prepare("SELECT hb.*, b.nama as bantuan_nama, b.jenis, b.satuan, b.sumber, u.nama_lengkap as disalurkan_nama FROM histori_bantuan hb JOIN bantuan b ON b.id=hb.bantuan_id LEFT JOIN user u ON u.id=hb.disalurkan_oleh WHERE hb.penduduk_id=? ORDER BY hb.tanggal DESC"); $st->execute([$pid]); jsonOk($st->fetchAll()); } if ($method === 'POST') { requireRole(['superadmin','pengurus']); $b = json_decode(file_get_contents('php://input'), true); $pid = (int)($b['penduduk_id'] ?? 0); $bid = (int)($b['bantuan_id'] ?? 0); if (!$pid || !$bid) jsonErr('penduduk_id dan bantuan_id wajib.'); $db->prepare("INSERT INTO histori_bantuan (penduduk_id,bantuan_id,disalurkan_oleh,tanggal,jumlah,status,catatan) VALUES (?,?,?,?,?,?,?)") ->execute([$pid,$bid,$user['id'],$b['tanggal']??date('Y-m-d'),(float)($b['jumlah']??1),$b['status']??'disalurkan',sanitize($b['catatan']??'')]); $newId=(int)$db->lastInsertId(); log_aksi($user['id'],'CREATE','histori_bantuan',$newId,"Catat bantuan penduduk_id:$pid bantuan_id:$bid"); jsonOk(['id'=>$newId],'Histori bantuan dicatat.'); } if ($method === 'PUT') { requireRole(['superadmin','pengurus']); if (!$id) jsonErr('ID tidak valid.'); $b = json_decode(file_get_contents('php://input'), true); $db->prepare("UPDATE histori_bantuan SET status=?,catatan=? WHERE id=?") ->execute([$b['status']??'disalurkan',sanitize($b['catatan']??''),$id]); jsonOk(null,'Status bantuan diperbarui.'); } jsonErr('Method tidak didukung.', 405); } // ── PRIORITAS OTOMATIS ── if ($action === 'prioritas') { $st = $db->query(" SELECT p.id, p.nik, p.nama, p.umur, p.profil_umur, p.kondisi_kesehatan, p.status_ekonomi, p.penghasilan, p.status_perkawinan, k.alamat, k.kelurahan, k.lat, k.lng, (SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id=p.id AND hb.status='disalurkan') as total_bantuan, CASE WHEN p.status_ekonomi='miskin' AND p.kondisi_kesehatan IN ('sakit_berat','disabilitas') THEN 'SANGAT TINGGI' WHEN p.profil_umur='Lansia' AND p.status_perkawinan IN ('cerai_mati','cerai_hidup') THEN 'SANGAT TINGGI' WHEN p.status_ekonomi='miskin' AND p.kondisi_kesehatan='sakit_ringan' THEN 'TINGGI' WHEN p.status_ekonomi='miskin' AND p.profil_umur='Lansia' THEN 'TINGGI' WHEN p.status_ekonomi='miskin' THEN 'SEDANG' WHEN p.status_ekonomi='rentan' AND p.kondisi_kesehatan != 'sehat' THEN 'SEDANG' ELSE 'RENDAH' END as prioritas FROM v_penduduk p JOIN keluarga k ON k.id=p.keluarga_id WHERE p.status_hidup='hidup' ORDER BY FIELD(prioritas,'SANGAT TINGGI','TINGGI','SEDANG','RENDAH'), total_bantuan ASC LIMIT 100 "); jsonOk($st->fetchAll()); } // ── BELUM TERIMA BANTUAN ── if ($action === 'belum_terima') { $st = $db->query(" SELECT p.id, p.nik, p.nama, p.umur, p.profil_umur, p.status_ekonomi, p.kondisi_kesehatan, k.kelurahan, k.alamat, k.lat, k.lng FROM v_penduduk p JOIN keluarga k ON k.id=p.keluarga_id WHERE p.status_hidup='hidup' AND p.status_ekonomi IN ('miskin','rentan') AND p.id NOT IN (SELECT DISTINCT penduduk_id FROM histori_bantuan WHERE status='disalurkan') ORDER BY p.status_ekonomi DESC, p.umur DESC "); jsonOk($st->fetchAll()); } // ── CRUD MASTER BANTUAN ── switch ($method) { case 'GET': if ($id) { $st = $db->prepare("SELECT * FROM bantuan WHERE id=?"); $st->execute([$id]); jsonOk($st->fetch()); } jsonOk($db->query("SELECT * FROM bantuan ORDER BY nama")->fetchAll()); break; case 'POST': requireRole(['superadmin','pengurus']); $b = json_decode(file_get_contents('php://input'), true); $db->prepare("INSERT INTO bantuan (nama,jenis,sumber,satuan,nilai_per_satuan,periode) VALUES (?,?,?,?,?,?)") ->execute([sanitize($b['nama']??''),$b['jenis']??'lainnya',sanitize($b['sumber']??''),sanitize($b['satuan']??''),(float)($b['nilai_per_satuan']??0),$b['periode']??'sekali']); jsonOk(['id'=>(int)$db->lastInsertId()],'Bantuan ditambahkan.'); break; case 'PUT': requireRole(['superadmin','pengurus']); if (!$id) jsonErr('ID tidak valid.'); $b = json_decode(file_get_contents('php://input'), true); $db->prepare("UPDATE bantuan SET nama=?,jenis=?,sumber=?,satuan=?,nilai_per_satuan=?,periode=?,aktif=? WHERE id=?") ->execute([sanitize($b['nama']??''),$b['jenis']??'lainnya',sanitize($b['sumber']??''),sanitize($b['satuan']??''),(float)($b['nilai_per_satuan']??0),$b['periode']??'sekali',(int)($b['aktif']??1),$id]); jsonOk(null,'Bantuan diperbarui.'); break; default: jsonErr('Method tidak didukung.', 405); }