168 lines
8.0 KiB
PHP
168 lines
8.0 KiB
PHP
<?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);
|
||
}
|