35251-vm/reports.php
2025-10-26 16:49:58 +00:00

151 lines
6.8 KiB
PHP

<?php
$title = 'Reports - Billing';
$page = 'reports';
require_once 'templates/header.php';
?>
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">Reports</h1>
</div>
<?php
require_once 'db/config.php';
$pdo = db();
// Fetch stats
$total_customers = $pdo->query('SELECT COUNT(*) FROM customers')->fetchColumn();
$active_customers = $pdo->query("SELECT COUNT(*) FROM customers WHERE status = 'Active'")->fetchColumn();
$total_plans = $pdo->query('SELECT COUNT(*) FROM plans')->fetchColumn();
$total_revenue = $pdo->query("SELECT SUM(amount) FROM invoices WHERE status = 'Paid'")->fetchColumn();
$invoice_status_stmt = $pdo->query("SELECT status, COUNT(*) as count FROM invoices GROUP BY status");
$invoice_statuses = $invoice_status_stmt->fetchAll(PDO::FETCH_KEY_PAIR);
$total_invoices = array_sum($invoice_statuses);
$paid_invoices = $invoice_statuses['Paid'] ?? 0;
$pending_invoices = $invoice_statuses['Pending'] ?? 0;
$overdue_invoices = $invoice_statuses['Overdue'] ?? 0;
?>
<div class="row">
<div class="col-md-3 mb-4">
<div class="card text-white bg-primary">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-people-fill"></i> Total Customers</h5>
<p class="card-text fs-4"><?php echo $total_customers; ?></p>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card text-white bg-success">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-person-check-fill"></i> Active Customers</h5>
<p class="card-text fs-4"><?php echo $active_customers; ?></p>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card text-white bg-info">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-tags-fill"></i> Available Plans</h5>
<p class="card-text fs-4"><?php echo $total_plans; ?></p>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card text-white bg-dark">
<div class="card-body">
<h5 class="card-title"><i class="bi bi-cash-stack"></i> Total Revenue</h5>
<p class="card-text fs-4">$<?php echo number_format($total_revenue, 2); ?></p>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<i class="bi bi-journal-text"></i> Invoice Status Distribution
</div>
<div class="card-body">
<div class="progress" style="height: 30px;">
<div class="progress-bar bg-success" role="progressbar" style="width: <?php echo ($paid_invoices / $total_invoices) * 100; ?>%" aria-valuenow="<?php echo $paid_invoices; ?>" aria-valuemin="0" aria-valuemax="<?php echo $total_invoices; ?>">Paid</div>
<div class="progress-bar bg-warning" role="progressbar" style="width: <?php echo ($pending_invoices / $total_invoices) * 100; ?>%" aria-valuenow="<?php echo $pending_invoices; ?>" aria-valuemin="0" aria-valuemax="<?php echo $total_invoices; ?>">Pending</div>
<div class="progress-bar bg-danger" role="progressbar" style="width: <?php echo ($overdue_invoices / $total_invoices) * 100; ?>%" aria-valuenow="<?php echo $overdue_invoices; ?>" aria-valuemin="0" aria-valuemax="<?php echo $total_invoices; ?>">Overdue</div>
</div>
<div class="d-flex justify-content-around mt-3 text-center">
<div>
<p class="mb-0 fs-5"><?php echo $paid_invoices; ?></p>
<span class="text-success">Paid</span>
</div>
<div>
<p class="mb-0 fs-5"><?php echo $pending_invoices; ?></p>
<span class="text-warning">Pending</span>
</div>
<div>
<p class="mb-0 fs-5"><?php echo $overdue_invoices; ?></p>
<span class="text-danger">Overdue</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<i class="bi bi-journal-text"></i> Generated Reports
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-sm">
<thead>
<tr>
<th>Report Name</th>
<th>Type</th>
<th>Date Generated</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php
$stmt = $pdo->query('SELECT * FROM reports ORDER BY created_at DESC');
$reports = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($reports)):
?>
<tr>
<td colspan="4" class="text-center py-5">
<i class="bi bi-journal-x" style="font-size: 3rem; color: #ccc;"></i>
<h2 class="mt-3">No Reports Found</h2>
<p class="text-muted">There are no generated reports to display yet.</p>
</td>
</tr>
<?php else: ?>
<?php foreach ($reports as $report): ?>
<tr>
<td><?php echo htmlspecialchars($report['name']); ?></td>
<td><span class="badge bg-secondary"><?php echo htmlspecialchars($report['type']); ?></span></td>
<td><?php echo date('M d, Y H:i A', strtotime($report['created_at'])); ?></td>
<td>
<a href="view_report.php?id=<?php echo $report['id']; ?>" class="btn btn-sm btn-outline-primary"><i class="bi bi-eye"></i> View</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<?php
require_once 'templates/footer.php';
?>