81 lines
3.7 KiB
PHP
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); }
|
|
}
|