215 lines
7.7 KiB
PHP
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);
|