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);