97 lines
4.9 KiB
PHP
97 lines
4.9 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../config.php';
|
|
requireLogin();
|
|
$db = getDB();
|
|
|
|
// KPI Utama
|
|
$totalPenduduk = (int)$db->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],
|
|
]);
|