query("SELECT *, TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur, CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) < 6 THEN 'Balita' WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) < 13 THEN 'Anak-anak' WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) < 18 THEN 'Remaja' WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) < 60 THEN 'Dewasa' ELSE 'Lansia' END AS kelompok_usia FROM anggota_keluarga WHERE id_penduduk=$pid ORDER BY id"); $data = []; while ($r = $res->fetch_assoc()) { // Tambahkan riwayat pendidikan tiap anggota $pend = $conn->query("SELECT * FROM riwayat_pendidikan WHERE id_anggota={$r['id']} ORDER BY tahun_masuk DESC"); $pendList = []; while ($p = $pend->fetch_assoc()) $pendList[] = $p; $r['riwayat_pendidikan'] = $pendList; $data[] = $r; } jsonResponse($data); } elseif ($action === 'get' && isset($_GET['id'])) { $id = (int)$_GET['id']; $row = $conn->query("SELECT *, TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) AS umur FROM anggota_keluarga WHERE id=$id")->fetch_assoc(); if ($row) { $pend = $conn->query("SELECT * FROM riwayat_pendidikan WHERE id_anggota=$id ORDER BY tahun_masuk DESC"); $pendList = []; while ($p = $pend->fetch_assoc()) $pendList[] = $p; $row['riwayat_pendidikan'] = $pendList; } jsonResponse($row ?: ['error'=>'Tidak ditemukan']); } elseif ($action === 'statistik_usia') { // Distribusi usia seluruh anggota keluarga $res = $conn->query("SELECT COUNT(*) AS total, SUM(CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) < 6 THEN 1 ELSE 0 END) AS balita, SUM(CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) BETWEEN 6 AND 12 THEN 1 ELSE 0 END) AS anak, SUM(CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) BETWEEN 13 AND 17 THEN 1 ELSE 0 END) AS remaja, SUM(CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) BETWEEN 18 AND 59 THEN 1 ELSE 0 END) AS dewasa, SUM(CASE WHEN TIMESTAMPDIFF(YEAR,tanggal_lahir,CURDATE()) >= 60 THEN 1 ELSE 0 END) AS lansia FROM anggota_keluarga WHERE status_hidup='hidup'"); jsonResponse($res->fetch_assoc()); } elseif ($action === 'statistik_pendidikan') { $res = $conn->query("SELECT rp.jenjang, COUNT(*) AS jumlah FROM riwayat_pendidikan rp JOIN anggota_keluarga ak ON rp.id_anggota=ak.id WHERE rp.status_pendidikan='lulus' OR rp.status_pendidikan='putus_sekolah' GROUP BY rp.jenjang ORDER BY jumlah DESC"); $data=[]; while($r=$res->fetch_assoc())$data[]=$r; jsonResponse($data); } } // ── POST: tambah anggota ────────────────────────────────── if ($method === 'POST') { requireLogin(['admin','pengurus_ibadah','masyarakat']); $d = json_decode(file_get_contents('php://input'), true) ?: $_POST; $id_penduduk= (int)($d['id_penduduk']??0); $nik = esc($conn,$d['nik']??''); $nama = esc($conn,$d['nama']??''); $hub = esc($conn,$d['hubungan']??'Anak'); $jk = esc($conn,$d['jenis_kelamin']??'L'); $tgl = esc($conn,$d['tanggal_lahir']??'2000-01-01'); $tmp = esc($conn,$d['tempat_lahir']??''); $agm = esc($conn,$d['agama']??'Islam'); $pkj = esc($conn,$d['pekerjaan']??''); $hp = esc($conn,$d['no_hp']??''); if (!$id_penduduk || !$nama) jsonResponse(['success'=>false,'error'=>'ID penduduk dan nama wajib diisi'],400); $sql = "INSERT INTO anggota_keluarga (id_penduduk,nik,nama,hubungan,jenis_kelamin,tanggal_lahir,tempat_lahir,agama,pekerjaan,no_hp) VALUES ($id_penduduk,'$nik','$nama','$hub','$jk','$tgl','$tmp','$agm','$pkj','$hp')"; if ($conn->query($sql)) { $aid = $conn->insert_id; // Tambah riwayat pendidikan jika ada $pendList = $d['riwayat_pendidikan'] ?? []; foreach ($pendList as $pd) { $jj = esc($conn,$pd['jenjang']??''); $ni = esc($conn,$pd['nama_institusi']??''); $jur= esc($conn,$pd['jurusan']??''); $tm = (int)($pd['tahun_masuk']??0)?:'NULL'; $tl = (int)($pd['tahun_lulus']??0)?:'NULL'; $sp = esc($conn,$pd['status_pendidikan']??'lulus'); $ket= esc($conn,$pd['keterangan']??''); if ($jj) { $conn->query("INSERT INTO riwayat_pendidikan (id_anggota,jenjang,nama_institusi,jurusan,tahun_masuk,tahun_lulus,status_pendidikan,keterangan) VALUES ($aid,'$jj','$ni','$jur',$tm,$tl,'$sp','$ket')"); } } // Update jumlah_anggota di KK $conn->query("UPDATE penduduk SET jumlah_anggota=(SELECT COUNT(*) FROM anggota_keluarga WHERE id_penduduk=$id_penduduk) WHERE id=$id_penduduk"); logAktivitas($conn,'tambah_anggota','anggota_keluarga',$aid,"KK:$id_penduduk - $nama"); jsonResponse(['success'=>true,'id'=>$aid,'message'=>'Anggota keluarga berhasil ditambahkan']); } else { jsonResponse(['success'=>false,'error'=>$conn->error],500); } } // ── PUT: update anggota / status hidup ─────────────────── if ($method === 'PUT') { requireLogin(['admin','pengurus_ibadah']); $d = json_decode(file_get_contents('php://input'), true); $id = (int)$d['id']; $action2 = $d['action'] ?? 'update'; if ($action2 === 'status') { // Update status hidup saja (dari verifikasi laporan) $status = esc($conn,$d['status_hidup']??'hidup'); $sql = "UPDATE anggota_keluarga SET status_hidup='$status' WHERE id=$id"; if ($conn->query($sql)) { logAktivitas($conn,'update_status_anggota','anggota_keluarga',$id,"Status: $status"); jsonResponse(['success'=>true,'message'=>'Status diperbarui']); } else { jsonResponse(['success'=>false,'error'=>$conn->error],500); } } else { // Full update $nama = esc($conn,$d['nama']??''); $hub = esc($conn,$d['hubungan']??''); $tgl = esc($conn,$d['tanggal_lahir']??''); $agm = esc($conn,$d['agama']??''); $pkj = esc($conn,$d['pekerjaan']??''); $hp = esc($conn,$d['no_hp']??''); $sh = esc($conn,$d['status_hidup']??'hidup'); $sql = "UPDATE anggota_keluarga SET nama='$nama',hubungan='$hub',tanggal_lahir='$tgl', agama='$agm',pekerjaan='$pkj',no_hp='$hp',status_hidup='$sh' WHERE id=$id"; if ($conn->query($sql)) { // Update pendidikan jika ada if (!empty($d['riwayat_pendidikan'])) { $conn->query("DELETE FROM riwayat_pendidikan WHERE id_anggota=$id"); foreach ($d['riwayat_pendidikan'] as $pd) { $jj=$conn->real_escape_string($pd['jenjang']??''); $ni=$conn->real_escape_string($pd['nama_institusi']??''); $tm=(int)($pd['tahun_masuk']??0)?:'NULL'; $tl=(int)($pd['tahun_lulus']??0)?:'NULL'; $sp=$conn->real_escape_string($pd['status_pendidikan']??'lulus'); if($jj)$conn->query("INSERT INTO riwayat_pendidikan (id_anggota,jenjang,nama_institusi,tahun_masuk,tahun_lulus,status_pendidikan) VALUES ($id,'$jj','$ni',$tm,$tl,'$sp')"); } } logAktivitas($conn,'edit_anggota','anggota_keluarga',$id,"Edit: $nama"); jsonResponse(['success'=>true,'message'=>'Data anggota diperbarui']); } else { jsonResponse(['success'=>false,'error'=>$conn->error],500); } } } // ── DELETE ──────────────────────────────────────────────── if ($method === 'DELETE') { requireLogin(['admin','pengurus_ibadah']); $id = (int)($_GET['id']??0); $row = $conn->query("SELECT id_penduduk FROM anggota_keluarga WHERE id=$id")->fetch_assoc(); if ($conn->query("DELETE FROM anggota_keluarga WHERE id=$id")) { if ($row) { $pid = (int)$row['id_penduduk']; $conn->query("UPDATE penduduk SET jumlah_anggota=(SELECT COUNT(*) FROM anggota_keluarga WHERE id_penduduk=$pid) WHERE id=$pid"); } logAktivitas($conn,'hapus_anggota','anggota_keluarga',$id,''); jsonResponse(['success'=>true,'message'=>'Data dihapus']); } else { jsonResponse(['success'=>false,'error'=>$conn->error],500); } } ?>