query("SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup'")->fetchColumn(); $totalKeluarga = (int)$db->query("SELECT COUNT(*) FROM keluarga")->fetchColumn(); $totalMiskin = (int)$db->query("SELECT COUNT(*) FROM penduduk WHERE status_ekonomi='miskin' AND status_hidup='hidup'")->fetchColumn(); $totalRentan = (int)$db->query("SELECT COUNT(*) FROM penduduk WHERE status_ekonomi='rentan' AND status_hidup='hidup'")->fetchColumn(); $totalMampu = (int)$db->query("SELECT COUNT(*) FROM penduduk WHERE status_ekonomi='mampu' AND status_hidup='hidup'")->fetchColumn(); $totalLaporan = (int)$db->query("SELECT COUNT(*) FROM laporan WHERE status != 'selesai'")->fetchColumn(); $laporanDarurat= (int)$db->query("SELECT COUNT(*) FROM laporan WHERE urgensi='darurat' AND status NOT IN ('selesai')")->fetchColumn(); $totalBantuan = (int)$db->query("SELECT COUNT(*) FROM histori_bantuan WHERE status='disalurkan'")->fetchColumn(); $belumBantuan = (int)$db->query("SELECT COUNT(*) FROM penduduk WHERE status_ekonomi IN ('miskin','rentan') AND status_hidup='hidup' AND id NOT IN (SELECT DISTINCT penduduk_id FROM histori_bantuan WHERE status='disalurkan')")->fetchColumn(); $unreadChat = (int)$db->query("SELECT COUNT(*) FROM chat WHERE dibaca=0")->fetchColumn(); // Distribusi ekonomi per kelurahan $byKelurahan = $db->query("SELECT k.kelurahan, SUM(CASE WHEN k.status_ekonomi='miskin' THEN 1 ELSE 0 END) as miskin, SUM(CASE WHEN k.status_ekonomi='rentan' THEN 1 ELSE 0 END) as rentan, SUM(CASE WHEN k.status_ekonomi='mampu' THEN 1 ELSE 0 END) as mampu, COUNT(*) as total FROM keluarga k GROUP BY k.kelurahan ORDER BY miskin DESC LIMIT 10")->fetchAll(); // Distribusi bantuan per jenis $byBantuan = $db->query("SELECT b.nama, b.jenis, COUNT(hb.id) as total_disalurkan FROM bantuan b LEFT JOIN histori_bantuan hb ON hb.bantuan_id=b.id AND hb.status='disalurkan' GROUP BY b.id ORDER BY total_disalurkan DESC")->fetchAll(); // Distribusi per rumah ibadah $byRI = $db->query("SELECT ri.nama, ri.jenis, ri.lat, ri.lng, COUNT(DISTINCT k.id) as jumlah_kk, SUM(CASE WHEN k.status_ekonomi='miskin' THEN 1 ELSE 0 END) as kk_miskin, (SELECT COUNT(*) FROM v_penduduk p JOIN keluarga k2 ON k2.id=p.keluarga_id WHERE k2.rumah_ibadah_id=ri.id AND p.status_hidup='hidup') as jumlah_jiwa FROM rumah_ibadah ri LEFT JOIN keluarga k ON k.rumah_ibadah_id=ri.id GROUP BY ri.id ORDER BY kk_miskin DESC")->fetchAll(); // Profil umur $byUmur = $db->query("SELECT profil_umur, COUNT(*) as jumlah FROM v_penduduk WHERE status_hidup='hidup' GROUP BY profil_umur")->fetchAll(); // Laporan per status $byLaporan = $db->query("SELECT status, urgensi, COUNT(*) as jumlah FROM laporan GROUP BY status, urgensi ORDER BY FIELD(urgensi,'darurat','tinggi','sedang','rendah')")->fetchAll(); // GeoJSON penduduk untuk peta $geoRows = $db->query("SELECT p.id, p.nik, p.nama, p.umur, p.profil_umur, p.status_ekonomi, p.kondisi_kesehatan, p.penghasilan, k.kelurahan, k.lat, k.lng, k.no_kk, (SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id=p.id AND hb.status='disalurkan') as total_bantuan FROM v_penduduk p JOIN keluarga k ON k.id=p.keluarga_id WHERE p.status_hidup='hidup' AND k.lat IS NOT NULL AND k.lng IS NOT NULL LIMIT 1000")->fetchAll(); $features = []; foreach ($geoRows as $r) { $features[] = [ 'type' => 'Feature', 'geometry' => ['type'=>'Point','coordinates'=>[(float)$r['lng'],(float)$r['lat']]], 'properties' => $r ]; } // GeoJSON laporan untuk peta $laporanRows = $db->query("SELECT id,deskripsi,lat,lng,urgensi,status,created_at,foto FROM laporan WHERE lat IS NOT NULL AND lng IS NOT NULL")->fetchAll(); $laporanFeatures = []; foreach ($laporanRows as $r) { $laporanFeatures[] = [ 'type' => 'Feature', 'geometry' => ['type'=>'Point','coordinates'=>[(float)$r['lng'],(float)$r['lat']]], 'properties' => $r ]; } jsonOk([ 'kpi' => [ 'total_penduduk' => $totalPenduduk, 'total_keluarga' => $totalKeluarga, 'total_miskin' => $totalMiskin, 'total_rentan' => $totalRentan, 'total_mampu' => $totalMampu, 'total_laporan_aktif' => $totalLaporan, 'laporan_darurat' => $laporanDarurat, 'total_bantuan_disalurkan' => $totalBantuan, 'belum_dapat_bantuan' => $belumBantuan, 'unread_chat' => $unreadChat, 'pct_miskin' => $totalPenduduk ? round($totalMiskin/$totalPenduduk*100,1) : 0, ], 'by_kelurahan' => $byKelurahan, 'by_bantuan' => $byBantuan, 'by_ri' => $byRI, 'by_umur' => $byUmur, 'by_laporan' => $byLaporan, 'geojson_penduduk' => ['type'=>'FeatureCollection','features'=>$features], 'geojson_laporan' => ['type'=>'FeatureCollection','features'=>$laporanFeatures], ]);