true, 'data' => [], 'total' => 0]); break; } $wargaId = (int)($_GET['rumah_warga_id'] ?? 0); if (!$wargaId) { echo json_encode(['success' => false, 'message' => 'rumah_warga_id diperlukan']); break; } $res = $conn->query("SELECT * FROM anggota_keluarga WHERE rumah_warga_id=$wargaId ORDER BY tanggal_lahir ASC"); $data = []; $today = new DateTime(); while ($row = $res->fetch_assoc()) { // Hitung usia if ($row['tanggal_lahir']) { $lahir = new DateTime($row['tanggal_lahir']); $row['usia'] = (int)$today->diff($lahir)->y; } else { $row['usia'] = null; } $data[] = $row; } echo json_encode(['success' => true, 'data' => $data, 'total' => count($data)]); break; case 'POST': $input = json_decode(file_get_contents('php://input'), true) ?: $_POST; $wargaId = (int)($input['rumah_warga_id'] ?? 0); $nama = $conn->real_escape_string(trim($input['nama'] ?? '')); $nik = $conn->real_escape_string($input['nik'] ?? ''); $tl = !empty($input['tanggal_lahir']) ? "'" . $conn->real_escape_string($input['tanggal_lahir']) . "'" : 'NULL'; $jk = $conn->real_escape_string($input['jenis_kelamin'] ?? 'laki_laki'); $pend = $conn->real_escape_string($input['pendidikan'] ?? 'sd'); $pek = $conn->real_escape_string($input['pekerjaan'] ?? ''); $stsBk = $conn->real_escape_string($input['status_bekerja'] ?? 'tidak_bekerja'); $kes = $conn->real_escape_string($input['kondisi_kesehatan'] ?? 'sehat'); $bisa = (int)($input['dapat_bekerja'] ?? 1); if (!$wargaId || !$nama) { echo json_encode(['success' => false, 'message' => 'ID warga dan nama wajib diisi']); break; } $sql = "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)"; if ($conn->query($sql)) { // Re-hitung rekomendasi induk rehitungRekomendasi($conn, $wargaId); echo json_encode(['success' => true, 'message' => 'Anggota berhasil ditambahkan', 'id' => $conn->insert_id]); } else { echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]); } break; case 'PUT': $input = json_decode(file_get_contents('php://input'), true); $id = (int)($input['id'] ?? 0); $nama = $conn->real_escape_string(trim($input['nama'] ?? '')); $nik = $conn->real_escape_string($input['nik'] ?? ''); $tl = !empty($input['tanggal_lahir']) ? "'" . $conn->real_escape_string($input['tanggal_lahir']) . "'" : 'NULL'; $jk = $conn->real_escape_string($input['jenis_kelamin'] ?? 'laki_laki'); $pend = $conn->real_escape_string($input['pendidikan'] ?? 'sd'); $pek = $conn->real_escape_string($input['pekerjaan'] ?? ''); $stsBk = $conn->real_escape_string($input['status_bekerja'] ?? 'tidak_bekerja'); $kes = $conn->real_escape_string($input['kondisi_kesehatan'] ?? 'sehat'); $bisa = (int)($input['dapat_bekerja'] ?? 1); if (!$id) { echo json_encode(['success' => false, 'message' => 'ID tidak valid']); break; } $sql = "UPDATE anggota_keluarga SET nama='$nama', nik='$nik', tanggal_lahir=$tl, jenis_kelamin='$jk', pendidikan='$pend', pekerjaan='$pek', status_bekerja='$stsBk', kondisi_kesehatan='$kes', dapat_bekerja=$bisa WHERE id=$id"; if ($conn->query($sql)) { // Ambil warga_id lalu re-hitung rekomendasi $r = $conn->query("SELECT rumah_warga_id FROM anggota_keluarga WHERE id=$id"); if ($row = $r->fetch_assoc()) rehitungRekomendasi($conn, (int)$row['rumah_warga_id']); echo json_encode(['success' => true, 'message' => 'Anggota berhasil diperbarui']); } else { echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]); } break; case 'DELETE': $id = (int)($_GET['id'] ?? 0); if (!$id) { $input = json_decode(file_get_contents('php://input'), true); $id = (int)($input['id'] ?? 0); } // Ambil warga_id sebelum hapus $r = $conn->query("SELECT rumah_warga_id FROM anggota_keluarga WHERE id=$id"); $wargaId = ($row = $r->fetch_assoc()) ? (int)$row['rumah_warga_id'] : 0; if ($conn->query("DELETE FROM anggota_keluarga WHERE id=$id")) { if ($wargaId) rehitungRekomendasi($conn, $wargaId); echo json_encode(['success' => true, 'message' => 'Anggota berhasil dihapus']); } else { echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]); } break; default: http_response_code(405); echo json_encode(['error' => 'Method not allowed']); } $conn->close(); // ── Helper: re-hitung & simpan rekomendasi ──────────────────────────────── function rehitungRekomendasi(mysqli $conn, int $wargaId): void { $res = $conn->query("SELECT penghasilan_bulanan, status_pekerjaan, is_rekomendasi_manual FROM rumah_warga WHERE id=$wargaId"); if (!($row = $res->fetch_assoc())) return; if (isset($row['is_rekomendasi_manual']) && (int)$row['is_rekomendasi_manual'] === 1) return; $penghasilan = (float)$row['penghasilan_bulanan']; $stsPekerjaan = $row['status_pekerjaan']; $today = new DateTime(); $resA = $conn->query("SELECT tanggal_lahir, status_bekerja, dapat_bekerja, kondisi_kesehatan FROM anggota_keluarga WHERE rumah_warga_id=$wargaId"); $anggota = []; while ($a = $resA->fetch_assoc()) $anggota[] = $a; $adaProduktif = false; $adaProduktifBisaKerja = false; $semuaProduktifTakBisa = true; 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; if ($bisaKerja && $a['status_bekerja'] !== 'bekerja') $adaProduktifBisaKerja = true; } } $perluRutin = !$adaProduktif || ($adaProduktif && $semuaProduktifTakBisa) || $penghasilan < 500000 || $stsPekerjaan === 'tidak_bekerja'; $perluPelatihan = $adaProduktifBisaKerja; $rek = 'tidak_ada'; if ($perluRutin && $perluPelatihan) $rek = 'keduanya'; elseif ($perluRutin) $rek = 'bantuan_rutin'; elseif ($perluPelatihan) $rek = 'bantuan_pelatihan'; $conn->query("UPDATE rumah_warga SET rekomendasi_bantuan='$rek' WHERE id=$wargaId"); }