query("SELECT id,lat,lng,radius FROM rumah_ibadah"); $ilist=[]; while($r=$ib->fetch_assoc()) $ilist[]=$r; $w=$pid?"WHERE id=".intval($pid):""; $pd=$conn->query("SELECT id,lat,lng FROM penduduk_miskin $w"); while($p=$pd->fetch_assoc()){ $best=null;$bd=PHP_FLOAT_MAX; foreach($ilist as $i){ $d=haversine($p['lat'],$p['lng'],$i['lat'],$i['lng']); if($d<=$i['radius']&&$d<$bd){$bd=$d;$best=$i['id'];} } if($best){ $s=$conn->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id=?,jarak_ke_ibadah=? WHERE id=?"); $s->bind_param('idi',$best,$bd,$p['id']); } else { $s=$conn->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id=NULL,jarak_ke_ibadah=NULL WHERE id=?"); $s->bind_param('i',$p['id']); } $s->execute(); } } // ── GET ALL ──────────────────────────────── if($action==='get_all'){ $ri=[]; $r=$conn->query("SELECT * FROM rumah_ibadah ORDER BY nama"); while($row=$r->fetch_assoc()) $ri[]=$row; $pm=[]; $r2=$conn->query("SELECT p.*,i.nama as nama_ibadah,i.jenis as jenis_ibadah FROM penduduk_miskin p LEFT JOIN rumah_ibadah i ON p.rumah_ibadah_id=i.id ORDER BY p.nama_kk"); while($row=$r2->fetch_assoc()) $pm[]=$row; $stats=[ 'total_ibadah'=>(int)$conn->query("SELECT COUNT(*) c FROM rumah_ibadah")->fetch_assoc()['c'], 'total_penduduk'=>(int)$conn->query("SELECT COUNT(*) c FROM penduduk_miskin")->fetch_assoc()['c'], 'total_jiwa'=>(int)($conn->query("SELECT COALESCE(SUM(jumlah_anggota),0) c FROM penduduk_miskin")->fetch_assoc()['c']), 'terdaftar'=>(int)$conn->query("SELECT COUNT(*) c FROM penduduk_miskin WHERE rumah_ibadah_id IS NOT NULL")->fetch_assoc()['c'], 'belum'=>(int)$conn->query("SELECT COUNT(*) c FROM penduduk_miskin WHERE rumah_ibadah_id IS NULL")->fetch_assoc()['c'], ]; echo json_encode(['rumah_ibadah'=>$ri,'penduduk'=>$pm,'stats'=>$stats]); exit; } // ── ADD IBADAH ───────────────────────────── if($action==='add_ibadah'&&$_SERVER['REQUEST_METHOD']==='POST'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $nama=$conn->real_escape_string($d['nama']??''); $jenis=$conn->real_escape_string($d['jenis']??'Masjid'); $alamat=$conn->real_escape_string($d['alamat']??''); $pic=$conn->real_escape_string($d['pic']??''); $no_wa=$conn->real_escape_string($d['no_wa']??''); $lat=floatval($d['lat']??0); $lng=floatval($d['lng']??0); $radius=max(500,intval($d['radius']??500)); if(!$nama||!$lat||!$lng){echo json_encode(['error'=>'Data tidak lengkap']);exit;} $s=$conn->prepare("INSERT INTO rumah_ibadah(nama,jenis,alamat,pic,no_wa,lat,lng,radius) VALUES(?,?,?,?,?,?,?,?)"); $s->bind_param('sssssddi',$nama,$jenis,$alamat,$pic,$no_wa,$lat,$lng,$radius); if($s->execute()){ $id=$conn->insert_id; recalc($conn); $row=$conn->query("SELECT * FROM rumah_ibadah WHERE id=$id")->fetch_assoc(); echo json_encode(['success'=>true,'id'=>$id,'data'=>$row]); } else echo json_encode(['error'=>$conn->error]); exit; } // ── EDIT IBADAH ──────────────────────────── if($action==='edit_ibadah'&&$_SERVER['REQUEST_METHOD']==='POST'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $id=intval($d['id']??0); $nama=$conn->real_escape_string($d['nama']??''); $jenis=$conn->real_escape_string($d['jenis']??'Masjid'); $alamat=$conn->real_escape_string($d['alamat']??''); $pic=$conn->real_escape_string($d['pic']??''); $no_wa=$conn->real_escape_string($d['no_wa']??''); $lat=floatval($d['lat']??0); $lng=floatval($d['lng']??0); $radius=max(500,intval($d['radius']??500)); $s=$conn->prepare("UPDATE rumah_ibadah SET nama=?,jenis=?,alamat=?,pic=?,no_wa=?,lat=?,lng=?,radius=? WHERE id=?"); $s->bind_param('sssssddii',$nama,$jenis,$alamat,$pic,$no_wa,$lat,$lng,$radius,$id); if($s->execute()){recalc($conn);echo json_encode(['success'=>true]);} else echo json_encode(['error'=>$conn->error]); exit; } // ── DELETE IBADAH ────────────────────────── if($action==='delete_ibadah'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $id=intval($d['id']??$_GET['id']??0); $s=$conn->prepare("DELETE FROM rumah_ibadah WHERE id=?"); $s->bind_param('i',$id); if($s->execute()){recalc($conn);echo json_encode(['success'=>true]);} else echo json_encode(['error'=>$conn->error]); exit; } // ── UPLOAD FOTO RUMAH ────────────────────── if($action==='upload_foto'&&$_SERVER['REQUEST_METHOD']==='POST'){ $id = intval($_POST['id'] ?? 0); if(!$id || empty($_FILES['foto']['tmp_name'])){ echo json_encode(['error'=>'Data tidak valid']); exit; } $ext = strtolower(pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION)); $allowed = ['jpg','jpeg','png','webp']; if(!in_array($ext, $allowed)){ echo json_encode(['error'=>'Format tidak didukung']); exit; } $filename = 'foto_'.$id.'_'.time().'.'.$ext; $dest = __DIR__.'/uploads/foto_rumah/'.$filename; if(move_uploaded_file($_FILES['foto']['tmp_name'], $dest)){ // Hapus foto lama jika ada $old = $conn->query("SELECT foto_rumah FROM penduduk_miskin WHERE id=$id")->fetch_assoc(); if($old['foto_rumah'] && file_exists(__DIR__.'/'.$old['foto_rumah'])) unlink(__DIR__.'/'.$old['foto_rumah']); $path = 'uploads/foto_rumah/'.$filename; $conn->query("UPDATE penduduk_miskin SET foto_rumah='$path' WHERE id=$id"); echo json_encode(['success'=>true,'path'=>$path]); } else echo json_encode(['error'=>'Gagal upload']); exit; } //ADD PENDUDUK if($action==='add_penduduk'&&$_SERVER['REQUEST_METHOD']==='POST'){ // Ambil dari $_POST (bukan json), karena ada file upload $nama_kk = $conn->real_escape_string($_POST['nama_kk'] ?? ''); $jml = intval($_POST['jumlah_anggota'] ?? 1); $alamat = $conn->real_escape_string($_POST['alamat'] ?? ''); $lat = floatval($_POST['lat'] ?? 0); $lng = floatval($_POST['lng'] ?? 0); $jenis_bantuan = $conn->real_escape_string($_POST['jenis_bantuan'] ?? ''); $tanggal_bantuan = $conn->real_escape_string($_POST['tanggal_bantuan'] ?? ''); if(!$nama_kk||!$lat||!$lng){echo json_encode(['error'=>'Data tidak lengkap']);exit;} $s=$conn->prepare("INSERT INTO penduduk_miskin(nama_kk,jumlah_anggota,alamat,lat,lng,jenis_bantuan,tanggal_bantuan) VALUES(?,?,?,?,?,?,?)"); $tanggal_bantuan_val = $tanggal_bantuan ? $tanggal_bantuan : null; $s->bind_param('sisddss',$nama_kk,$jml,$alamat,$lat,$lng,$jenis_bantuan,$tanggal_bantuan_val); if($s->execute()){ $id=$conn->insert_id; // Log to riwayat_bantuan if provided if($jenis_bantuan && $tanggal_bantuan_val) { $conn->query("INSERT INTO riwayat_bantuan (penduduk_id, jenis_bantuan, tanggal_pemberian, keterangan) VALUES ($id, '$jenis_bantuan', '$tanggal_bantuan_val', 'Bantuan pertama saat pendaftaran KK')"); } // Proses upload foto jika ada if(!empty($_FILES['foto']['tmp_name'])){ $ext = strtolower(pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION)); $allowed = ['jpg','jpeg','png','webp']; if(in_array($ext,$allowed)){ $filename = 'foto_'.$id.'_'.time().'.'.$ext; $dest = __DIR__.'/uploads/foto_rumah/'.$filename; if(move_uploaded_file($_FILES['foto']['tmp_name'],$dest)){ $path = 'uploads/foto_rumah/'.$filename; $conn->query("UPDATE penduduk_miskin SET foto_rumah='$path' WHERE id=$id"); } } } recalc($conn,$id); $row=$conn->query("SELECT p.*,i.nama as nama_ibadah,i.jenis as jenis_ibadah FROM penduduk_miskin p LEFT JOIN rumah_ibadah i ON p.rumah_ibadah_id=i.id WHERE p.id=$id")->fetch_assoc(); echo json_encode(['success'=>true,'id'=>$id,'data'=>$row]); } else echo json_encode(['error'=>$conn->error]); exit; } // ── EDIT PENDUDUK ────────────────────────── if($action==='edit_penduduk'&&$_SERVER['REQUEST_METHOD']==='POST'){ $id=intval($_POST['id']??0); $nama_kk=$conn->real_escape_string($_POST['nama_kk']??''); $jml=intval($_POST['jumlah_anggota']??1); $alamat=$conn->real_escape_string($_POST['alamat']??''); $lat=floatval($_POST['lat']??0); $lng=floatval($_POST['lng']??0); $jenis_bantuan = $conn->real_escape_string($_POST['jenis_bantuan'] ?? ''); $tanggal_bantuan = $conn->real_escape_string($_POST['tanggal_bantuan'] ?? ''); $s=$conn->prepare("UPDATE penduduk_miskin SET nama_kk=?,jumlah_anggota=?,alamat=?,lat=?,lng=?,jenis_bantuan=?,tanggal_bantuan=? WHERE id=?"); $tanggal_bantuan_val = $tanggal_bantuan ? $tanggal_bantuan : null; $s->bind_param('sisddssi',$nama_kk,$jml,$alamat,$lat,$lng,$jenis_bantuan,$tanggal_bantuan_val,$id); // Proses upload foto jika ada if(!empty($_FILES['foto']['tmp_name'])){ $ext = strtolower(pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION)); $allowed = ['jpg','jpeg','png','webp']; if(in_array($ext,$allowed)){ $filename = 'foto_'.$id.'_'.time().'.'.$ext; $dest = __DIR__.'/uploads/foto_rumah/'.$filename; if(move_uploaded_file($_FILES['foto']['tmp_name'],$dest)){ // Hapus foto lama jika ada $old = $conn->query("SELECT foto_rumah FROM penduduk_miskin WHERE id=$id")->fetch_assoc(); if($old['foto_rumah'] && file_exists(__DIR__.'/'.$old['foto_rumah'])) unlink(__DIR__.'/'.$old['foto_rumah']); $path = 'uploads/foto_rumah/'.$filename; $conn->query("UPDATE penduduk_miskin SET foto_rumah='$path' WHERE id=$id"); } } } if($s->execute()){ // Log to riwayat_bantuan if new combination if($jenis_bantuan && $tanggal_bantuan_val) { $check = $conn->query("SELECT id FROM riwayat_bantuan WHERE penduduk_id=$id AND jenis_bantuan='$jenis_bantuan' AND tanggal_pemberian='$tanggal_bantuan_val'")->num_rows; if ($check == 0) { $conn->query("INSERT INTO riwayat_bantuan (penduduk_id, jenis_bantuan, tanggal_pemberian, keterangan) VALUES ($id, '$jenis_bantuan', '$tanggal_bantuan_val', 'Bantuan baru diinput lewat edit KK')"); } } recalc($conn,$id); echo json_encode(['success'=>true]); } else echo json_encode(['error'=>$conn->error]); exit; } // ── DELETE PENDUDUK ──────────────────────── if($action==='delete_penduduk'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $id=intval($d['id']??$_GET['id']??0); $s=$conn->prepare("DELETE FROM penduduk_miskin WHERE id=?"); $s->bind_param('i',$id); if($s->execute()) echo json_encode(['success'=>true]); else echo json_encode(['error'=>$conn->error]); exit; } // ── RECALCULATE ──────────────────────────── if($action==='recalculate'){ recalc($conn); echo json_encode(['success'=>true]); exit; } // ── ADD BANTUAN ─────────────────────────── if($action==='add_bantuan'&&$_SERVER['REQUEST_METHOD']==='POST'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $pid=intval($d['penduduk_id']??0); $jenis=$conn->real_escape_string($d['jenis_bantuan']??''); $tanggal=$conn->real_escape_string($d['tanggal_pemberian']??''); $ket=$conn->real_escape_string($d['keterangan']??''); $ri_id=isset($d['rumah_ibadah_id']) && $d['rumah_ibadah_id'] !== '' ? intval($d['rumah_ibadah_id']) : null; if(!$pid||!$jenis||!$tanggal){echo json_encode(['error'=>'Data tidak lengkap']);exit;} $s=$conn->prepare("INSERT INTO riwayat_bantuan(penduduk_id,jenis_bantuan,tanggal_pemberian,keterangan,rumah_ibadah_id) VALUES(?,?,?,?,?)"); $s->bind_param('isssi',$pid,$jenis,$tanggal,$ket,$ri_id); if($s->execute()){ // Update jenis_bantuan & tanggal_bantuan di penduduk_miskin dengan yg terbaru $conn->query("UPDATE penduduk_miskin SET jenis_bantuan='$jenis', tanggal_bantuan='$tanggal' WHERE id=$pid"); echo json_encode(['success'=>true,'id'=>$conn->insert_id]); } else echo json_encode(['error'=>$conn->error]); exit; } // ── GET BANTUAN (per penduduk) ──────────── if($action==='get_bantuan'){ $pid=intval($_GET['penduduk_id']??0); $rows=[]; $r=$conn->query("SELECT rb.*, ri.nama as nama_ibadah FROM riwayat_bantuan rb LEFT JOIN rumah_ibadah ri ON rb.rumah_ibadah_id=ri.id WHERE rb.penduduk_id=$pid ORDER BY rb.tanggal_pemberian DESC, rb.id DESC"); while($row=$r->fetch_assoc()) $rows[]=$row; echo json_encode($rows); exit; } // ── DELETE BANTUAN ──────────────────────── if($action==='delete_bantuan'){ $d=json_decode(file_get_contents('php://input'),true)??[]; $id=intval($d['id']??$_GET['id']??0); // Get penduduk_id before delete $row=$conn->query("SELECT penduduk_id FROM riwayat_bantuan WHERE id=$id")->fetch_assoc(); $s=$conn->prepare("DELETE FROM riwayat_bantuan WHERE id=?"); $s->bind_param('i',$id); if($s->execute()){ // Update penduduk with latest remaining bantuan if($row){ $pid=$row['penduduk_id']; $latest=$conn->query("SELECT jenis_bantuan,tanggal_pemberian FROM riwayat_bantuan WHERE penduduk_id=$pid ORDER BY tanggal_pemberian DESC LIMIT 1")->fetch_assoc(); if($latest) $conn->query("UPDATE penduduk_miskin SET jenis_bantuan='".$conn->real_escape_string($latest['jenis_bantuan'])."', tanggal_bantuan='".$latest['tanggal_pemberian']."' WHERE id=$pid"); else $conn->query("UPDATE penduduk_miskin SET jenis_bantuan=NULL, tanggal_bantuan=NULL WHERE id=$pid"); } echo json_encode(['success'=>true]); } else echo json_encode(['error'=>$conn->error]); exit; } echo json_encode(['error'=>'Action tidak dikenali']); exit; } ?> Pemetaan Kemiskinan Terpadu — Pontianak
Peta GIS Rumah Ibadah & Penduduk Miskin

Radius Default

Jarak cakupan: 500 m

Legenda

Masjid
Gereja
Pura
Vihara / Kelenteng
Penduduk — Terdaftar
Penduduk — Belum
Radius Ibadah

Tampilkan

Edit Radius

Radius: 500 m
Min. 500 m · Geser untuk ubah ukuran lingkaran

Data

Ibadah
Penduduk