first commit
This commit is contained in:
+260
@@ -0,0 +1,260 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/warga.php — CRUD Data Warga (Kepala Keluarga)
|
||||
// GET ?kat=&kel_id=&kec=&status=aktif — list warga
|
||||
// POST — tambah warga
|
||||
// PUT ?id= — update warga
|
||||
// DELETE ?id= — hapus warga
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// ── GET: list warga dengan filter ──────────────────────────
|
||||
if ($method === 'GET') {
|
||||
$where = ["w.status = 'aktif'"];
|
||||
$params = [];
|
||||
|
||||
if ($kat = getParam('kat')) { $where[] = "w.kategori = ?"; $params[] = $kat; }
|
||||
if ($kid = getParam('kel_id')){ $where[] = "w.kelurahan_id = ?"; $params[] = $kid; }
|
||||
if ($kec = getParam('kec')) { $where[] = "k.kecamatan = ?"; $params[] = $kec; }
|
||||
|
||||
$sql = "SELECT w.id, w.nama, w.nik, w.lat, w.lng, w.kategori,
|
||||
w.jumlah_anggota, w.penghasilan, w.tgl_lahir, w.pendidikan,
|
||||
w.keterangan, w.status, w.pelapor, w.no_laporan, w.created_at,
|
||||
k.id AS kelurahan_id, k.nama AS kelurahan, k.kecamatan
|
||||
FROM warga w
|
||||
LEFT JOIN kelurahan k ON w.kelurahan_id = k.id
|
||||
WHERE " . implode(' AND ', $where) . "
|
||||
ORDER BY w.created_at DESC";
|
||||
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$wargaList = $stmt->fetchAll();
|
||||
|
||||
// Ambil anggota & penyakit untuk setiap warga
|
||||
foreach ($wargaList as &$w) {
|
||||
$stmt2 = $db->prepare(
|
||||
"SELECT a.id, a.nama, a.usia, a.hubungan,
|
||||
GROUP_CONCAT(rp.penyakit SEPARATOR ',') AS penyakit_csv
|
||||
FROM anggota_keluarga a
|
||||
LEFT JOIN riwayat_penyakit rp ON rp.anggota_id = a.id
|
||||
WHERE a.warga_id = ?
|
||||
GROUP BY a.id"
|
||||
);
|
||||
$stmt2->execute([$w['id']]);
|
||||
$anggota = $stmt2->fetchAll();
|
||||
foreach ($anggota as &$a) {
|
||||
$a['penyakit'] = $a['penyakit_csv'] ? explode(',', $a['penyakit_csv']) : [];
|
||||
unset($a['penyakit_csv']);
|
||||
}
|
||||
$w['anggota'] = $anggota;
|
||||
|
||||
// Riwayat penyakit KK (dari anggota dengan nama sama / index 0)
|
||||
$rp_kk = [];
|
||||
if (!empty($anggota)) {
|
||||
$rp_kk = $anggota[0]['penyakit'];
|
||||
}
|
||||
$w['riwayat_penyakit'] = $rp_kk;
|
||||
|
||||
// Histori bantuan
|
||||
$stmt3 = $db->prepare(
|
||||
"SELECT id, tanggal, jenis, nominal, sumber_dana AS sumber, keterangan
|
||||
FROM histori_bantuan WHERE warga_id = ? ORDER BY tanggal DESC"
|
||||
);
|
||||
$stmt3->execute([$w['id']]);
|
||||
$w['histori_bantuan'] = $stmt3->fetchAll();
|
||||
}
|
||||
|
||||
jsonOk($wargaList);
|
||||
}
|
||||
|
||||
// ── POST: tambah warga ──────────────────────────────────────
|
||||
if ($method === 'POST') {
|
||||
requireEdit();
|
||||
$d = body();
|
||||
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat lokasi wajib diisi.');
|
||||
if (empty($d['kelurahan_id'])) jsonError('Kelurahan wajib dipilih.');
|
||||
|
||||
$db->beginTransaction();
|
||||
try {
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO warga (nama, nik, kelurahan_id, lat, lng, kategori, jumlah_anggota,
|
||||
penghasilan, tgl_lahir, pendidikan, keterangan, pelapor, no_laporan)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'],
|
||||
$d['nik'] ?? null,
|
||||
$d['kelurahan_id'],
|
||||
$d['lat'],
|
||||
$d['lng'],
|
||||
$d['kategori'] ?? 'miskin',
|
||||
$d['jumlah_anggota'] ?? 1,
|
||||
$d['penghasilan'] ?? 0,
|
||||
!empty($d['tgl_lahir']) ? $d['tgl_lahir'] : null,
|
||||
$d['pendidikan'] ?? '',
|
||||
$d['keterangan'] ?? '',
|
||||
$d['pelapor'] ?? null,
|
||||
$d['no_laporan'] ?? null,
|
||||
]);
|
||||
$wargaId = $db->lastInsertId();
|
||||
|
||||
// 1. Simpan Kepala Keluarga sebagai anggota keluarga pertama
|
||||
$usiaKk = 0;
|
||||
if (!empty($d['tgl_lahir'])) {
|
||||
try {
|
||||
$birthDate = new DateTime($d['tgl_lahir']);
|
||||
$today = new DateTime();
|
||||
$usiaKk = $today->diff($birthDate)->y;
|
||||
} catch (Exception $e) {
|
||||
$usiaKk = 0;
|
||||
}
|
||||
}
|
||||
$stmtKk = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?, ?, ?, 'Kepala Keluarga')"
|
||||
);
|
||||
$stmtKk->execute([$wargaId, $d['nama'], $usiaKk]);
|
||||
$kkAnggotaId = $db->lastInsertId();
|
||||
|
||||
$kkPenyakit = $d['rp'] ?? $d['riwayat_penyakit'] ?? [];
|
||||
foreach ($kkPenyakit as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?, ?)")
|
||||
->execute([$kkAnggotaId, $py]);
|
||||
}
|
||||
|
||||
// 2. Simpan anggota keluarga lainnya + penyakit mereka
|
||||
foreach (($d['anggota'] ?? []) as $a) {
|
||||
if (empty($a['nama'])) continue;
|
||||
|
||||
// Hindari duplikasi jika KK dikirim lagi di list anggota
|
||||
if (strtolower(trim($a['nama'])) === strtolower(trim($d['nama'])) && ($a['hub'] ?? $a['hubungan'] ?? '') === 'Kepala Keluarga') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$stmtA = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?,?,?,?)"
|
||||
);
|
||||
$stmtA->execute([$wargaId, $a['nama'], $a['usia'] ?? 0, $a['hub'] ?? $a['hubungan'] ?? 'Anak']);
|
||||
$anggotaId = $db->lastInsertId();
|
||||
|
||||
foreach (($a['penyakit'] ?? $a['py'] ?? []) as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?,?)")
|
||||
->execute([$anggotaId, $py]);
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
jsonOk(['id' => $wargaId], 'Data warga berhasil ditambahkan');
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
jsonError('Gagal menyimpan: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
// ── PUT: update data warga ─────────────────────────────────
|
||||
if ($method === 'PUT') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$d = body();
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat lokasi wajib diisi.');
|
||||
if (empty($d['kelurahan_id'])) jsonError('Kelurahan wajib dipilih.');
|
||||
|
||||
$db->beginTransaction();
|
||||
try {
|
||||
// 1. Update data kepala keluarga
|
||||
$stmt = $db->prepare(
|
||||
"UPDATE warga SET nama=?, nik=?, kelurahan_id=?, lat=?, lng=?,
|
||||
kategori=?, jumlah_anggota=?, penghasilan=?,
|
||||
tgl_lahir=?, pendidikan=?, keterangan=?
|
||||
WHERE id=?"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'],
|
||||
$d['nik'] ?? null,
|
||||
$d['kelurahan_id'],
|
||||
$d['lat'],
|
||||
$d['lng'],
|
||||
$d['kategori'] ?? 'miskin',
|
||||
$d['jumlah_anggota'] ?? 1,
|
||||
$d['penghasilan'] ?? 0,
|
||||
!empty($d['tgl_lahir']) ? $d['tgl_lahir'] : null,
|
||||
$d['pendidikan'] ?? '',
|
||||
$d['keterangan'] ?? '',
|
||||
$id
|
||||
]);
|
||||
|
||||
// 2. Hapus anggota lama beserta riwayat penyakitnya
|
||||
$oldAnggota = $db->prepare("SELECT id FROM anggota_keluarga WHERE warga_id=?");
|
||||
$oldAnggota->execute([$id]);
|
||||
foreach ($oldAnggota->fetchAll() as $oa) {
|
||||
$db->prepare("DELETE FROM riwayat_penyakit WHERE anggota_id=?")->execute([$oa['id']]);
|
||||
}
|
||||
$db->prepare("DELETE FROM anggota_keluarga WHERE warga_id=?")->execute([$id]);
|
||||
|
||||
// 3. Simpan KK sebagai anggota keluarga pertama
|
||||
$usiaKk = 0;
|
||||
if (!empty($d['tgl_lahir'])) {
|
||||
try {
|
||||
$birthDate = new DateTime($d['tgl_lahir']);
|
||||
$today = new DateTime();
|
||||
$usiaKk = $today->diff($birthDate)->y;
|
||||
} catch (Exception $e) { $usiaKk = 0; }
|
||||
}
|
||||
$stmtKk = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?, ?, ?, 'Kepala Keluarga')"
|
||||
);
|
||||
$stmtKk->execute([$id, $d['nama'], $usiaKk]);
|
||||
$kkAnggotaId = $db->lastInsertId();
|
||||
|
||||
$kkPenyakit = $d['rp'] ?? $d['riwayat_penyakit'] ?? [];
|
||||
foreach ($kkPenyakit as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?, ?)")
|
||||
->execute([$kkAnggotaId, $py]);
|
||||
}
|
||||
|
||||
// 4. Simpan anggota keluarga lainnya
|
||||
foreach (($d['anggota'] ?? []) as $a) {
|
||||
if (empty($a['nama'])) continue;
|
||||
if (strtolower(trim($a['nama'])) === strtolower(trim($d['nama'])) &&
|
||||
($a['hub'] ?? $a['hubungan'] ?? '') === 'Kepala Keluarga') {
|
||||
continue;
|
||||
}
|
||||
$stmtA = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?,?,?,?)"
|
||||
);
|
||||
$stmtA->execute([$id, $a['nama'], $a['usia'] ?? 0, $a['hub'] ?? $a['hubungan'] ?? 'Anak']);
|
||||
$anggotaId = $db->lastInsertId();
|
||||
foreach (($a['penyakit'] ?? $a['py'] ?? []) as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?,?)")
|
||||
->execute([$anggotaId, $py]);
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
jsonOk(null, 'Data warga berhasil diperbarui');
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
jsonError('Gagal memperbarui: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
// ── DELETE: hapus warga ────────────────────────────────────
|
||||
if ($method === 'DELETE') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$db->prepare("UPDATE warga SET status='nonaktif' WHERE id=?")->execute([$id]);
|
||||
jsonOk(null, 'Data warga berhasil dihapus');
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
Reference in New Issue
Block a user