149 lines
5.6 KiB
PHP
149 lines
5.6 KiB
PHP
<?php
|
|
// ============================================================
|
|
// API: Dashboard Walikota — Data agregasi read-only
|
|
// GET: walikota + admin only
|
|
// ============================================================
|
|
require_once __DIR__ . '/config.php';
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
|
|
if ($method !== 'GET') {
|
|
jsonResponse(null, 'Hanya metode GET yang didukung.', false, 405);
|
|
}
|
|
|
|
$user = requireRole(['admin', 'walikota']);
|
|
|
|
$tahun = isset($_GET['tahun']) ? (int)$_GET['tahun'] : (int)date('Y');
|
|
|
|
// ── 1. Total KK per kecamatan ─────────────────────────────────
|
|
$stmt = $pdo->query("
|
|
SELECT kecamatan, COUNT(*) AS jumlah
|
|
FROM keluarga_miskin
|
|
GROUP BY kecamatan
|
|
ORDER BY FIELD(kecamatan,
|
|
'Pontianak Utara','Pontianak Selatan','Pontianak Timur',
|
|
'Pontianak Barat','Pontianak Tenggara','Pontianak Kota')
|
|
");
|
|
$kkPerKecamatan = $stmt->fetchAll();
|
|
|
|
// ── 2. KK yang SUDAH dapat bantuan tahun ini (dari histori_bantuan) ──
|
|
$stmt = $pdo->prepare("
|
|
SELECT COUNT(DISTINCT kk_id) AS jumlah
|
|
FROM histori_bantuan
|
|
WHERE YEAR(tanggal_penyaluran) = ?
|
|
");
|
|
$stmt->execute([$tahun]);
|
|
$kkSudahBantuan = (int)$stmt->fetch()['jumlah'];
|
|
|
|
// ── 3. Total KK ───────────────────────────────────────────────
|
|
$stmt = $pdo->query("SELECT COUNT(*) AS jumlah FROM keluarga_miskin");
|
|
$totalKK = (int)$stmt->fetch()['jumlah'];
|
|
|
|
$kkBelumBantuan = $totalKK - $kkSudahBantuan;
|
|
|
|
// ── 4. Distribusi status DTKS ────────────────────────────────
|
|
$stmt = $pdo->query("
|
|
SELECT status_dtks, COUNT(*) AS jumlah
|
|
FROM keluarga_miskin
|
|
GROUP BY status_dtks
|
|
");
|
|
$distribusiDtks = $stmt->fetchAll();
|
|
|
|
// ── 5. Distribusi riwayat penyakit ───────────────────────────
|
|
$stmt = $pdo->query("SELECT riwayat_penyakit FROM keluarga_miskin WHERE riwayat_penyakit IS NOT NULL AND riwayat_penyakit != '[]'");
|
|
$penyakitRows = $stmt->fetchAll();
|
|
$penyakitCount = [];
|
|
foreach ($penyakitRows as $row) {
|
|
$arr = json_decode($row['riwayat_penyakit'], true) ?? [];
|
|
foreach ($arr as $p) {
|
|
$penyakitCount[$p] = ($penyakitCount[$p] ?? 0) + 1;
|
|
}
|
|
}
|
|
arsort($penyakitCount);
|
|
// Format jadi array [{ penyakit, jumlah }]
|
|
$distribusiPenyakit = array_map(
|
|
fn($k, $v) => ['penyakit' => $k, 'jumlah' => $v],
|
|
array_keys($penyakitCount),
|
|
array_values($penyakitCount)
|
|
);
|
|
|
|
// ── 6. Laporan belum ditangani ────────────────────────────────
|
|
$stmt = $pdo->query("SELECT COUNT(*) AS jumlah FROM laporan_masyarakat WHERE status = 'Baru'");
|
|
$laporanBaru = (int)$stmt->fetch()['jumlah'];
|
|
|
|
// ── 7. Bantuan tersalurkan tahun ini per sumber dana ─────────
|
|
$stmt = $pdo->prepare("
|
|
SELECT sumber_dana,
|
|
COUNT(*) AS jumlah_entri,
|
|
COUNT(DISTINCT kk_id) AS jumlah_kk,
|
|
COALESCE(SUM(nominal), 0) AS total_nominal
|
|
FROM histori_bantuan
|
|
WHERE YEAR(tanggal_penyaluran) = ?
|
|
GROUP BY sumber_dana
|
|
ORDER BY total_nominal DESC
|
|
");
|
|
$stmt->execute([$tahun]);
|
|
$bantuanPerSumber = $stmt->fetchAll();
|
|
|
|
// Format nominal di setiap baris
|
|
foreach ($bantuanPerSumber as &$b) {
|
|
$b['total_nominal_formatted'] = 'Rp ' . number_format((int)$b['total_nominal'], 0, ',', '.');
|
|
}
|
|
unset($b);
|
|
|
|
// ── 8. Bantuan tersalurkan tahun ini per jenis ───────────────
|
|
$stmt = $pdo->prepare("
|
|
SELECT jenis_bantuan,
|
|
COUNT(*) AS jumlah_entri,
|
|
COUNT(DISTINCT kk_id) AS jumlah_kk,
|
|
COALESCE(SUM(nominal), 0) AS total_nominal
|
|
FROM histori_bantuan
|
|
WHERE YEAR(tanggal_penyaluran) = ?
|
|
GROUP BY jenis_bantuan
|
|
ORDER BY total_nominal DESC
|
|
");
|
|
$stmt->execute([$tahun]);
|
|
$bantuanPerJenis = $stmt->fetchAll();
|
|
|
|
foreach ($bantuanPerJenis as &$b) {
|
|
$b['total_nominal_formatted'] = 'Rp ' . number_format((int)$b['total_nominal'], 0, ',', '.');
|
|
}
|
|
unset($b);
|
|
|
|
// ── 9. Total entri bantuan + total nominal tahun ini ─────────
|
|
$stmt = $pdo->prepare("
|
|
SELECT COUNT(*) AS jumlah, COALESCE(SUM(nominal), 0) AS total_nominal
|
|
FROM histori_bantuan WHERE YEAR(tanggal_penyaluran) = ?
|
|
");
|
|
$stmt->execute([$tahun]);
|
|
$totalRow = $stmt->fetch();
|
|
$totalEntri = (int)$totalRow['jumlah'];
|
|
$totalNominal = (int)$totalRow['total_nominal'];
|
|
$totalNominalFormatted = 'Rp ' . number_format($totalNominal, 0, ',', '.');
|
|
|
|
// ── 10. Distribusi tingkat kemiskinan ────────────────────────
|
|
$stmt = $pdo->query("
|
|
SELECT tingkat_kemiskinan, COUNT(*) AS jumlah
|
|
FROM keluarga_miskin
|
|
GROUP BY tingkat_kemiskinan
|
|
");
|
|
$distribusiKemiskinan = $stmt->fetchAll();
|
|
|
|
// ── Kirim semua data ──────────────────────────────────────────
|
|
jsonResponse([
|
|
'tahun' => $tahun,
|
|
'total_kk' => $totalKK,
|
|
'kk_per_kecamatan' => $kkPerKecamatan,
|
|
'kk_sudah_bantuan' => $kkSudahBantuan,
|
|
'kk_belum_bantuan' => $kkBelumBantuan,
|
|
'distribusi_dtks' => $distribusiDtks,
|
|
'distribusi_penyakit' => $distribusiPenyakit,
|
|
'distribusi_kemiskinan' => $distribusiKemiskinan,
|
|
'laporan_baru' => $laporanBaru,
|
|
'bantuan_per_sumber' => $bantuanPerSumber,
|
|
'bantuan_per_jenis' => $bantuanPerJenis,
|
|
'total_entri_bantuan' => $totalEntri,
|
|
'total_nominal_bantuan' => $totalNominal,
|
|
'total_nominal_formatted'=> $totalNominalFormatted,
|
|
], "Data dashboard tahun $tahun.");
|