Files
UAS_SIG/dashboard-admin.php
2026-06-03 05:04:28 +00:00

291 lines
14 KiB
PHP

<?php
// dashboard-admin.php
require_once 'koneksi.php';
cekLogin(); // Memastikan user sudah login lewat fungsi sistem Anda
// Proteksi ketat: Hanya Role Admin yang Boleh Mengakses Halaman Ini
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: login.php');
exit;
}
$page = 'beranda'; // Penanda agar menu "Beranda" di sidebar menyala
$pageTitle = 'Beranda Admin';
$pageSubtitle = 'Panel Kendali Otoritas Tertinggi';
// 1. MENGAMBIL DATA STATISTIK UTAMA (DIAMBIL DARI DATABASE)
$totalIbadah = $conn->query("SELECT COUNT(*) AS c FROM rumah_ibadah")->fetch_assoc()['c'] ?? 0;
$totalKpm = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin")->fetch_assoc()['c'] ?? 0;
$terjangkau = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE status_bantuan='Terjangkau'")->fetch_assoc()['c'] ?? 0;
$blankSpot = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE status_bantuan='Belum Terbantu'")->fetch_assoc()['c'] ?? 0;
$totalBantuan = $conn->query("SELECT COUNT(*) AS c FROM bantuan_tersalur")->fetch_assoc()['c'] ?? 0;
$bencanaAktif = $conn->query("SELECT COUNT(*) AS c FROM bencana WHERE status='Aktif'")->fetch_assoc()['c'] ?? 0;
$prioritas = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE prioritas=1")->fetch_assoc()['c'] ?? 0;
// Mengambil statistik tambahan khusus admin (Manajemen User)
$totalUser = $conn->query("SELECT COUNT(*) AS c FROM users")->fetch_assoc()['c'] ?? 0;
$userAktif = $conn->query("SELECT COUNT(*) AS c FROM users WHERE aktif=1")->fetch_assoc()['c'] ?? 0;
// Menghitung persentase capaian rasio jangkauan bantuan
$pct = $totalKpm > 0 ? round($terjangkau / $totalKpm * 100) : 0;
// 2. MENGAMBIL DATA TERBARU UNTUK PREVIEW LOG TABEL (LIMIT 5)
$kpmBaru = $conn->query("SELECT rm.nama_kepala_keluarga, rm.nik, rm.kelurahan, rm.kondisi_rumah, rm.prioritas FROM rumah_miskin rm ORDER BY rm.created_at DESC LIMIT 5");
$bantuanBaru = $conn->query("SELECT bt.jenis_bantuan, bt.jumlah, bt.tanggal, rm.nama_kepala_keluarga FROM bantuan_tersalur bt LEFT JOIN rumah_miskin rm ON bt.warga_id=rm.id ORDER BY bt.created_at DESC LIMIT 5");
// MEMANGGIL SIDEBAR DINAMIS (Otomatis menyambung dan layout tidak akan pecah)
include 'includes/sidebar.php';
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Panel Administrasi Pusat - Poverty Mapping</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"/>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
.db-wrap { max-width: 1200px; font-family: 'Inter', sans-serif; }
/* Welcome Banner Premium bergradasi linier mewah */
.db-welcome {
background: linear-gradient(135deg, #0f1d42 0%, #204075 100%);
color: white;
border-radius: 16px;
padding: 26px 28px;
margin-bottom: 24px;
box-shadow: 0 10px 20px -3px rgba(30, 58, 138, 0.15);
position: relative;
overflow: hidden;
}
.db-welcome h1 { font-size: 22px; font-weight: 700; margin-bottom: 6px; }
.db-welcome p { font-size: 13px; opacity: 0.9; max-width: 700px; }
.db-welcome::after {
content: ''; position: absolute; top:0; right:0; width: 250px; height: 100%;
background: radial-gradient(circle at 80% 20%, rgba(255,255,255,0.12) 0%, transparent 60%);
}
/* Grid Kartu Statistik Utama */
.stat-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
margin-bottom: 24px;
}
.scard {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 14px;
padding: 20px;
text-decoration: none;
color: inherit;
display: flex;
align-items: center;
justify-content: space-between;
transition: box-shadow .2s, transform .2s;
box-shadow: 0 4px 6px -1px rgba(15,23,42,0.02);
}
.scard:hover {
box-shadow: 0 12px 20px -5px rgba(15, 23, 42, 0.05);
transform: translateY(-4px);
}
.scard-label { font-size: 11px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 6px; }
.scard-num { font-size: 26px; font-weight: 800; line-height: 1; color: #0f172a; }
.scard-sub { font-size: 11px; color: #64748b; margin-top: 5px; font-weight: 500; }
.scard-icon { width: 44px; height: 44px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 16px; }
/* Area Cakupan Bantuan (Progress Bar) */
.coverage-box {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 14px;
padding: 24px;
margin-bottom: 24px;
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02);
}
.cov-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
.cov-top h3 { font-size: 14px; font-weight: 700; color: #1e293b; }
.cov-top p { font-size: 12px; color: #64748b; margin-top: 2px; }
.cov-pct { font-size: 24px; font-weight: 800; color: #059669; }
.cov-track { height: 12px; background: #e2e8f0; border-radius: 99px; overflow: hidden; }
.cov-fill { height: 100%; background: linear-gradient(90deg, #10b981, #34d399); border-radius: 99px; transition: width .8s; }
.cov-meta { display: flex; gap: 20px; font-size: 12px; color: #475569; margin-top: 14px; flex-wrap: wrap; font-weight: 500; }
.cov-meta strong { color: #0f172a; }
/* Pembagian Grid Tabel */
.db-tables { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.dbt-card { background: #fff; border: 1px solid #e2e8f0; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02); }
.dbt-head { padding: 16px 20px; border-bottom: 1px solid #f1f5f9; display: flex; justify-content: space-between; align-items: center; background: #fafbfc; }
.dbt-head h3 { font-size: 13px; font-weight: 700; color: #1e3a8a; display: flex; align-items: center; gap: 8px; }
.dbt-head a { font-size: 12px; color: #3b82f6; text-decoration: none; font-weight: 600; background: #eff6ff; padding: 4px 10px; border-radius: 6px; transition: 0.2s; }
.dbt-head a:hover { background: #dbeafe; }
/* Styling Tabel Premium */
table.dbt { width: 100%; border-collapse: collapse; font-size: 13px; }
table.dbt th { background: #f8fafc; padding: 12px 16px; text-align: left; font-size: 11px; font-weight: 700; color: #64748b; text-transform: uppercase; letter-spacing: .5px; border-bottom: 1px solid #e2e8f0; }
table.dbt td { padding: 14px 16px; border-bottom: 1px solid #f1f5f9; vertical-align: middle; color: #334155; }
table.dbt tr:last-child td { border-bottom: none; }
table.dbt tr:hover { background: #f8fafc; }
/* Lencana Modern (Badges) */
.badge-modern { padding: 4px 10px; border-radius: 99px; font-size: 11px; font-weight: 600; display: inline-block; }
.badge-danger { background: #fee2e2; color: #dc2626; }
.badge-success { background: #d1fae5; color: #059669; }
.badge-warning { background: #fef3c7; color: #d97706; }
.badge-info { background: #e0f2fe; color: #0284c7; }
@media (max-width: 992px) {
.stat-row { grid-template-columns: repeat(2,1fr); }
.db-tables { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<div class="db-wrap">
<div class="db-welcome">
<h1>Selamat Datang Kembali, <?= htmlspecialchars($_SESSION['nama'] ?? 'Administrator') ?></h1>
</div>
<div class="stat-row">
<div class="scard">
<div>
<div class="scard-label">Manajemen Akun</div>
<div class="scard-num"><?= $totalUser ?> Akun</div>
<div class="scard-sub"><i class="fa fa-circle" style="font-size:8px; color:#10b981;"></i> <?= $userAktif ?> User Aktif</div>
</div>
<div class="scard-icon" style="background: #e0e7ff; color: #4f46e5;">
<i class="fa fa-user-gear"></i>
</div>
</div>
<div class="scard">
<div>
<div class="scard-label">Total KPM</div>
<div class="scard-num"><?= $totalKpm ?></div>
<div class="scard-sub">Keluarga terdata</div>
</div>
<div class="scard-icon" style="background: #fcf2e9; color: #ea580c;">
<i class="fa fa-users"></i>
</div>
</div>
<div class="scard">
<div>
<div class="scard-label">Blank Spot</div>
<div class="scard-num" style="color:#dc2626"><?= $blankSpot ?></div>
<div class="scard-sub">Belum terjangkau</div>
</div>
<div class="scard-icon" style="background: #fee2e2; color: #dc2626;">
<i class="fa fa-street-view"></i>
</div>
</div>
<div class="scard">
<div>
<div class="scard-label">Bencana Aktif</div>
<div class="scard-num" style="color:<?= $bencanaAktif > 0 ? '#dc2626' : '#0f172a' ?>"><?= $bencanaAktif ?></div>
<div class="scard-sub"><?= $bencanaAktif > 0 ? $prioritas.' KPM diprioritaskan' : 'Sistem kondusif' ?></div>
</div>
<div class="scard-icon" style="background: #fff1f2; color: #e11d48;">
<i class="fa fa-triangle-exclamation"></i>
</div>
</div>
</div>
<div class="coverage-box">
<div class="cov-top">
<div>
<h3>Rasio Capaian Pengentasan Kemiskinan Makro</h3>
<p>Persentase keseluruhan KPM yang berhasil masuk dalam jangkauan koordinasi pos rumah ibadah</p>
</div>
<div class="cov-pct"><?= $pct ?>%</div>
</div>
<div class="cov-track">
<div class="cov-fill" style="width:<?= $pct ?>%"></div>
</div>
<div class="cov-meta">
<span>Terjangkau: <strong><?= $terjangkau ?> KPM</strong></span>
<span>Blank Spot: <strong><?= $blankSpot ?> KPM</strong></span>
<span>Titik Pos Rumah Ibadah: <strong><?= $totalIbadah ?> Titik</strong></span>
<span>Total Penyaluran: <strong><?= $totalBantuan ?> Kali</strong></span>
</div>
</div>
<div class="db-tables">
<div class="dbt-card">
<div class="dbt-head">
<h3><i class="fa fa-user-plus"></i> Pendaftaran KPM Terbaru</h3>
<a href="data-warga.php">Lihat semua</a>
</div>
<table class="dbt">
<thead>
<tr><th>Nama KK</th><th>Kelurahan</th><th>Kondisi Rumah</th></tr>
</thead>
<tbody>
<?php if ($kpmBaru->num_rows === 0): ?>
<tr><td colspan="3" style="text-align:center;padding:28px;color:#94a3b8;">Belum ada entri data KPM terdaftar.</td></tr>
<?php else:
while ($k = $kpmBaru->fetch_assoc()):
$kondisiClass = 'badge-info';
if (in_array($k['kondisi_rumah'], ['Sangat Parah', 'Sangat Tidak Layak'])) $kondisiClass = 'badge-danger';
elseif (in_array($k['kondisi_rumah'], ['Parah', 'Tidak Layak'])) $kondisiClass = 'badge-warning';
elseif (in_array($k['kondisi_rumah'], ['Cukup Baik', 'Layak'])) $kondisiClass = 'badge-success';
?>
<tr>
<td>
<div style="font-weight:600"><?= htmlspecialchars($k['nama_kepala_keluarga']) ?></div>
<div style="font-size:11px;color:#94a3b8">NIK: <?= $k['nik'] ?: '-' ?></div>
</td>
<td style="font-size:12px;"><?= htmlspecialchars($k['kelurahan'] ?: '-') ?></td>
<td>
<span class="badge-modern <?= $kondisiClass ?>"><?= $k['kondisi_rumah'] ?></span>
<?php if ($k['prioritas'] == 1): ?>
<span class="badge-modern badge-danger" title="Prioritas Utama"><i class="fa fa-bolt"></i></span>
<?php endif; ?>
</td>
</tr>
<?php endwhile; endif; ?>
</tbody>
</table>
</div>
<div class="dbt-card">
<div class="dbt-head">
<h3><i class="fa fa-hand-holding-heart"></i> Transaksi Distribusi Bantuan</h3>
<a href="bantuan.php">Lihat semua</a>
</div>
<table class="dbt">
<thead>
<tr><th>Penerima KPM</th><th>Paket Bantuan</th><th>Tanggal Penyaluran</th></tr>
</thead>
<tbody>
<?php if ($bantuanBaru->num_rows === 0): ?>
<tr><td colspan="3" style="text-align:center;padding:28px;color:#94a3b8;">Belum ada log transaksi penyaluran bantuan.</td></tr>
<?php else: while ($b = $bantuanBaru->fetch_assoc()): ?>
<tr>
<td style="font-weight:600"><?= htmlspecialchars($b['nama_kepala_keluarga'] ?? '-') ?></td>
<td>
<span class="badge-modern badge-success"><?= htmlspecialchars($b['jenis_bantuan']) ?></span>
<?php if ($b['jumlah']): ?>
<div style="font-size:11px;color:#64748b;margin-top:2px; font-weight:500;"><?= htmlspecialchars($b['jumlah']) ?></div>
<?php endif; ?>
</td>
<td style="font-size:12px;color:#64748b"><?= date('d M Y', strtotime($b['tanggal'])) ?></td>
</tr>
<?php endwhile; endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<?php include 'includes/footer.php'; ?>
</body>
</html>