false,'message'=>'ID diperlukan']); exit; } $stmt = $db->prepare("SELECT * FROM histori_kerusakan WHERE kerusakan_id=? ORDER BY tgl_perubahan DESC"); $stmt->bind_param('i', $id); $stmt->execute(); $result = $stmt->get_result(); $data = []; while ($row = $result->fetch_assoc()) $data[] = $row; echo json_encode(['success'=>true, 'data'=>$data]); $db->close(); exit; } if ($action === 'update_status') { // POST update status + catat histori $input = json_decode(file_get_contents('php://input'), true); $id = intval($input['id'] ?? 0); $status_baru = $input['status_baru'] ?? ''; $catatan = $input['catatan'] ?? ''; if (!$id || !$status_baru) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID dan status_baru diperlukan']); exit; } // Ambil status lama $stmt = $db->prepare("SELECT status_laporan FROM kerusakan_jalan WHERE id=?"); $stmt->bind_param('i', $id); $stmt->execute(); $row = $stmt->get_result()->fetch_assoc(); if (!$row) { http_response_code(404); echo json_encode(['success'=>false,'message'=>'Data tidak ditemukan']); exit; } $status_lama = $row['status_laporan']; // Update status $stmt2 = $db->prepare("UPDATE kerusakan_jalan SET status_laporan=? WHERE id=?"); $stmt2->bind_param('si', $status_baru, $id); $stmt2->execute(); // Catat histori $stmt3 = $db->prepare("INSERT INTO histori_kerusakan (kerusakan_id, status_lama, status_baru, catatan) VALUES (?,?,?,?)"); $stmt3->bind_param('isss', $id, $status_lama, $status_baru, $catatan); $stmt3->execute(); echo json_encode(['success'=>true, 'message'=>'Status kerusakan diupdate']); $db->close(); exit; } switch ($method) { // ── READ ──────────────────────────────────────────────────────── case 'GET': if (isset($_GET['id'])) { $id = intval($_GET['id']); $stmt = $db->prepare("SELECT * FROM kerusakan_jalan WHERE id=?"); $stmt->bind_param('i', $id); $stmt->execute(); $row = $stmt->get_result()->fetch_assoc(); if ($row) { echo json_encode(['success'=>true, 'data'=>$row]); } else { http_response_code(404); echo json_encode(['success'=>false, 'message'=>'Data tidak ditemukan']); } } else { // Filter opsional: ?jalan_id=X atau ?status=X $where = []; $params = ''; $vals = []; if (!empty($_GET['jalan_id'])) { $where[] = 'jalan_id=?'; $params .= 'i'; $vals[] = intval($_GET['jalan_id']); } if (!empty($_GET['status'])) { $where[] = 'status_laporan=?'; $params .= 's'; $vals[] = $_GET['status']; } $sql = "SELECT k.*, j.nama_jalan as jalan_nama FROM kerusakan_jalan k LEFT JOIN jalan j ON k.jalan_id=j.id"; if ($where) $sql .= ' WHERE '.implode(' AND ', $where); $sql .= ' ORDER BY k.tgl_laporan DESC'; $stmt = $db->prepare($sql); if ($params) $stmt->bind_param($params, ...$vals); $stmt->execute(); $result = $stmt->get_result(); $data = []; while ($row = $result->fetch_assoc()) $data[] = $row; // Hitung kluster per lokasi (radius ~50m) foreach ($data as &$item) { $cnt = 0; foreach ($data as $other) { $dlat = ($item['lat'] - $other['lat']) * 111000; $dlng = ($item['lng'] - $other['lng']) * 111000 * cos(deg2rad($item['lat'])); if (sqrt($dlat*$dlat + $dlng*$dlng) < 50) $cnt++; } $item['laporan_terdekat'] = $cnt; } echo json_encode(['success'=>true, 'data'=>$data]); } break; // ── CREATE ────────────────────────────────────────────────────── case 'POST': $input = json_decode(file_get_contents('php://input'), true); $required = ['deskripsi','tingkat_urgensi','lat','lng']; foreach ($required as $f) { if (empty($input[$f]) && $input[$f] !== 0) { http_response_code(400); echo json_encode(['success'=>false,'message'=>"Field $f diperlukan"]); exit; } } $jalan_id = !empty($input['jalan_id']) ? intval($input['jalan_id']) : null; $nama_jalan_ref = trim($input['nama_jalan_ref'] ?? ''); $deskripsi = trim($input['deskripsi']); $tingkat_urgensi = $input['tingkat_urgensi']; $lat = floatval($input['lat']); $lng = floatval($input['lng']); $foto_base64 = $input['foto_base64'] ?? null; $valid_urgensi = ['Rendah','Sedang','Tinggi','Kritis']; if (!in_array($tingkat_urgensi, $valid_urgensi)) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'Tingkat urgensi tidak valid']); break; } $stmt = $db->prepare( "INSERT INTO kerusakan_jalan (jalan_id, nama_jalan_ref, deskripsi, tingkat_urgensi, lat, lng, foto_base64) VALUES (?,?,?,?,?,?,?)" ); $stmt->bind_param('isssdds', $jalan_id, $nama_jalan_ref, $deskripsi, $tingkat_urgensi, $lat, $lng, $foto_base64); if ($stmt->execute()) { echo json_encode(['success'=>true,'message'=>'Laporan kerusakan berhasil disimpan','id'=>$db->insert_id]); } else { http_response_code(500); echo json_encode(['success'=>false,'message'=>'Gagal menyimpan data']); } break; // ── UPDATE ────────────────────────────────────────────────────── case 'PUT': $input = json_decode(file_get_contents('php://input'), true); $id = intval($input['id'] ?? 0); if (!$id) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID diperlukan']); break; } $deskripsi = trim($input['deskripsi'] ?? ''); $tingkat_urgensi = $input['tingkat_urgensi'] ?? ''; $nama_jalan_ref = trim($input['nama_jalan_ref'] ?? ''); $stmt = $db->prepare("UPDATE kerusakan_jalan SET deskripsi=?, tingkat_urgensi=?, nama_jalan_ref=? WHERE id=?"); $stmt->bind_param('sssi', $deskripsi, $tingkat_urgensi, $nama_jalan_ref, $id); if ($stmt->execute()) { echo json_encode(['success'=>true,'message'=>'Data kerusakan diupdate']); } else { http_response_code(500); echo json_encode(['success'=>false,'message'=>'Gagal mengupdate data']); } break; // ── DELETE ────────────────────────────────────────────────────── case 'DELETE': $input = json_decode(file_get_contents('php://input'), true); $id = intval($input['id'] ?? ($_GET['id'] ?? 0)); if (!$id) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID diperlukan']); break; } $stmt = $db->prepare("DELETE FROM kerusakan_jalan WHERE id=?"); $stmt->bind_param('i', $id); if ($stmt->execute() && $stmt->affected_rows > 0) { echo json_encode(['success'=>true,'message'=>'Laporan kerusakan dihapus']); } else { http_response_code(404); echo json_encode(['success'=>false,'message'=>'Data tidak ditemukan']); } break; default: http_response_code(405); echo json_encode(['success'=>false,'message'=>'Method tidak diizinkan']); } $db->close(); ?>