Files

71 lines
4.0 KiB
PHP

<?php
require_once __DIR__ . '/auth.php';
require_login(true);
require_post();
$id = (int) post('id', 0);
$penerima = get_penerima_by_id($id);
if (!$penerima || !can_manage_penerima($penerima)) json_response('err', 'Data tidak ditemukan atau akses ditolak.', [], 403);
$allowedKondisi = ['baik','sedang','rusak'];
$allowedJenis = ['zakat','sembako','uang_tunai','lainnya'];
$nama = clean_text(post('nama_penerima'), 100);
$nik = clean_text(post('nik'), 30);
$no_hp = clean_text(post('no_hp'), 20);
$alamat = clean_text(post('alamat'), 1000);
$pekerjaan = clean_text(post('pekerjaan'), 100);
$penghasilan = (int) post('penghasilan', 0);
$jumlah_tanggungan = (int) post('jumlah_tanggungan', 0);
$kondisi_rumah = post('kondisi_rumah');
$jenis_bantuan = post('jenis_bantuan');
$lat = post('latitude', $penerima['latitude']);
$lng = post('longitude', $penerima['longitude']);
if ($nama==='' || $no_hp==='' || $alamat==='' || $pekerjaan==='' || !valid_latlng($lat, $lng)) json_response('err', 'Data wajib belum lengkap atau koordinat tidak valid.');
if (!valid_enum($kondisi_rumah, $allowedKondisi) || !valid_enum($jenis_bantuan, $allowedJenis)) json_response('err', 'Pilihan tidak valid.');
if ($penghasilan < 0 || $jumlah_tanggungan < 0) json_response('err', 'Penghasilan dan tanggungan tidak valid.');
$rumah_ibadah_id = null;
$jarak_meter = null;
// FIX: cek apakah koordinat berubah untuk keperluan riwayat
$latBefore = (float)$penerima['latitude'];
$lngBefore = (float)$penerima['longitude'];
$lokasiBerubar = (abs((float)$lat - $latBefore) > 0.000001 || abs((float)$lng - $lngBefore) > 0.000001);
if ($_SESSION['role'] === 'admin_rumah_ibadah') {
$globalNearest = get_nearest_rumah_ibadah((float)$lat, (float)$lng, 300);
$ownNearest = get_nearest_rumah_ibadah((float)$lat, (float)$lng, 300, (int)$_SESSION['user_id']);
if (!$ownNearest) json_response('err', 'Lokasi baru di luar radius 300 meter seluruh rumah ibadah Anda.');
if ($globalNearest && (int)$globalNearest['id'] !== (int)$ownNearest['id']) {
json_response('err', 'Lokasi baru lebih dekat ke rumah ibadah lain. Sistem hanya boleh mengaitkan penerima ke rumah ibadah terdekat.', [], 409);
}
$rumah_ibadah_id = (int)$ownNearest['id'];
$jarak_meter = (float)$ownNearest['jarak_meter'];
} else {
$nearest = get_nearest_rumah_ibadah((float)$lat, (float)$lng, 300);
if ($nearest) {
$rumah_ibadah_id = (int)$nearest['id'];
$jarak_meter = (float)$nearest['jarak_meter'];
}
}
// FIX: pisahkan cabang UPDATE agar rumah_ibadah_id/jarak_meter NULL tersimpan benar, bukan 0.
if ($rumah_ibadah_id !== null) {
$stmt = $koneksi->prepare("UPDATE penerima_bantuan SET rumah_ibadah_id=?, nama_penerima=?, nik=?, no_hp=?, alamat=?, pekerjaan=?, penghasilan=?, jumlah_tanggungan=?, kondisi_rumah=?, jenis_bantuan=?, latitude=?, longitude=?, jarak_meter=? WHERE id=?");
$stmt->bind_param('isssssiissdddi', $rumah_ibadah_id, $nama, $nik, $no_hp, $alamat, $pekerjaan, $penghasilan, $jumlah_tanggungan, $kondisi_rumah, $jenis_bantuan, $lat, $lng, $jarak_meter, $id);
} else {
$stmt = $koneksi->prepare("UPDATE penerima_bantuan SET rumah_ibadah_id=NULL, nama_penerima=?, nik=?, no_hp=?, alamat=?, pekerjaan=?, penghasilan=?, jumlah_tanggungan=?, kondisi_rumah=?, jenis_bantuan=?, latitude=?, longitude=?, jarak_meter=NULL WHERE id=?");
$stmt->bind_param('sssssiissddi', $nama, $nik, $no_hp, $alamat, $pekerjaan, $penghasilan, $jumlah_tanggungan, $kondisi_rumah, $jenis_bantuan, $lat, $lng, $id);
}
if (!$stmt->execute()) json_response('err', 'Gagal mengubah data: ' . $koneksi->error);
// FIX: catat riwayat saat lokasi berubah agar ada jejak audit.
if ($lokasiBerubar) {
$riNama = $rumah_ibadah_id ? ('RI ID ' . $rumah_ibadah_id) : 'belum terhubung RI';
insert_riwayat_status($id, $penerima['status_pengajuan'], $penerima['status_pengajuan'], "Lokasi penerima diperbarui. RI baru: $riNama, jarak: " . ($jarak_meter ?? 'N/A') . " m.");
}
json_response('ok', 'Data penerima berhasil diubah.', get_penerima_by_id($id));
?>