Files
luthfihadinugroho79 e950468760 add files
2026-06-10 19:42:59 +07:00

194 lines
9.4 KiB
PHP

<?php
// api/anggota.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(200); exit; }
require_once '../includes/config.php';
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? 'list';
// ── GET ───────────────────────────────────────────────────
if ($method === 'GET') {
if ($action === 'list' && isset($_GET['id_penduduk'])) {
$pid = (int)$_GET['id_penduduk'];
$res = $conn->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);
}
}
?>