Files
2026-06-03 05:09:24 +00:00

259 lines
13 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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 &nbsp;<?= $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'; ?>