prepare(" SELECT ri.*, COUNT(pm.id) as jumlah_kk, COALESCE(SUM(pm.jumlah_anggota), 0) as total_jiwa FROM rumah_ibadah ri LEFT JOIN penduduk_miskin pm ON pm.rumah_ibadah_id = ri.id WHERE ri.id = ? GROUP BY ri.id "); $stmt->execute([$id]); $row = $stmt->fetch(); if ($row) jsonResponse(['success' => true, 'data' => $row]); else jsonResponse(['success' => false, 'error' => 'Not found'], 404); } $rows = $db->query(" SELECT ri.*, COUNT(pm.id) as jumlah_kk, COALESCE(SUM(pm.jumlah_anggota), 0) as total_jiwa FROM rumah_ibadah ri LEFT JOIN penduduk_miskin pm ON pm.rumah_ibadah_id = ri.id GROUP BY ri.id ORDER BY ri.nama ASC ")->fetchAll(); jsonResponse(['success' => true, 'data' => $rows]); break; // ── POST buat rumah ibadah baru case 'POST': $input = getInput(); $required = ['nama', 'lat', 'lng']; foreach ($required as $field) { if (empty($input[$field])) { jsonResponse(['success' => false, 'error' => "Field '$field' wajib diisi"], 400); } } $stmt = $db->prepare(" INSERT INTO rumah_ibadah (nama, jenis, alamat, pic, no_wa, lat, lng, radius) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([ trim($input['nama']), $input['jenis'] ?? 'masjid', $input['alamat'] ?? '', $input['pic'] ?? '', $input['no_wa'] ?? '', (float)$input['lat'], (float)$input['lng'], (int)($input['radius'] ?? 500), ]); $newId = (int)$db->lastInsertId(); reassignAll(); $stmt2 = $db->prepare("SELECT * FROM rumah_ibadah WHERE id = ?"); $stmt2->execute([$newId]); jsonResponse(['success' => true, 'data' => $stmt2->fetch(), 'message' => 'Rumah ibadah berhasil ditambahkan']); break; // ── PUT update rumah ibadah case 'PUT': $input = getInput(); $id = $input['id'] ?? $_GET['id'] ?? null; if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); $fields = []; $values = []; $allowed = ['nama', 'jenis', 'alamat', 'pic', 'no_wa', 'lat', 'lng', 'radius']; foreach ($allowed as $f) { if (isset($input[$f])) { $fields[] = "$f = ?"; $values[] = ($f === 'lat' || $f === 'lng') ? (float)$input[$f] : ($f === 'radius' ? (int)$input[$f] : trim($input[$f])); } } if (empty($fields)) jsonResponse(['success' => false, 'error' => 'Tidak ada data yang diupdate'], 400); $values[] = $id; $db->prepare("UPDATE rumah_ibadah SET " . implode(', ', $fields) . " WHERE id = ?")->execute($values); // Radius berubah → reassign semua if (isset($input['radius']) || isset($input['lat']) || isset($input['lng'])) { reassignAll(); } $stmt = $db->prepare("SELECT * FROM rumah_ibadah WHERE id = ?"); $stmt->execute([$id]); jsonResponse(['success' => true, 'data' => $stmt->fetch(), 'message' => 'Berhasil diupdate']); break; // ── DELETE hapus rumah ibadah case 'DELETE': $id = $_GET['id'] ?? getInput()['id'] ?? null; if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); // Lepas referensi penduduk $db->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id = NULL, jarak_ke_ibadah = NULL WHERE rumah_ibadah_id = ?") ->execute([$id]); $db->prepare("DELETE FROM rumah_ibadah WHERE id = ?")->execute([$id]); reassignAll(); jsonResponse(['success' => true, 'message' => 'Berhasil dihapus']); break; default: jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); }