Files
WebGIS_Project/05/penduduk.php
T

189 lines
10 KiB
PHP

<?php
error_reporting(0);
ini_set('display_errors', 0);
ob_start();
session_start();
include 'koneksi.php';
ob_clean(); // buang output apapun sebelum json_out
$aksi = $_REQUEST['aksi'] ?? 'list';
// ── LIST ─────────────────────────────────────────────────────
if ($aksi === 'list') {
$where = ["p.status_hidup='hidup'"];
$params = []; $types = '';
if (!empty($_GET['status_ekonomi'])) { $where[] = "p.status_ekonomi=?"; $params[] = $_GET['status_ekonomi']; $types .= 's'; }
if (!empty($_GET['rumah_ibadah_id'])) { $where[] = "p.rumah_ibadah_id=?"; $params[] = (int)$_GET['rumah_ibadah_id']; $types .= 'i'; }
if (!empty($_GET['status_bantuan'])) {
if ($_GET['status_bantuan'] === 'sudah') $where[] = "p.id IN (SELECT DISTINCT penduduk_id FROM histori_bantuan WHERE status='disalurkan')";
else $where[] = "p.id NOT IN (SELECT DISTINCT penduduk_id FROM histori_bantuan WHERE status='disalurkan')";
}
if (!empty($_GET['kelurahan'])) { $where[] = "k.kelurahan LIKE ?"; $params[] = '%'.$_GET['kelurahan'].'%'; $types .= 's'; }
if (!empty($_GET['penghasilan_min'])) { $where[] = "p.penghasilan>=?"; $params[] = (float)$_GET['penghasilan_min']; $types .= 'd'; }
if (!empty($_GET['penghasilan_max'])) { $where[] = "p.penghasilan<=?"; $params[] = (float)$_GET['penghasilan_max']; $types .= 'd'; }
if (!empty($_GET['q'])) { $like = '%'.$_GET['q'].'%'; $where[] = "(p.nama LIKE ? OR p.nik LIKE ?)"; $params[] = $like; $params[] = $like; $types .= 'ss'; }
$w = implode(' AND ', $where);
$sql = "SELECT p.id,p.nik,p.nama,p.jenis_kelamin,p.tanggal_lahir,
TIMESTAMPDIFF(YEAR,p.tanggal_lahir,CURDATE()) AS umur,
p.status_keluarga,p.status_ekonomi,p.status_hidup,
p.pekerjaan,p.penghasilan,p.pendidikan_terakhir,p.status_pendidikan,
p.lat,p.lng,p.no_hp,p.jenis_bantuan,p.created_at,
k.no_kk,k.rt,k.rw,k.kelurahan,k.kecamatan,
ri.nama AS nama_ibadah,
(SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id=p.id AND hb.status='disalurkan') AS total_bantuan
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id=k.id
LEFT JOIN rumah_ibadah ri ON p.rumah_ibadah_id=ri.id
WHERE $w ORDER BY p.nama";
if ($params) {
$stmt = $conn->prepare($sql);
$stmt->bind_param($types,...$params);
$stmt->execute(); $res = $stmt->get_result(); $stmt->close();
} else {
$res = $conn->query($sql);
}
if(!$res) json_out(['error'=>$conn->error],500);
$rows = [];
while ($r = $res->fetch_assoc()) { $r['penghasilan']=(float)$r['penghasilan']; $rows[]=$r; }
json_out($rows);
}
// ── DETAIL ─────────────────────────────────────────────
if ($aksi === 'detail') {
$id = (int)($_GET['id']??0);
$stmt = $conn->prepare("SELECT p.*,TIMESTAMPDIFF(YEAR,p.tanggal_lahir,CURDATE()) AS umur,k.no_kk,k.rt,k.rw,k.kelurahan,k.kecamatan,ri.nama AS nama_ibadah,ri.jenis AS jenis_ibadah FROM penduduk p LEFT JOIN keluarga k ON p.keluarga_id=k.id LEFT JOIN rumah_ibadah ri ON p.rumah_ibadah_id=ri.id WHERE p.id=?");
$stmt->bind_param('i',$id); $stmt->execute();
$data = $stmt->get_result()->fetch_assoc(); $stmt->close();
if (!$data) json_out(['error'=>'Tidak ditemukan'],404);
if ($data['keluarga_id']) {
$stmt2 = $conn->prepare("SELECT p2.id,p2.nik,p2.nama,p2.jenis_kelamin,TIMESTAMPDIFF(YEAR,p2.tanggal_lahir,CURDATE()) AS umur,p2.status_keluarga,p2.pekerjaan,p2.status_ekonomi FROM penduduk p2 WHERE p2.keluarga_id=? AND p2.id!=?");
$stmt2->bind_param('ii',$data['keluarga_id'],$id); $stmt2->execute();
$res2=$stmt2->get_result(); $anggota=[];
while($r=$res2->fetch_assoc()) $anggota[]=$r;
$stmt2->close(); $data['anggota_keluarga']=$anggota;
} else $data['anggota_keluarga']=[];
$stmt3 = $conn->prepare("SELECT hb.*,b.nama AS nama_bantuan,b.jenis FROM histori_bantuan hb JOIN bantuan b ON hb.bantuan_id=b.id WHERE hb.penduduk_id=? ORDER BY hb.tanggal DESC");
$stmt3->bind_param('i',$id); $stmt3->execute();
$res3=$stmt3->get_result(); $histori=[];
while($r=$res3->fetch_assoc()) $histori[]=$r;
$stmt3->close(); $data['histori_bantuan']=$histori;
json_out($data);
}
// ── SIMPAN ─────────────────────────────────────────────
if ($aksi === 'simpan') {
$nik = trim($_POST['nik']??'');
$nama = trim($_POST['nama']??'');
$jk = $_POST['jenis_kelamin']??'L';
$tgl = $_POST['tanggal_lahir']??'';
$stk = $_POST['status_keluarga']??'anggota';
$stm = $_POST['status_perkawinan']??'belum_kawin';
$pek = $_POST['pekerjaan']??'';
$pgh = (float)($_POST['penghasilan']??0);
$sek = $_POST['status_ekonomi']??'rentan';
$pend = $_POST['pendidikan_terakhir']??'tidak_sekolah';
$spend= $_POST['status_pendidikan']??'tidak_sekolah';
$kid = !empty($_POST['keluarga_id'])?(int)$_POST['keluarga_id']:null;
$lat = !empty($_POST['lat'])?(float)$_POST['lat']:null;
$lng = !empty($_POST['lng'])?(float)$_POST['lng']:null;
$nohp = $_POST['no_hp']??'';
$jban = $_POST['jenis_bantuan']??'';
if (!$nik||!$nama||!$tgl) json_out(['error'=>'NIK, nama, dan tanggal lahir wajib diisi'],400);
$cek=$conn->prepare("SELECT id FROM penduduk WHERE nik=?");
$cek->bind_param('s',$nik); $cek->execute();
if($cek->get_result()->num_rows>0) { $cek->close(); json_out(['error'=>'NIK sudah terdaftar'],400); }
$cek->close();
// cari ibadah terdekat
$ibadah_id=null;
if($lat!==null && $lng!==null){
$si=$conn->prepare("SELECT id FROM rumah_ibadah ORDER BY (6371*acos(cos(radians(?))*cos(radians(lat))*cos(radians(lng)-radians(?))+sin(radians(?))*sin(radians(lat)))) ASC LIMIT 1");
$si->bind_param('ddd',$lat,$lng,$lat); $si->execute();
$ri=$si->get_result()->fetch_assoc(); $si->close();
$ibadah_id=$ri['id']??null;
}
// Build query with NULL handling
$lat_sql = $lat!==null ? $lat : 'NULL';
$lng_sql = $lng!==null ? $lng : 'NULL';
$kid_sql = $kid!==null ? $kid : 'NULL';
$ibd_sql = $ibadah_id!==null ? $ibadah_id : 'NULL';
$conn->query("INSERT INTO penduduk
(nik,nama,jenis_kelamin,tanggal_lahir,status_keluarga,status_perkawinan,
pekerjaan,penghasilan,status_ekonomi,pendidikan_terakhir,status_pendidikan,
keluarga_id,rumah_ibadah_id,lat,lng,no_hp,jenis_bantuan)
VALUES (
'".$conn->real_escape_string($nik)."',
'".$conn->real_escape_string($nama)."',
'".$conn->real_escape_string($jk)."',
'".$conn->real_escape_string($tgl)."',
'".$conn->real_escape_string($stk)."',
'".$conn->real_escape_string($stm)."',
'".$conn->real_escape_string($pek)."',
$pgh,
'".$conn->real_escape_string($sek)."',
'".$conn->real_escape_string($pend)."',
'".$conn->real_escape_string($spend)."',
$kid_sql,$ibd_sql,$lat_sql,$lng_sql,
'".$conn->real_escape_string($nohp)."',
'".$conn->real_escape_string($jban)."'
)");
if($conn->error) json_out(['error'=>$conn->error],500);
$new_id=$conn->insert_id;
if(!empty($_SESSION['user_id'])){
log_aktivitas($conn,(int)$_SESSION['user_id'],'CREATE','penduduk',$new_id,'Tambah penduduk: '.$nama);
}
$umur=(int)date_diff(date_create($tgl),date_create('today'))->y;
$warning=null;
if($umur>=7&&$umur<=12&&$spend!='sekolah') $warning='Umur 7-12 th seharusnya masih SD.';
elseif($umur>=13&&$umur<=15&&$spend!='sekolah') $warning='Umur 13-15 th seharusnya masih SMP.';
elseif($umur>=16&&$umur<=18&&$spend=='tidak_sekolah') $warning='Umur 16-18 th biasanya masih SMA/SMK, mohon verifikasi.';
json_out(['success'=>true,'id'=>$new_id,'warning'=>$warning]);
}
// ── EDIT ───────────────────────────────────────────────
if ($aksi === 'edit') {
$id=(int)($_POST['id']??0);
$nm = $conn->real_escape_string($_POST['nama']??'');
$jk = $conn->real_escape_string($_POST['jenis_kelamin']??'L');
$tgl = $conn->real_escape_string($_POST['tanggal_lahir']??'');
$stk = $conn->real_escape_string($_POST['status_keluarga']??'anggota');
$stm = $conn->real_escape_string($_POST['status_perkawinan']??'belum_kawin');
$sh = $conn->real_escape_string($_POST['status_hidup']??'hidup');
$pek = $conn->real_escape_string($_POST['pekerjaan']??'');
$pgh = (float)($_POST['penghasilan']??0);
$sek = $conn->real_escape_string($_POST['status_ekonomi']??'rentan');
$pend= $conn->real_escape_string($_POST['pendidikan_terakhir']??'tidak_sekolah');
$spend=$conn->real_escape_string($_POST['status_pendidikan']??'tidak_sekolah');
$nohp= $conn->real_escape_string($_POST['no_hp']??'');
$jban= $conn->real_escape_string($_POST['jenis_bantuan']??'');
$conn->query("UPDATE penduduk SET
nama='$nm',jenis_kelamin='$jk',tanggal_lahir='$tgl',
status_keluarga='$stk',status_perkawinan='$stm',status_hidup='$sh',
pekerjaan='$pek',penghasilan=$pgh,status_ekonomi='$sek',
pendidikan_terakhir='$pend',status_pendidikan='$spend',
no_hp='$nohp',jenis_bantuan='$jban'
WHERE id=$id");
if($conn->error) json_out(['error'=>$conn->error],500);
if(!empty($_SESSION['user_id'])){
log_aktivitas($conn,(int)$_SESSION['user_id'],'UPDATE','penduduk',$id,'Edit penduduk id='.$id);
}
json_out(['success'=>true]);
}
// ── HAPUS ──────────────────────────────────────────────
if ($aksi === 'hapus') {
$id=(int)($_POST['id']??0);
$conn->query("DELETE FROM histori_bantuan WHERE penduduk_id=$id");
$conn->query("DELETE FROM pelatihan WHERE penduduk_id=$id");
$conn->query("DELETE FROM laporan WHERE penduduk_id=$id");
$conn->query("DELETE FROM penduduk WHERE id=$id");
json_out(['success'=>true]);
}