335 lines
18 KiB
PHP
335 lines
18 KiB
PHP
<?php
|
|
// ============================================================
|
|
// proses.php — Backend CRUD lengkap
|
|
// ============================================================
|
|
require_once 'koneksi.php';
|
|
|
|
// Jika bukan request AJAX/POST dari form, cek session
|
|
// Tapi untuk redirect POST, boleh tanpa JSON header
|
|
$isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) || isset($_GET['aksi']);
|
|
if ($isAjax) header('Content-Type: application/json; charset=utf-8');
|
|
|
|
$aksi = $_REQUEST['aksi'] ?? '';
|
|
$uid = $_SESSION['user_id'] ?? 0;
|
|
|
|
// Redirect helper untuk form POST
|
|
function redir($page, $msg, $type='success') {
|
|
header("Location: $page?" . ($type==='success'?'success':'error') . "=" . urlencode($msg));
|
|
exit;
|
|
}
|
|
|
|
switch ($aksi) {
|
|
|
|
// ════════ TAMPIL SEMUA (PETA) ════════
|
|
case 'tampil_semua':
|
|
$ibadah=[]; $miskin=[];
|
|
$ri=$conn->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(); |