175 lines
8.2 KiB
PHP
175 lines
8.2 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../config.php';
|
|
$user = requireLogin();
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
|
|
$db = getDB();
|
|
|
|
switch ($method) {
|
|
// ── GET LIST / SINGLE ──
|
|
case 'GET':
|
|
if ($id) {
|
|
// single dengan histori bantuan & riwayat pelatihan
|
|
$st = $db->prepare("SELECT p.*, k.no_kk, k.alamat as alamat_kk, k.rt, k.rw,
|
|
k.kelurahan, k.kecamatan, k.rumah_ibadah_id
|
|
FROM v_penduduk p
|
|
JOIN keluarga k ON k.id = p.keluarga_id
|
|
WHERE p.id = ?");
|
|
$st->execute([$id]);
|
|
$row = $st->fetch();
|
|
if (!$row) jsonErr('Data tidak ditemukan.', 404);
|
|
|
|
// histori bantuan
|
|
$hb = $db->prepare("SELECT hb.*, b.nama as bantuan_nama, b.jenis, b.satuan,
|
|
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");
|
|
$hb->execute([$id]);
|
|
$row['histori_bantuan'] = $hb->fetchAll();
|
|
|
|
// pelatihan
|
|
$plt = $db->prepare("SELECT rp.*, p.nama_pelatihan, p.penyelenggara
|
|
FROM riwayat_pelatihan rp
|
|
JOIN pelatihan p ON p.id = rp.pelatihan_id
|
|
WHERE rp.penduduk_id = ?");
|
|
$plt->execute([$id]);
|
|
$row['riwayat_pelatihan'] = $plt->fetchAll();
|
|
|
|
// validasi pendidikan
|
|
$warn = validasiPendidikan((int)$row['umur'], $row['pendidikan_terakhir'], $row['status_pendidikan']);
|
|
$row['peringatan_pendidikan'] = $warn;
|
|
|
|
jsonOk($row);
|
|
}
|
|
|
|
// list dengan filter
|
|
$where = ["p.status_hidup = 'hidup'"]; $params = [];
|
|
if (!empty($_GET['status_ekonomi'])) { $where[] = "p.status_ekonomi = ?"; $params[] = $_GET['status_ekonomi']; }
|
|
if (!empty($_GET['keluarga_id'])) { $where[] = "p.keluarga_id = ?"; $params[] = (int)$_GET['keluarga_id']; }
|
|
if (!empty($_GET['kelurahan'])) { $where[] = "k.kelurahan = ?"; $params[] = $_GET['kelurahan']; }
|
|
if (!empty($_GET['q'])) { $where[] = "(p.nama LIKE ? OR p.nik LIKE ?)"; $params[] = '%'.$_GET['q'].'%'; $params[] = '%'.$_GET['q'].'%'; }
|
|
|
|
$wStr = implode(' AND ', $where);
|
|
$st = $db->prepare("SELECT p.id, p.nik, p.nama, p.jenis_kelamin, p.tanggal_lahir, p.umur,
|
|
p.profil_umur, p.status_keluarga, p.status_perkawinan,
|
|
p.status_ekonomi, p.kondisi_kesehatan, p.pekerjaan,
|
|
p.penghasilan, p.lat, p.lng, p.keluarga_id,
|
|
k.no_kk, k.kelurahan, k.alamat as alamat_kk,
|
|
(SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id=p.id AND hb.status='disalurkan') as total_bantuan
|
|
FROM v_penduduk p JOIN keluarga k ON k.id=p.keluarga_id
|
|
WHERE $wStr ORDER BY p.nama ASC LIMIT 500");
|
|
$st->execute($params);
|
|
jsonOk($st->fetchAll());
|
|
break;
|
|
|
|
// ── POST: Tambah ──
|
|
case 'POST':
|
|
requireRole(['superadmin','pengurus','relawan']);
|
|
$b = json_decode(file_get_contents('php://input'), true);
|
|
|
|
$nik = sanitize($b['nik'] ?? '');
|
|
$nama = sanitize($b['nama'] ?? '');
|
|
$tgl = $b['tanggal_lahir'] ?? '';
|
|
$kjId = (int)($b['keluarga_id'] ?? 0);
|
|
|
|
if (!$nik || strlen($nik) !== 16) jsonErr('NIK harus 16 digit.');
|
|
if (!$nama) jsonErr('Nama wajib diisi.');
|
|
if (!$tgl) jsonErr('Tanggal lahir wajib diisi.');
|
|
if (!$kjId) jsonErr('Keluarga (KK) wajib dipilih.');
|
|
|
|
// cek NIK unik
|
|
$chk = $db->prepare("SELECT id FROM penduduk WHERE nik=?"); $chk->execute([$nik]);
|
|
if ($chk->fetch()) jsonErr('NIK sudah terdaftar di sistem.');
|
|
|
|
$umur = hitungUmur($tgl);
|
|
$pendid = $b['pendidikan_terakhir'] ?? 'tidak_sekolah';
|
|
$stPend = $b['status_pendidikan'] ?? 'tidak_sekolah';
|
|
|
|
$db->prepare("INSERT INTO penduduk
|
|
(nik,nama,jenis_kelamin,tanggal_lahir,status_keluarga,status_perkawinan,status_hidup,
|
|
keluarga_id,pendidikan_terakhir,status_pendidikan,pekerjaan,penghasilan,
|
|
status_ekonomi,kondisi_kesehatan,lat,lng,catatan,created_by)
|
|
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")
|
|
->execute([
|
|
$nik, $nama,
|
|
$b['jenis_kelamin'] ?? 'L',
|
|
$tgl,
|
|
$b['status_keluarga'] ?? 'anggota',
|
|
$b['status_perkawinan'] ?? 'belum_kawin',
|
|
$b['status_hidup'] ?? 'hidup',
|
|
$kjId, $pendid, $stPend,
|
|
sanitize($b['pekerjaan'] ?? ''),
|
|
(float)($b['penghasilan'] ?? 0),
|
|
$b['status_ekonomi'] ?? 'rentan',
|
|
$b['kondisi_kesehatan'] ?? 'sehat',
|
|
isset($b['lat']) ? (float)$b['lat'] : null,
|
|
isset($b['lng']) ? (float)$b['lng'] : null,
|
|
sanitize($b['catatan'] ?? ''),
|
|
$user['id']
|
|
]);
|
|
$newId = (int)$db->lastInsertId();
|
|
log_aksi($user['id'], 'CREATE', 'penduduk', $newId, "Tambah: $nama (NIK: $nik)");
|
|
|
|
$warn = validasiPendidikan($umur, $pendid, $stPend);
|
|
jsonOk(['id'=>$newId,'peringatan'=>$warn], 'Penduduk berhasil ditambahkan.');
|
|
break;
|
|
|
|
// ── PUT: Edit ──
|
|
case 'PUT':
|
|
requireRole(['superadmin','pengurus','relawan']);
|
|
if (!$id) jsonErr('ID tidak valid.');
|
|
$b = json_decode(file_get_contents('php://input'), true);
|
|
|
|
$chk = $db->prepare("SELECT id,nik FROM penduduk WHERE id=?"); $chk->execute([$id]);
|
|
if (!$chk->fetch()) jsonErr('Data tidak ditemukan.', 404);
|
|
|
|
$tgl = $b['tanggal_lahir'] ?? '';
|
|
$umur = $tgl ? hitungUmur($tgl) : 0;
|
|
$pendid = $b['pendidikan_terakhir'] ?? 'tidak_sekolah';
|
|
$stPend = $b['status_pendidikan'] ?? 'tidak_sekolah';
|
|
|
|
$db->prepare("UPDATE penduduk SET
|
|
nama=?,jenis_kelamin=?,tanggal_lahir=?,status_keluarga=?,status_perkawinan=?,
|
|
status_hidup=?,keluarga_id=?,pendidikan_terakhir=?,status_pendidikan=?,
|
|
pekerjaan=?,penghasilan=?,status_ekonomi=?,kondisi_kesehatan=?,
|
|
lat=?,lng=?,catatan=?,updated_at=NOW() WHERE id=?")
|
|
->execute([
|
|
sanitize($b['nama'] ?? ''),
|
|
$b['jenis_kelamin'] ?? 'L',
|
|
$tgl,
|
|
$b['status_keluarga'] ?? 'anggota',
|
|
$b['status_perkawinan'] ?? 'belum_kawin',
|
|
$b['status_hidup'] ?? 'hidup',
|
|
(int)($b['keluarga_id'] ?? 0),
|
|
$pendid, $stPend,
|
|
sanitize($b['pekerjaan'] ?? ''),
|
|
(float)($b['penghasilan'] ?? 0),
|
|
$b['status_ekonomi'] ?? 'rentan',
|
|
$b['kondisi_kesehatan'] ?? 'sehat',
|
|
isset($b['lat']) ? (float)$b['lat'] : null,
|
|
isset($b['lng']) ? (float)$b['lng'] : null,
|
|
sanitize($b['catatan'] ?? ''),
|
|
$id
|
|
]);
|
|
log_aksi($user['id'], 'UPDATE', 'penduduk', $id, "Edit ID: $id");
|
|
$warn = validasiPendidikan($umur, $pendid, $stPend);
|
|
jsonOk(['peringatan'=>$warn], 'Data berhasil diperbarui.');
|
|
break;
|
|
|
|
// ── DELETE ──
|
|
case 'DELETE':
|
|
requireRole(['superadmin']);
|
|
if (!$id) jsonErr('ID tidak valid.');
|
|
$chk = $db->prepare("SELECT nama FROM penduduk WHERE id=?"); $chk->execute([$id]);
|
|
$row = $chk->fetch();
|
|
if (!$row) jsonErr('Data tidak ditemukan.', 404);
|
|
$db->prepare("DELETE FROM penduduk WHERE id=?")->execute([$id]);
|
|
log_aksi($user['id'], 'DELETE', 'penduduk', $id, 'Hapus: '.$row['nama']);
|
|
jsonOk(null, 'Data berhasil dihapus.');
|
|
break;
|
|
|
|
default: jsonErr('Method tidak didukung.', 405);
|
|
}
|