Files
2026-06-13 11:24:58 +07:00

93 lines
4.4 KiB
PHP

<?php
/**
* api/laporan_wilayah.php — Laporan per kelurahan (KF-29).
* ?wilayah_id=ID [&format=print|json] (default print)
* Daftar warga dihitung secara spasial (ST_Contains).
*/
require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../config/auth_check.php';
requireAnyRole(['operator', 'pimpinan']);
$pdo = Database::getConnection();
$wid = $_GET['wilayah_id'] ?? null;
$format = $_GET['format'] ?? 'print';
if (!$wid) { http_response_code(400); echo 'wilayah_id wajib'; exit; }
$wil = $pdo->prepare("SELECT id, nama, jumlah_penduduk FROM wilayah WHERE id=?");
$wil->execute([$wid]);
$w = $wil->fetch();
if (!$w) { http_response_code(404); echo 'Wilayah tidak ditemukan'; exit; }
$stmt = $pdo->prepare("
SELECT wm.id, wm.nik_kk, wm.nama_kk, wm.penghasilan, wm.jumlah_jiwa,
wm.sumber_air, wm.material_dinding, wm.status_verifikasi,
(SELECT GROUP_CONCAT(jb.kode SEPARATOR ', ') FROM bantuan_sosial bs
JOIN jenis_bantuan jb ON jb.id=bs.jenis_bantuan_id
WHERE bs.warga_id=wm.id AND bs.is_aktif=1) AS bantuan
FROM warga_miskin wm
JOIN wilayah w ON w.id = ?
WHERE ST_Contains(w.geom, wm.geom)
ORDER BY wm.nama_kk
");
$stmt->execute([$wid]);
$rows = $stmt->fetchAll();
$miskin = count($rows);
$dibantu = count(array_filter($rows, fn($r) => !empty($r['bantuan'])));
$terverif = count(array_filter($rows, fn($r) => $r['status_verifikasi'] === 'terverifikasi'));
$persen = $w['jumlah_penduduk'] > 0 ? round($miskin / $w['jumlah_penduduk'] * 100, 2) : 0;
$cakupan = $miskin > 0 ? round($dibantu / $miskin * 100, 1) : 0;
if ($format === 'json') {
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => [
'nama' => $w['nama'], 'penduduk' => (int)$w['jumlah_penduduk'],
'miskin' => $miskin, 'dibantu' => $dibantu, 'terverif' => $terverif,
'persen' => $persen, 'cakupan' => $cakupan,
]]);
exit;
}
?>
<!DOCTYPE html><html lang="id"><head><meta charset="UTF-8">
<title>Laporan <?= htmlspecialchars($w['nama']) ?></title>
<style>
body{font-family:Arial,sans-serif;margin:28px;color:#111;}
h2{margin:0 0 2px;} .sub{color:#666;font-size:0.85rem;margin-bottom:16px;}
.kpi{display:flex;gap:12px;margin-bottom:18px;flex-wrap:wrap;}
.kpi .b{border:1px solid #ddd;border-radius:8px;padding:10px 16px;min-width:120px;}
.kpi .n{font-size:1.4rem;font-weight:bold;} .kpi .l{font-size:0.75rem;color:#666;}
table{width:100%;border-collapse:collapse;font-size:0.76rem;}
th,td{border:1px solid #ccc;padding:5px 7px;text-align:left;} th{background:#f1f5f9;}
button{padding:8px 14px;background:#2563EB;color:#fff;border:none;border-radius:6px;cursor:pointer;margin-bottom:14px;}
@media print{button{display:none;}}
</style></head><body>
<button onclick="window.print()">🖨️ Cetak / Simpan PDF</button>
<h2>Laporan Kemiskinan — <?= htmlspecialchars($w['nama']) ?></h2>
<div class="sub">WebGIS Pemetaan Kemiskinan · dicetak <?= date('d M Y H:i') ?></div>
<div class="kpi">
<div class="b"><div class="n"><?= $miskin ?></div><div class="l">Rumah Tangga Miskin</div></div>
<div class="b"><div class="n"><?= $persen ?>%</div><div class="l">dari <?= (int)$w['jumlah_penduduk'] ?> KK</div></div>
<div class="b"><div class="n"><?= $cakupan ?>%</div><div class="l">Cakupan Bantuan</div></div>
<div class="b"><div class="n"><?= $terverif ?></div><div class="l">Terverifikasi</div></div>
</div>
<table>
<thead><tr><th>#</th><th>NIK</th><th>Nama KK</th><th>Jiwa</th><th>Penghasilan</th><th>Sumber Air</th><th>Dinding</th><th>Bantuan</th><th>Verifikasi</th></tr></thead>
<tbody>
<?php foreach ($rows as $i => $r): ?>
<tr>
<td><?= $i+1 ?></td>
<td><?= htmlspecialchars($r['nik_kk'] ?: '-') ?></td>
<td><?= htmlspecialchars($r['nama_kk']) ?></td>
<td><?= $r['jumlah_jiwa'] ?: '-' ?></td>
<td>Rp <?= number_format($r['penghasilan'],0,',','.') ?></td>
<td><?= htmlspecialchars($r['sumber_air'] ?: '-') ?></td>
<td><?= htmlspecialchars($r['material_dinding'] ?: '-') ?></td>
<td><?= htmlspecialchars($r['bantuan'] ?: '-') ?></td>
<td><?= htmlspecialchars($r['status_verifikasi']) ?></td>
</tr>
<?php endforeach; ?>
<?php if (!$rows): ?><tr><td colspan="9" style="text-align:center;padding:20px;">Tidak ada data di wilayah ini.</td></tr><?php endif; ?>
</tbody>
</table>
</body></html>