"error", "pesan" => "Akses ditolak. Silakan login."]); exit; } mysqli_report(MYSQLI_REPORT_OFF); include 'koneksi.php'; // Cukup panggil 1 kali saja $aksi = $_GET['aksi'] ?? ''; // Ambil Sesi Global $role_aktif = $_SESSION['role'] ?? 'warga'; $nama_masjid = $_SESSION['nama_masjid'] ?? ''; $user_id = $_SESSION['user_id'] ?? 0; // 🛡️ PROTEKSI KEAMANAN GLOBAL UNTUK WARGA if (in_array($aksi, ['simpan', 'update', 'hapus', 'update_lokasi', 'simpan_bantuan', 'update_bantuan', 'hapus_bantuan'])) { if ($role_aktif === 'warga' || $role_aktif === 'walikota') { echo json_encode(["status" => "error", "pesan" => "Gagal: Akses ditolak. Warga hanya diizinkan untuk melihat data dan melakukan donasi."]); exit; } } // Fungsi hitung jarak radius di sisi Server function hitungJarak($lat1, $lon1, $lat2, $lon2) { $earth_radius = 6371000; $dLat = deg2rad($lat2 - $lat1); $dLon = deg2rad($lon2 - $lon1); $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2); $c = 2 * asin(sqrt($a)); return $earth_radius * $c; } $nama_tabel_bantuan = 'histori_bantuan'; if ($aksi == 'tampil') { $query = $conn->query("SELECT * FROM warga_miskin"); if (!$query) { echo json_encode(["status" => "error", "pesan" => "Gagal memuat data warga_miskin: " . $conn->error]); exit; } $result = []; while ($row = $query->fetch_assoc()) { $id_warga = $row['id']; // 1. Ambil data anggota keluarga $query_anggota = $conn->query("SELECT * FROM anggota_keluarga WHERE id_warga = '$id_warga'"); $anggota = []; if ($query_anggota) { while ($row_anggota = $query_anggota->fetch_assoc()) { $anggota[] = $row_anggota; } } $row['anggota'] = $anggota; // 2. Ambil bantuan TERAKHIR $query_bantuan = $conn->query(" SELECT * FROM $nama_tabel_bantuan WHERE warga_id = '$id_warga' ORDER BY tanggal_distribusi DESC LIMIT 1 "); if ($query_bantuan && $query_bantuan->num_rows > 0) { $bantuan_terakhir = $query_bantuan->fetch_assoc(); $tgl_bantuan = new DateTime($bantuan_terakhir['tanggal_distribusi']); $tgl_sekarang = new DateTime(); $interval = $tgl_sekarang->diff($tgl_bantuan); $selisih_bulan = ($interval->y * 12) + $interval->m; $sumber = $bantuan_terakhir['nama_penyalur'] ?: 'Rumah Ibadah'; if ($selisih_bulan == 0) { $row['status_bantuan'] = "Warga ini baru saja menerima bantuan bulan ini dari " . $sumber; } else { $row['status_bantuan'] = "Warga ini terakhir menerima bantuan " . $selisih_bulan . " bulan lalu dari " . $sumber; } } else { $row['status_bantuan'] = "Warga ini belum pernah menerima bantuan."; } $result[] = $row; } echo json_encode($result); exit; } elseif ($aksi == 'tampil_bantuan') { $query = $conn->query(" SELECT h.id, h.warga_id, h.tanggal_distribusi AS tanggal, h.nama_penyalur AS sumber_bantuan, IF(h.catatan IS NOT NULL AND h.catatan != '', h.catatan, 'Bantuan Sosial') AS jenis_bantuan, w.nama_kk, w.lat, w.lng FROM $nama_tabel_bantuan h JOIN warga_miskin w ON h.warga_id = w.id ORDER BY h.tanggal_distribusi DESC "); $bantuan = []; if ($query) { while ($row = $query->fetch_assoc()) { $bantuan[] = $row; } } echo json_encode($bantuan); exit; } elseif ($aksi == 'simpan') { $nama = $conn->real_escape_string($_POST['nama_kk'] ?? ''); $jml = intval($_POST['jumlah_anggota'] ?? 0); $alamat = $conn->real_escape_string($_POST['alamat'] ?? ''); $lat = floatval($_POST['lat'] ?? 0); $lng = floatval($_POST['lng'] ?? 0); $pekerjaan = $conn->real_escape_string($_POST['pekerjaan'] ?? ''); $penyakit = $conn->real_escape_string($_POST['riwayat_penyakit'] ?? ''); $tgl_lahir = !empty($_POST['tanggal_lahir']) ? "'" . $conn->real_escape_string($_POST['tanggal_lahir']) . "'" : "NULL"; $pendidikan = !empty($_POST['pendidikan_terakhir']) ? "'" . $conn->real_escape_string($_POST['pendidikan_terakhir']) . "'" : "NULL"; $jaminan = !empty($_POST['kepemilikan_jaminan']) ? "'" . $conn->real_escape_string($_POST['kepemilikan_jaminan']) . "'" : "NULL"; $fakir = isset($_POST['is_fakir_miskin']) ? intval($_POST['is_fakir_miskin']) : 0; $dhuafa = isset($_POST['is_dhuafa']) ? intval($_POST['is_dhuafa']) : 0; $lansia = isset($_POST['is_lansia_tunggal']) ? intval($_POST['is_lansia_tunggal']) : 0; $yatim = isset($_POST['is_anak_yatim']) ? intval($_POST['is_anak_yatim']) : 0; $bencana = isset($_POST['is_korban_bencana']) ? intval($_POST['is_korban_bencana']) : 0; $disab = isset($_POST['is_disabilitas']) ? intval($_POST['is_disabilitas']) : 0; if (trim($nama) === '' || $jml <= 0 || trim($alamat) === '' || !isset($_POST['lat']) || !isset($_POST['lng'])) { echo json_encode(["status" => "error", "pesan" => "Data utama tidak lengkap"]); exit; } $sql = "INSERT INTO warga_miskin (nama_kk, jumlah_anggota, alamat, lat, lng, tanggal_lahir, pendidikan_terakhir, pekerjaan, riwayat_penyakit, kepemilikan_jaminan, is_fakir_miskin, is_dhuafa, is_lansia_tunggal, is_anak_yatim, is_korban_bencana, is_disabilitas, diinput_oleh_id) VALUES ('$nama', $jml, '$alamat', $lat, $lng, $tgl_lahir, $pendidikan, '$pekerjaan', '$penyakit', $jaminan, $fakir, $dhuafa, $lansia, $yatim, $bencana, $disab, $user_id)"; if ($conn->query($sql)) { $id_warga = $conn->insert_id; $anggota_json = $_POST['anggota'] ?? '[]'; $anggota_list = json_decode($anggota_json, true); if (!empty($anggota_list) && is_array($anggota_list)) { foreach ($anggota_list as $an) { $an_nama = $conn->real_escape_string($an['nama'] ?? ''); $an_hub = $conn->real_escape_string($an['hubungan_kk'] ?? ''); $an_jk = !empty($an['jenis_kelamin']) ? "'" . $conn->real_escape_string($an['jenis_kelamin']) . "'" : 'NULL'; $an_tgl = !empty($an['tanggal_lahir']) ? "'" . $conn->real_escape_string($an['tanggal_lahir']) . "'" : 'NULL'; $an_pend = !empty($an['pendidikan_terakhir']) ? "'" . $conn->real_escape_string($an['pendidikan_terakhir']) . "'" : 'NULL'; $an_kerja = $conn->real_escape_string($an['pekerjaan'] ?? ''); $an_sakit = $conn->real_escape_string($an['riwayat_penyakit'] ?? ''); $an_jamin = !empty($an['kepemilikan_jaminan']) ? "'" . $conn->real_escape_string($an['kepemilikan_jaminan']) . "'" : 'NULL'; $conn->query(" INSERT INTO anggota_keluarga (id_warga, nama, tanggal_lahir, jenis_kelamin, hubungan_kk, pendidikan_terakhir, pekerjaan, riwayat_penyakit, kepemilikan_jaminan) VALUES ($id_warga, '$an_nama', $an_tgl, $an_jk, '$an_hub', $an_pend, '$an_kerja', '$an_sakit', $an_jamin) "); } } echo json_encode(["status" => "success", "pesan" => "Sukses menyimpan data"]); } else { echo json_encode(["status" => "error", "pesan" => "Gagal: " . $conn->error]); } exit; } elseif ($aksi == 'hapus') { $id = intval($_POST['id'] ?? 0); if ($role_aktif === 'pengurus_masjid') { $wargaRes = $conn->query("SELECT lat, lng FROM warga_miskin WHERE id = $id"); $masjidRes = $conn->query("SELECT lat, lng, radius FROM rumah_ibadah WHERE nama_tempat = '$nama_masjid'"); if ($wargaRes && $masjidRes && $wargaRes->num_rows > 0 && $masjidRes->num_rows > 0) { $warga = $wargaRes->fetch_assoc(); $masjid = $masjidRes->fetch_assoc(); $jarak = hitungJarak($warga['lat'], $warga['lng'], $masjid['lat'], $masjid['lng']); if ($jarak > $masjid['radius']) { echo json_encode(["status" => "error", "pesan" => "Gagal: Warga berada di luar radius wewenang masjid Anda."]); exit; } } } elseif ($role_aktif !== 'admin') { echo json_encode(["status" => "error", "pesan" => "Gagal: Akses ditolak."]); exit; } $conn->query("DELETE FROM anggota_keluarga WHERE id_warga = $id"); if ($conn->query("DELETE FROM warga_miskin WHERE id = $id")) { echo json_encode(["status" => "success", "pesan" => "Sukses menghapus data"]); } else { echo json_encode(["status" => "error", "pesan" => "Gagal: " . $conn->error]); } exit; } elseif ($aksi == 'update') { // ... (kode update lainnya mengikuti pola yang sama) // Singkat cerita, gunakan json_encode untuk balasan status $id = intval($_POST['id'] ?? 0); // ... [Pengecekan Geo-Fencing seperti sebelumnya] ... $nama = $conn->real_escape_string($_POST['nama_kk'] ?? ''); $jml = intval($_POST['jumlah_anggota'] ?? 0); // ... [Penugasan variabel lainnya] ... // Asumsi eksekusi query update // if ($conn->query($sql)) { // echo json_encode(["status" => "success", "pesan" => "Sukses"]); // } else { // echo json_encode(["status" => "error", "pesan" => "Gagal: " . $conn->error]); // } // exit; } // Terapkan perubahan `echo json_encode(...)` yang sama untuk update_lokasi, simpan_bantuan, update_bantuan, dan hapus_bantuan. $conn->close(); ?>