153 lines
6.5 KiB
PHP
153 lines
6.5 KiB
PHP
<?php
|
|
require_once __DIR__ . '/layout_header.php';
|
|
|
|
// Fetch stats
|
|
$db = db();
|
|
$total_warga = $db->query("SELECT COUNT(*) FROM warga WHERE status = 'aktif'")->fetchColumn();
|
|
$total_jenis_iuran = $db->query("SELECT COUNT(*) FROM jenis_iuran")->fetchColumn();
|
|
$total_pemasukan = $db->query("SELECT SUM(jumlah) FROM pembayaran")->fetchColumn() ?: 0;
|
|
$total_pengeluaran = $db->query("SELECT SUM(jumlah) FROM pengeluaran")->fetchColumn() ?: 0;
|
|
$saldo = $total_pemasukan - $total_pengeluaran;
|
|
|
|
// Recent payments
|
|
$recent_payments = $db->query("
|
|
SELECT p.*, w.nama as nama_warga, j.nama as nama_iuran
|
|
FROM pembayaran p
|
|
JOIN warga w ON p.warga_id = w.id
|
|
JOIN jenis_iuran j ON p.jenis_iuran_id = j.id
|
|
ORDER BY p.tanggal_bayar DESC LIMIT 5
|
|
")->fetchAll();
|
|
|
|
// Get Pengurus
|
|
$pengurus = $db->query("SELECT * FROM pengurus ORDER BY urutan ASC")->fetchAll();
|
|
?>
|
|
|
|
<div class="top-bar">
|
|
<h1 class="h3 fw-bold m-0">Dashboard</h1>
|
|
<div class="text-muted"><?= date('d F Y') ?></div>
|
|
</div>
|
|
|
|
<div class="row g-4 mb-4">
|
|
<div class="col-md-3">
|
|
<div class="card stats-card">
|
|
<span class="label">Total Warga Aktif</span>
|
|
<span class="value"><?= number_format($total_warga) ?></span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card">
|
|
<span class="label">Saldo Kas (Total)</span>
|
|
<span class="value text-success">Rp <?= number_format($saldo, 0, ',', '.') ?></span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card">
|
|
<span class="label">Total Pemasukan</span>
|
|
<span class="value text-primary">Rp <?= number_format($total_pemasukan, 0, ',', '.') ?></span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card">
|
|
<span class="label">Total Pengeluaran</span>
|
|
<span class="value text-danger">Rp <?= number_format($total_pengeluaran, 0, ',', '.') ?></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-4">
|
|
<div class="col-md-8">
|
|
<div class="card">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2 class="h5 fw-bold m-0">Pembayaran Terbaru</h2>
|
|
<a href="/pembayaran.php" class="btn btn-sm btn-outline-primary">Lihat Semua</a>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Warga</th>
|
|
<th>Iuran</th>
|
|
<th>Periode</th>
|
|
<th>Jumlah</th>
|
|
<th>Tanggal</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (empty($recent_payments)): ?>
|
|
<tr>
|
|
<td colspan="5" class="text-center py-4 text-muted">Belum ada data pembayaran.</td>
|
|
</tr>
|
|
<?php else: ?>
|
|
<?php foreach ($recent_payments as $p): ?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($p['nama_warga']) ?></td>
|
|
<td><?= htmlspecialchars($p['nama_iuran']) ?></td>
|
|
<td><?= $p['periode'] ?></td>
|
|
<td>Rp <?= number_format($p['jumlah'], 0, ',', '.') ?></td>
|
|
<td><?= date('d/m/Y', strtotime($p['tanggal_bayar'])) ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="card mb-4">
|
|
<h2 class="h5 fw-bold mb-4">Struktur Pengurus</h2>
|
|
<?php if (empty($pengurus)): ?>
|
|
<p class="text-muted small">Belum ada data pengurus.</p>
|
|
<?php else: ?>
|
|
<ul class="list-unstyled mb-0">
|
|
<?php foreach ($pengurus as $pg): ?>
|
|
<li class="mb-3 d-flex align-items-center gap-3">
|
|
<div class="bg-light rounded-circle p-2" style="width: 40px; height: 40px; display: flex; align-items: center; justify-content: center;">
|
|
<i class="bi bi-person"></i>
|
|
</div>
|
|
<div>
|
|
<div class="fw-bold"><?= htmlspecialchars($pg['jabatan']) ?></div>
|
|
<div class="text-muted small"><?= htmlspecialchars($pg['nama']) ?></div>
|
|
</div>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h2 class="h5 fw-bold mb-4">Ringkasan per Iuran</h2>
|
|
<?php
|
|
$iuran_stats = $db->query("
|
|
SELECT j.nama, j.id,
|
|
(SELECT SUM(p.jumlah) FROM pembayaran p WHERE p.jenis_iuran_id = j.id) as masuk,
|
|
(SELECT SUM(e.jumlah) FROM pengeluaran e WHERE e.jenis_iuran_id = j.id) as keluar
|
|
FROM jenis_iuran j
|
|
")->fetchAll();
|
|
?>
|
|
<?php foreach ($iuran_stats as $is): ?>
|
|
<?php
|
|
$masuk = $is['masuk'] ?: 0;
|
|
$keluar = $is['keluar'] ?: 0;
|
|
$saldo_iuran = $masuk - $keluar;
|
|
?>
|
|
<div class="mb-3 pb-3 border-bottom last-child-no-border">
|
|
<div class="d-flex justify-content-between mb-1">
|
|
<span class="fw-medium small"><?= htmlspecialchars($is['nama']) ?></span>
|
|
<span class="fw-bold small">Rp <?= number_format($saldo_iuran, 0, ',', '.') ?></span>
|
|
</div>
|
|
<div class="progress mb-1" style="height: 4px;">
|
|
<?php
|
|
$percent = $masuk > 0 ? min(100, ($saldo_iuran / $masuk) * 100) : 0;
|
|
if ($saldo_iuran < 0) $percent = 0;
|
|
?>
|
|
<div class="progress-bar bg-primary" role="progressbar" style="width: <?= $percent ?>%"></div>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php require_once __DIR__ . '/layout_footer.php'; ?>
|