query("SELECT COUNT(*) FROM warga_miskin")->fetchColumn(); $dibantu = (int)$pdo->query("SELECT COUNT(DISTINCT warga_id) FROM bantuan_sosial WHERE is_aktif=1")->fetchColumn(); $terverif = (int)$pdo->query("SELECT COUNT(*) FROM warga_miskin WHERE status_verifikasi='terverifikasi'")->fetchColumn(); $cakupan = $total > 0 ? round($dibantu / $total * 100, 1) : 0; // Zona prioritas (skor sama dgn api/zona_prioritas) $zrows = $pdo->query(" SELECT w.nama, w.jumlah_penduduk, COUNT(DISTINCT wm.id) AS miskin, COUNT(DISTINCT CASE WHEN bs.id IS NOT NULL THEN wm.id END) AS dibantu FROM wilayah w LEFT JOIN warga_miskin wm ON ST_Contains(w.geom, wm.geom) LEFT JOIN bantuan_sosial bs ON bs.warga_id=wm.id AND bs.is_aktif=1 GROUP BY w.id ")->fetchAll(); $zona = []; foreach ($zrows as $r) { $m = (int)$r['miskin']; $p = (int)$r['jumlah_penduduk']; $persen = $p > 0 ? round($m/$p*100,2) : 0; $cak = $m > 0 ? round($r['dibantu']/$m*100,1) : 0; $gap = $m > 0 ? (100-$cak) : 0; $skor = round($persen*2 + $gap*0.2 + $m*1, 1); $level = $skor > 35 ? 'Tinggi' : ($skor > 20 ? 'Sedang' : 'Rendah'); $zona[] = ['nama'=>$r['nama'],'skor'=>$skor,'level'=>$level,'persen'=>$persen,'cakupan'=>$cak]; } usort($zona, fn($a,$b)=>$b['skor']<=>$a['skor']); $zonaTinggi = count(array_filter($zona, fn($z)=>$z['level']==='Tinggi')); $pageTitle = 'Dashboard Eksekutif'; $activeNav = 'dashboard'; $extraHead = ''; require_once __DIR__ . '/partials/header.php'; ?>
Total RT Miskin
kelurahan
Cakupan Bantuan
%
RT dibantu
Terverifikasi
dari data
Zona Prioritas Tinggi
kelurahan

Cakupan Bantuan

Penerima per Jenis Bantuan

Tren 12 Bulan

Komparatif Kelurahan (radar)

๐Ÿ† Zona Prioritas Teratas

$z): $c=['Tinggi'=>'#EF4444','Sedang'=>'#FB923C','Rendah'=>'#10B981'][$z['level']]; ?>
#
% miskin % ยท cakupan %
Skor ยท

Tindak Lanjut

Buka Analisis Spasial Laporan & Cetak Peta Interaktif