Files
2026-06-10 18:54:25 +07:00

511 lines
27 KiB
PHP

<?php
// api/rumah_warga.php
header('Content-Type: application/json');
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') { http_response_code(204); exit; }
require_once '../config/db.php';
require_once 'middleware.php';
$method = $_SERVER['REQUEST_METHOD'];
// ════════════════════════════════════════════════════════════════════════════
// FUNGSI: Hitung rekomendasi bantuan otomatis berdasarkan data anggota
// ════════════════════════════════════════════════════════════════════════════
function hitungRekomendasi(mysqli $conn, int $wargaId, float $penghasilan, string $statusPekerjaan): string
{
$today = new DateTime();
// Ambil semua anggota keluarga
$res = $conn->query("SELECT tanggal_lahir, status_bekerja, dapat_bekerja, kondisi_kesehatan FROM anggota_keluarga WHERE rumah_warga_id = $wargaId");
$anggota = [];
while ($r = $res->fetch_assoc()) $anggota[] = $r;
$adaProduktif = false; // usia 18-55 th
$adaProduktifBisaKerja = false; // produktif & bisa kerja & belum bekerja tetap
$semuaProduktifTakBisa = true; // semua yg produktif tidak bisa kerja
foreach ($anggota as $a) {
$usia = null;
if ($a['tanggal_lahir']) {
$lahir = new DateTime($a['tanggal_lahir']);
$usia = (int)$today->diff($lahir)->y;
}
if ($usia !== null && $usia >= 18 && $usia <= 55) {
$adaProduktif = true;
$bisaKerja = (int)$a['dapat_bekerja'] === 1
&& in_array($a['kondisi_kesehatan'], ['sehat', 'sakit_ringan']);
if ($bisaKerja) $semuaProduktifTakBisa = false;
// Produktif, bisa kerja, belum bekerja tetap → kandidat pelatihan
if ($bisaKerja && $a['status_bekerja'] !== 'bekerja') {
$adaProduktifBisaKerja = true;
}
}
}
// Kriteria bantuan rutin
$perluRutin = !$adaProduktif
|| ($adaProduktif && $semuaProduktifTakBisa)
|| $penghasilan < 500000
|| $statusPekerjaan === 'tidak_bekerja';
// Kriteria bantuan pelatihan
$perluPelatihan = $adaProduktifBisaKerja;
if ($perluRutin && $perluPelatihan) return 'keduanya';
if ($perluRutin) return 'bantuan_rutin';
if ($perluPelatihan) return 'bantuan_pelatihan';
return 'tidak_ada';
}
// ════════════════════════════════════════════════════════════════════════════
// FUNGSI: Hitung kategori kesejahteraan otomatis berdasarkan data warga
// ════════════════════════════════════════════════════════════════════════════
function hitungKategoriKesejahteraan(float $penghasilan, int $tanggungan, string $statusTempatTinggal, string $sumberAir): string
{
// Logika sederhana:
// Jika penghasilan sangat rendah dan tanggungan banyak
$pendapatanPerKapita = $tanggungan > 0 ? $penghasilan / $tanggungan : $penghasilan;
$skor = 0;
if ($pendapatanPerKapita < 300000) {
$skor += 40;
} elseif ($pendapatanPerKapita < 600000) {
$skor += 20;
}
if ($statusTempatTinggal === 'numpang' || $statusTempatTinggal === 'sewa') {
$skor += 20;
}
if ($sumberAir === 'sungai' || $sumberAir === 'hujan') {
$skor += 10;
}
if ($skor >= 50) return 'sangat_miskin';
if ($skor >= 20) return 'miskin';
return 'rentan_miskin';
}
// ════════════════════════════════════════════════════════════════════════════
// FUNGSI: Memeriksa akses koordinator berdasarkan kelurahan/kecamatan ATAU radius geografis <= 5km
// ════════════════════════════════════════════════════════════════════════════
function checkCoordinatorAccess(mysqli $conn, int $koorIbadahId, float $lat, float $lng, string $kelurahan, string $kecamatan): bool
{
$wilRes = $conn->query("SELECT latitude, longitude, kelurahan, kecamatan FROM rumah_ibadah WHERE id = $koorIbadahId");
if ($wil = $wilRes->fetch_assoc()) {
// Cek 1: Pencocokan nama kelurahan/kecamatan (sebagai fallback tangguh)
$kel = strtolower($wil['kelurahan']);
$kec = strtolower($wil['kecamatan']);
$wKel = strtolower(trim($kelurahan));
$wKec = strtolower(trim($kecamatan));
if (($kel !== '' && strpos($wKel, $kel) !== false) || ($kec !== '' && strpos($wKec, $kec) !== false)) {
return true;
}
// Cek 2: Jarak radius geografis <= 5000m (karena batas slider maksimal 5km)
$lat1 = (float)$wil['latitude'];
$lng1 = (float)$wil['longitude'];
if ($lat1 !== 0.0 && $lng1 !== 0.0 && $lat !== 0.0 && $lng !== 0.0) {
$earthRadius = 6371000;
$dLat = deg2rad($lat - $lat1);
$dLng = deg2rad($lng - $lng1);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat)) * sin($dLng/2) * sin($dLng/2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$dist = $earthRadius * $c;
if ($dist <= 5000.0) {
return true;
}
}
}
return false;
}
// ════════════════════════════════════════════════════════════════════════════
switch ($method) {
// ── GET ──────────────────────────────────────────────────────────────────
case 'GET':
// Izinkan guest mode (opsional) untuk melihat data rumah warga
$currentUser = optionalAuth();
$isGuest = $currentUser === null;
// Jika tidak login (guest), validasi akses
if ($isGuest) {
$currentUser = ['role' => 'guest'];
} else {
// Validasi role jika sudah login
if (!in_array($currentUser['role'], ['admin', 'petugas', 'koordinator', 'kontributor'])) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Forbidden: Role Anda tidak memiliki akses.']);
exit;
}
}
if (isset($_GET['id'])) {
$id = (int)$_GET['id'];
$res = $conn->query("SELECT * FROM rumah_warga WHERE id=$id");
if ($row = $res->fetch_assoc()) {
// Batasi Koordinator agar hanya bisa melihat detail warga di wilayah tugasnya sendiri (radius / kelurahan / kecamatan)
if ($currentUser['role'] === 'koordinator') {
$koorIbadahId = (int)$currentUser['rumah_ibadah_id'];
$lat = (float)($row['latitude'] ?? 0);
$lng = (float)($row['longitude'] ?? 0);
$kelurahan = $row['kelurahan'] ?? '';
$kecamatan = $row['kecamatan'] ?? '';
if (!checkCoordinatorAccess($conn, $koorIbadahId, $lat, $lng, $kelurahan, $kecamatan)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Forbidden: Detail warga di luar wilayah tugas Anda.']);
exit;
}
}
// Sertakan anggota keluarga jika bukan koordinator / kontributor / guest
if ($currentUser['role'] === 'koordinator') {
$row['anggota'] = [];
unset($row['no_kk']);
unset($row['nik']);
unset($row['penghasilan_bulanan']);
unset($row['pekerjaan']);
unset($row['status_pekerjaan']);
unset($row['luas_rumah']);
unset($row['jenis_lantai']);
unset($row['jenis_dinding']);
unset($row['sumber_air']);
unset($row['status_tempat_tinggal']);
unset($row['keterangan']);
unset($row['skor_kepercayaan']);
unset($row['is_rekomendasi_manual']);
unset($row['is_kategori_manual']);
// KEEP: kategori_kemiskinan, jumlah_tanggungan (needed for display)
} elseif ($currentUser['role'] === 'kontributor' || $currentUser['role'] === 'guest') {
$row['anggota'] = [];
unset($row['no_kk']);
unset($row['nik']);
unset($row['penghasilan_bulanan']);
unset($row['pekerjaan']);
unset($row['status_pekerjaan']);
unset($row['luas_rumah']);
unset($row['jenis_lantai']);
unset($row['jenis_dinding']);
unset($row['sumber_air']);
unset($row['status_tempat_tinggal']);
unset($row['keterangan']);
unset($row['skor_kepercayaan']);
unset($row['is_rekomendasi_manual']);
unset($row['is_kategori_manual']);
unset($row['created_at']);
unset($row['updated_at']);
// KEEP: kategori_kemiskinan, jumlah_tanggungan, nama_kepala_keluarga (needed for display)
} else {
$resA = $conn->query("SELECT * FROM anggota_keluarga WHERE rumah_warga_id=$id ORDER BY tanggal_lahir ASC");
$anggota = [];
while ($a = $resA->fetch_assoc()) $anggota[] = $a;
$row['anggota'] = $anggota;
}
echo json_encode(['success' => true, 'data' => $row]);
} else {
echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']);
}
break;
}
// Filter pencarian
$where = [];
if (!empty($_GET['kategori'])) $where[] = "kategori_kemiskinan = '" . $conn->real_escape_string($_GET['kategori']) . "'";
if (!empty($_GET['status'])) $where[] = "status_bantuan = '" . $conn->real_escape_string($_GET['status']) . "'";
if (!empty($_GET['rekomendasi'])) $where[] = "rekomendasi_bantuan = '" . $conn->real_escape_string($_GET['rekomendasi']) . "'";
if (!empty($_GET['kecamatan'])) $where[] = "kecamatan LIKE '%" . $conn->real_escape_string($_GET['kecamatan']) . "%'";
if (!empty($_GET['kelurahan'])) $where[] = "kelurahan LIKE '%" . $conn->real_escape_string($_GET['kelurahan']) . "%'";
if (!empty($_GET['search'])) $where[] = "(nama_kepala_keluarga LIKE '%" . $conn->real_escape_string($_GET['search']) . "%' OR no_kk LIKE '%" . $conn->real_escape_string($_GET['search']) . "%' OR nik LIKE '%" . $conn->real_escape_string($_GET['search']) . "%')";
// Filter wilayah untuk koordinator tidak lagi dibatasi per kelurahan/kecamatan di SQL,
// melainkan akan difilter secara dinamis berdasarkan radius geografis di frontend.
$sql = "SELECT * FROM rumah_warga" . ($where ? " WHERE " . implode(' AND ', $where) : "") . " ORDER BY nama_kepala_keluarga ASC";
$result = $conn->query($sql);
if ($result === false) {
echo json_encode([
'success' => false,
'message' => 'Gagal mengambil data dari tabel "rumah_warga": ' . $conn->error
]);
break;
}
$data = [];
while ($row = $result->fetch_assoc()) {
if ($currentUser['role'] === 'koordinator') {
unset($row['no_kk']);
unset($row['nik']);
unset($row['penghasilan_bulanan']);
unset($row['pekerjaan']);
unset($row['status_pekerjaan']);
unset($row['luas_rumah']);
unset($row['jenis_lantai']);
unset($row['jenis_dinding']);
unset($row['sumber_air']);
unset($row['status_tempat_tinggal']);
unset($row['keterangan']);
unset($row['skor_kepercayaan']);
unset($row['is_rekomendasi_manual']);
// KEEP: kategori_kemiskinan, jumlah_tanggungan (needed for frontend display)
} elseif ($currentUser['role'] === 'kontributor' || $currentUser['role'] === 'guest') {
unset($row['no_kk']);
unset($row['nik']);
unset($row['penghasilan_bulanan']);
unset($row['pekerjaan']);
unset($row['status_pekerjaan']);
unset($row['luas_rumah']);
unset($row['jenis_lantai']);
unset($row['jenis_dinding']);
unset($row['sumber_air']);
unset($row['status_tempat_tinggal']);
unset($row['keterangan']);
unset($row['skor_kepercayaan']);
unset($row['is_rekomendasi_manual']);
unset($row['created_at']);
unset($row['updated_at']);
// KEEP: kategori_kemiskinan, jumlah_tanggungan, nama_kepala_keluarga (needed for frontend display)
}
$data[] = $row;
}
echo json_encode(['success' => true, 'data' => $data, 'total' => count($data)]);
break;
// ── POST ─────────────────────────────────────────────────────────────────
case 'POST':
// Membatasi akses: Hanya Admin dan Petugas Lapangan yang bisa menginput
requireAuth(['admin', 'petugas']);
$input = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$no_kk = $conn->real_escape_string(trim($input['no_kk'] ?? ''));
$nama = $conn->real_escape_string(trim($input['nama_kepala_keluarga'] ?? ''));
$nik = $conn->real_escape_string($input['nik'] ?? '');
$alamat = $conn->real_escape_string($input['alamat'] ?? '');
$kelurahan = $conn->real_escape_string($input['kelurahan'] ?? '');
$kecamatan = $conn->real_escape_string($input['kecamatan'] ?? '');
$kota = $conn->real_escape_string($input['kota'] ?? '');
$lat = (float)($input['latitude'] ?? 0);
$lng = (float)($input['longitude'] ?? 0);
$tanggungan = (int)($input['jumlah_tanggungan'] ?? 1);
$penghasilan= (float)($input['penghasilan_bulanan'] ?? 0);
$pekerjaan = $conn->real_escape_string($input['pekerjaan'] ?? '');
$stsPekerjaan = $conn->real_escape_string($input['status_pekerjaan'] ?? 'tidak_bekerja');
$luas = !empty($input['luas_rumah']) ? (float)$input['luas_rumah'] : 'NULL';
$lantai = $conn->real_escape_string($input['jenis_lantai'] ?? 'semen');
$dinding = $conn->real_escape_string($input['jenis_dinding'] ?? 'tembok');
$air = $conn->real_escape_string($input['sumber_air'] ?? 'sumur');
$tinggal = $conn->real_escape_string($input['status_tempat_tinggal'] ?? 'milik_sendiri');
$kategoriInput = $conn->real_escape_string($input['kategori_kemiskinan'] ?? 'miskin');
$isKatManual = ($kategoriInput !== 'sistem') ? 1 : 0;
$kategori = ($isKatManual === 1) ? $kategoriInput : hitungKategoriKesejahteraan($penghasilan, $tanggungan, $tinggal, $air);
$stsbansos = $conn->real_escape_string($input['status_bantuan'] ?? 'belum_terima');
$ket = $conn->real_escape_string($input['keterangan'] ?? '');
$dikelola = !empty($input['dikelola_oleh_ibadah_id']) ? (int)$input['dikelola_oleh_ibadah_id'] : 'NULL';
// Validasi
if (!$nama || !$lat || !$lng) {
echo json_encode(['success' => false, 'message' => 'Nama KK, latitude, dan longitude wajib diisi']); break;
}
if (!$no_kk || strlen(preg_replace('/\D/', '', $no_kk)) !== 16) {
echo json_encode(['success' => false, 'message' => 'Nomor KK harus 16 digit angka']); break;
}
// Cek duplikat KK
$cek = $conn->query("SELECT id FROM rumah_warga WHERE no_kk='$no_kk'");
if ($cek->num_rows > 0) {
echo json_encode(['success' => false, 'message' => 'Nomor KK sudah terdaftar']); break;
}
$luasVal = is_numeric($luas) ? $luas : 'NULL';
$rekInput = $conn->real_escape_string($input['rekomendasi_bantuan'] ?? 'sistem');
$isManual = ($rekInput !== 'sistem') ? 1 : 0;
$sql = "INSERT INTO rumah_warga
(no_kk,nama_kepala_keluarga,nik,alamat,kelurahan,kecamatan,kota,latitude,longitude,
jumlah_tanggungan,penghasilan_bulanan,pekerjaan,status_pekerjaan,
luas_rumah,jenis_lantai,jenis_dinding,sumber_air,status_tempat_tinggal,
kategori_kemiskinan,is_kategori_manual,status_bantuan,rekomendasi_bantuan,is_rekomendasi_manual,keterangan,
dikelola_oleh_ibadah_id, tanggal_verifikasi, skor_kepercayaan, status_verifikasi)
VALUES
('$no_kk','$nama','$nik','$alamat','$kelurahan','$kecamatan','$kota',$lat,$lng,
$tanggungan,$penghasilan,'$pekerjaan','$stsPekerjaan',
$luasVal,'$lantai','$dinding','$air','$tinggal',
'$kategori',$isKatManual,'$stsbansos','bantuan_rutin',$isManual,'$ket',
$dikelola, CURRENT_DATE(), 100, 'terverifikasi')";
if ($conn->query($sql)) {
$newId = $conn->insert_id;
// Simpan anggota jika ada
if (!empty($input['anggota']) && is_array($input['anggota'])) {
simpanAnggota($conn, $newId, $input['anggota']);
}
// Hitung rekomendasi otomatis
if ($isManual === 1) {
$rek = $rekInput;
} else {
$rek = hitungRekomendasi($conn, $newId, $penghasilan, $stsPekerjaan);
}
$conn->query("UPDATE rumah_warga SET rekomendasi_bantuan='$rek' WHERE id=$newId");
echo json_encode(['success' => true, 'message' => 'Data berhasil disimpan', 'id' => $newId, 'rekomendasi' => $rek]);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal menyimpan: ' . $conn->error]);
}
break;
// ── PUT ──────────────────────────────────────────────────────────────────
case 'PUT':
// Membatasi akses: Admin, Petugas Lapangan, dan Koordinator Rumah Ibadah
$currentUser = requireAuth(['admin', 'petugas', 'koordinator']);
$input = json_decode(file_get_contents('php://input'), true);
$id = (int)($input['id'] ?? 0);
if (!$id) { echo json_encode(['success' => false, 'message' => 'ID tidak valid']); break; }
if ($currentUser['role'] === 'koordinator') {
$stsbansos = $conn->real_escape_string($input['status_bantuan'] ?? 'belum_terima');
// Cek apakah warga berada di wilayah tugas koordinator (radius / kelurahan / kecamatan)
$koorIbadahId = (int)$currentUser['rumah_ibadah_id'];
$wargaRes = $conn->query("SELECT latitude, longitude, kelurahan, kecamatan FROM rumah_warga WHERE id = $id");
if ($wargaRow = $wargaRes->fetch_assoc()) {
$lat = (float)($wargaRow['latitude'] ?? 0);
$lng = (float)($wargaRow['longitude'] ?? 0);
$kelurahan = $wargaRow['kelurahan'] ?? '';
$kecamatan = $wargaRow['kecamatan'] ?? '';
if (!checkCoordinatorAccess($conn, $koorIbadahId, $lat, $lng, $kelurahan, $kecamatan)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Forbidden: Warga di luar wilayah tugas Anda.']);
exit;
}
} else {
echo json_encode(['success' => false, 'message' => 'Warga tidak ditemukan.']);
exit;
}
$sql = "UPDATE rumah_warga SET status_bantuan='$stsbansos' WHERE id=$id";
if ($conn->query($sql)) {
echo json_encode(['success' => true, 'message' => 'Status bantuan warga berhasil diperbarui']);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal memperbarui status bantuan: ' . $conn->error]);
}
break;
}
$no_kk = $conn->real_escape_string(trim($input['no_kk'] ?? ''));
$nama = $conn->real_escape_string(trim($input['nama_kepala_keluarga'] ?? ''));
$nik = $conn->real_escape_string($input['nik'] ?? '');
$alamat = $conn->real_escape_string($input['alamat'] ?? '');
$kelurahan = $conn->real_escape_string($input['kelurahan'] ?? '');
$kecamatan = $conn->real_escape_string($input['kecamatan'] ?? '');
$kota = $conn->real_escape_string($input['kota'] ?? '');
$lat = (float)($input['latitude'] ?? 0);
$lng = (float)($input['longitude'] ?? 0);
$tanggungan = (int)($input['jumlah_tanggungan'] ?? 1);
$penghasilan= (float)($input['penghasilan_bulanan'] ?? 0);
$pekerjaan = $conn->real_escape_string($input['pekerjaan'] ?? '');
$stsPekerjaan = $conn->real_escape_string($input['status_pekerjaan'] ?? 'tidak_bekerja');
$luasVal = !empty($input['luas_rumah']) ? (float)$input['luas_rumah'] : 'NULL';
$lantai = $conn->real_escape_string($input['jenis_lantai'] ?? 'semen');
$dinding = $conn->real_escape_string($input['jenis_dinding'] ?? 'tembok');
$air = $conn->real_escape_string($input['sumber_air'] ?? 'sumur');
$tinggal = $conn->real_escape_string($input['status_tempat_tinggal'] ?? 'milik_sendiri');
$kategoriInput = $conn->real_escape_string($input['kategori_kemiskinan'] ?? 'miskin');
$isKatManual = ($kategoriInput !== 'sistem') ? 1 : 0;
$kategori = ($isKatManual === 1) ? $kategoriInput : hitungKategoriKesejahteraan($penghasilan, $tanggungan, $tinggal, $air);
$stsbansos = $conn->real_escape_string($input['status_bantuan'] ?? 'belum_terima');
$rekInput = $conn->real_escape_string($input['rekomendasi_bantuan'] ?? 'sistem');
$isManual = ($rekInput !== 'sistem') ? 1 : 0;
$ket = $conn->real_escape_string($input['keterangan'] ?? '');
$dikelola = isset($input['dikelola_oleh_ibadah_id']) && $input['dikelola_oleh_ibadah_id'] !== '' ? (int)$input['dikelola_oleh_ibadah_id'] : 'NULL';
// Cek duplikat KK (kecuali diri sendiri)
$cek = $conn->query("SELECT id FROM rumah_warga WHERE no_kk='$no_kk' AND id != $id");
if ($cek->num_rows > 0) {
echo json_encode(['success' => false, 'message' => 'Nomor KK sudah digunakan data lain']); break;
}
// Update anggota jika ada
if (!empty($input['anggota']) && is_array($input['anggota'])) {
$conn->query("DELETE FROM anggota_keluarga WHERE rumah_warga_id=$id");
simpanAnggota($conn, $id, $input['anggota']);
}
// Hitung rekomendasi otomatis
if ($isManual === 1) {
$rek = $rekInput;
} else {
$rek = hitungRekomendasi($conn, $id, $penghasilan, $stsPekerjaan);
}
$sql = "UPDATE rumah_warga SET
no_kk='$no_kk', nama_kepala_keluarga='$nama', nik='$nik',
alamat='$alamat', kelurahan='$kelurahan', kecamatan='$kecamatan', kota='$kota',
latitude=$lat, longitude=$lng,
jumlah_tanggungan=$tanggungan, penghasilan_bulanan=$penghasilan,
pekerjaan='$pekerjaan', status_pekerjaan='$stsPekerjaan',
luas_rumah=$luasVal, jenis_lantai='$lantai', jenis_dinding='$dinding',
sumber_air='$air', status_tempat_tinggal='$tinggal',
kategori_kemiskinan='$kategori', is_kategori_manual=$isKatManual, status_bantuan='$stsbansos',
rekomendasi_bantuan='$rek', is_rekomendasi_manual=$isManual, keterangan='$ket',
dikelola_oleh_ibadah_id=$dikelola
WHERE id=$id";
if ($conn->query($sql)) {
echo json_encode(['success' => true, 'message' => 'Data berhasil diperbarui', 'rekomendasi' => $rek]);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal memperbarui: ' . $conn->error]);
}
break;
// ── DELETE ───────────────────────────────────────────────────────────────
case 'DELETE':
// Membatasi akses: HANYA Admin yang boleh menghapus data warga
requireAuth(['admin']);
$id = (int)($_GET['id'] ?? 0);
if (!$id) {
$input = json_decode(file_get_contents('php://input'), true);
$id = (int)($input['id'] ?? 0);
}
if ($conn->query("DELETE FROM rumah_warga WHERE id=$id")) {
echo json_encode(['success' => true, 'message' => 'Data berhasil dihapus']);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal menghapus: ' . $conn->error]);
}
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
}
$conn->close();
// ════════════════════════════════════════════════════════════════════════════
function simpanAnggota(mysqli $conn, int $wargaId, array $list): void
{
foreach ($list as $a) {
$nama = $conn->real_escape_string(trim($a['nama'] ?? ''));
if (!$nama) continue;
$nik = $conn->real_escape_string($a['nik'] ?? '');
$tl = !empty($a['tanggal_lahir']) ? "'" . $conn->real_escape_string($a['tanggal_lahir']) . "'" : 'NULL';
$jk = $conn->real_escape_string($a['jenis_kelamin'] ?? 'laki_laki');
$pend = $conn->real_escape_string($a['pendidikan'] ?? 'sd');
$pek = $conn->real_escape_string($a['pekerjaan'] ?? '');
$stsBk = $conn->real_escape_string($a['status_bekerja'] ?? 'tidak_bekerja');
$kes = $conn->real_escape_string($a['kondisi_kesehatan'] ?? 'sehat');
$bisa = (int)($a['dapat_bekerja'] ?? 1);
$conn->query("INSERT INTO anggota_keluarga (rumah_warga_id,nama,nik,tanggal_lahir,jenis_kelamin,pendidikan,pekerjaan,status_bekerja,kondisi_kesehatan,dapat_bekerja)
VALUES ($wargaId,'$nama','$nik',$tl,'$jk','$pend','$pek','$stsBk','$kes',$bisa)");
}
}