Files

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