77 lines
4.5 KiB
PHP
77 lines
4.5 KiB
PHP
<?php
|
|
require_once __DIR__ . '/auth.php';
|
|
require_login(true);
|
|
require_post();
|
|
require_role(['super_admin','admin_rumah_ibadah'], true);
|
|
|
|
$program_id = (int) post('program_id', 0);
|
|
$penerima_id = (int) post('penerima_id', 0);
|
|
$ket = clean_text(post('keterangan'), 1500);
|
|
$tanggal = post('tanggal_penyaluran', date('Y-m-d'));
|
|
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $tanggal)) json_response('err', 'Tanggal penyaluran tidak valid.');
|
|
|
|
$stmt = $koneksi->prepare("SELECT p.*, ri.user_id AS admin_rumah_user_id, ri.latitude AS ri_latitude, ri.longitude AS ri_longitude, ri.nama_rumah_ibadah FROM program_bantuan p LEFT JOIN rumah_ibadah ri ON ri.id=p.rumah_ibadah_id WHERE p.id=? AND COALESCE(ri.status_hapus,'normal')<>'disetujui' LIMIT 1");
|
|
$stmt->bind_param('i', $program_id);
|
|
$program = fetch_all_stmt($stmt)[0] ?? null;
|
|
if (!$program || $program['status_program'] === 'dibatalkan') json_response('err', 'Program bantuan tidak ditemukan atau dibatalkan.');
|
|
|
|
// FIX: cek status program selesai — tidak bisa menyalurkan ke program yang sudah selesai
|
|
if ($program['status_program'] === 'selesai') json_response('err', 'Program bantuan sudah berstatus selesai, tidak dapat menyalurkan bantuan baru.', [], 409);
|
|
|
|
$jenis = $program['jenis_bantuan'];
|
|
$nominal = $program['nominal'] === null ? null : (int)$program['nominal'];
|
|
$jumlah_item = $program['jumlah_item'] === null ? '' : (string)$program['jumlah_item'];
|
|
|
|
$penerima = get_penerima_by_id($penerima_id);
|
|
if (!$penerima || $penerima['status_pengajuan'] !== 'diterima' || ($penerima['status_hapus'] ?? 'normal') === 'disetujui') json_response('err', 'Penerima tidak ditemukan, belum diterima, atau marker sudah dihapus.');
|
|
|
|
$rumah_ibadah_id = (int) $program['rumah_ibadah_id'];
|
|
if (!$rumah_ibadah_id) json_response('err', 'Program belum terhubung ke rumah ibadah.');
|
|
if ((int)$penerima['rumah_ibadah_id'] !== $rumah_ibadah_id) {
|
|
json_response('err', 'Program dan penerima tidak berada pada rumah ibadah yang sama. Sinkronkan data penerima terlebih dahulu.', [], 409);
|
|
}
|
|
|
|
if ($_SESSION['role'] === 'admin_rumah_ibadah') {
|
|
if (!is_admin_rumah_ibadah_id($rumah_ibadah_id, (int)$_SESSION['user_id'], true)) {
|
|
json_response('err', 'Anda hanya bisa menyalurkan bantuan untuk seluruh rumah ibadah milik akun Anda sendiri.', [], 403);
|
|
}
|
|
}
|
|
|
|
$jarak = haversine_meter((float)$penerima['latitude'], (float)$penerima['longitude'], (float)$program['ri_latitude'], (float)$program['ri_longitude']);
|
|
if ($jarak > 300) json_response('err', 'Penerima berada di luar radius 300 meter rumah ibadah program.');
|
|
|
|
$bulan = (int) date('m', strtotime($tanggal));
|
|
$tahun = (int) date('Y', strtotime($tanggal));
|
|
$stmt = $koneksi->prepare("SELECT COUNT(*) AS jml FROM penyaluran_bantuan WHERE penerima_id=? AND program_id=? AND MONTH(tanggal_penyaluran)=? AND YEAR(tanggal_penyaluran)=?");
|
|
$stmt->bind_param('iiii', $penerima_id, $program_id, $bulan, $tahun);
|
|
$count = fetch_all_stmt($stmt)[0];
|
|
$bantuan_ke = ((int)$count['jml']) + 1;
|
|
$target = (int)$program['target_frekuensi'];
|
|
$warning = '';
|
|
if ($bantuan_ke > $target) {
|
|
$warning = "Peringatan: penerima ini sudah/akan menerima bantuan $bantuan_ke kali pada program ini. Target program adalah $target kali. Data tetap dicatat untuk audit.";
|
|
}
|
|
|
|
$admin_id = (int) $_SESSION['user_id'];
|
|
|
|
// FIX: pisahkan cabang INSERT agar nominal NULL tersimpan sebagai NULL, bukan 0.
|
|
if ($nominal !== null) {
|
|
$stmt = $koneksi->prepare("INSERT INTO penyaluran_bantuan (program_id, penerima_id, rumah_ibadah_id, admin_id, jenis_bantuan, nominal, jumlah_item, bantuan_ke, keterangan, tanggal_penyaluran) VALUES (?,?,?,?,?,?,?,?,?,?)");
|
|
$stmt->bind_param('iiiisisiss', $program_id, $penerima_id, $rumah_ibadah_id, $admin_id, $jenis, $nominal, $jumlah_item, $bantuan_ke, $ket, $tanggal);
|
|
} else {
|
|
$stmt = $koneksi->prepare("INSERT INTO penyaluran_bantuan (program_id, penerima_id, rumah_ibadah_id, admin_id, jenis_bantuan, nominal, jumlah_item, bantuan_ke, keterangan, tanggal_penyaluran) VALUES (?,?,?,?,?,NULL,?,?,?,?)");
|
|
$stmt->bind_param('iiiississ', $program_id, $penerima_id, $rumah_ibadah_id, $admin_id, $jenis, $jumlah_item, $bantuan_ke, $ket, $tanggal);
|
|
}
|
|
if (!$stmt->execute()) json_response('err', 'Gagal mencatat penyaluran bantuan: ' . $koneksi->error);
|
|
|
|
json_response('ok', 'Penyaluran bantuan berhasil dicatat sesuai master program.' . ($warning ? ' ' . $warning : ''), [
|
|
'id' => $stmt->insert_id,
|
|
'bantuan_ke' => $bantuan_ke,
|
|
'jenis_bantuan' => $jenis,
|
|
'nominal' => $nominal,
|
|
'jumlah_item' => $jumlah_item,
|
|
'warning' => $warning
|
|
]);
|
|
?>
|