259 lines
13 KiB
PHP
259 lines
13 KiB
PHP
<?php
|
||
require_once 'koneksi.php';
|
||
cekLogin();
|
||
$page = 'laporan';
|
||
$pageTitle = 'Laporan & Statistik';
|
||
$pageSubtitle= 'Analisis Data Kemiskinan';
|
||
|
||
$totalKpm = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin")->fetch_assoc()['c'];
|
||
$terjangkau = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE status_bantuan='Terjangkau'")->fetch_assoc()['c'];
|
||
$sudahTerima = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE status_bantuan='Sudah Menerima'")->fetch_assoc()['c'];
|
||
$blankSpot = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE status_bantuan='Belum Terbantu'")->fetch_assoc()['c'];
|
||
$prioritas = $conn->query("SELECT COUNT(*) AS c FROM rumah_miskin WHERE prioritas=1")->fetch_assoc()['c'];
|
||
$totalBantuan = $conn->query("SELECT COUNT(*) AS c FROM bantuan_tersalur")->fetch_assoc()['c'];
|
||
$totalIbadah = $conn->query("SELECT COUNT(*) AS c FROM rumah_ibadah")->fetch_assoc()['c'];
|
||
$totalTanggungan = $conn->query("SELECT SUM(jumlah_tanggungan) AS c FROM rumah_miskin")->fetch_assoc()['c'] ?? 0;
|
||
$avgPendapatan = $conn->query("SELECT AVG(pendapatan_bulanan) AS c FROM rumah_miskin")->fetch_assoc()['c'] ?? 0;
|
||
$pct = $totalKpm > 0 ? round(($terjangkau + $sudahTerima) / $totalKpm * 100) : 0;
|
||
|
||
$byKondisi = $conn->query("SELECT kondisi_rumah, COUNT(*) AS c FROM rumah_miskin GROUP BY kondisi_rumah");
|
||
$kondisiData = [];
|
||
while ($r = $byKondisi->fetch_assoc()) $kondisiData[$r['kondisi_rumah']] = $r['c'];
|
||
|
||
$byKec = $conn->query("SELECT kecamatan, COUNT(*) AS c FROM rumah_miskin WHERE kecamatan IS NOT NULL AND kecamatan!='' GROUP BY kecamatan ORDER BY c DESC LIMIT 10");
|
||
|
||
$ibadahPerf = $conn->query("SELECT ri.nama_ibadah, ri.kuota_bantuan, ri.radius_m, COUNT(bt.id) AS total_salur FROM rumah_ibadah ri LEFT JOIN bantuan_tersalur bt ON ri.id=bt.ibadah_id GROUP BY ri.id ORDER BY total_salur DESC");
|
||
|
||
$pendDist = $conn->query("SELECT
|
||
SUM(CASE WHEN pendapatan_bulanan < 500000 THEN 1 ELSE 0 END) AS sangat_rendah,
|
||
SUM(CASE WHEN pendapatan_bulanan BETWEEN 500000 AND 1000000 THEN 1 ELSE 0 END) AS rendah,
|
||
SUM(CASE WHEN pendapatan_bulanan BETWEEN 1000001 AND 2000000 THEN 1 ELSE 0 END) AS menengah,
|
||
SUM(CASE WHEN pendapatan_bulanan > 2000000 THEN 1 ELSE 0 END) AS atas
|
||
FROM rumah_miskin")->fetch_assoc();
|
||
|
||
include 'includes/sidebar.php';
|
||
?>
|
||
|
||
<style>
|
||
.lp-grid4 { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:16px; }
|
||
.lp-grid21 { display:grid; grid-template-columns:2fr 1fr; gap:14px; margin-bottom:14px; }
|
||
.lp-grid11 { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px; }
|
||
|
||
/* Stat box sederhana */
|
||
.lp-stat {
|
||
background:#fff; border:1px solid var(--gray-md); border-radius:var(--radius);
|
||
padding:16px 18px;
|
||
}
|
||
.lp-stat .lp-num { font-size:26px; font-weight:800; line-height:1; margin-bottom:3px; }
|
||
.lp-stat .lp-lbl { font-size:11px; color:var(--gray); font-weight:500; }
|
||
.lp-stat .lp-sub { font-size:11px; font-weight:600; margin-top:3px; }
|
||
.lp-stat .lp-line { height:2px; border-radius:99px; margin-top:12px; }
|
||
|
||
/* Bar label */
|
||
.bar-row { margin-bottom:11px; }
|
||
.bar-row-top { display:flex; justify-content:space-between; font-size:12px; font-weight:600; margin-bottom:4px; }
|
||
.bar-track { height:8px; background:var(--gray-lt); border-radius:99px; overflow:hidden; }
|
||
.bar-fill { height:100%; border-radius:99px; transition:.5s; }
|
||
|
||
/* Kondisi kotak */
|
||
.kond-box { text-align:center; padding:12px 8px; background:var(--gray-lt); border-radius:var(--radius-sm); }
|
||
.kond-box .knum { font-size:22px; font-weight:800; line-height:1; }
|
||
.kond-box .klbl { font-size:10px; color:var(--gray); margin-top:3px; }
|
||
|
||
/* Avg box */
|
||
.avg-box {
|
||
text-align:center; padding:12px; background:var(--yellow-lt);
|
||
border-radius:var(--radius-sm); margin-top:12px;
|
||
}
|
||
.avg-box .a-lbl { font-size:11px; color:var(--yellow); font-weight:600; }
|
||
.avg-box .a-num { font-size:18px; font-weight:800; color:var(--yellow); margin-top:2px; }
|
||
.avg-box .a-sub { font-size:10px; color:var(--yellow); margin-top:1px; }
|
||
|
||
@media(max-width:900px){
|
||
.lp-grid4 { grid-template-columns:repeat(2,1fr); }
|
||
.lp-grid21 { grid-template-columns:1fr; }
|
||
.lp-grid11 { grid-template-columns:1fr; }
|
||
}
|
||
@media print{
|
||
#sidebar,#topbar,.btn { display:none!important; }
|
||
#main-wrap { margin-left:0!important; }
|
||
.card { break-inside:avoid; }
|
||
}
|
||
</style>
|
||
|
||
<!-- Header -->
|
||
<div class="page-head" style="margin-bottom:16px">
|
||
<div>
|
||
<h2>Laporan & Statistik</h2>
|
||
<p>Data per <?= date('d F Y') ?></p>
|
||
</div>
|
||
<button class="btn btn-ghost btn-sm" onclick="window.print()">
|
||
<i class="fa fa-print"></i> Cetak
|
||
</button>
|
||
</div>
|
||
|
||
<!-- BARIS 1 — 4 stat cards, semua clickable -->
|
||
<div class="lp-grid4">
|
||
<a href="data-warga.php" class="lp-stat" style="text-decoration:none;color:inherit">
|
||
<div class="lp-num" style="color:var(--orange)"><?= $totalKpm ?></div>
|
||
<div class="lp-lbl">Total KPM Terdata</div>
|
||
<div class="lp-sub" style="color:var(--orange)"><?= $totalTanggungan ?> jiwa</div>
|
||
<div class="lp-line" style="background:var(--orange)"></div>
|
||
</a>
|
||
<a href="data-warga.php?status=Terjangkau" class="lp-stat" style="text-decoration:none;color:inherit">
|
||
<div class="lp-num" style="color:var(--green)"><?= $pct ?>%</div>
|
||
<div class="lp-lbl">Cakupan Bantuan</div>
|
||
<div class="lp-sub" style="color:var(--green)"><?= $terjangkau + $sudahTerima ?> KK</div>
|
||
<div class="lp-line" style="background:var(--green)"></div>
|
||
</a>
|
||
<a href="data-warga.php?status=Belum+Terbantu" class="lp-stat" style="text-decoration:none;color:inherit">
|
||
<div class="lp-num" style="color:var(--red)"><?= $blankSpot ?></div>
|
||
<div class="lp-lbl">Blank Spot</div>
|
||
<div class="lp-sub" style="color:var(--red)">Belum terjangkau</div>
|
||
<div class="lp-line" style="background:var(--red)"></div>
|
||
</a>
|
||
<a href="bantuan.php" class="lp-stat" style="text-decoration:none;color:inherit">
|
||
<div class="lp-num" style="color:var(--purple)"><?= $totalBantuan ?></div>
|
||
<div class="lp-lbl">Bantuan Tersalur</div>
|
||
<div class="lp-sub" style="color:var(--purple)">Transaksi tercatat</div>
|
||
<div class="lp-line" style="background:var(--purple)"></div>
|
||
</a>
|
||
</div>
|
||
|
||
<!-- BARIS 2 — Distribusi status + Pendapatan -->
|
||
<div class="lp-grid21">
|
||
|
||
<!-- Distribusi status -->
|
||
<div class="card">
|
||
<div class="card-hd"><h3>Distribusi Status KPM</h3></div>
|
||
<div class="card-bd">
|
||
<?php
|
||
$statusArr = [
|
||
'Belum Terbantu' => [$blankSpot, '#dc2626'],
|
||
'Terjangkau' => [$terjangkau, '#16a34a'],
|
||
'Sudah Menerima' => [$sudahTerima, '#2563eb'],
|
||
'Prioritas Bencana' => [$prioritas, '#ea580c'],
|
||
];
|
||
foreach ($statusArr as $label => [$val, $color]):
|
||
$p = $totalKpm > 0 ? round($val / $totalKpm * 100) : 0;
|
||
?>
|
||
<div class="bar-row">
|
||
<div class="bar-row-top">
|
||
<span style="color:var(--dark)"><?= $label ?></span>
|
||
<span style="color:<?= $color ?>"><?= $val ?> KK <?= $p ?>%</span>
|
||
</div>
|
||
<div class="bar-track">
|
||
<div class="bar-fill" style="width:<?= $p ?>%;background:<?= $color ?>"></div>
|
||
</div>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
|
||
<div style="border-top:1px solid var(--gray-md);margin-top:14px;padding-top:14px;display:grid;grid-template-columns:repeat(3,1fr);gap:10px">
|
||
<?php foreach(['Sangat Tidak Layak'=>'#dc2626','Tidak Layak'=>'#ea580c','Layak'=>'#16a34a'] as $k=>$c): ?>
|
||
<div class="kond-box">
|
||
<div class="knum" style="color:<?= $c ?>"><?= $kondisiData[$k] ?? 0 ?></div>
|
||
<div class="klbl"><?= $k ?></div>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Distribusi pendapatan -->
|
||
<div class="card">
|
||
<div class="card-hd"><h3>Distribusi Pendapatan</h3></div>
|
||
<div class="card-bd">
|
||
<?php
|
||
$pendArr = [
|
||
'< Rp500 rb' => [$pendDist['sangat_rendah'], '#dc2626'],
|
||
'Rp500rb – 1jt' => [$pendDist['rendah'], '#ea580c'],
|
||
'Rp1jt – 2jt' => [$pendDist['menengah'], '#d97706'],
|
||
'> Rp2 jt' => [$pendDist['atas'], '#16a34a'],
|
||
];
|
||
foreach ($pendArr as $label => [$val, $color]):
|
||
$pp = $totalKpm > 0 ? round($val / $totalKpm * 100) : 0;
|
||
?>
|
||
<div class="bar-row">
|
||
<div class="bar-row-top">
|
||
<span style="color:var(--gray);font-size:11px"><?= $label ?></span>
|
||
<span style="color:<?= $color ?>"><?= $val ?></span>
|
||
</div>
|
||
<div class="bar-track">
|
||
<div class="bar-fill" style="width:<?= $pp ?>%;background:<?= $color ?>"></div>
|
||
</div>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
|
||
<div class="avg-box">
|
||
<div class="a-lbl">Rata-rata Pendapatan</div>
|
||
<div class="a-num"><?= rupiah(round($avgPendapatan)) ?></div>
|
||
<div class="a-sub">per bulan / KK</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- BARIS 3 — Sebaran kecamatan + Performa ibadah -->
|
||
<div class="lp-grid11">
|
||
|
||
<!-- Sebaran kecamatan -->
|
||
<div class="card">
|
||
<div class="card-hd"><h3>Sebaran per Kecamatan</h3></div>
|
||
<div class="tbl-w">
|
||
<table>
|
||
<thead>
|
||
<tr><th>Kecamatan</th><th style="text-align:right">KPM</th><th>Proporsi</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php if ($byKec->num_rows === 0): ?>
|
||
<tr><td colspan="3" style="text-align:center;padding:24px;color:var(--gray)">Data wilayah belum diisi</td></tr>
|
||
<?php else: while ($r = $byKec->fetch_assoc()):
|
||
$p2 = $totalKpm > 0 ? round($r['c'] / $totalKpm * 100) : 0;
|
||
?>
|
||
<tr>
|
||
<td style="font-weight:600"><?= htmlspecialchars($r['kecamatan']) ?></td>
|
||
<td style="text-align:right;font-weight:700;color:var(--purple)"><?= $r['c'] ?></td>
|
||
<td style="width:120px">
|
||
<div style="display:flex;align-items:center;gap:6px">
|
||
<div class="bar-track" style="flex:1;height:6px">
|
||
<div class="bar-fill" style="width:<?= $p2 ?>%;background:var(--purple)"></div>
|
||
</div>
|
||
<span style="font-size:11px;font-weight:600;color:var(--purple);min-width:28px"><?= $p2 ?>%</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<?php endwhile; endif; ?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Performa ibadah -->
|
||
<div class="card">
|
||
<div class="card-hd">
|
||
<h3>Performa Rumah Ibadah</h3>
|
||
<a href="data-ibadah.php" style="font-size:12px;color:var(--blue);text-decoration:none;font-weight:600">Lihat semua</a>
|
||
</div>
|
||
<div class="tbl-w">
|
||
<table>
|
||
<thead>
|
||
<tr><th>Nama</th><th style="text-align:center">Kuota</th><th style="text-align:center">Radius</th><th style="text-align:center">Bantuan</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php if ($ibadahPerf->num_rows === 0): ?>
|
||
<tr><td colspan="4" style="text-align:center;padding:24px;color:var(--gray)">Belum ada data</td></tr>
|
||
<?php else: while ($r = $ibadahPerf->fetch_assoc()): ?>
|
||
<tr>
|
||
<td style="font-weight:600;font-size:12px"><?= htmlspecialchars($r['nama_ibadah']) ?></td>
|
||
<td style="text-align:center;font-size:12px"><?= $r['kuota_bantuan'] ?> KK</td>
|
||
<td style="text-align:center;font-size:12px"><?= $r['radius_m'] ?> m</td>
|
||
<td style="text-align:center"><span class="badge badge-green"><?= $r['total_salur'] ?>x</span></td>
|
||
</tr>
|
||
<?php endwhile; endif; ?>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<?php include 'includes/footer.php'; ?>
|