Files
2026-06-10 21:46:56 +07:00

168 lines
8.0 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// api/bantuan.php v2.0
// ============================================================
// API Bantuan Sosial CRUD jenis bantuan & relasi penduduk
// ============================================================
require_once __DIR__ . '/../includes/config.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
$method = $_SERVER['REQUEST_METHOD'];
$db = getDB();
$action = $_GET['action'] ?? 'pivot'; // 'jenis' | 'pivot'
switch ($method) {
// ════════════════════════════════════════════════════════
// GET
// ════════════════════════════════════════════════════════
case 'GET':
// GET jenis_bantuan (master)
if ($action === 'jenis') {
$rows = $db->query("SELECT * FROM jenis_bantuan ORDER BY kode")->fetchAll();
jsonResponse(['success' => true, 'data' => $rows]);
}
// GET bantuan per penduduk
$pendudukId = $_GET['penduduk_id'] ?? null;
if (!$pendudukId) jsonResponse(['success' => false, 'error' => 'penduduk_id diperlukan'], 400);
$stmt = $db->prepare("
SELECT bp.*, jb.kode, jb.nama AS nama_bantuan, jb.warna_badge, jb.deskripsi
FROM bantuan_penduduk bp
JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id
WHERE bp.penduduk_id = ?
ORDER BY jb.kode
");
$stmt->execute([$pendudukId]);
jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]);
break;
// ════════════════════════════════════════════════════════
// POST Tambah/set bantuan untuk penduduk
// ════════════════════════════════════════════════════════
case 'POST':
$in = getInput();
// Batch upsert terima array bantuans[]
if (isset($in['bantuans']) && is_array($in['bantuans'])) {
$pendudukId = (int)($in['penduduk_id'] ?? 0);
if (!$pendudukId) jsonResponse(['success' => false, 'error' => 'penduduk_id diperlukan'], 400);
// Nonaktifkan semua bantuan lama dulu
$db->prepare("UPDATE bantuan_penduduk SET status = 'tidak_aktif' WHERE penduduk_id = ?")
->execute([$pendudukId]);
foreach ($in['bantuans'] as $b) {
$bantuanId = (int)($b['bantuan_id'] ?? 0);
if (!$bantuanId) continue;
// Cek sudah ada?
$cek = $db->prepare("SELECT id FROM bantuan_penduduk WHERE penduduk_id = ? AND bantuan_id = ?");
$cek->execute([$pendudukId, $bantuanId]);
$existing = $cek->fetch();
if ($existing) {
$db->prepare("
UPDATE bantuan_penduduk
SET status = 'aktif', tanggal_mulai = ?, nominal_bulanan = ?,
nomor_kpj = ?, keterangan = ?, diinput_oleh = ?
WHERE penduduk_id = ? AND bantuan_id = ?
")->execute([
$b['tanggal_mulai'] ?? null,
$b['nominal_bulanan'] ?? null,
$b['nomor_kpj'] ?? null,
$b['keterangan'] ?? null,
$b['diinput_oleh'] ?? 1,
$pendudukId, $bantuanId,
]);
} else {
$db->prepare("
INSERT INTO bantuan_penduduk
(penduduk_id, bantuan_id, status, tanggal_mulai, nominal_bulanan, nomor_kpj, keterangan, diinput_oleh)
VALUES (?,?,'aktif',?,?,?,?,?)
")->execute([
$pendudukId, $bantuanId,
$b['tanggal_mulai'] ?? null,
$b['nominal_bulanan'] ?? null,
$b['nomor_kpj'] ?? null,
$b['keterangan'] ?? null,
$b['diinput_oleh'] ?? 1,
]);
}
}
jsonResponse(['success' => true, 'message' => 'Data bantuan berhasil disimpan']);
}
// Single insert
$required = ['penduduk_id','bantuan_id'];
foreach ($required as $f) {
if (empty($in[$f])) jsonResponse(['success' => false, 'error' => "Field '$f' wajib diisi"], 400);
}
// Upsert
$cek = $db->prepare("SELECT id FROM bantuan_penduduk WHERE penduduk_id = ? AND bantuan_id = ?");
$cek->execute([(int)$in['penduduk_id'], (int)$in['bantuan_id']]);
if ($cek->fetch()) {
jsonResponse(['success' => false, 'error' => 'Bantuan ini sudah tercatat untuk penduduk tersebut. Gunakan PUT untuk update.'], 409);
}
$db->prepare("
INSERT INTO bantuan_penduduk (penduduk_id, bantuan_id, status, tanggal_mulai, nominal_bulanan, nomor_kpj, keterangan, diinput_oleh)
VALUES (?,?,?,?,?,?,?,?)
")->execute([
(int)$in['penduduk_id'],
(int)$in['bantuan_id'],
$in['status'] ?? 'aktif',
$in['tanggal_mulai'] ?? null,
$in['nominal_bulanan'] ?? null,
$in['nomor_kpj'] ?? null,
$in['keterangan'] ?? null,
$in['diinput_oleh'] ?? 1,
]);
jsonResponse(['success' => true, 'id' => $db->lastInsertId(), 'message' => 'Bantuan berhasil ditambahkan']);
break;
// ════════════════════════════════════════════════════════
// PUT Update status bantuan
// ════════════════════════════════════════════════════════
case 'PUT':
$in = getInput();
$id = (int)($in['id'] ?? $_GET['id'] ?? 0);
if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400);
$db->prepare("
UPDATE bantuan_penduduk
SET status = ?, tanggal_mulai = ?, tanggal_selesai = ?,
nominal_bulanan = ?, nomor_kpj = ?, keterangan = ?
WHERE id = ?
")->execute([
$in['status'] ?? 'aktif',
$in['tanggal_mulai'] ?? null,
$in['tanggal_selesai'] ?? null,
$in['nominal_bulanan'] ?? null,
$in['nomor_kpj'] ?? null,
$in['keterangan'] ?? null,
$id,
]);
jsonResponse(['success' => true, 'message' => 'Status bantuan diperbarui']);
break;
// ════════════════════════════════════════════════════════
// DELETE Hapus relasi bantuan
// ════════════════════════════════════════════════════════
case 'DELETE':
$id = (int)($_GET['id'] ?? getInput()['id'] ?? 0);
if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400);
$db->prepare("DELETE FROM bantuan_penduduk WHERE id = ?")->execute([$id]);
jsonResponse(['success' => true, 'message' => 'Bantuan dihapus']);
break;
default:
jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405);
}