Files
UAS_SIG/proses.php
T
2026-06-03 05:09:44 +00:00

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();