Files
2026-06-09 19:36:57 +07:00

215 lines
7.7 KiB
PHP

<?php
// ============================================================
// API: Histori Bantuan
// GET: publik | POST: admin+pengurus | DELETE: admin
// ============================================================
require_once __DIR__ . '/config.php';
$method = $_SERVER['REQUEST_METHOD'];
// Blokir aksi tulis walikota
blockWalikotaWrite();
// Helper: format angka ke Rupiah Indonesia
function formatRupiah(int $nominal): string {
return 'Rp ' . number_format($nominal, 0, ',', '.');
}
// ── GET: Ambil histori bantuan ──────────────────────────────
if ($method === 'GET') {
$kk_id = isset($_GET['kk_id']) ? (int)$_GET['kk_id'] : null;
$jenis = clean($_GET['jenis_bantuan'] ?? '');
$sumber = clean($_GET['sumber_dana'] ?? '');
$tahun = isset($_GET['tahun']) ? (int)$_GET['tahun'] : null;
// ── Mode BULK: filter per jenis atau sumber (untuk drilldown walikota) ──
if (!$kk_id && ($jenis || $sumber)) {
requireRole(['admin', 'walikota']);
$sql = "
SELECT hb.*, km.nama_kepala_keluarga, km.kecamatan, km.nik, km.alamat AS alamat_kk,
u.nama AS nama_penanggung_jawab
FROM histori_bantuan hb
JOIN keluarga_miskin km ON hb.kk_id = km.id
LEFT JOIN users u ON hb.penanggung_jawab = u.id
WHERE 1=1
";
$params = [];
if ($jenis) { $sql .= " AND hb.jenis_bantuan = ?"; $params[] = $jenis; }
if ($sumber) { $sql .= " AND hb.sumber_dana = ?"; $params[] = $sumber; }
if ($tahun) { $sql .= " AND YEAR(hb.tanggal_penyaluran) = ?"; $params[] = $tahun; }
$sql .= " ORDER BY hb.tanggal_penyaluran DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
$totalNominal = 0;
foreach ($rows as &$r) {
$r['nominal_formatted'] = formatRupiah((int)$r['nominal']);
$totalNominal += (int)$r['nominal'];
}
unset($r);
jsonResponse($rows, count($rows) . ' data bantuan ditemukan.', true, 200, [
'total_nominal' => $totalNominal,
'total_nominal_formatted' => formatRupiah($totalNominal),
]);
}
// ── Mode PER-KK (existing) ──────────────────────────────
if (!$kk_id) {
jsonResponse(null, 'Parameter kk_id wajib diisi.', false, 400);
}
$stmt = $pdo->prepare("
SELECT hb.*,
u.nama AS nama_penanggung_jawab
FROM histori_bantuan hb
LEFT JOIN users u ON hb.penanggung_jawab = u.id
WHERE hb.kk_id = ?
ORDER BY hb.tanggal_penyaluran DESC
");
$stmt->execute([$kk_id]);
$rows = $stmt->fetchAll();
foreach ($rows as &$r) {
$r['nominal_formatted'] = formatRupiah((int)$r['nominal']);
}
unset($r);
$stmtTotal = $pdo->prepare("SELECT COALESCE(SUM(nominal), 0) AS total FROM histori_bantuan WHERE kk_id = ?");
$stmtTotal->execute([$kk_id]);
$totalNominal = (int)$stmtTotal->fetch()['total'];
jsonResponse($rows, 'Histori bantuan untuk KK ID ' . $kk_id . '.', true, 200, [
'total_bantuan' => $totalNominal,
'total_bantuan_formatted' => formatRupiah($totalNominal),
]);
}
// ── POST: Tambah histori bantuan (admin + pengurus) ──────────
if ($method === 'POST') {
$user = requireRole(['admin', 'pengurus']);
$body = json_decode(file_get_contents('php://input'), true) ?? [];
$kk_id = (int)($body['kk_id'] ?? 0);
$jenis_bantuan = clean($body['jenis_bantuan'] ?? '');
$nominal = (int)($body['nominal'] ?? 0);
$keterangan = clean($body['keterangan'] ?? '');
$tanggal_penyaluran = clean($body['tanggal_penyaluran'] ?? '');
$sumber_dana = clean($body['sumber_dana'] ?? 'APBD');
if (!$kk_id || !$jenis_bantuan || !$tanggal_penyaluran) {
jsonResponse(null, 'KK ID, jenis bantuan, dan tanggal penyaluran wajib diisi.', false, 400);
}
if ($nominal < 0) {
jsonResponse(null, 'Nominal tidak boleh negatif.', false, 400);
}
// Validasi jenis_bantuan
$validJenis = ['PKH', 'BPNT/Sembako', 'Beras Bansos', 'KIS-PBI', 'Bansos Tunai Pemkot', 'Rutilahu', 'PMT Stunting', 'CSR Swasta', 'Lainnya'];
if (!in_array($jenis_bantuan, $validJenis)) {
jsonResponse(null, 'Jenis bantuan tidak valid.', false, 400);
}
// Validasi sumber_dana
$validSumber = ['APBN', 'APBD', 'CSR', 'Lainnya'];
if (!in_array($sumber_dana, $validSumber)) {
jsonResponse(null, 'Sumber dana tidak valid.', false, 400);
}
// Cek apakah KK ada
$stmt = $pdo->prepare("SELECT id, rumah_ibadah_id FROM keluarga_miskin WHERE id = ? LIMIT 1");
$stmt->execute([$kk_id]);
$kk = $stmt->fetch();
if (!$kk) {
jsonResponse(null, 'Data keluarga miskin tidak ditemukan.', false, 404);
}
// Pengurus hanya bisa tambah bantuan untuk KK binaan miliknya
if ($user['role'] === 'pengurus') {
if ((int)($kk['rumah_ibadah_id'] ?? 0) !== (int)$user['rumah_ibadah_id']) {
jsonResponse(null, 'Anda hanya dapat menambah bantuan untuk KK binaan rumah ibadah Anda.', false, 403);
}
}
// Cek duplikasi bantuan: PKH, BPNT/Sembako, Beras Bansos
$duplikasiWarning = false;
$bantuanPrioritas = ['PKH', 'BPNT/Sembako', 'Beras Bansos'];
if (in_array($jenis_bantuan, $bantuanPrioritas)) {
$placeholders = implode(',', array_fill(0, count($bantuanPrioritas), '?'));
$stmt = $pdo->prepare("
SELECT COUNT(*) AS cnt
FROM histori_bantuan
WHERE kk_id = ? AND jenis_bantuan IN ({$placeholders})
");
$stmt->execute(array_merge([$kk_id], $bantuanPrioritas));
$cnt = (int)$stmt->fetch()['cnt'];
if ($cnt > 0) {
$duplikasiWarning = true;
}
}
// Tentukan penanggung_jawab
$penanggungJawab = $user['id'];
if ($penanggungJawab === 0) {
$stAdmin = $pdo->query("SELECT id FROM users WHERE role = 'admin' LIMIT 1");
$admin = $stAdmin->fetch();
$penanggungJawab = $admin ? (int)$admin['id'] : 1;
}
// Simpan bantuan
$stmt = $pdo->prepare("
INSERT INTO histori_bantuan
(kk_id, jenis_bantuan, nominal, keterangan, tanggal_penyaluran, sumber_dana, penanggung_jawab)
VALUES (?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
$kk_id, $jenis_bantuan, $nominal,
$keterangan ?: null,
$tanggal_penyaluran, $sumber_dana, $penanggungJawab,
]);
$newId = (int)$pdo->lastInsertId();
$message = 'Histori bantuan berhasil ditambahkan.';
if ($duplikasiWarning) {
$message .= ' PERHATIAN: KK ini sudah memiliki bantuan serupa (PKH/BPNT/Beras Bansos).';
}
jsonResponse(
['id' => $newId],
$message,
true,
200,
['duplikasi_warning' => $duplikasiWarning]
);
}
// ── DELETE: Hapus histori bantuan (admin only) ───────────────
if ($method === 'DELETE') {
$user = requireRole(['admin']);
$id = (int)($_GET['id'] ?? 0);
if (!$id) {
jsonResponse(null, 'ID histori bantuan wajib diisi.', false, 400);
}
$stmt = $pdo->prepare("DELETE FROM histori_bantuan WHERE id = ?");
$stmt->execute([$id]);
if ($stmt->rowCount() === 0) {
jsonResponse(null, 'Data histori bantuan tidak ditemukan.', false, 404);
}
jsonResponse(null, 'Histori bantuan berhasil dihapus.');
}
// ── Method tidak didukung ────────────────────────────────────
jsonResponse(null, 'Method tidak didukung.', false, 405);