prepare(" SELECT ri.*, (SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id) AS jumlah_binaan FROM rumah_ibadah ri WHERE ri.id = ? "); $stmt->execute([$id]); $row = $stmt->fetch(); if (!$row) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404); jsonResponse(['success' => true, 'data' => $row]); } // List dengan filter $where = ['1=1']; $params = []; if (!empty($_GET['jenis'])) { $where[] = 'jenis = ?'; $params[] = $_GET['jenis']; } if (!empty($_GET['kecamatan'])) { $where[] = 'kecamatan = ?'; $params[] = $_GET['kecamatan']; } if (!empty($_GET['search'])) { $where[] = 'nama LIKE ?'; $params[] = '%' . $_GET['search'] . '%'; } $sql = "SELECT ri.*, (SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id) AS jumlah_binaan FROM rumah_ibadah ri WHERE " . implode(' AND ', $where) . " ORDER BY ri.nama ASC"; $stmt = $db->prepare($sql); $stmt->execute($params); $rows = $stmt->fetchAll(); jsonResponse(['success' => true, 'data' => $rows, 'total' => count($rows)]); } // ── POST ─────────────────────────────────────────────────────── if ($method === 'POST') { $body = json_decode(file_get_contents('php://input'), true) ?? $_POST; $required = ['nama', 'jenis', 'lat', 'lng']; foreach ($required as $f) { if (empty($body[$f])) jsonResponse(['success' => false, 'message' => "Field '$f' wajib diisi"], 422); } $stmt = $db->prepare(" INSERT INTO rumah_ibadah (nama, jenis, kontak, alamat, kelurahan, kecamatan, lat, lng, radius) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([ sanitize($body['nama']), $body['jenis'], sanitize($body['kontak'] ?? ''), sanitize($body['alamat'] ?? ''), sanitize($body['kelurahan'] ?? ''), sanitize($body['kecamatan'] ?? ''), (float)$body['lat'], (float)$body['lng'], (int)($body['radius'] ?? RADIUS_DEFAULT), ]); $newId = $db->lastInsertId(); $new = $db->query("SELECT * FROM rumah_ibadah WHERE id = $newId")->fetch(); jsonResponse(['success' => true, 'message' => 'Rumah ibadah berhasil ditambahkan', 'data' => $new], 201); } // ── PUT ──────────────────────────────────────────────────────── if ($method === 'PUT') { if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400); $body = json_decode(file_get_contents('php://input'), true) ?? []; $stmt = $db->prepare(" UPDATE rumah_ibadah SET nama=?, jenis=?, kontak=?, alamat=?, kelurahan=?, kecamatan=?, lat=?, lng=?, radius=? WHERE id=? "); $stmt->execute([ sanitize($body['nama'] ?? ''), $body['jenis'] ?? 'Masjid', sanitize($body['kontak'] ?? ''), sanitize($body['alamat'] ?? ''), sanitize($body['kelurahan'] ?? ''), sanitize($body['kecamatan'] ?? ''), (float)($body['lat'] ?? 0), (float)($body['lng'] ?? 0), (int)($body['radius'] ?? RADIUS_DEFAULT), $id, ]); // Re-assign penduduk yang terhubung jika radius berubah reassignPendudukAfterIbadahUpdate(); $updated = $db->query("SELECT * FROM rumah_ibadah WHERE id = $id")->fetch(); jsonResponse(['success' => true, 'message' => 'Data berhasil diperbarui', 'data' => $updated]); } // ── DELETE ───────────────────────────────────────────────────── if ($method === 'DELETE') { if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400); $stmt = $db->prepare("DELETE FROM rumah_ibadah WHERE id = ?"); $stmt->execute([$id]); if ($stmt->rowCount() === 0) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404); jsonResponse(['success' => true, 'message' => 'Data berhasil dihapus']); } function reassignPendudukAfterIbadahUpdate(): void { $db = getDB(); $penduduk = $db->query("SELECT id, lat, lng FROM penduduk_miskin")->fetchAll(); foreach ($penduduk as $p) { $nearest = findNearestIbadah((float)$p['lat'], (float)$p['lng']); if ($nearest) { $stmt = $db->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id=?, jarak_ke_ibadah=? WHERE id=?"); $stmt->execute([$nearest['id'], $nearest['jarak'], $p['id']]); } } } jsonResponse(['success' => false, 'message' => 'Method tidak didukung'], 405);