Files

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