setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { http_response_code(500); echo json_encode(["success" => false, "message" => "Koneksi gagal: " . $e->getMessage()]); exit(); } $method = $_SERVER['REQUEST_METHOD']; $input = json_decode(file_get_contents("php://input"), true) ?? []; $resource = strtolower($_GET['resource'] ?? ''); switch ($resource) { case 'ibadah': handleIbadah($pdo, $method, $input); break; case 'miskin': handleMiskin($pdo, $method, $input); break; case 'bantuan': handleBantuan($pdo, $method, $input); break; default: http_response_code(404); echo json_encode(["success" => false, "message" => "Resource '$resource' tidak ditemukan. Gunakan: ibadah, miskin, bantuan"]); } // ════════════════════════════════════════════════════════════════ // RUMAH IBADAH // ════════════════════════════════════════════════════════════════ function handleIbadah($pdo, $method, $input) { $validKategori = ['Masjid', 'Gereja', 'Gereja Katolik', 'Pura', 'Vihara', 'Klenteng']; switch ($method) { case 'GET': try { $s = $pdo->query("SELECT * FROM rumah_ibadah ORDER BY kategori, nama_ibadah ASC"); echo json_encode(["success" => true, "data" => $s->fetchAll()]); } catch (Exception $e) { echo json_encode(["success" => true, "data" => [], "warning" => "Tabel belum ada: " . $e->getMessage()]); } break; case 'POST': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } foreach (['nama_ibadah', 'kategori', 'latitude', 'longitude', 'radius_meter'] as $f) { if (!isset($input[$f]) || $input[$f] === '') { http_response_code(400); echo json_encode(["success" => false, "message" => "Field '$f' wajib diisi"]); return; } } if (!in_array($input['kategori'], $validKategori)) { http_response_code(400); echo json_encode(["success" => false, "message" => "Kategori tidak valid. Pilih: " . implode(', ', $validKategori)]); return; } $s = $pdo->prepare( "INSERT INTO rumah_ibadah (nama_ibadah, kategori, radius_meter, keterangan, alamat, latitude, longitude) VALUES (?, ?, ?, ?, ?, ?, ?)" ); $s->execute([ trim($input['nama_ibadah']), $input['kategori'], (int)$input['radius_meter'], trim($input['keterangan'] ?? ''), trim($input['alamat'] ?? ''), (float)$input['latitude'], (float)$input['longitude'], ]); echo json_encode(["success" => true, "message" => "Rumah ibadah disimpan", "id" => $pdo->lastInsertId()]); break; case 'PUT': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } if (!isset($input['id'])) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; } if (!in_array($input['kategori'], $validKategori)) { http_response_code(400); echo json_encode(["success" => false, "message" => "Kategori tidak valid"]); return; } $s = $pdo->prepare( "UPDATE rumah_ibadah SET nama_ibadah=?, kategori=?, radius_meter=?, keterangan=?, alamat=?, latitude=?, longitude=? WHERE id=?" ); $s->execute([ trim($input['nama_ibadah']), $input['kategori'], (int)$input['radius_meter'], trim($input['keterangan'] ?? ''), trim($input['alamat'] ?? ''), (float)$input['latitude'], (float)$input['longitude'], (int)$input['id'], ]); echo json_encode(["success" => true, "message" => "Rumah ibadah diperbarui"]); break; case 'DELETE': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } $id = $_GET['id'] ?? $input['id'] ?? null; if (!$id) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; } $pdo->prepare("DELETE FROM rumah_ibadah WHERE id=?")->execute([(int)$id]); echo json_encode(["success" => true, "message" => "Rumah ibadah dihapus"]); break; default: http_response_code(405); echo json_encode(["success" => false, "message" => "Method tidak diizinkan"]); } } // ════════════════════════════════════════════════════════════════ // PENDUDUK MISKIN // ════════════════════════════════════════════════════════════════ function handleMiskin($pdo, $method, $input) { $validKelas = ['Kelas I', 'Kelas II', 'Kelas III']; switch ($method) { case 'GET': try { // Urutkan: Kelas I dulu (prioritas tertinggi), lalu dalam jangkauan dulu $s = $pdo->query( "SELECT * FROM penduduk_miskin ORDER BY FIELD(kelas_kemiskinan, 'Kelas I', 'Kelas II', 'Kelas III'), nama_kk ASC" ); echo json_encode(["success" => true, "data" => $s->fetchAll()]); } catch (Exception $e) { echo json_encode(["success" => true, "data" => [], "warning" => "Tabel belum ada: " . $e->getMessage()]); } break; case 'POST': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } foreach (['nama_kk', 'latitude', 'longitude'] as $f) { if (!isset($input[$f]) || $input[$f] === '') { http_response_code(400); echo json_encode(["success" => false, "message" => "Field '$f' wajib diisi"]); return; } } if (!empty($input['kelas_kemiskinan']) && !in_array($input['kelas_kemiskinan'], $validKelas)) { http_response_code(400); echo json_encode(["success" => false, "message" => "Kelas kemiskinan tidak valid"]); return; } $s = $pdo->prepare( "INSERT INTO penduduk_miskin (nama_kk, jumlah_jiwa, kelas_kemiskinan, keterangan, alamat, dalam_jangkauan, latitude, longitude) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" ); $s->execute([ trim($input['nama_kk']), (int)($input['jumlah_jiwa'] ?? 1), $input['kelas_kemiskinan'] ?? 'Kelas I', trim($input['keterangan'] ?? ''), trim($input['alamat'] ?? ''), (int)($input['dalam_jangkauan'] ?? 0), (float)$input['latitude'], (float)$input['longitude'], ]); echo json_encode(["success" => true, "message" => "Data penduduk miskin disimpan", "id" => $pdo->lastInsertId()]); break; case 'PUT': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } if (!isset($input['id'])) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; } $s = $pdo->prepare( "UPDATE penduduk_miskin SET nama_kk=?, jumlah_jiwa=?, kelas_kemiskinan=?, keterangan=?, alamat=?, dalam_jangkauan=?, latitude=?, longitude=? WHERE id=?" ); $s->execute([ trim($input['nama_kk']), (int)($input['jumlah_jiwa'] ?? 1), $input['kelas_kemiskinan'] ?? 'Kelas I', trim($input['keterangan'] ?? ''), trim($input['alamat'] ?? ''), (int)($input['dalam_jangkauan'] ?? 0), (float)$input['latitude'], (float)$input['longitude'], (int)$input['id'], ]); echo json_encode(["success" => true, "message" => "Data penduduk miskin diperbarui"]); break; case 'DELETE': if (isOperator()) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Operator tidak punya akses ini" ]); return; } $id = $_GET['id'] ?? $input['id'] ?? null; if (!$id) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; } $pdo->prepare("DELETE FROM penduduk_miskin WHERE id=?")->execute([(int)$id]); echo json_encode(["success" => true, "message" => "Data penduduk miskin dihapus"]); break; default: http_response_code(405); echo json_encode(["success" => false, "message" => "Method tidak diizinkan"]); } } // ════════════════════════════════════════════════════════════════ // RIWAYAT BANTUAN // ════════════════════════════════════════════════════════════════ function handleBantuan($pdo, $method, $input) { switch ($method) { // GET?resource=bantuan&id_miskin=N — ambil riwayat bantuan 1 KK case 'GET': $idMiskin = (int)($_GET['id_miskin'] ?? 0); if (!$idMiskin) { http_response_code(400); echo json_encode(["success"=>false,"message"=>"Parameter id_miskin diperlukan"]); return; } $s = $pdo->prepare( "SELECT *, DATEDIFF(CURDATE(), tanggal) AS hari_lalu FROM riwayat_bantuan WHERE id_miskin = ? ORDER BY tanggal DESC" ); $s->execute([$idMiskin]); $rows = $s->fetchAll(); // Hitung apakah sudah dapat bantuan hari ini $sudahHariIni = false; if (!empty($rows) && $rows[0]['hari_lalu'] == 0) { $sudahHariIni = true; } echo json_encode([ "success" => true, "data" => $rows, "sudah_hari_ini" => $sudahHariIni, ]); break; // POST — tambah riwayat bantuan baru case 'POST': if (isOperator()) { $idMiskin = (int)($input['id_miskin'] ?? 0); $idIbadah = myIbadahId(); $sMiskin = $pdo->prepare( "SELECT latitude, longitude FROM penduduk_miskin WHERE id=?" ); $sMiskin->execute([$idMiskin]); $mk = $sMiskin->fetch(); $sIbadah = $pdo->prepare( "SELECT latitude, longitude, radius_meter FROM rumah_ibadah WHERE id=?" ); $sIbadah->execute([$idIbadah]); $ib = $sIbadah->fetch(); if (!$mk || !$ib) { http_response_code(403); echo json_encode([ "success" => false, "message" => "Akses ditolak" ]); return; } $jarak = haversine( $mk['latitude'], $mk['longitude'], $ib['latitude'], $ib['longitude'] ); if ($jarak > $ib['radius_meter']) { http_response_code(403); echo json_encode([ "success" => false, "message" => "KK ini di luar radius ibadah Anda" ]); return; } } foreach (['id_miskin','jenis_bantuan'] as $f) { if (empty($input[$f])) { http_response_code(400); echo json_encode(["success"=>false,"message"=>"Field '$f' wajib diisi"]); return; } } $tanggal = $input['tanggal'] ?? date('Y-m-d'); // default hari ini $s = $pdo->prepare( "INSERT INTO riwayat_bantuan (id_miskin, tanggal, jenis_bantuan, keterangan, diberikan_oleh) VALUES (?, ?, ?, ?, ?)" ); $s->execute([ (int)$input['id_miskin'], $tanggal, trim($input['jenis_bantuan']), trim($input['keterangan'] ?? ''), trim($input['diberikan_oleh'] ?? ''), ]); echo json_encode(["success"=>true,"message"=>"Riwayat bantuan disimpan","id"=>$pdo->lastInsertId()]); break; // DELETE?id=N — hapus satu riwayat bantuan case 'DELETE': $id = $_GET['id'] ?? $input['id'] ?? null; if (!$id) { http_response_code(400); echo json_encode(["success"=>false,"message"=>"ID diperlukan"]); return; } $pdo->prepare("DELETE FROM riwayat_bantuan WHERE id=?")->execute([(int)$id]); echo json_encode(["success"=>true,"message"=>"Riwayat dihapus"]); break; default: http_response_code(405); echo json_encode(["success"=>false,"message"=>"Method tidak diizinkan"]); } } function haversine($lat1, $lon1, $lat2, $lon2) { $R = 6371000; // meter $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); return $R * 2 * atan2( sqrt($a), sqrt(1 - $a) ); } ?>