Files
WebGIS-Project/webgis-v3/api/controllers/KeluargaController.php
T
2026-06-10 19:48:00 +07:00

124 lines
5.0 KiB
PHP

<?php
// api/controllers/KeluargaController.php
class KeluargaController {
public function index(): void {
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
$db = getDB();
$sql = "SELECT k.*, ri.nama AS nama_ri,
COUNT(p.nik) AS jumlah_anggota,
SUM(p.penghasilan) AS total_penghasilan,
COUNT(DISTINCT hb.id) AS total_bantuan
FROM keluarga k
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
LEFT JOIN penduduk p ON p.id_keluarga = k.id AND p.status_hidup='hidup'
LEFT JOIN histori_bantuan hb ON hb.nik = p.nik
WHERE 1=1";
$params = [];
if (!empty($_GET['status_ekonomi'])) {
$sql .= " AND k.status_ekonomi = ?"; $params[] = $_GET['status_ekonomi'];
}
if (!empty($_GET['kecamatan'])) {
$sql .= " AND k.kecamatan = ?"; $params[] = $_GET['kecamatan'];
}
$sql .= " GROUP BY k.id ORDER BY k.status_ekonomi, k.nama_kepala";
$stmt = $db->prepare($sql);
$stmt->execute($params);
jsonSuccess($stmt->fetchAll());
}
public function show(string $id): void {
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
$db = getDB();
$stmt = $db->prepare(
"SELECT k.*, ri.nama AS nama_ri FROM keluarga k
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
WHERE k.id = ?"
);
$stmt->execute([$id]);
$kk = $stmt->fetch();
if (!$kk) jsonError('Keluarga tidak ditemukan', 404);
$anggota = $db->prepare(
"SELECT nik, nama_lengkap, jenis_kelamin, status_keluarga,
TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur,
pekerjaan, penghasilan, status_ekonomi, kondisi_kesehatan,
pendidikan_terakhir, status_pendidikan, status_hidup
FROM penduduk WHERE id_keluarga = ? ORDER BY status_keluarga"
);
$anggota->execute([$id]);
$kk['anggota'] = $anggota->fetchAll();
jsonSuccess($kk);
}
public function store(): void {
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
$body = getBody();
$errs = required($body, ['no_kk', 'nama_kepala']);
if ($errs) jsonError(implode('; ', $errs));
if (!preg_match('/^\d{16}$/', $body['no_kk'])) jsonError('No KK harus 16 digit');
$db = getDB();
$chk = $db->prepare("SELECT id FROM keluarga WHERE no_kk = ?");
$chk->execute([$body['no_kk']]);
if ($chk->fetch()) jsonError('No KK sudah terdaftar', 409);
$db->prepare(
"INSERT INTO keluarga (no_kk, id_rumah_ibadah, nama_kepala, alamat, rt, rw,
kelurahan, kecamatan, lat, lng, status_ekonomi)
VALUES (?,?,?,?,?,?,?,?,?,?,?)"
)->execute([
$body['no_kk'],
$body['id_rumah_ibadah'] ?? null,
sanitize($body['nama_kepala']),
sanitize($body['alamat'] ?? ''),
sanitize($body['rt'] ?? ''),
sanitize($body['rw'] ?? ''),
sanitize($body['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? ''),
$body['lat'] ?? null,
$body['lng'] ?? null,
$body['status_ekonomi'] ?? 'rentan',
]);
$newId = $db->lastInsertId();
logActivity('create_keluarga', 'keluarga', $newId, [], $body);
jsonSuccess(['id' => $newId], 'Data keluarga berhasil disimpan', 201);
}
public function update(string $id): void {
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
$db = getDB();
$body = getBody();
$db->prepare(
"UPDATE keluarga SET id_rumah_ibadah=?, nama_kepala=?, alamat=?,
rt=?, rw=?, kelurahan=?, kecamatan=?, lat=?, lng=?, status_ekonomi=?
WHERE id=?"
)->execute([
$body['id_rumah_ibadah'] ?? null,
sanitize($body['nama_kepala'] ?? ''),
sanitize($body['alamat'] ?? ''),
sanitize($body['rt'] ?? ''),
sanitize($body['rw'] ?? ''),
sanitize($body['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? ''),
$body['lat'] ?? null,
$body['lng'] ?? null,
$body['status_ekonomi'] ?? 'rentan',
$id,
]);
logActivity('update_keluarga', 'keluarga', $id, [], $body);
jsonSuccess([], 'Data keluarga diperbarui');
}
public function destroy(string $id): void {
requireAuth([ROLE_ADMIN]);
$db = getDB();
$chk = $db->prepare("SELECT COUNT(*) AS c FROM penduduk WHERE id_keluarga = ?");
$chk->execute([$id]);
if ($chk->fetch()['c'] > 0) jsonError('Tidak bisa hapus — masih ada anggota keluarga', 409);
$db->prepare("DELETE FROM keluarga WHERE id = ?")->execute([$id]);
logActivity('delete_keluarga', 'keluarga', $id);
jsonSuccess([], 'Data keluarga dihapus');
}
}