Files
WebGIS-Project/webgis-v3/api/controllers/DashboardController.php
T
2026-06-10 19:48:00 +07:00

81 lines
3.7 KiB
PHP

<?php
// api/controllers/DashboardController.php
class DashboardController {
public function index(): void {
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
$db = getDB();
// Ringkasan utama
$stat = $db->query(
"SELECT
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup') AS total_penduduk,
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='miskin') AS total_miskin,
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='rentan') AS total_rentan,
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='mampu') AS total_mampu,
(SELECT COUNT(*) FROM keluarga) AS total_kk,
(SELECT COUNT(*) FROM rumah_ibadah WHERE aktif=1) AS total_ri,
(SELECT COUNT(*) FROM laporan WHERE status='pending') AS laporan_pending,
(SELECT COUNT(*) FROM laporan WHERE urgensi='darurat' AND status NOT IN('selesai')) AS laporan_darurat,
(SELECT COUNT(DISTINCT nik) FROM histori_bantuan WHERE status_penyaluran='disalurkan') AS sudah_dibantu,
(SELECT COUNT(*) FROM histori_bantuan WHERE MONTH(tanggal)=MONTH(CURDATE()) AND YEAR(tanggal)=YEAR(CURDATE())) AS bantuan_bulan_ini"
)->fetch();
// Sebaran per kecamatan
$kec = $db->query(
"SELECT k.kecamatan,
COUNT(DISTINCT k.id) AS jumlah_kk,
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
FROM keluarga k GROUP BY k.kecamatan ORDER BY miskin DESC"
)->fetchAll();
// Trend bantuan 6 bulan
$trend = $db->query(
"SELECT DATE_FORMAT(tanggal,'%Y-%m') AS bulan, COUNT(*) AS jumlah
FROM histori_bantuan
WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY bulan ORDER BY bulan"
)->fetchAll();
// Belum pernah dibantu (miskin)
$belum = $db->query(
"SELECT COUNT(*) AS c FROM penduduk p
WHERE p.status_ekonomi IN ('miskin','rentan')
AND p.status_hidup='hidup'
AND NOT EXISTS (SELECT 1 FROM histori_bantuan hb WHERE hb.nik=p.nik AND hb.status_penyaluran='disalurkan')"
)->fetch()['c'];
// Prioritas darurat
$prioritas = $db->query(
"SELECT * FROM v_prioritas_bantuan
WHERE level_prioritas IN ('SANGAT TINGGI','TINGGI')
LIMIT 10"
)->fetchAll();
// Beban per RI
$bebanRI = $db->query(
"SELECT ri.nama, ri.jenis,
COUNT(DISTINCT k.id) AS jumlah_kk,
SUM(CASE WHEN k.status_ekonomi='miskin' THEN 1 ELSE 0 END) AS kk_miskin
FROM rumah_ibadah ri
LEFT JOIN keluarga k ON k.id_rumah_ibadah=ri.id
WHERE ri.aktif=1
GROUP BY ri.id ORDER BY kk_miskin DESC"
)->fetchAll();
jsonSuccess([
'statistik' => $stat,
'sebaran_kecamatan' => $kec,
'trend_bantuan' => $trend,
'belum_dibantu' => (int)$belum,
'prioritas_darurat' => $prioritas,
'beban_per_ri' => $bebanRI,
]);
}
public function show(string $id): void { jsonError('Not implemented', 501); }
public function store(): void { jsonError('Not implemented', 501); }
public function update(string $id): void { jsonError('Not implemented', 501); }
public function destroy(string $id): void { jsonError('Not implemented', 501); }
}