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