false, 'message' => 'Input tidak valid']); exit; } try { ensurePendudukDistanceColumns($pdo); ensurePendudukFeatureSchema($pdo); $input_lat = floatval($input['lat']); $input_lng = floatval($input['lng']); $coverage = calculatePendudukCoverage($pdo, $input_lat, $input_lng); $buktiFile = saveUploadedEvidence('bukti_file'); $stmt = $pdo->prepare(" INSERT INTO penduduk_miskin (kk_nama, kk_nik, alamat, lat, lng, ibadah_id, jarak_m, jarak_rute_m, is_blank_spot, status_bantuan, kategori_kebutuhan, deskripsi_kebutuhan, tindak_lanjut, kondisi_rumah, penghasilan, catatan_survei, bukti_file, jenis_bantuan, tanggal_bantuan) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([ $input['kk_nama'], $input['kk_nik'] ?? null, $input['alamat'], $input['lat'], $input['lng'], $coverage['ibadah_id'], $coverage['jarak_m'], $coverage['jarak_rute_m'], $coverage['is_blank_spot'], $input['status_bantuan'] ?? 'Belum dibantu', $input['kategori_kebutuhan'] ?? null, $input['deskripsi_kebutuhan'] ?? null, $input['tindak_lanjut'] ?? 'Belum disurvei', $input['kondisi_rumah'] ?? null, normalizeNonNegativeIntOrNull($input['penghasilan'] ?? '', 'Penghasilan'), $input['catatan_survei'] ?? null, $buktiFile, $input['jenis_bantuan'] ?? null, normalizeDateOrNull($input['tanggal_bantuan'] ?? null) ]); $penduduk_id = $pdo->lastInsertId(); // 4. Insert anggota keluarga if exist if (!empty($input['anggota']) && is_array($input['anggota'])) { $stmtAnggota = $pdo->prepare("INSERT INTO anggota_keluarga (penduduk_id, nama, hubungan, umur, pekerjaan) VALUES (?, ?, ?, ?, ?)"); foreach ($input['anggota'] as $anggota) { $stmtAnggota->execute([ $penduduk_id, $anggota['nama'], $anggota['hubungan'], $anggota['umur'] ?? null, $anggota['pekerjaan'] ?? null ]); } } if (($input['status_bantuan'] ?? '') === 'Sudah dibantu' && !empty($input['jenis_bantuan'])) { $stmtRiwayat = $pdo->prepare(" INSERT INTO riwayat_bantuan (penduduk_id, jenis_bantuan, tanggal_bantuan, pemberi_bantuan, catatan, bukti_file) VALUES (?, ?, ?, ?, ?, ?) "); $stmtRiwayat->execute([ $penduduk_id, $input['jenis_bantuan'], normalizeDateOrNull($input['tanggal_bantuan'] ?? null) ?? date('Y-m-d'), 'Admin', 'Dicatat dari form penduduk.', $buktiFile, ]); } updatePendudukPriority($pdo, (int)$penduduk_id); echo json_encode([ 'success' => true, 'id' => $penduduk_id, 'ibadah_id' => $coverage['ibadah_id'], 'jarak_m' => $coverage['jarak_m'], 'jarak_rute_m' => $coverage['jarak_rute_m'], 'is_blank_spot' => $coverage['is_blank_spot'] ]); } catch (Exception $e) { echo json_encode(['success' => false, 'message' => $e->getMessage()]); }