diff --git a/create_tables.php b/create_tables.php
index c6851e0..18cffcb 100644
--- a/create_tables.php
+++ b/create_tables.php
@@ -37,6 +37,36 @@ $statements = [
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_penduduk_coords (latitude, longitude),
INDEX idx_penduduk_rumah_ibadah (rumah_ibadah_id)
+)",
+ "CREATE TABLE IF NOT EXISTS verifikasi_lapangan (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ jenis_target VARCHAR(50) NOT NULL DEFAULT 'penduduk_miskin',
+ target_nama VARCHAR(255) DEFAULT NULL,
+ petugas_nama VARCHAR(255) NOT NULL,
+ status_verifikasi VARCHAR(30) NOT NULL DEFAULT 'menunggu',
+ hasil_temuan TEXT,
+ tindak_lanjut TEXT,
+ foto VARCHAR(255) DEFAULT NULL,
+ latitude DECIMAL(10, 8) NOT NULL,
+ longitude DECIMAL(11, 8) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ INDEX idx_verifikasi_coords (latitude, longitude),
+ INDEX idx_verifikasi_target (jenis_target, target_nama)
+)",
+ "CREATE TABLE IF NOT EXISTS aduan_warga (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ kategori VARCHAR(100) NOT NULL,
+ pelapor_nama VARCHAR(255) NOT NULL,
+ kontak_pelapor VARCHAR(100) DEFAULT NULL,
+ deskripsi TEXT NOT NULL,
+ status_tindak_lanjut VARCHAR(30) NOT NULL DEFAULT 'baru',
+ tindak_lanjut TEXT,
+ foto VARCHAR(255) DEFAULT NULL,
+ latitude DECIMAL(10, 8) NOT NULL,
+ longitude DECIMAL(11, 8) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ INDEX idx_aduan_coords (latitude, longitude),
+ INDEX idx_aduan_status (status_tindak_lanjut)
)"
];
diff --git a/delete_aduan_warga.php b/delete_aduan_warga.php
new file mode 100644
index 0000000..9a95f44
--- /dev/null
+++ b/delete_aduan_warga.php
@@ -0,0 +1,38 @@
+ 'error', 'message' => 'ID aduan tidak valid']);
+ $conn->close();
+ exit;
+ }
+
+ $stmt = $conn->prepare('DELETE FROM aduan_warga WHERE id = ?');
+ if (!$stmt) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $conn->error]);
+ $conn->close();
+ exit;
+ }
+
+ $stmt->bind_param('i', $id);
+ if ($stmt->execute()) {
+ echo json_encode(['status' => 'success', 'message' => 'Aduan warga berhasil dihapus']);
+ } else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $stmt->error]);
+ }
+
+ $stmt->close();
+ $conn->close();
+ exit;
+}
+
+http_response_code(405);
+echo json_encode(['status' => 'error', 'message' => 'Method tidak diizinkan']);
+$conn->close();
+?>
\ No newline at end of file
diff --git a/delete_verifikasi_lapangan.php b/delete_verifikasi_lapangan.php
new file mode 100644
index 0000000..4af316d
--- /dev/null
+++ b/delete_verifikasi_lapangan.php
@@ -0,0 +1,38 @@
+ 'error', 'message' => 'ID verifikasi tidak valid']);
+ $conn->close();
+ exit;
+ }
+
+ $stmt = $conn->prepare('DELETE FROM verifikasi_lapangan WHERE id = ?');
+ if (!$stmt) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $conn->error]);
+ $conn->close();
+ exit;
+ }
+
+ $stmt->bind_param('i', $id);
+ if ($stmt->execute()) {
+ echo json_encode(['status' => 'success', 'message' => 'Verifikasi lapangan berhasil dihapus']);
+ } else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $stmt->error]);
+ }
+
+ $stmt->close();
+ $conn->close();
+ exit;
+}
+
+http_response_code(405);
+echo json_encode(['status' => 'error', 'message' => 'Method tidak diizinkan']);
+$conn->close();
+?>
\ No newline at end of file
diff --git a/fitur_jalan_parsel/api.php b/fitur_jalan_parsel/api.php
new file mode 100644
index 0000000..2b86e94
--- /dev/null
+++ b/fitur_jalan_parsel/api.php
@@ -0,0 +1,3 @@
+true,'msg'=>'API placeholder untuk fitur jalan/parsel']);
diff --git a/fitur_jalan_parsel/delete_jalan_rusak.php b/fitur_jalan_parsel/delete_jalan_rusak.php
new file mode 100644
index 0000000..728a14b
--- /dev/null
+++ b/fitur_jalan_parsel/delete_jalan_rusak.php
@@ -0,0 +1,46 @@
+ 'error', 'message' => 'ID wajib diisi']);
+ exit;
+ }
+
+ // Ambil data gambar untuk dihapus
+ $stmt = $conn->prepare("SELECT gambar FROM jalan_rusak WHERE id = ?");
+ $stmt->bind_param("i", $id);
+ $stmt->execute();
+ $result = $stmt->get_result();
+ $row = $result->fetch_assoc();
+
+ if ($row && $row['gambar'] && file_exists(__DIR__ . '/../' . $row['gambar'])) {
+ unlink(__DIR__ . '/../' . $row['gambar']);
+ }
+
+ $stmt->close();
+
+ // Hapus record
+ $stmt = $conn->prepare("DELETE FROM jalan_rusak WHERE id = ?");
+ $stmt->bind_param("i", $id);
+
+ if ($stmt->execute()) {
+ echo json_encode(['status' => 'success', 'message' => 'Laporan jalan rusak berhasil dihapus']);
+ } else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $stmt->error]);
+ }
+
+ $stmt->close();
+ $conn->close();
+ exit;
+}
+
+http_response_code(405);
+echo json_encode(['status' => 'error', 'message' => 'Method tidak diizinkan']);
+$conn->close();
+?>
diff --git a/fitur_jalan_parsel/get_jalan_rusak.php b/fitur_jalan_parsel/get_jalan_rusak.php
new file mode 100644
index 0000000..742dac4
--- /dev/null
+++ b/fitur_jalan_parsel/get_jalan_rusak.php
@@ -0,0 +1,29 @@
+query($sql);
+$data = [];
+
+if (!$result) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Query gagal: ' . $conn->error]);
+ $conn->close();
+ exit;
+}
+
+if ($result && $result->num_rows > 0) {
+ while ($row = $result->fetch_assoc()) {
+ $row['latitude'] = (float)$row['latitude'];
+ $row['longitude'] = (float)$row['longitude'];
+ $data[] = $row;
+ }
+}
+
+echo json_encode($data);
+$conn->close();
+?>
diff --git a/fitur_jalan_parsel/index.html b/fitur_jalan_parsel/index.html
new file mode 100644
index 0000000..fbaf33c
--- /dev/null
+++ b/fitur_jalan_parsel/index.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+ Fitur Jalan & Parsel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fitur_jalan_parsel/save_jalan_rusak.php b/fitur_jalan_parsel/save_jalan_rusak.php
new file mode 100644
index 0000000..f2e168f
--- /dev/null
+++ b/fitur_jalan_parsel/save_jalan_rusak.php
@@ -0,0 +1,72 @@
+ 'error', 'message' => 'Latitude, longitude, dan jenis kerusakan wajib diisi']);
+ exit;
+ }
+
+ $gambar = null;
+
+ // Handle file upload
+ if (isset($_FILES['gambar']) && $_FILES['gambar']['error'] === UPLOAD_ERR_OK) {
+ $allowed = ['jpg', 'jpeg', 'png', 'gif'];
+ $filename = $_FILES['gambar']['name'];
+ $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
+
+ if (!in_array($ext, $allowed)) {
+ http_response_code(400);
+ echo json_encode(['status' => 'error', 'message' => 'Format gambar hanya JPG, PNG, GIF']);
+ exit;
+ }
+
+ // Buat folder uploads jika belum ada
+ if (!is_dir(__DIR__ . '/../uploads')) {
+ mkdir(__DIR__ . '/../uploads', 0755, true);
+ }
+
+ // Generate nama file unik
+ $gambar = 'uploads/' . time() . '_' . basename($filename);
+
+ if (!move_uploaded_file($_FILES['gambar']['tmp_name'], __DIR__ . '/../' . $gambar)) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Gagal upload gambar']);
+ exit;
+ }
+ }
+
+ $stmt = $conn->prepare("INSERT INTO jalan_rusak (latitude, longitude, jenis_kerusakan, deskripsi, severity, gambar) VALUES (?, ?, ?, ?, ?, ?)");
+
+ if (!$stmt) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $conn->error]);
+ exit;
+ }
+
+ $stmt->bind_param("ddssss", $latitude, $longitude, $jenis_kerusakan, $deskripsi, $severity, $gambar);
+
+ if ($stmt->execute()) {
+ echo json_encode(['status' => 'success', 'message' => 'Laporan jalan rusak berhasil disimpan', 'id' => $stmt->insert_id]);
+ } else {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => $stmt->error]);
+ }
+
+ $stmt->close();
+ $conn->close();
+ exit;
+}
+
+http_response_code(405);
+echo json_encode(['status' => 'error', 'message' => 'Method tidak diizinkan']);
+$conn->close();
+?>
diff --git a/get_aduan_warga.php b/get_aduan_warga.php
new file mode 100644
index 0000000..748c588
--- /dev/null
+++ b/get_aduan_warga.php
@@ -0,0 +1,24 @@
+query($sql);
+
+if (!$result) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Query gagal: ' . $conn->error]);
+ $conn->close();
+ exit;
+}
+
+$data = [];
+while ($row = $result->fetch_assoc()) {
+ $row['latitude'] = (float)$row['latitude'];
+ $row['longitude'] = (float)$row['longitude'];
+ $data[] = $row;
+}
+
+echo json_encode($data);
+$conn->close();
+?>
\ No newline at end of file
diff --git a/get_verifikasi_lapangan.php b/get_verifikasi_lapangan.php
new file mode 100644
index 0000000..1fbc570
--- /dev/null
+++ b/get_verifikasi_lapangan.php
@@ -0,0 +1,24 @@
+query($sql);
+
+if (!$result) {
+ http_response_code(500);
+ echo json_encode(['status' => 'error', 'message' => 'Query gagal: ' . $conn->error]);
+ $conn->close();
+ exit;
+}
+
+$data = [];
+while ($row = $result->fetch_assoc()) {
+ $row['latitude'] = (float)$row['latitude'];
+ $row['longitude'] = (float)$row['longitude'];
+ $data[] = $row;
+}
+
+echo json_encode($data);
+$conn->close();
+?>
\ No newline at end of file
diff --git a/global/leaflet-loader.js b/global/leaflet-loader.js
new file mode 100644
index 0000000..b46fe29
--- /dev/null
+++ b/global/leaflet-loader.js
@@ -0,0 +1,17 @@
+// Simple loader to make Leaflet resources available globally to pages
+(function(){
+ if(window._leafletLoaderRan) return; window._leafletLoaderRan = true;
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
+ document.head.appendChild(link);
+
+ var script = document.createElement('script');
+ script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
+ script.defer = false;
+ script.onload = function(){
+ console.log('Leaflet loaded');
+ var ev = document.createEvent('Event'); ev.initEvent('leaflet:loaded', true, true); window.dispatchEvent(ev);
+ };
+ document.head.appendChild(script);
+})();
diff --git a/index.html b/index.html
index 3885645..40d1f9d 100644
--- a/index.html
+++ b/index.html
@@ -155,6 +155,12 @@
+
+
@@ -251,6 +257,12 @@
+
+
@@ -401,6 +413,14 @@
Penduduk Miskin
+
+