119 lines
5.0 KiB
PHP
119 lines
5.0 KiB
PHP
<?php
|
|
try {
|
|
$pdo = db();
|
|
$stmt = $pdo->query("SELECT s.id, s.receipt_number, s.total_amount, s.created_at, u.username
|
|
FROM sales s
|
|
JOIN users u ON s.user_id = u.id
|
|
ORDER BY s.created_at DESC");
|
|
$sales = $stmt->fetchAll();
|
|
} catch (PDOException $e) {
|
|
echo "<div class='alert alert-danger'>Database error: " . htmlspecialchars($e->getMessage()) . "</div>";
|
|
$sales = [];
|
|
}
|
|
?>
|
|
|
|
<h1 class="h3 mb-4">Sales Reports</h1>
|
|
|
|
<div class="card shadow-sm">
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-striped table-hover">
|
|
<thead class="table-dark">
|
|
<tr>
|
|
<th>Receipt Number</th>
|
|
<th>Cashier</th>
|
|
<th>Total Amount</th>
|
|
<th>Date</th>
|
|
<th>Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (empty($sales)): ?>
|
|
<tr>
|
|
<td colspan="5" class="text-center">No sales recorded yet.</td>
|
|
</tr>
|
|
<?php else: ?>
|
|
<?php foreach ($sales as $sale): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($sale['receipt_number']) ?></td>
|
|
<td><?= htmlspecialchars($sale['username']) ?></td>
|
|
<td>$<?= htmlspecialchars(number_format($sale['total_amount'], 2)) ?></td>
|
|
<td><?= htmlspecialchars(date('M d, Y h:i A', strtotime($sale['created_at']))) ?></td>
|
|
<td>
|
|
<button class="btn btn-sm btn-primary view-sale-details-btn" data-sale-id="<?= $sale['id'] ?>" data-bs-toggle="modal" data-bs-target="#saleDetailsModal">
|
|
View Details
|
|
</button>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sale Details Modal -->
|
|
<div class="modal fade" id="saleDetailsModal" tabindex="-1" aria-labelledby="saleDetailsModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="saleDetailsModalLabel">Sale Details</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body" id="saleDetailsBody">
|
|
<!-- Sale details will be loaded here -->
|
|
<p class="text-center">Loading...</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const saleDetailsModal = document.getElementById('saleDetailsModal');
|
|
const saleDetailsBody = document.getElementById('saleDetailsBody');
|
|
|
|
saleDetailsModal.addEventListener('show.bs.modal', function (event) {
|
|
const button = event.relatedTarget;
|
|
const saleId = button.getAttribute('data-sale-id');
|
|
|
|
saleDetailsBody.innerHTML = '<p class="text-center">Loading...</p>';
|
|
|
|
fetch(`/api/get_sale_details.php?id=${saleId}`)
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.error) {
|
|
saleDetailsBody.innerHTML = `<div class="alert alert-danger">${data.error}</div>`;
|
|
return;
|
|
}
|
|
|
|
let itemsHtml = '<ul class="list-group">';
|
|
data.items.forEach(item => {
|
|
itemsHtml += `<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
${item.product_name} (x${item.quantity})
|
|
<span>$${parseFloat(item.price_at_sale).toFixed(2)} each</span>
|
|
</li>`;
|
|
});
|
|
itemsHtml += '</ul>';
|
|
|
|
saleDetailsBody.innerHTML = `
|
|
<p><strong>Receipt Number:</strong> ${data.receipt_number}</p>
|
|
<p><strong>Cashier:</strong> ${data.cashier_name}</p>
|
|
<p><strong>Date:</strong> ${new Date(data.created_at).toLocaleString()}</p>
|
|
<hr>
|
|
<h5>Items Sold</h5>
|
|
${itemsHtml}
|
|
<hr>
|
|
<div class="text-end fs-5 fw-bold">
|
|
Total: $${parseFloat(data.total_amount).toFixed(2)}
|
|
</div>
|
|
`;
|
|
})
|
|
.catch(err => {
|
|
saleDetailsBody.innerHTML = `<div class="alert alert-danger">An error occurred while fetching sale details.</div>`;
|
|
console.error('Fetch error:', err);
|
|
});
|
|
});
|
|
});
|
|
</script>
|