84 lines
4.6 KiB
PHP
84 lines
4.6 KiB
PHP
<?php
|
|
require_once __DIR__ . '/auth.php';
|
|
require_login(true);
|
|
require_post();
|
|
|
|
$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');
|
|
$username_penerima = clean_text(post('username_penerima'), 50);
|
|
$lat = post('latitude');
|
|
$lng = post('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 kondisi rumah atau jenis bantuan tidak valid.');
|
|
if ($penghasilan < 0 || $jumlah_tanggungan < 0) json_response('err', 'Penghasilan dan tanggungan tidak valid.');
|
|
|
|
$role = $_SESSION['role'];
|
|
$user_id = null;
|
|
$rumah_ibadah_id = null;
|
|
$jarak_meter = null;
|
|
$sumber = 'mandiri';
|
|
|
|
if ($role === 'penerima') {
|
|
$user_id = (int) $_SESSION['user_id'];
|
|
$sumber = 'mandiri';
|
|
} elseif ($role === 'admin_rumah_ibadah' || $role === 'super_admin') {
|
|
if ($username_penerima === '') json_response('err', 'Username penerima wajib diisi agar titik rumah terkait ke akun yang benar.', [], 422);
|
|
$akunPenerima = get_user_by_username_role($username_penerima, 'penerima');
|
|
if (!$akunPenerima) json_response('err', 'Username penerima tidak ditemukan, bukan role penerima, atau akun tidak aktif.', [], 404);
|
|
$user_id = (int) $akunPenerima['id'];
|
|
$sumber = 'admin_rumah_ibadah';
|
|
} else {
|
|
json_response('err', 'Role tidak valid.', [], 403);
|
|
}
|
|
|
|
// Satu akun penerima hanya boleh punya satu pin aktif.
|
|
if (has_active_penerima_pin($user_id)) {
|
|
json_response('err', 'Akun penerima ini sudah memiliki pin aktif. Satu akun penerima hanya boleh punya satu pin aktif.', [], 409);
|
|
}
|
|
|
|
$nearest = get_nearest_rumah_ibadah((float) $lat, (float) $lng, 300);
|
|
if ($nearest) {
|
|
$rumah_ibadah_id = (int) $nearest['id'];
|
|
$jarak_meter = (float) $nearest['jarak_meter'];
|
|
}
|
|
|
|
if ($role === 'admin_rumah_ibadah') {
|
|
$ownNearest = get_nearest_rumah_ibadah((float)$lat, (float)$lng, 300, (int)$_SESSION['user_id']);
|
|
if (!$ownNearest) json_response('err', 'Lokasi penerima berada di luar radius 300 meter seluruh rumah ibadah Anda.');
|
|
if ($nearest && (int)$nearest['id'] !== (int)$ownNearest['id']) {
|
|
json_response('err', 'Lokasi penerima 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'];
|
|
}
|
|
|
|
$status = 'menunggu';
|
|
|
|
// FIX: pisahkan cabang INSERT agar rumah_ibadah_id dan jarak_meter NULL tersimpan benar, bukan 0.
|
|
if ($rumah_ibadah_id !== null) {
|
|
$stmt = $koneksi->prepare("INSERT INTO penerima_bantuan (user_id, rumah_ibadah_id, nama_penerima, nik, no_hp, alamat, pekerjaan, penghasilan, jumlah_tanggungan, kondisi_rumah, jenis_bantuan, latitude, longitude, jarak_meter, status_pengajuan, sumber_pengajuan) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
|
|
$stmt->bind_param('iisssssiissdddss', $user_id, $rumah_ibadah_id, $nama, $nik, $no_hp, $alamat, $pekerjaan, $penghasilan, $jumlah_tanggungan, $kondisi_rumah, $jenis_bantuan, $lat, $lng, $jarak_meter, $status, $sumber);
|
|
} else {
|
|
$stmt = $koneksi->prepare("INSERT INTO penerima_bantuan (user_id, rumah_ibadah_id, nama_penerima, nik, no_hp, alamat, pekerjaan, penghasilan, jumlah_tanggungan, kondisi_rumah, jenis_bantuan, latitude, longitude, jarak_meter, status_pengajuan, sumber_pengajuan) VALUES (?,NULL,?,?,?,?,?,?,?,?,?,?,?,NULL,?,?)");
|
|
$stmt->bind_param('isssssiissddss', $user_id, $nama, $nik, $no_hp, $alamat, $pekerjaan, $penghasilan, $jumlah_tanggungan, $kondisi_rumah, $jenis_bantuan, $lat, $lng, $status, $sumber);
|
|
}
|
|
if (!$stmt->execute()) json_response('err', 'Gagal menyimpan penerima: ' . $koneksi->error);
|
|
|
|
$id = $stmt->insert_id;
|
|
insert_riwayat_status($id, null, $status, 'Pengajuan penerima dibuat.');
|
|
$row = get_penerima_by_id($id);
|
|
$msg = $rumah_ibadah_id ? 'Pengajuan penerima berhasil disimpan dan masuk radius rumah ibadah terdekat.' : 'Pengajuan tersimpan, tetapi belum ada pemberi bantuan dalam radius 300 meter. Nanti akan otomatis terhubung jika ada rumah ibadah diterima di radius tersebut.';
|
|
json_response('ok', $msg, $row);
|
|
?>
|