diff --git a/peta.php b/peta.php
new file mode 100644
index 0000000..e29f486
--- /dev/null
+++ b/peta.php
@@ -0,0 +1,444 @@
+
+';
+
+include 'includes/sidebar.php';
+?>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/proses.php b/proses.php
new file mode 100644
index 0000000..9c6a2ec
--- /dev/null
+++ b/proses.php
@@ -0,0 +1,335 @@
+query("SELECT * FROM rumah_ibadah ORDER BY id");
+ while($r=$ri->fetch_assoc()) $ibadah[]=$r;
+ $rm=$conn->query("SELECT * FROM rumah_miskin ORDER BY prioritas DESC, id");
+ while($r=$rm->fetch_assoc()) $miskin[]=$r;
+ echo json_encode(['status'=>'ok','ibadah'=>$ibadah,'miskin'=>$miskin]);
+ break;
+
+ // ════════ SIMPAN IBADAH (peta/form) ════════
+ case 'simpan_ibadah':
+ case 'simpan_ibadah_form':
+ $nama = bersih($_POST['nama_ibadah'] ??'', $conn);
+ $kat = bersih($_POST['kategori'] ??'Masjid', $conn);
+ $alamat = bersih($_POST['alamat'] ??'', $conn);
+ $peng = bersih($_POST['nama_pengurus'] ??'', $conn);
+ $telp = bersih($_POST['no_telp'] ??'', $conn);
+ $kuota = (int)($_POST['kuota_bantuan'] ??20);
+ $radius = (int)($_POST['radius_m'] ??300);
+ $lat = (float)($_POST['lat'] ??0);
+ $lng = (float)($_POST['lng'] ??0);
+
+ if(!$nama||!$lat||!$lng){ echo json_encode(['status'=>'error','message'=>'Data tidak lengkap']); break; }
+
+ $sql="INSERT INTO rumah_ibadah(nama_ibadah,kategori,alamat,nama_pengurus,no_telp,kuota_bantuan,radius_m,lat,lng,dibuat_oleh) VALUES('$nama','$kat','$alamat','$peng','$telp',$kuota,$radius,$lat,$lng,$uid)";
+ if($conn->query($sql)){
+ if($aksi==='simpan_ibadah_form') redir('data-ibadah.php','Rumah ibadah berhasil ditambahkan');
+ echo json_encode(['status'=>'ok','id'=>$conn->insert_id]);
+ } else echo json_encode(['status'=>'error','message'=>$conn->error]);
+ break;
+
+ // ════════ SIMPAN KPM (peta/form) ════════
+ case 'simpan_miskin':
+ case 'simpan_miskin_form':
+ $nama = bersih($_POST['nama_kk'] ??'', $conn);
+ $nik = bersih($_POST['nik'] ??'', $conn);
+ $tgl = bersih($_POST['tanggal_lahir'] ??'', $conn);
+ $jk = bersih($_POST['jenis_kelamin'] ??'Laki-laki', $conn);
+ $tang = (int)($_POST['jumlah_tanggungan'] ??0);
+ $pend = (int)($_POST['pendapatan_bulanan'] ??0);
+ $kerja = bersih($_POST['pekerjaan'] ??'', $conn);
+ $kond = bersih($_POST['kondisi_rumah'] ??'Tidak Layak', $conn);
+ $telp = bersih($_POST['no_telp'] ??'', $conn);
+ $rtrw = bersih($_POST['rt_rw'] ??'', $conn);
+ $kel = bersih($_POST['kelurahan'] ??'', $conn);
+ $kec = bersih($_POST['kecamatan'] ??'', $conn);
+ $ket = bersih($_POST['keterangan'] ??'', $conn);
+ $lat = (float)($_POST['lat'] ??0);
+ $lng = (float)($_POST['lng'] ??0);
+ $tglVal= $tgl ? "'$tgl'" : 'NULL';
+
+ if(!$nama||!$lat||!$lng){ echo json_encode(['status'=>'error','message'=>'Data tidak lengkap']); break; }
+
+ $sql="INSERT INTO rumah_miskin(nama_kepala_keluarga,nik,tanggal_lahir,jenis_kelamin,jumlah_tanggungan,pendapatan_bulanan,pekerjaan,kondisi_rumah,no_telp,rt_rw,kelurahan,kecamatan,keterangan,lat,lng,didata_oleh) VALUES('$nama','$nik',$tglVal,'$jk',$tang,$pend,'$kerja','$kond','$telp','$rtrw','$kel','$kec','$ket',$lat,$lng,$uid)";
+ if($conn->query($sql)){
+ if($aksi==='simpan_miskin_form') redir('data-warga.php','Data KPM berhasil ditambahkan');
+ echo json_encode(['status'=>'ok','id'=>$conn->insert_id]);
+ } else echo json_encode(['status'=>'error','message'=>$conn->error]);
+ break;
+
+ // ════════ EDIT IBADAH ════════
+ case 'edit_ibadah':
+ $id = (int)($_POST['id']??0);
+ $nama = bersih($_POST['nama_ibadah'] ??'', $conn);
+ $kat = bersih($_POST['kategori'] ??'', $conn);
+ $alm = bersih($_POST['alamat'] ??'', $conn);
+ $peng = bersih($_POST['nama_pengurus'] ??'', $conn);
+ $telp = bersih($_POST['no_telp'] ??'', $conn);
+ $kuo = (int)($_POST['kuota_bantuan'] ??20);
+ $rad = (int)($_POST['radius_m'] ??300);
+ if(!$id||!$nama){redir('data-ibadah.php','Data tidak lengkap','error');break;}
+ $conn->query("UPDATE rumah_ibadah SET nama_ibadah='$nama',kategori='$kat',alamat='$alm',nama_pengurus='$peng',no_telp='$telp',kuota_bantuan=$kuo,radius_m=$rad WHERE id=$id");
+ redir('data-ibadah.php','Data rumah ibadah diperbarui');
+ break;
+
+ // ════════ EDIT KPM ════════
+ case 'edit_miskin':
+ $id = (int)($_POST['id']??0);
+ $nama = bersih($_POST['nama_kk'] ??'', $conn);
+ $nik = bersih($_POST['nik'] ??'', $conn);
+ $tgl = bersih($_POST['tanggal_lahir'] ??'', $conn);
+ $jk = bersih($_POST['jenis_kelamin'] ??'Laki-laki', $conn);
+ $tang = (int)($_POST['jumlah_tanggungan'] ??0);
+ $pend = (int)($_POST['pendapatan_bulanan'] ??0);
+ $kerja= bersih($_POST['pekerjaan'] ??'', $conn);
+ $kond = bersih($_POST['kondisi_rumah'] ??'', $conn);
+ $stat = bersih($_POST['status_bantuan'] ??'Belum Terbantu', $conn);
+ $rtrw = bersih($_POST['rt_rw'] ??'', $conn);
+ $kel = bersih($_POST['kelurahan'] ??'', $conn);
+ $kec = bersih($_POST['kecamatan'] ??'', $conn);
+ $telp = bersih($_POST['no_telp'] ??'', $conn);
+ $ket = bersih($_POST['keterangan'] ??'', $conn);
+ $tglVal= $tgl ? "'$tgl'" : 'NULL';
+ if(!$id||!$nama){redir('data-warga.php','Data tidak lengkap','error');break;}
+ $conn->query("UPDATE rumah_miskin SET nama_kepala_keluarga='$nama',nik='$nik',tanggal_lahir=$tglVal,jenis_kelamin='$jk',jumlah_tanggungan=$tang,pendapatan_bulanan=$pend,pekerjaan='$kerja',kondisi_rumah='$kond',status_bantuan='$stat',rt_rw='$rtrw',kelurahan='$kel',kecamatan='$kec',no_telp='$telp',keterangan='$ket' WHERE id=$id");
+ redir('data-warga.php','Data KPM diperbarui');
+ break;
+
+ // ════════ UPDATE RADIUS ════════
+ case 'update_radius':
+ $id=$conn->real_escape_string($_POST['id']??0);
+ $r =(int)($_POST['radius']??300);
+ $conn->query("UPDATE rumah_ibadah SET radius_m=$r WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ // ════════ UPDATE KOORDINAT ════════
+ case 'update_coords':
+ $jenis=bersih($_POST['jenis']??'', $conn);
+ $id =(int)($_POST['id']??0);
+ $lat =(float)($_POST['lat']??0);
+ $lng =(float)($_POST['lng']??0);
+ $tbl =($jenis==='ibadah')?'rumah_ibadah':'rumah_miskin';
+ $conn->query("UPDATE $tbl SET lat=$lat,lng=$lng WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ // ════════ UPDATE STATUS BANTUAN MASSAL ════════
+ case 'update_status_bantuan':
+ $updates=json_decode(file_get_contents('php://input'),true);
+ if(!is_array($updates)){echo json_encode(['status'=>'error']);break;}
+ foreach($updates as $item){
+ $id=(int)$item['id'];
+ $st=bersih($item['status'],$conn);
+ $conn->query("UPDATE rumah_miskin SET status_bantuan='$st' WHERE id=$id");
+ }
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ // ════════ HAPUS UMUM ════════
+ case 'hapus':
+ $jenis=bersih($_POST['jenis']??'',$conn);
+ $id=(int)($_POST['id']??0);
+ $tbl=($jenis==='ibadah')?'rumah_ibadah':'rumah_miskin';
+ $conn->query("DELETE FROM $tbl WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ // ════════ SIMPAN BANTUAN ════════
+ case 'simpan_bantuan':
+ $wid =(int)($_POST['warga_id'] ??0);
+ $iid =(int)($_POST['ibadah_id'] ??0) ?: 'NULL';
+ $bid =(int)($_POST['bencana_id'] ??0) ?: 'NULL';
+ $jenis= bersih($_POST['jenis_bantuan']??'',$conn);
+ $jml = bersih($_POST['jumlah'] ??'',$conn);
+ $tgl = bersih($_POST['tanggal'] ??date('Y-m-d'),$conn);
+ $pet = bersih($_POST['petugas'] ??'',$conn);
+ $ket = bersih($_POST['keterangan'] ??'',$conn);
+ if(!$wid||!$jenis){redir('data-warga.php','Data tidak lengkap','error');break;}
+ $conn->query("INSERT INTO bantuan_tersalur(warga_id,ibadah_id,bencana_id,jenis_bantuan,jumlah,tanggal,petugas,keterangan,disalurkan_oleh) VALUES($wid,$iid,$bid,'$jenis','$jml','$tgl','$pet','$ket',$uid)");
+ $conn->query("UPDATE rumah_miskin SET status_bantuan='Sudah Menerima' WHERE id=$wid");
+ redir('data-warga.php','Bantuan berhasil dicatat');
+ break;
+
+ // ════════ BENCANA ════════
+ case 'simpan_bencana':
+ $nama = bersih($_POST['nama_bencana']??'',$conn);
+ $jenis= bersih($_POST['jenis'] ??'Banjir',$conn);
+ $tgl = bersih($_POST['tanggal'] ??date('Y-m-d'),$conn);
+ $lok = bersih($_POST['lokasi'] ??'',$conn);
+ $desk = bersih($_POST['deskripsi'] ??'',$conn);
+ if(!$nama){redir('bencana.php','Nama bencana wajib diisi','error');break;}
+ $conn->query("INSERT INTO bencana(nama_bencana,jenis,tanggal,lokasi,deskripsi,dibuat_oleh) VALUES('$nama','$jenis','$tgl','$lok','$desk',$uid)");
+ redir('bencana.php','Bencana berhasil dicatat');
+ break;
+
+ case 'update_status_bencana':
+ $id=(int)($_POST['id']??0);
+ $st=bersih($_POST['status']??'Aktif',$conn);
+ $conn->query("UPDATE bencana SET status='$st' WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ case 'hapus_bencana':
+ $id=(int)($_POST['id']??0);
+ $conn->query("DELETE FROM bencana WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ // ════════ TERDAMPAK BENCANA ════════
+ case 'tandai_terdampak':
+ $bid =(int)($_POST['bencana_id']??0);
+ $wid =(int)($_POST['warga_id'] ??0);
+ $tkt = bersih($_POST['tingkat'] ??'Sedang',$conn);
+ $ket = bersih($_POST['keterangan']??'',$conn);
+ if(!$bid||!$wid){echo json_encode(['status'=>'error','message'=>'Data tidak lengkap']);break;}
+ // Cek duplikat
+ $cek=$conn->query("SELECT id FROM bencana_terdampak WHERE bencana_id=$bid AND warga_id=$wid");
+ if($cek->num_rows>0){echo json_encode(['status'=>'error','message'=>'Warga sudah ditandai']);break;}
+ $conn->query("INSERT INTO bencana_terdampak(bencana_id,warga_id,tingkat,keterangan,ditandai_oleh) VALUES($bid,$wid,'$tkt','$ket',$uid)");
+ // Set prioritas
+ $conn->query("UPDATE rumah_miskin SET prioritas=1 WHERE id=$wid");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ case 'hapus_terdampak':
+ $id=(int)($_POST['id']??0);
+ // Ambil warga_id sebelum hapus
+ $r=$conn->query("SELECT warga_id FROM bencana_terdampak WHERE id=$id")->fetch_assoc();
+ $conn->query("DELETE FROM bencana_terdampak WHERE id=$id");
+ // Cek apakah masih ada bencana lain
+ if($r){
+ $wid=$r['warga_id'];
+ $sisa=$conn->query("SELECT id FROM bencana_terdampak WHERE warga_id=$wid");
+ if($sisa->num_rows===0) $conn->query("UPDATE rumah_miskin SET prioritas=0 WHERE id=$wid");
+ }
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ case 'list_terdampak':
+ $bid=(int)($_GET['bencana_id']??0);
+ $list=[];
+ $r=$conn->query("SELECT bt.*, rm.nama_kepala_keluarga FROM bencana_terdampak bt LEFT JOIN rumah_miskin rm ON bt.warga_id=rm.id WHERE bt.bencana_id=$bid ORDER BY bt.created_at DESC");
+ while($row=$r->fetch_assoc()) $list[]=$row;
+ echo json_encode(['status'=>'ok','data'=>$list]);
+ break;
+
+ // ════════ USER MANAGEMENT (admin only) ════════
+ case 'tambah_user':
+ if($_SESSION['role']!=='admin'){echo json_encode(['status'=>'error']);break;}
+ $nama = bersih($_POST['nama_lengkap']??'',$conn);
+ $uname = bersih($_POST['username'] ??'',$conn);
+ $email = bersih($_POST['email'] ??'',$conn);
+ $role = bersih($_POST['role'] ??'relawan',$conn);
+ $pw = $_POST['password']??'';
+ $pw2 = $_POST['password2']??'';
+ if(!$nama||!$uname||!$email||!$pw){redir('manajemen-user.php','Semua field wajib diisi','error');break;}
+ if($pw!==$pw2){redir('manajemen-user.php','Password tidak cocok','error');break;}
+ if(strlen($pw)<6){redir('manajemen-user.php','Password minimal 6 karakter','error');break;}
+ $hash=password_hash($pw,PASSWORD_DEFAULT);
+ // Cek duplikat
+ $cek=$conn->query("SELECT id FROM users WHERE username='$uname' OR email='$email'");
+ if($cek->num_rows>0){redir('manajemen-user.php','Username atau email sudah digunakan','error');break;}
+ $conn->query("INSERT INTO users(nama_lengkap,username,email,password,role) VALUES('$nama','$uname','$email','$hash','$role')");
+ redir('manajemen-user.php','User berhasil dibuat');
+ break;
+
+ case 'edit_user':
+ if($_SESSION['role']!=='admin'){echo json_encode(['status'=>'error']);break;}
+ $id =(int)($_POST['id']??0);
+ $nama = bersih($_POST['nama_lengkap']??'',$conn);
+ $uname = bersih($_POST['username'] ??'',$conn);
+ $email = bersih($_POST['email'] ??'',$conn);
+ $role = bersih($_POST['role'] ??'relawan',$conn);
+ $conn->query("UPDATE users SET nama_lengkap='$nama',username='$uname',email='$email',role='$role' WHERE id=$id");
+ redir('manajemen-user.php','Data user diperbarui');
+ break;
+
+ case 'reset_password':
+ if($_SESSION['role']!=='admin'){break;}
+ $id =(int)($_POST['id']??0);
+ $pw =$_POST['password_baru']??'';
+ $pw2 =$_POST['password_baru2']??'';
+ if($pw!==$pw2){redir('manajemen-user.php','Password tidak cocok','error');break;}
+ if(strlen($pw)<6){redir('manajemen-user.php','Password minimal 6 karakter','error');break;}
+ $hash=password_hash($pw,PASSWORD_DEFAULT);
+ $conn->query("UPDATE users SET password='$hash' WHERE id=$id");
+ redir('manajemen-user.php','Password berhasil direset');
+ break;
+
+ case 'toggle_aktif':
+ if($_SESSION['role']!=='admin'){break;}
+ $id=(int)($_POST['id']??0);
+ $ak=(int)($_POST['aktif']??0);
+ $conn->query("UPDATE users SET aktif=$ak WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ case 'hapus_user':
+ if($_SESSION['role']!=='admin'){break;}
+ $id=(int)($_POST['id']??0);
+ if($id===$uid){echo json_encode(['status'=>'error','message'=>'Tidak bisa hapus akun sendiri']);break;}
+ $conn->query("DELETE FROM users WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+
+ // ════════ KONFIRMASI BANTUAN (operator/relawan) ════════
+ case 'konfirmasi_bantuan':
+ $id = (int)($_POST['id'] ?? 0);
+ $status = bersih($_POST['status'] ?? 'Menunggu', $conn);
+ $nama_p = bersih($_POST['nama_penerima_konfirmasi'] ?? '', $conn);
+ $catatan= bersih($_POST['catatan_konfirmasi'] ?? '', $conn);
+ if (!$id) { echo json_encode(['status'=>'error','message'=>'ID tidak valid']); break; }
+ $conn->query("UPDATE bantuan_tersalur SET
+ status_konfirmasi='$status',
+ nama_penerima_konfirmasi='$nama_p',
+ catatan_konfirmasi='$catatan',
+ dikonfirmasi_oleh=$uid,
+ tgl_konfirmasi=NOW()
+ WHERE id=$id");
+ // Update status KPM jika dikonfirmasi
+ if ($status === 'Dikonfirmasi') {
+ $wid = $conn->query("SELECT warga_id FROM bantuan_tersalur WHERE id=$id")->fetch_assoc()['warga_id'] ?? 0;
+ if ($wid) $conn->query("UPDATE rumah_miskin SET status_bantuan='Sudah Menerima' WHERE id=$wid");
+ }
+ redir('konfirmasi-bantuan.php?tab='.strtolower($status === 'Dikonfirmasi' ? 'dikonfirmasi' : 'ditolak'),
+ $status === 'Dikonfirmasi' ? 'Bantuan berhasil dikonfirmasi' : 'Laporan berhasil dikirim');
+ break;
+
+ // ════════ HAPUS BANTUAN ════════
+ case 'hapus_bantuan':
+ $id = (int)($_POST['id'] ?? 0);
+ $conn->query("DELETE FROM bantuan_tersalur WHERE id=$id");
+ echo json_encode(['status'=>'ok']);
+ break;
+
+ default:
+ echo json_encode(['status'=>'error','message'=>'Aksi tidak dikenal: '.$aksi]);
+}
+
+$conn->close();
\ No newline at end of file