From df18a7a99a635de41bc0f8ed381da6f683e19266 Mon Sep 17 00:00:00 2001 From: L4zyL4mb Date: Wed, 10 Jun 2026 21:46:56 +0700 Subject: [PATCH] UAS SIG Proyek WebGis --- SIG_Tanah_Jalan/api/jalan.php | 141 + SIG_Tanah_Jalan/api/kerusakan.php | 194 ++ SIG_Tanah_Jalan/api/tanah.php | 144 + SIG_Tanah_Jalan/config.php | 31 + SIG_Tanah_Jalan/database.sql | 80 + SIG_Tanah_Jalan/db_jalan_update.sql | 45 + SIG_Tanah_Jalan/index.php | 1466 +++++++++ SPBU_Pontianak/database.sql | 28 + SPBU_Pontianak/db_connect.php | 14 + SPBU_Pontianak/index.html | 14 + SPBU_Pontianak/index.php | 397 +++ SPBU_Pontianak/insert.php | 293 ++ SPBU_Pontianak/show.php | 414 +++ index.html | 614 ++++ sig-kemiskinan/README.md | 132 + sig-kemiskinan/api/auth.php | 75 + sig-kemiskinan/api/bantuan.php | 167 ++ sig-kemiskinan/api/dashboard_stats.php | 189 ++ sig-kemiskinan/api/export_excel.php | 118 + sig-kemiskinan/api/export_pdf.php | 246 ++ sig-kemiskinan/api/foto.php | 171 ++ sig-kemiskinan/api/geocode.php | 71 + sig-kemiskinan/api/notifikasi.php | 161 + sig-kemiskinan/api/penduduk.php | 308 ++ sig-kemiskinan/api/rumah_ibadah.php | 131 + sig-kemiskinan/api/update_radius.php | 29 + sig-kemiskinan/api/wilayah.php | 68 + .../uploads/foto_14_1781095115_a7fa167f.jpeg | Bin 0 -> 84292 bytes .../uploads/foto_15_1781099424_25542d1c.jpg | Bin 0 -> 37906 bytes .../uploads/foto_16_1781099576_96e58d0d.jpeg | Bin 0 -> 33526 bytes sig-kemiskinan/database.sql | 363 +++ sig-kemiskinan/includes/auth.php | 30 + sig-kemiskinan/includes/config.php | 144 + sig-kemiskinan/index.html | 2661 +++++++++++++++++ sig-kemiskinan/update_kategori.php | 38 + 35 files changed, 8977 insertions(+) create mode 100644 SIG_Tanah_Jalan/api/jalan.php create mode 100644 SIG_Tanah_Jalan/api/kerusakan.php create mode 100644 SIG_Tanah_Jalan/api/tanah.php create mode 100644 SIG_Tanah_Jalan/config.php create mode 100644 SIG_Tanah_Jalan/database.sql create mode 100644 SIG_Tanah_Jalan/db_jalan_update.sql create mode 100644 SIG_Tanah_Jalan/index.php create mode 100644 SPBU_Pontianak/database.sql create mode 100644 SPBU_Pontianak/db_connect.php create mode 100644 SPBU_Pontianak/index.html create mode 100644 SPBU_Pontianak/index.php create mode 100644 SPBU_Pontianak/insert.php create mode 100644 SPBU_Pontianak/show.php create mode 100644 index.html create mode 100644 sig-kemiskinan/README.md create mode 100644 sig-kemiskinan/api/auth.php create mode 100644 sig-kemiskinan/api/bantuan.php create mode 100644 sig-kemiskinan/api/dashboard_stats.php create mode 100644 sig-kemiskinan/api/export_excel.php create mode 100644 sig-kemiskinan/api/export_pdf.php create mode 100644 sig-kemiskinan/api/foto.php create mode 100644 sig-kemiskinan/api/geocode.php create mode 100644 sig-kemiskinan/api/notifikasi.php create mode 100644 sig-kemiskinan/api/penduduk.php create mode 100644 sig-kemiskinan/api/rumah_ibadah.php create mode 100644 sig-kemiskinan/api/update_radius.php create mode 100644 sig-kemiskinan/api/wilayah.php create mode 100644 sig-kemiskinan/assets/img/uploads/foto_14_1781095115_a7fa167f.jpeg create mode 100644 sig-kemiskinan/assets/img/uploads/foto_15_1781099424_25542d1c.jpg create mode 100644 sig-kemiskinan/assets/img/uploads/foto_16_1781099576_96e58d0d.jpeg create mode 100644 sig-kemiskinan/database.sql create mode 100644 sig-kemiskinan/includes/auth.php create mode 100644 sig-kemiskinan/includes/config.php create mode 100644 sig-kemiskinan/index.html create mode 100644 sig-kemiskinan/update_kategori.php diff --git a/SIG_Tanah_Jalan/api/jalan.php b/SIG_Tanah_Jalan/api/jalan.php new file mode 100644 index 0000000..109dbe5 --- /dev/null +++ b/SIG_Tanah_Jalan/api/jalan.php @@ -0,0 +1,141 @@ +prepare("SELECT * FROM jalan WHERE id = ?"); + $stmt->bind_param('i', $id); + $stmt->execute(); + $result = $stmt->get_result(); + $row = $result->fetch_assoc(); + if ($row) { + $row['geometry'] = json_decode($row['geometry']); + echo json_encode(['success' => true, 'data' => $row]); + } else { + http_response_code(404); + echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']); + } + } else { + $result = $db->query("SELECT * FROM jalan ORDER BY created_at DESC"); + $data = []; + while ($row = $result->fetch_assoc()) { + $row['geometry'] = json_decode($row['geometry']); + $data[] = $row; + } + echo json_encode(['success' => true, 'data' => $data]); + } + break; + + // ── CREATE: Tambah jalan baru ─────────────────────────────────── + case 'POST': + $input = json_decode(file_get_contents('php://input'), true); + + if ( + empty($input['nama_jalan']) || + empty($input['status_jalan']) || + empty($input['geometry']) || + !isset($input['panjang']) + ) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'Data tidak lengkap']); + break; + } + + $nama_jalan = trim($input['nama_jalan']); + $status_jalan = $input['status_jalan']; + $panjang = floatval($input['panjang']); + $geometry = json_encode($input['geometry']); + + $valid_status = ['Nasional', 'Provinsi', 'Kabupaten']; + if (!in_array($status_jalan, $valid_status)) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'Status jalan tidak valid']); + break; + } + + $stmt = $db->prepare( + "INSERT INTO jalan (nama_jalan, status_jalan, panjang, geometry) VALUES (?, ?, ?, ?)" + ); + $stmt->bind_param('ssds', $nama_jalan, $status_jalan, $panjang, $geometry); + + if ($stmt->execute()) { + echo json_encode([ + 'success' => true, + 'message' => 'Data jalan berhasil disimpan', + 'id' => $db->insert_id + ]); + } else { + http_response_code(500); + echo json_encode(['success' => false, 'message' => 'Gagal menyimpan data']); + } + break; + + // ── UPDATE: Edit jalan ────────────────────────────────────────── + case 'PUT': + $input = json_decode(file_get_contents('php://input'), true); + + if (empty($input['id'])) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'ID diperlukan']); + break; + } + + $id = intval($input['id']); + $nama_jalan = trim($input['nama_jalan']); + $status_jalan = $input['status_jalan']; + $panjang = floatval($input['panjang']); + $geometry = json_encode($input['geometry']); + + $stmt = $db->prepare( + "UPDATE jalan SET nama_jalan=?, status_jalan=?, panjang=?, geometry=? WHERE id=?" + ); + $stmt->bind_param('ssdsi', $nama_jalan, $status_jalan, $panjang, $geometry, $id); + + if ($stmt->execute()) { + echo json_encode(['success' => true, 'message' => 'Data jalan berhasil diupdate']); + } else { + http_response_code(500); + echo json_encode(['success' => false, 'message' => 'Gagal mengupdate data']); + } + break; + + // ── DELETE: Hapus jalan ───────────────────────────────────────── + 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 jalan WHERE id = ?"); + $stmt->bind_param('i', $id); + + if ($stmt->execute() && $stmt->affected_rows > 0) { + echo json_encode(['success' => true, 'message' => 'Data jalan berhasil 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(); +?> \ No newline at end of file diff --git a/SIG_Tanah_Jalan/api/kerusakan.php b/SIG_Tanah_Jalan/api/kerusakan.php new file mode 100644 index 0000000..a694685 --- /dev/null +++ b/SIG_Tanah_Jalan/api/kerusakan.php @@ -0,0 +1,194 @@ +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(); +?> \ No newline at end of file diff --git a/SIG_Tanah_Jalan/api/tanah.php b/SIG_Tanah_Jalan/api/tanah.php new file mode 100644 index 0000000..4ae7f5e --- /dev/null +++ b/SIG_Tanah_Jalan/api/tanah.php @@ -0,0 +1,144 @@ +prepare("SELECT * FROM tanah WHERE id = ?"); + $stmt->bind_param('i', $id); + $stmt->execute(); + $result = $stmt->get_result(); + $row = $result->fetch_assoc(); + if ($row) { + $row['geometry'] = json_decode($row['geometry']); + echo json_encode(['success' => true, 'data' => $row]); + } else { + http_response_code(404); + echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']); + } + } else { + $result = $db->query("SELECT * FROM tanah ORDER BY created_at DESC"); + $data = []; + while ($row = $result->fetch_assoc()) { + $row['geometry'] = json_decode($row['geometry']); + $data[] = $row; + } + echo json_encode(['success' => true, 'data' => $data]); + } + break; + + // ── CREATE ────────────────────────────────────────────────────── + case 'POST': + $input = json_decode(file_get_contents('php://input'), true); + + if ( + empty($input['kode_kavling']) || + empty($input['nama_pemilik']) || + empty($input['status_tanah']) || + empty($input['geometry']) || + !isset($input['luas']) + ) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'Data tidak lengkap']); + break; + } + + $kode_kavling = trim($input['kode_kavling']); + $nama_pemilik = trim($input['nama_pemilik']); + $status_tanah = $input['status_tanah']; + $luas = floatval($input['luas']); + $geometry = json_encode($input['geometry']); + + $valid_status = ['SHM', 'HGB', 'HGU', 'HP']; + if (!in_array($status_tanah, $valid_status)) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'Status tanah tidak valid']); + break; + } + + $stmt = $db->prepare( + "INSERT INTO tanah (kode_kavling, nama_pemilik, status_tanah, luas, geometry) VALUES (?, ?, ?, ?, ?)" + ); + $stmt->bind_param('sssds', $kode_kavling, $nama_pemilik, $status_tanah, $luas, $geometry); + + if ($stmt->execute()) { + echo json_encode([ + 'success' => true, + 'message' => 'Data tanah 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); + + if (empty($input['id'])) { + http_response_code(400); + echo json_encode(['success' => false, 'message' => 'ID diperlukan']); + break; + } + + $id = intval($input['id']); + $kode_kavling = trim($input['kode_kavling']); + $nama_pemilik = trim($input['nama_pemilik']); + $status_tanah = $input['status_tanah']; + $luas = floatval($input['luas']); + $geometry = json_encode($input['geometry']); + + $stmt = $db->prepare( + "UPDATE tanah SET kode_kavling=?, nama_pemilik=?, status_tanah=?, luas=?, geometry=? WHERE id=?" + ); + $stmt->bind_param('sssdsi', $kode_kavling, $nama_pemilik, $status_tanah, $luas, $geometry, $id); + + if ($stmt->execute()) { + echo json_encode(['success' => true, 'message' => 'Data tanah berhasil 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 tanah WHERE id = ?"); + $stmt->bind_param('i', $id); + + if ($stmt->execute() && $stmt->affected_rows > 0) { + echo json_encode(['success' => true, 'message' => 'Data tanah berhasil 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(); +?> \ No newline at end of file diff --git a/SIG_Tanah_Jalan/config.php b/SIG_Tanah_Jalan/config.php new file mode 100644 index 0000000..1b1f624 --- /dev/null +++ b/SIG_Tanah_Jalan/config.php @@ -0,0 +1,31 @@ +connect_error) { + http_response_code(500); + die(json_encode(['error' => 'Koneksi database gagal: ' . $conn->connect_error])); + } + $conn->set_charset('utf8mb4'); + return $conn; +} + +// Header CORS & JSON untuk semua API +header('Content-Type: application/json'); +header('Access-Control-Allow-Origin: *'); +header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); +header('Access-Control-Allow-Headers: Content-Type'); + +if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { + http_response_code(200); + exit(); +} +?> \ No newline at end of file diff --git a/SIG_Tanah_Jalan/database.sql b/SIG_Tanah_Jalan/database.sql new file mode 100644 index 0000000..7ba88d4 --- /dev/null +++ b/SIG_Tanah_Jalan/database.sql @@ -0,0 +1,80 @@ +-- ============================================ +-- DATABASE SETUP - SIG Tugas Kuliah +-- Manajemen Jalan & Parsil Tanah - Pontianak +-- ============================================ + +CREATE DATABASE IF NOT EXISTS sig_tugas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE sig_tugas; + +-- Tabel Data Jalan (Polyline) +CREATE TABLE IF NOT EXISTS jalan ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama_jalan VARCHAR(100) NOT NULL, + status_jalan ENUM('Nasional','Provinsi','Kabupaten') NOT NULL, + panjang DOUBLE NOT NULL DEFAULT 0 COMMENT 'Panjang dalam meter, dihitung otomatis Leaflet', + geometry LONGTEXT NOT NULL COMMENT 'GeoJSON LineString', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabel Data Parsil Tanah (Polygon) +CREATE TABLE IF NOT EXISTS tanah ( + id INT AUTO_INCREMENT PRIMARY KEY, + kode_kavling VARCHAR(50) NOT NULL, + nama_pemilik VARCHAR(100) NOT NULL, + status_tanah ENUM('SHM','HGB','HGU','HP') NOT NULL, + luas DOUBLE NOT NULL DEFAULT 0 COMMENT 'Luas dalam meter persegi, dihitung otomatis Leaflet', + geometry LONGTEXT NOT NULL COMMENT 'GeoJSON Polygon', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- ============================================ +-- Sample Data - Jalan di Pontianak +-- ============================================ +INSERT INTO jalan (nama_jalan, status_jalan, panjang, geometry) VALUES +( + 'Jl. Ahmad Yani', + 'Nasional', + 3250.5, + '{"type":"LineString","coordinates":[[109.3425,-0.0222],[109.3480,-0.0198],[109.3540,-0.0175],[109.3600,-0.0155]]}' +), +( + 'Jl. Gajah Mada', + 'Provinsi', + 1820.3, + '{"type":"LineString","coordinates":[[109.3310,-0.0290],[109.3355,-0.0265],[109.3400,-0.0242]]}' +), +( + 'Jl. Tanjungpura', + 'Kabupaten', + 1100.7, + '{"type":"LineString","coordinates":[[109.3250,-0.0350],[109.3285,-0.0330],[109.3320,-0.0310]]}' +); + +-- ============================================ +-- Sample Data - Parsil Tanah di Pontianak +-- ============================================ +INSERT INTO tanah (kode_kavling, nama_pemilik, status_tanah, luas, geometry) VALUES +( + 'KAV-001', + 'Budi Santoso', + 'SHM', + 1250.75, + '{"type":"Polygon","coordinates":[[[109.3350,-0.0400],[109.3370,-0.0400],[109.3370,-0.0420],[109.3350,-0.0420],[109.3350,-0.0400]]]}' +), +( + 'KAV-002', + 'PT. Maju Bersama', + 'HGB', + 3400.00, + '{"type":"Polygon","coordinates":[[[109.3280,-0.0450],[109.3310,-0.0450],[109.3310,-0.0480],[109.3280,-0.0480],[109.3280,-0.0450]]]}' +), +( + 'KAV-003', + 'CV. Agro Kalimantan', + 'HGU', + 5800.50, + '{"type":"Polygon","coordinates":[[[109.3150,-0.0500],[109.3200,-0.0500],[109.3200,-0.0540],[109.3150,-0.0540],[109.3150,-0.0500]]]}' +); \ No newline at end of file diff --git a/SIG_Tanah_Jalan/db_jalan_update.sql b/SIG_Tanah_Jalan/db_jalan_update.sql new file mode 100644 index 0000000..bda2c2a --- /dev/null +++ b/SIG_Tanah_Jalan/db_jalan_update.sql @@ -0,0 +1,45 @@ +-- ============================================ +-- DATABASE UPDATE - Tambah Tabel Kerusakan Jalan +-- Jalankan query ini setelah database.sql +-- ============================================ + +-- Tabel Laporan Kerusakan Jalan (Point) +CREATE TABLE IF NOT EXISTS kerusakan_jalan ( + id INT AUTO_INCREMENT PRIMARY KEY, + jalan_id INT NULL COMMENT 'Referensi ke tabel jalan (opsional)', + nama_jalan_ref VARCHAR(100) NULL COMMENT 'Nama jalan jika tidak ada di db', + deskripsi TEXT NOT NULL, + tingkat_urgensi ENUM('Rendah','Sedang','Tinggi','Kritis') NOT NULL DEFAULT 'Sedang', + status_laporan ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL DEFAULT 'Dilaporkan', + foto_path VARCHAR(255) NULL COMMENT 'Path relatif foto', + foto_base64 LONGTEXT NULL COMMENT 'Base64 foto (opsional, jika tidak pakai file system)', + lat DOUBLE NOT NULL, + lng DOUBLE NOT NULL, + tgl_laporan TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + tgl_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- Tabel Histori Kerusakan Jalan +-- Dipakai untuk merekam perubahan status kerusakan +CREATE TABLE IF NOT EXISTS histori_kerusakan ( + id INT AUTO_INCREMENT PRIMARY KEY, + kerusakan_id INT NOT NULL, + status_lama ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL, + status_baru ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL, + catatan TEXT NULL, + tgl_perubahan TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (kerusakan_id) REFERENCES kerusakan_jalan(id) ON DELETE CASCADE +); + +-- Sample Data Kerusakan +INSERT INTO kerusakan_jalan (jalan_id, nama_jalan_ref, deskripsi, tingkat_urgensi, status_laporan, lat, lng) VALUES +(1, 'Jl. Ahmad Yani', 'Lubang besar di tengah jalan, diameter sekitar 50cm', 'Tinggi', 'Diverifikasi', -0.0210, 109.3460), +(1, 'Jl. Ahmad Yani', 'Aspal terkelupas dan berlubang', 'Sedang', 'Dilaporkan', -0.0215, 109.3465), +(1, 'Jl. Ahmad Yani', 'Lubang di pinggir jalan dekat got', 'Sedang', 'Dilaporkan', -0.0212, 109.3462), +(2, 'Jl. Gajah Mada', 'Retak memanjang sepanjang 3 meter', 'Rendah', 'Sudah Diperbaiki', -0.0275, 109.3340); + +-- Sample Histori +INSERT INTO histori_kerusakan (kerusakan_id, status_lama, status_baru, catatan) VALUES +(1, 'Dilaporkan', 'Diverifikasi', 'Tim survei sudah turun ke lapangan, kerusakan terkonfirmasi'), +(4, 'Dilaporkan', 'Dalam Perbaikan', 'Jadwal perbaikan: minggu ini'), +(4, 'Dalam Perbaikan', 'Sudah Diperbaiki', 'Perbaikan selesai tanggal 10 April 2026'); \ No newline at end of file diff --git a/SIG_Tanah_Jalan/index.php b/SIG_Tanah_Jalan/index.php new file mode 100644 index 0000000..d66db76 --- /dev/null +++ b/SIG_Tanah_Jalan/index.php @@ -0,0 +1,1466 @@ + + + + + +WebGIS SIG – Jalan & Parsil Tanah Pontianak + + + + + + + + + +
+ +
+
+ + +
+ Mode Edit Shape Aktif + + + +
+ + + + + + + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/SPBU_Pontianak/database.sql b/SPBU_Pontianak/database.sql new file mode 100644 index 0000000..7a10afa --- /dev/null +++ b/SPBU_Pontianak/database.sql @@ -0,0 +1,28 @@ +-- ===================================================== +-- WebGIS SPBU Pontianak — Database Schema +-- Jalankan di phpMyAdmin atau MySQL CLI +-- ===================================================== + +CREATE DATABASE IF NOT EXISTS webgis_spbu + CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE webgis_spbu; + +CREATE TABLE IF NOT EXISTS spbu ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama VARCHAR(150) NOT NULL COMMENT 'Nama SPBU', + no VARCHAR(50) NOT NULL COMMENT 'Nomor SPBU (mis: 64.751.01)', + status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=Buka 24 Jam, 0=Terbatas', + latitude DECIMAL(10,8) NOT NULL COMMENT 'Koordinat Latitude', + longitude DECIMAL(11,8) NOT NULL COMMENT 'Koordinat Longitude', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ── Contoh Data SPBU Pontianak ────────────────────── +INSERT INTO spbu (nama, no, status, latitude, longitude) VALUES +('SPBU Jl. Ahmad Yani', '64.751.01', 1, -0.020500, 109.341200), +('SPBU Jl. Gajahmada', '64.751.02', 0, -0.031800, 109.325600), +('SPBU Jl. Tanjungpura', '64.751.03', 1, -0.025300, 109.332400), +('SPBU Jl. Sutan Syahrir', '64.751.04', 0, -0.018200, 109.348700), +('SPBU Jl. Adisucipto', '64.751.05', 1, -0.040100, 109.358900); \ No newline at end of file diff --git a/SPBU_Pontianak/db_connect.php b/SPBU_Pontianak/db_connect.php new file mode 100644 index 0000000..dcc52a9 --- /dev/null +++ b/SPBU_Pontianak/db_connect.php @@ -0,0 +1,14 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch (PDOException $e) { + die(json_encode(["error" => "Koneksi gagal: " . $e->getMessage()])); +} +?> \ No newline at end of file diff --git a/SPBU_Pontianak/index.html b/SPBU_Pontianak/index.html new file mode 100644 index 0000000..faf761c --- /dev/null +++ b/SPBU_Pontianak/index.html @@ -0,0 +1,14 @@ + + + + + + WebGIS SPBU Pontianak + + + +

Mengalihkan ke halaman utama... Jika tidak otomatis, klik di sini.

+ + diff --git a/SPBU_Pontianak/index.php b/SPBU_Pontianak/index.php new file mode 100644 index 0000000..bbc6e26 --- /dev/null +++ b/SPBU_Pontianak/index.php @@ -0,0 +1,397 @@ + 0){ + $pdo->prepare("UPDATE spbu SET latitude=:lat,longitude=:lng WHERE id=:id") + ->execute([':lat'=>$lat,':lng'=>$lng,':id'=>$id]); + echo json_encode(['ok'=>true,'lat'=>$lat,'lng'=>$lng]); + } else { + echo json_encode(['ok'=>false]); + } + exit; +} + +// AJAX: hapus dari index.php +if (isset($_GET['delete']) && $_SERVER['REQUEST_METHOD']==='POST') { + header('Content-Type: application/json'); + $id = intval($_POST['id']); + $pdo->prepare("DELETE FROM spbu WHERE id=:id")->execute([':id'=>$id]); + echo json_encode(['ok'=>true]); + exit; +} + +$spbu_list = $pdo->query("SELECT * FROM spbu ORDER BY nama")->fetchAll(PDO::FETCH_ASSOC); +$total = count($spbu_list); +$total_24 = count(array_filter($spbu_list, fn($s) => $s['status']==1)); +?> + + + + + +Peta SPBU — WebGIS Pontianak + + + + + + + + +
+
Total SPBU
+
Buka 24 Jam:
+
Terbatas:
+
+ +
+ + + + + +
+
+
+ +
+
+ ⛽ Informasi SPBU +
+ Edit + + +
+
+
+
Nama
+
Nomor SPBU
+
Status
+
Koordinat
+
+
⟳ Drag marker di peta untuk memperbarui lokasi secara langsung
+
+
+ +
+ + + + + diff --git a/SPBU_Pontianak/insert.php b/SPBU_Pontianak/insert.php new file mode 100644 index 0000000..debf099 --- /dev/null +++ b/SPBU_Pontianak/insert.php @@ -0,0 +1,293 @@ +prepare("INSERT INTO spbu (nama, no, status, latitude, longitude) VALUES (:nama,:no,:status,:lat,:lng)"); + $stmt->execute([':nama'=>trim($_POST['nama']),':no'=>trim($_POST['no']),':status'=>isset($_POST['status'])?1:0,':lat'=>floatval($_POST['latitude']),':lng'=>floatval($_POST['longitude'])]); + $message = ['type'=>'success','text'=>'Data SPBU berhasil ditambahkan!']; + } + if ($_POST['action'] === 'update') { + $stmt = $pdo->prepare("UPDATE spbu SET nama=:nama,no=:no,status=:status,latitude=:lat,longitude=:lng WHERE id=:id"); + $stmt->execute([':nama'=>trim($_POST['nama']),':no'=>trim($_POST['no']),':status'=>isset($_POST['status'])?1:0,':lat'=>floatval($_POST['latitude']),':lng'=>floatval($_POST['longitude']),':id'=>intval($_POST['id'])]); + $message = ['type'=>'success','text'=>'Data berhasil diperbarui!']; + } + if ($_POST['action'] === 'delete') { + $pdo->prepare("DELETE FROM spbu WHERE id=:id")->execute([':id'=>intval($_POST['id'])]); + $message = ['type'=>'danger','text'=>'Data berhasil dihapus.']; + } +} + +if (isset($_GET['edit'])) { + $stmt = $pdo->prepare("SELECT * FROM spbu WHERE id=:id"); + $stmt->execute([':id'=>intval($_GET['edit'])]); + $edit_data = $stmt->fetch(PDO::FETCH_ASSOC); +} + +$all = $pdo->query("SELECT * FROM spbu ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC); +?> + + + + + +Input SPBU — WebGIS Pontianak + + + + + + + + +
+ + +
+ +
+ + +
+
+
📍

Klik Peta — Tentukan Lokasi

+
+
+
Klik titik mana saja untuk mengisi koordinat otomatis
+
+
+
+ +
+
+
+

+
+
+
+ + + + + +
+ + +
+
+ + +
+
+ +
+ + Buka 24 Jam +
+
+
+ +
+ + +
+
+ +
+ + Batal +
+
+
+
+
+ + +
+
+
📋
+

Daftar SPBU data

+
+
+ +
Belum ada data. Tambahkan SPBU lewat form di atas.
+ + + + + $r): ?> + + + + + + + + + + + +
#NamaNoStatusLatitudeLongitudeAksi
+
+ Edit +
+ + + +
+
+
+ +
+
+ +
+ + + + + \ No newline at end of file diff --git a/SPBU_Pontianak/show.php b/SPBU_Pontianak/show.php new file mode 100644 index 0000000..83114b3 --- /dev/null +++ b/SPBU_Pontianak/show.php @@ -0,0 +1,414 @@ + 0){ + $pdo->prepare("UPDATE spbu SET latitude=:lat,longitude=:lng WHERE id=:id") + ->execute([':lat'=>$lat,':lng'=>$lng,':id'=>$id]); + echo json_encode(['ok'=>true,'lat'=>$lat,'lng'=>$lng]); + } else { + echo json_encode(['ok'=>false]); + } + exit; +} + +// AJAX: hapus dari show.php +if (isset($_GET['delete']) && $_SERVER['REQUEST_METHOD']==='POST') { + header('Content-Type: application/json'); + $id = intval($_POST['id']); + $pdo->prepare("DELETE FROM spbu WHERE id=:id")->execute([':id'=>$id]); + echo json_encode(['ok'=>true]); + exit; +} + +$spbu_list = $pdo->query("SELECT * FROM spbu ORDER BY nama")->fetchAll(PDO::FETCH_ASSOC); +$total = count($spbu_list); +$total_24 = count(array_filter($spbu_list, fn($s) => $s['status']==1)); +?> + + + + + +Peta SPBU — WebGIS Pontianak + + + + + + + + +
+
Total SPBU
+
Buka 24 Jam:
+
Terbatas:
+
+ +
+ + + + + +
+
+
+ +
+
+ ⛽ Informasi SPBU +
+ Edit + + +
+
+
+
Nama
+
Nomor SPBU
+
Status
+
Koordinat
+
+
⟳ Drag marker di peta untuk memperbarui lokasi secara langsung
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c297b63 --- /dev/null +++ b/index.html @@ -0,0 +1,614 @@ + + + + + + Portal WebGIS Pontianak — SIG Hub + + + + + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+ +
+
+

GIS HUB PONTIANAK

+

Sistem Informasi Geografis Terintegrasi

+
+
+ +
+
+
+ Server Online +
+
+
+ + +
+
+ Geographic Information System +

Portal Aplikasi WebGIS

+

Akses cepat ke berbagai modul pemetaan interaktif Kota Pontianak. Dibuat menggunakan teknologi web modern dan visualisasi data spasial secara real-time.

+
+ + + +
+ + + + + + diff --git a/sig-kemiskinan/README.md b/sig-kemiskinan/README.md new file mode 100644 index 0000000..8cd7bbb --- /dev/null +++ b/sig-kemiskinan/README.md @@ -0,0 +1,132 @@ +# SIG Penduduk Miskin – Berbasis Rumah Ibadah + +Aplikasi Sistem Informasi Geografis (SIG) untuk pendataan penduduk miskin berdasarkan wilayah radius rumah ibadah terdekat. + +--- + +## 📁 Struktur Folder + +``` +sig-kemiskinan/ +├── index.html ← Halaman utama (Leaflet + JS) +├── database.sql ← Schema + data contoh +├── includes/ +│ └── config.php ← Koneksi DB + fungsi utilitas +├── api/ +│ ├── rumah_ibadah.php ← CRUD Rumah Ibadah +│ ├── penduduk.php ← CRUD Penduduk Miskin +│ ├── geocode.php ← Reverse Geocoding (Nominatim) +│ └── update_radius.php ← Update radius + reassign +└── README.md +``` + +--- + +## ⚙️ Setup + +### 1. Persyaratan +- PHP 7.4+ (atau 8.x) +- MySQL 5.7+ / MariaDB +- Web server (Apache/Nginx) atau PHP built-in server + +### 2. Database +```sql +-- Import file database.sql ke MySQL: +mysql -u root -p < database.sql +``` +Atau lewat phpMyAdmin: Import → pilih `database.sql` + +### 3. Konfigurasi DB +Edit `includes/config.php`: +```php +define('DB_HOST', 'localhost'); +define('DB_USER', 'root'); // ganti sesuai user MySQL Anda +define('DB_PASS', ''); // ganti dengan password MySQL +define('DB_NAME', 'sig_kemiskinan'); +``` + +### 4. Jalankan +```bash +# Opsi 1: PHP built-in server (development) +cd sig-kemiskinan +php -S localhost:8080 + +# Opsi 2: Taruh di folder htdocs (XAMPP/WAMP) +# Copy folder ke C:/xampp/htdocs/sig-kemiskinan +# Akses: http://localhost/sig-kemiskinan +``` + +--- + +## 🗺️ Cara Penggunaan + +### Tambah Rumah Ibadah +1. Klik tombol **"+ Rumah Ibadah"** (pojok kanan atas) +2. Kursor berubah → **klik lokasi di peta** +3. Isi form: Nama, Jenis, PIC, No. WA, Radius +4. Alamat **otomatis terisi** dari reverse geocoding (Nominatim/OSM) +5. Klik **Simpan** + +### Tambah Penduduk Miskin +1. Klik tombol **"+ Penduduk"** +2. **Klik lokasi rumah** di peta +3. Isi: Nama KK, Jumlah anggota +4. Sistem otomatis menentukan rumah ibadah terdekat dalam radius +5. **Titik hijau** = dalam radius | **Titik merah** = luar radius + +### Ubah Radius +1. Klik marker rumah ibadah → popup → tombol **📐 Radius** +2. Atau klik ikon 📐 di list sidebar +3. **Drag slider** untuk mengubah radius (preview langsung) +4. Klik **Simpan** → semua penduduk di-reassign otomatis + +### Logika Overlap +Jika penduduk masuk dalam radius **>1 rumah ibadah**: +→ Diassign ke **rumah ibadah yang paling dekat** (Haversine distance) + +--- + +## 🔌 API Endpoints + +| Method | URL | Fungsi | +|--------|-----|--------| +| GET | `api/rumah_ibadah.php` | Semua rumah ibadah + stats | +| POST | `api/rumah_ibadah.php` | Tambah rumah ibadah | +| PUT | `api/rumah_ibadah.php` | Update rumah ibadah | +| DELETE | `api/rumah_ibadah.php?id=X` | Hapus | +| GET | `api/penduduk.php` | Semua penduduk | +| POST | `api/penduduk.php` | Tambah penduduk | +| PUT | `api/penduduk.php` | Update penduduk | +| DELETE | `api/penduduk.php?id=X` | Hapus | +| GET | `api/geocode.php?lat=X&lng=Y` | Reverse geocoding | +| POST | `api/update_radius.php` | Update radius + reassign | + +--- + +## 🧮 Algoritma Radius + +``` +Jarak = Haversine(lat1, lng1, lat2, lng2) // dalam meter + +Untuk setiap penduduk P: + candidates = [ibadah | jarak(P, ibadah) <= ibadah.radius] + if candidates: + assign P → min(candidates, key=jarak) + else: + P.rumah_ibadah_id = NULL // luar radius semua +``` + +--- + +## 🖥️ Fitur UI + +- Peta Leaflet dengan tile OpenStreetMap +- Sidebar panel: list Rumah Ibadah & Penduduk +- Stats bar: total ibadah, KK, jiwa, tercakup/tidak +- Radius fleksibel via slider (100–3000m, default 500m) +- Lingkaran radius real-time di peta +- Reverse geocoding otomatis saat klik peta +- Warna marker penduduk: hijau (dalam radius) / merah (luar) +- Popup informatif + tombol CRUD langsung dari peta +- Responsive mobile-friendly +- Dark theme modern diff --git a/sig-kemiskinan/api/auth.php b/sig-kemiskinan/api/auth.php new file mode 100644 index 0000000..457f42b --- /dev/null +++ b/sig-kemiskinan/api/auth.php @@ -0,0 +1,75 @@ + false, 'error' => 'Username dan password wajib diisi'], 400); + } + + $stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND aktif = 1 LIMIT 1"); + $stmt->execute([$username]); + $user = $stmt->fetch(); + + if (!$user || !password_verify($password, $user['password'])) { + jsonResponse(['success' => false, 'error' => 'Username atau password salah'], 401); + } + + // Simpan ke session + $_SESSION['user_id'] = $user['id']; + $_SESSION['user'] = [ + 'id' => $user['id'], + 'nama' => $user['nama'], + 'username' => $user['username'], + 'role' => $user['role'], + ]; + + // Update last_login + $db->prepare("UPDATE users SET last_login = NOW() WHERE id = ?") + ->execute([$user['id']]); + + jsonResponse([ + 'success' => true, + 'message' => 'Login berhasil', + 'user' => $_SESSION['user'], + ]); + break; + + // ── DELETE /api/auth.php → Logout ───────────────────── + case 'DELETE': + session_destroy(); + jsonResponse(['success' => true, 'message' => 'Logout berhasil']); + break; + + // ── GET /api/auth.php → Cek session ─────────────────── + case 'GET': + if (!isset($_SESSION['user_id'])) { + jsonResponse(['success' => false, 'loggedIn' => false], 200); + } + jsonResponse(['success' => true, 'loggedIn' => true, 'user' => $_SESSION['user']]); + break; + + default: + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); +} diff --git a/sig-kemiskinan/api/bantuan.php b/sig-kemiskinan/api/bantuan.php new file mode 100644 index 0000000..87a040a --- /dev/null +++ b/sig-kemiskinan/api/bantuan.php @@ -0,0 +1,167 @@ +query("SELECT * FROM jenis_bantuan ORDER BY kode")->fetchAll(); + jsonResponse(['success' => true, 'data' => $rows]); + } + + // GET bantuan per penduduk + $pendudukId = $_GET['penduduk_id'] ?? null; + if (!$pendudukId) jsonResponse(['success' => false, 'error' => 'penduduk_id diperlukan'], 400); + + $stmt = $db->prepare(" + SELECT bp.*, jb.kode, jb.nama AS nama_bantuan, jb.warna_badge, jb.deskripsi + FROM bantuan_penduduk bp + JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id + WHERE bp.penduduk_id = ? + ORDER BY jb.kode + "); + $stmt->execute([$pendudukId]); + jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]); + break; + + // ════════════════════════════════════════════════════════ + // POST – Tambah/set bantuan untuk penduduk + // ════════════════════════════════════════════════════════ + case 'POST': + $in = getInput(); + + // Batch upsert – terima array bantuans[] + if (isset($in['bantuans']) && is_array($in['bantuans'])) { + $pendudukId = (int)($in['penduduk_id'] ?? 0); + if (!$pendudukId) jsonResponse(['success' => false, 'error' => 'penduduk_id diperlukan'], 400); + + // Nonaktifkan semua bantuan lama dulu + $db->prepare("UPDATE bantuan_penduduk SET status = 'tidak_aktif' WHERE penduduk_id = ?") + ->execute([$pendudukId]); + + foreach ($in['bantuans'] as $b) { + $bantuanId = (int)($b['bantuan_id'] ?? 0); + if (!$bantuanId) continue; + + // Cek sudah ada? + $cek = $db->prepare("SELECT id FROM bantuan_penduduk WHERE penduduk_id = ? AND bantuan_id = ?"); + $cek->execute([$pendudukId, $bantuanId]); + $existing = $cek->fetch(); + + if ($existing) { + $db->prepare(" + UPDATE bantuan_penduduk + SET status = 'aktif', tanggal_mulai = ?, nominal_bulanan = ?, + nomor_kpj = ?, keterangan = ?, diinput_oleh = ? + WHERE penduduk_id = ? AND bantuan_id = ? + ")->execute([ + $b['tanggal_mulai'] ?? null, + $b['nominal_bulanan'] ?? null, + $b['nomor_kpj'] ?? null, + $b['keterangan'] ?? null, + $b['diinput_oleh'] ?? 1, + $pendudukId, $bantuanId, + ]); + } else { + $db->prepare(" + INSERT INTO bantuan_penduduk + (penduduk_id, bantuan_id, status, tanggal_mulai, nominal_bulanan, nomor_kpj, keterangan, diinput_oleh) + VALUES (?,?,'aktif',?,?,?,?,?) + ")->execute([ + $pendudukId, $bantuanId, + $b['tanggal_mulai'] ?? null, + $b['nominal_bulanan'] ?? null, + $b['nomor_kpj'] ?? null, + $b['keterangan'] ?? null, + $b['diinput_oleh'] ?? 1, + ]); + } + } + jsonResponse(['success' => true, 'message' => 'Data bantuan berhasil disimpan']); + } + + // Single insert + $required = ['penduduk_id','bantuan_id']; + foreach ($required as $f) { + if (empty($in[$f])) jsonResponse(['success' => false, 'error' => "Field '$f' wajib diisi"], 400); + } + + // Upsert + $cek = $db->prepare("SELECT id FROM bantuan_penduduk WHERE penduduk_id = ? AND bantuan_id = ?"); + $cek->execute([(int)$in['penduduk_id'], (int)$in['bantuan_id']]); + if ($cek->fetch()) { + jsonResponse(['success' => false, 'error' => 'Bantuan ini sudah tercatat untuk penduduk tersebut. Gunakan PUT untuk update.'], 409); + } + + $db->prepare(" + INSERT INTO bantuan_penduduk (penduduk_id, bantuan_id, status, tanggal_mulai, nominal_bulanan, nomor_kpj, keterangan, diinput_oleh) + VALUES (?,?,?,?,?,?,?,?) + ")->execute([ + (int)$in['penduduk_id'], + (int)$in['bantuan_id'], + $in['status'] ?? 'aktif', + $in['tanggal_mulai'] ?? null, + $in['nominal_bulanan'] ?? null, + $in['nomor_kpj'] ?? null, + $in['keterangan'] ?? null, + $in['diinput_oleh'] ?? 1, + ]); + jsonResponse(['success' => true, 'id' => $db->lastInsertId(), 'message' => 'Bantuan berhasil ditambahkan']); + break; + + // ════════════════════════════════════════════════════════ + // PUT – Update status bantuan + // ════════════════════════════════════════════════════════ + case 'PUT': + $in = getInput(); + $id = (int)($in['id'] ?? $_GET['id'] ?? 0); + if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); + + $db->prepare(" + UPDATE bantuan_penduduk + SET status = ?, tanggal_mulai = ?, tanggal_selesai = ?, + nominal_bulanan = ?, nomor_kpj = ?, keterangan = ? + WHERE id = ? + ")->execute([ + $in['status'] ?? 'aktif', + $in['tanggal_mulai'] ?? null, + $in['tanggal_selesai'] ?? null, + $in['nominal_bulanan'] ?? null, + $in['nomor_kpj'] ?? null, + $in['keterangan'] ?? null, + $id, + ]); + jsonResponse(['success' => true, 'message' => 'Status bantuan diperbarui']); + break; + + // ════════════════════════════════════════════════════════ + // DELETE – Hapus relasi bantuan + // ════════════════════════════════════════════════════════ + case 'DELETE': + $id = (int)($_GET['id'] ?? getInput()['id'] ?? 0); + if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); + $db->prepare("DELETE FROM bantuan_penduduk WHERE id = ?")->execute([$id]); + jsonResponse(['success' => true, 'message' => 'Bantuan dihapus']); + break; + + default: + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); +} diff --git a/sig-kemiskinan/api/dashboard_stats.php b/sig-kemiskinan/api/dashboard_stats.php new file mode 100644 index 0000000..e17f1ec --- /dev/null +++ b/sig-kemiskinan/api/dashboard_stats.php @@ -0,0 +1,189 @@ +false,'error'=>'Method tidak diizinkan'],405); + +$db = getDB(); + +// ── Filter opsional ──────────────────────────────────────── +$kelurahan = $_GET['kelurahan'] ?? null; +$kecamatan = $_GET['kecamatan'] ?? null; +$whereBase = "WHERE 1=1"; +$params = []; +if ($kelurahan) { $whereBase .= " AND w.kelurahan = ?"; $params[] = $kelurahan; } +if ($kecamatan) { $whereBase .= " AND w.kecamatan = ?"; $params[] = $kecamatan; } + +$joinW = "LEFT JOIN wilayah w ON w.id = pm.wilayah_id"; + +// ═══════════════════════════════════════════════════════════ +// 1. RINGKASAN UTAMA (KPI Cards) +// ═══════════════════════════════════════════════════════════ +$kpi = $db->prepare(" + SELECT + COUNT(pm.id) AS total_kk, + SUM(pm.jumlah_anggota) AS total_jiwa, + SUM(pm.jumlah_anak_sekolah) AS total_anak_sekolah, + SUM(CASE WHEN pm.status_verifikasi='terverifikasi' THEN 1 ELSE 0 END) AS terverifikasi, + SUM(CASE WHEN pm.status_verifikasi='belum_diverifikasi' THEN 1 ELSE 0 END) AS belum_verifikasi, + SUM(CASE WHEN pm.punya_bpjs=1 THEN 1 ELSE 0 END) AS punya_bpjs, + SUM(CASE WHEN pm.kategori_kemiskinan='sangat_miskin' THEN 1 ELSE 0 END) AS sangat_miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='miskin' THEN 1 ELSE 0 END) AS miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='hampir_miskin' THEN 1 ELSE 0 END) AS hampir_miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='mampu' THEN 1 ELSE 0 END) AS mampu, + ROUND(AVG(pm.penghasilan_bulanan),0) AS avg_penghasilan, + SUM(CASE WHEN bp_count.cnt > 0 THEN 1 ELSE 0 END) AS penerima_bantuan, + SUM(CASE WHEN bp_count.cnt = 0 THEN 1 ELSE 0 END) AS belum_bantuan + FROM penduduk_miskin pm + $joinW + LEFT JOIN ( + SELECT penduduk_id, COUNT(*) AS cnt + FROM bantuan_penduduk + WHERE status='aktif' + GROUP BY penduduk_id + ) bp_count ON bp_count.penduduk_id = pm.id + $whereBase +"); +$kpi->execute($params); +$kpiData = $kpi->fetch(); + +// ═══════════════════════════════════════════════════════════ +// 2. DISTRIBUSI KATEGORI KEMISKINAN (Donut Chart) +// ═══════════════════════════════════════════════════════════ +$katStmt = $db->prepare(" + SELECT pm.kategori_kemiskinan AS label, COUNT(*) AS value + FROM penduduk_miskin pm $joinW $whereBase + GROUP BY pm.kategori_kemiskinan + ORDER BY FIELD(pm.kategori_kemiskinan,'sangat_miskin','miskin','hampir_miskin','mampu') +"); +$katStmt->execute($params); +$kategoriChart = $katStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 3. KK PER KELURAHAN (Bar Chart) +// ═══════════════════════════════════════════════════════════ +$kelStmt = $db->prepare(" + SELECT + COALESCE(w.kelurahan,'Tidak Diketahui') AS label, + COUNT(pm.id) AS total_kk, + SUM(pm.jumlah_anggota) AS total_jiwa, + SUM(CASE WHEN bp_c.cnt>0 THEN 1 ELSE 0 END) AS penerima + FROM penduduk_miskin pm $joinW + LEFT JOIN ( + SELECT penduduk_id, COUNT(*) AS cnt FROM bantuan_penduduk WHERE status='aktif' GROUP BY penduduk_id + ) bp_c ON bp_c.penduduk_id = pm.id + $whereBase + GROUP BY w.kelurahan + ORDER BY total_kk DESC + LIMIT 15 +"); +$kelStmt->execute($params); +$kelurahanChart = $kelStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 4. DISTRIBUSI JENIS BANTUAN (Pie Chart) +// ═══════════════════════════════════════════════════════════ +$bantuanStmt = $db->prepare(" + SELECT jb.kode, jb.nama AS label, jb.warna_badge AS color, COUNT(bp.id) AS value + FROM bantuan_penduduk bp + JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id + JOIN penduduk_miskin pm ON pm.id = bp.penduduk_id + $joinW + " . str_replace('WHERE 1=1', 'WHERE bp.status=\'aktif\'', $whereBase) . " + GROUP BY jb.id + ORDER BY value DESC +"); +$bantuanStmt->execute($params); +$bantuanChart = $bantuanStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 5. TREN PENDATAAN PER BULAN (Line Chart) – 12 bulan terakhir +// ═══════════════════════════════════════════════════════════ +$trenStmt = $db->prepare(" + SELECT + DATE_FORMAT(pm.created_at,'%Y-%m') AS bulan, + COUNT(pm.id) AS total + FROM penduduk_miskin pm $joinW $whereBase + AND pm.created_at >= DATE_SUB(NOW(), INTERVAL 12 MONTH) + GROUP BY DATE_FORMAT(pm.created_at,'%Y-%m') + ORDER BY bulan ASC +"); +$trenStmt->execute($params); +$trenChart = $trenStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 6. DISTRIBUSI PEKERJAAN (Bar horizontal) +// ═══════════════════════════════════════════════════════════ +$pekerjaanStmt = $db->prepare(" + SELECT pm.status_pekerjaan AS label, COUNT(*) AS value + FROM penduduk_miskin pm $joinW $whereBase + GROUP BY pm.status_pekerjaan + ORDER BY value DESC +"); +$pekerjaanStmt->execute($params); +$pekerjaanChart = $pekerjaanStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 7. DATA HEATMAP (lat/lng + bobot untuk Leaflet.heat) +// ═══════════════════════════════════════════════════════════ +$heatStmt = $db->prepare(" + SELECT pm.lat, pm.lng, + CASE pm.kategori_kemiskinan + WHEN 'sangat_miskin' THEN 1.0 + WHEN 'miskin' THEN 0.6 + WHEN 'hampir_miskin' THEN 0.3 + WHEN 'mampu' THEN 0.1 + ELSE 0.1 + END AS intensity + FROM penduduk_miskin pm $joinW $whereBase +"); +$heatStmt->execute($params); +$heatmap = $heatStmt->fetchAll(); + +// ═══════════════════════════════════════════════════════════ +// 8. TOP 10 KK BELUM MENERIMA BANTUAN APAPUN +// ═══════════════════════════════════════════════════════════ +$belumBantuanStmt = $db->prepare(" + SELECT pm.id, pm.nama_kk, pm.nik_kk, pm.alamat, + pm.kategori_kemiskinan, pm.jumlah_anggota, + pm.status_verifikasi, + COALESCE(w.kelurahan,'–') AS kelurahan, + DATEDIFF(NOW(), pm.created_at) AS hari_terdata + FROM penduduk_miskin pm $joinW + $whereBase + AND NOT EXISTS ( + SELECT 1 FROM bantuan_penduduk bp + WHERE bp.penduduk_id = pm.id AND bp.status='aktif' + ) + ORDER BY pm.kategori_kemiskinan ASC, hari_terdata DESC + LIMIT 10 +"); +$belumBantuanStmt->execute($params); +$belumBantuan = $belumBantuanStmt->fetchAll(); + +// ── Statistik Rumah Ibadah (tetap dari v1.1) ────────────── +$ibadahStats = $db->query(" + SELECT COUNT(*) AS total_ibadah FROM rumah_ibadah +")->fetch(); + +jsonResponse([ + 'success' => true, + 'kpi' => $kpiData, + 'chart_kategori' => $kategoriChart, + 'chart_kelurahan' => $kelurahanChart, + 'chart_bantuan' => $bantuanChart, + 'chart_tren' => $trenChart, + 'chart_pekerjaan' => $pekerjaanChart, + 'heatmap' => $heatmap, + 'belum_bantuan' => $belumBantuan, + 'total_ibadah' => (int)$ibadahStats['total_ibadah'], + 'generated_at' => date('Y-m-d H:i:s'), +]); diff --git a/sig-kemiskinan/api/export_excel.php b/sig-kemiskinan/api/export_excel.php new file mode 100644 index 0000000..418d13b --- /dev/null +++ b/sig-kemiskinan/api/export_excel.php @@ -0,0 +1,118 @@ + 0"; +} + +$stmt = $db->prepare(" + SELECT + pm.nik_kk, pm.nama_kk, pm.no_hp, + pm.alamat, pm.rt, pm.rw, + COALESCE(w.kelurahan,'–') AS kelurahan, + COALESCE(w.kecamatan,'–') AS kecamatan, + pm.jumlah_anggota, pm.jumlah_anak_sekolah, + pm.penghasilan_bulanan, pm.sumber_penghasilan, pm.status_pekerjaan, + pm.kategori_kemiskinan, pm.kondisi_rumah, pm.kepemilikan_rumah, + CASE pm.punya_bpjs WHEN 1 THEN 'Ya' ELSE 'Tidak' END AS punya_bpjs, + pm.jenis_bpjs, + pm.lat, pm.lng, + pm.status_verifikasi, + COALESCE(u.nama,'–') AS nama_surveyor, + DATE_FORMAT(pm.created_at,'%d/%m/%Y %H:%i') AS tgl_input, + (SELECT GROUP_CONCAT(jb.kode ORDER BY jb.kode SEPARATOR ', ') + FROM bantuan_penduduk bp JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id + WHERE bp.penduduk_id = pm.id AND bp.status='aktif') AS bantuan_diterima + FROM penduduk_miskin pm + LEFT JOIN wilayah w ON w.id = pm.wilayah_id + LEFT JOIN users u ON u.id = pm.surveyor_id + $where + ORDER BY w.kelurahan, pm.nama_kk +"); +$stmt->execute($params); +$rows = $stmt->fetchAll(); + +// ── Nama file ───────────────────────────────────────────── +$filter = $kelurahan ? "_" . preg_replace('/\s+/', '-', $kelurahan) : ''; +$filename = "data_kemiskinan{$filter}_" . date('Ymd_His') . ".csv"; + +// ── Output header HTTP ───────────────────────────────────── +header('Content-Type: text/csv; charset=UTF-8'); +header('Content-Disposition: attachment; filename="' . $filename . '"'); +header('Cache-Control: no-cache, no-store, must-revalidate'); +header('Pragma: no-cache'); + +// BOM UTF-8 agar Excel baca karakter Indonesia dengan benar +echo "\xEF\xBB\xBF"; + +$out = fopen('php://output', 'w'); + +// ── Header kolom ────────────────────────────────────────── +fputcsv($out, [ + 'No','NIK KK','Nama KK','No HP', + 'Alamat','RT','RW','Kelurahan','Kecamatan', + 'Jml Anggota','Anak Sekolah', + 'Penghasilan/Bln','Sumber Penghasilan','Status Pekerjaan', + 'Kategori Kemiskinan','Kondisi Rumah','Kepemilikan Rumah', + 'Punya BPJS','Jenis BPJS', + 'Latitude','Longitude', + 'Status Verifikasi','Bantuan Diterima', + 'Petugas Input','Tgl Input', +], ';'); + +// ── Data rows ───────────────────────────────────────────── +$no = 1; +foreach ($rows as $r) { + fputcsv($out, [ + $no++, + $r['nik_kk'], + $r['nama_kk'], + $r['no_hp'] ?? '–', + $r['alamat'] ?? '–', + $r['rt'] ?? '–', + $r['rw'] ?? '–', + $r['kelurahan'], + $r['kecamatan'], + $r['jumlah_anggota'], + $r['jumlah_anak_sekolah'], + $r['penghasilan_bulanan'] ? 'Rp ' . number_format($r['penghasilan_bulanan'],0,',','.') : '–', + $r['sumber_penghasilan'] ?? '–', + ucwords(str_replace('_',' ', $r['status_pekerjaan'])), + $r['kategori_kemiskinan'] === 'hampir_miskin' ? 'Nyaris Miskin' : ucwords(str_replace('_',' ', $r['kategori_kemiskinan'])), + ucwords(str_replace('_',' ', $r['kondisi_rumah'])), + ucwords(str_replace('_',' ', $r['kepemilikan_rumah'])), + $r['punya_bpjs'], + strtoupper(str_replace('_',' ', $r['jenis_bpjs'])), + $r['lat'], + $r['lng'], + ucwords(str_replace('_',' ', $r['status_verifikasi'])), + $r['bantuan_diterima'] ?? 'Belum Ada', + $r['nama_surveyor'], + $r['tgl_input'], + ], ';'); +} + +fclose($out); +exit; diff --git a/sig-kemiskinan/api/export_pdf.php b/sig-kemiskinan/api/export_pdf.php new file mode 100644 index 0000000..435d3ab --- /dev/null +++ b/sig-kemiskinan/api/export_pdf.php @@ -0,0 +1,246 @@ +prepare(" + SELECT pm.nik_kk, pm.nama_kk, pm.no_hp, pm.alamat, pm.rt, pm.rw, + COALESCE(w.kelurahan,'–') AS kelurahan, + pm.jumlah_anggota, pm.jumlah_anak_sekolah, + pm.penghasilan_bulanan, pm.status_pekerjaan, + pm.kategori_kemiskinan, pm.kondisi_rumah, + CASE pm.punya_bpjs WHEN 1 THEN 'Ya' ELSE 'Tidak' END AS punya_bpjs, + pm.status_verifikasi, + (SELECT GROUP_CONCAT(jb.kode ORDER BY jb.kode SEPARATOR ', ') + FROM bantuan_penduduk bp JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id + WHERE bp.penduduk_id = pm.id AND bp.status='aktif') AS bantuan + FROM penduduk_miskin pm + LEFT JOIN wilayah w ON w.id = pm.wilayah_id + $where + ORDER BY w.kelurahan, pm.kategori_kemiskinan, pm.nama_kk +"); +$stmt->execute($params); +$rows = $stmt->fetchAll(); + +// Statistik ringkas +$statsStmt = $db->prepare(" + SELECT COUNT(*) AS total, SUM(pm.jumlah_anggota) AS jiwa, + SUM(CASE WHEN pm.kategori_kemiskinan='sangat_miskin' THEN 1 ELSE 0 END) AS sangat_miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='miskin' THEN 1 ELSE 0 END) AS miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='hampir_miskin' THEN 1 ELSE 0 END) AS hampir_miskin, + SUM(CASE WHEN pm.kategori_kemiskinan='mampu' THEN 1 ELSE 0 END) AS mampu, + SUM(CASE WHEN EXISTS(SELECT 1 FROM bantuan_penduduk bp WHERE bp.penduduk_id=pm.id AND bp.status='aktif') THEN 1 ELSE 0 END) AS penerima + FROM penduduk_miskin pm LEFT JOIN wilayah w ON w.id = pm.wilayah_id $where +"); +$statsStmt->execute($params); +$stats = $statsStmt->fetch(); + +$judul = "LAPORAN DATA PENDUDUK MISKIN"; +$filter = $kelurahan ? " – Kelurahan $kelurahan" : ($kecamatan ? " – Kec. $kecamatan" : " – Seluruh Wilayah"); +$tgl = date('d F Y'); + +// Warna kategori +function warnaBg(string $k): string { + return match($k) { + 'sangat_miskin' => '#fee2e2', + 'miskin' => '#fef3c7', + 'hampir_miskin' => '#dcfce7', + 'mampu' => '#dbeafe', + default => '#f3f4f6', + }; +} +function labelKat(string $k): string { + return match($k) { + 'sangat_miskin' => 'Sangat Miskin', + 'miskin' => 'Miskin', + 'hampir_miskin' => 'Nyaris Miskin', + 'mampu' => 'Mampu', + default => $k, + }; +} +?> + + + + +<?= htmlspecialchars($judul . $filter) ?> + + + + + +
+ + +
+ + +
+

+

SISTEM INFORMASI GEOGRAFIS KEMISKINAN

+

Dicetak pada:  |  Total: KK

+
+ + +
+
Total KK
+
Total Jiwa
+
Sangat Miskin
+
Miskin
+
Nyaris Miskin
+
Mampu
+
Penerima Bantuan
+
Belum Bantuan
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNIK / Nama KKKelurahanRT/RWAlamatAngg.AnakPenghasilanPekerjaanKategoriKondisi RumahBPJSBantuan DiterimaStatus Verifikasi
+
+
+ +
+ + + + + + + + + + Belum Ada + + + '#dcfce7', 'belum_diverifikasi'=>'#fef3c7', default=>'#fee2e2' }; + ?> + + + +
+ + + + + + diff --git a/sig-kemiskinan/api/foto.php b/sig-kemiskinan/api/foto.php new file mode 100644 index 0000000..d5db212 --- /dev/null +++ b/sig-kemiskinan/api/foto.php @@ -0,0 +1,171 @@ + false, 'error' => 'penduduk_id diperlukan'], 400); + } + $stmt = $db->prepare(" + SELECT f.*, u.nama AS nama_petugas + FROM foto_rumah f + LEFT JOIN users u ON u.id = f.diambil_oleh + WHERE f.penduduk_id = ? + ORDER BY f.is_primary DESC, f.created_at ASC + "); + $stmt->execute([$pendudukId]); + header('Content-Type: application/json'); + jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]); + break; + + // ════════════════════════════════════════════════════════ + // POST – Upload foto baru + // ════════════════════════════════════════════════════════ + case 'POST': + header('Content-Type: application/json'); + $pendudukId = (int)($_POST['penduduk_id'] ?? 0); + if (!$pendudukId) jsonResponse(['success' => false, 'error' => 'penduduk_id diperlukan'], 400); + + // Cek penduduk ada + $cek = $db->prepare("SELECT id FROM penduduk_miskin WHERE id = ?"); + $cek->execute([$pendudukId]); + if (!$cek->fetch()) jsonResponse(['success' => false, 'error' => 'Data penduduk tidak ditemukan'], 404); + + if (!isset($_FILES['foto']) || $_FILES['foto']['error'] !== UPLOAD_ERR_OK) { + $errCode = $_FILES['foto']['error'] ?? 'no_file'; + jsonResponse(['success' => false, 'error' => "Upload gagal (kode: $errCode)"], 400); + } + + $file = $_FILES['foto']; + $tmpPath = $file['tmp_name']; + $origName = $file['name']; + $fileSize = $file['size']; + + // Validasi ukuran + if ($fileSize > MAX_FOTO_SIZE) { + jsonResponse(['success' => false, 'error' => 'Ukuran file maksimal 5 MB'], 413); + } + + // Validasi ekstensi & MIME type + $ext = strtolower(pathinfo($origName, PATHINFO_EXTENSION)); + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $tmpPath); + finfo_close($finfo); + $allowedMime = ['image/jpeg','image/png','image/webp']; + if (!in_array($ext, ALLOWED_EXT) || !in_array($mime, $allowedMime)) { + jsonResponse(['success' => false, 'error' => 'Format file tidak didukung (jpg/png/webp)'], 415); + } + + // Generate nama file unik + $newName = 'foto_' . $pendudukId . '_' . time() . '_' . bin2hex(random_bytes(4)) . '.' . $ext; + $destPath = UPLOAD_DIR . $newName; + $relPath = UPLOAD_URL . $newName; + + if (!move_uploaded_file($tmpPath, $destPath)) { + jsonResponse(['success' => false, 'error' => 'Gagal menyimpan file'], 500); + } + + // Cek apakah ini foto pertama → jadikan primary + $countStmt = $db->prepare("SELECT COUNT(*) FROM foto_rumah WHERE penduduk_id = ?"); + $countStmt->execute([$pendudukId]); + $isPrimary = ($countStmt->fetchColumn() == 0) ? 1 : 0; + + // Koordinat GPS dari POST (dari browser Geolocation atau EXIF) + $latFoto = isset($_POST['lat_foto']) && $_POST['lat_foto'] !== '' ? (float)$_POST['lat_foto'] : null; + $lngFoto = isset($_POST['lng_foto']) && $_POST['lng_foto'] !== '' ? (float)$_POST['lng_foto'] : null; + $accuracy = isset($_POST['accuracy_meter']) && $_POST['accuracy_meter'] !== '' ? (float)$_POST['accuracy_meter'] + : (isset($_POST['accuracy']) && $_POST['accuracy'] !== '' ? (float)$_POST['accuracy'] : null); + + // Jika user set is_primary = 1, nonaktifkan primary lain dulu + $isPrimaryReq = isset($_POST['is_primary']) && (int)$_POST['is_primary'] === 1; + if ($isPrimaryReq) { + $db->prepare("UPDATE foto_rumah SET is_primary = 0 WHERE penduduk_id = ?") + ->execute([$pendudukId]); + $isPrimary = 1; + } + + // diambil_oleh: support field name lama (user_id) dan baru (diambil_oleh) + $diambilOleh = $_POST['diambil_oleh'] ?? $_POST['user_id'] ?? null; + + $db->prepare(" + INSERT INTO foto_rumah (penduduk_id, file_path, lat_foto, lng_foto, accuracy_meter, is_primary, ukuran_kb, keterangan, diambil_oleh) + VALUES (?,?,?,?,?,?,?,?,?) + ")->execute([ + $pendudukId, + $relPath, + $latFoto, + $lngFoto, + $accuracy, + $isPrimary, + (int)round($fileSize / 1024), + $_POST['keterangan'] ?? null, + $diambilOleh ? (int)$diambilOleh : null, + ]); + + $newId = (int)$db->lastInsertId(); + jsonResponse([ + 'success' => true, + 'id' => $newId, + 'file_path' => $relPath, + 'is_primary'=> $isPrimary, + 'message' => 'Foto berhasil diupload', + ]); + break; + + // ════════════════════════════════════════════════════════ + // DELETE – Hapus foto + // ════════════════════════════════════════════════════════ + case 'DELETE': + header('Content-Type: application/json'); + $id = (int)($_GET['id'] ?? 0); + if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); + + $stmt = $db->prepare("SELECT * FROM foto_rumah WHERE id = ?"); + $stmt->execute([$id]); + $foto = $stmt->fetch(); + if (!$foto) jsonResponse(['success' => false, 'error' => 'Foto tidak ditemukan'], 404); + + // Hapus file fisik + $filePath = __DIR__ . '/../' . $foto['file_path']; + if (file_exists($filePath)) @unlink($filePath); + + $db->prepare("DELETE FROM foto_rumah WHERE id = ?")->execute([$id]); + + // Jika foto yang dihapus adalah primary, set foto lain jadi primary + if ($foto['is_primary']) { + $next = $db->prepare("SELECT id FROM foto_rumah WHERE penduduk_id = ? ORDER BY created_at ASC LIMIT 1"); + $next->execute([$foto['penduduk_id']]); + $nextFoto = $next->fetch(); + if ($nextFoto) { + $db->prepare("UPDATE foto_rumah SET is_primary = 1 WHERE id = ?")->execute([$nextFoto['id']]); + } + } + + jsonResponse(['success' => true, 'message' => 'Foto berhasil dihapus']); + break; + + default: + header('Content-Type: application/json'); + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); +} \ No newline at end of file diff --git a/sig-kemiskinan/api/geocode.php b/sig-kemiskinan/api/geocode.php new file mode 100644 index 0000000..26c65d4 --- /dev/null +++ b/sig-kemiskinan/api/geocode.php @@ -0,0 +1,71 @@ + false, 'error' => 'lat dan lng diperlukan']); + exit; +} + +$lat = (float)$lat; +$lng = (float)$lng; + +$url = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={$lat}&lon={$lng}&zoom=18&addressdetails=1"; + +$context = stream_context_create([ + 'http' => [ + 'method' => 'GET', + 'header' => "User-Agent: SIG-Kemiskinan/1.0 (sig@example.com)\r\n", + 'timeout' => 8, + ] +]); + +$response = @file_get_contents($url, false, $context); + +if ($response === false) { + // Fallback: koordinat saja + echo json_encode([ + 'success' => true, + 'alamat' => "Koordinat: {$lat}, {$lng}", + 'detail' => null + ]); + exit; +} + +$data = json_decode($response, true); + +if (!$data || isset($data['error'])) { + echo json_encode([ + 'success' => true, + 'alamat' => "Koordinat: {$lat}, {$lng}", + 'detail' => null + ]); + exit; +} + +// Susun alamat yang rapi +$addr = $data['address'] ?? []; +$parts = array_filter([ + $addr['road'] ?? $addr['pedestrian'] ?? $addr['path'] ?? null, + $addr['house_number'] ?? null, + $addr['neighbourhood'] ?? $addr['suburb'] ?? null, + $addr['city'] ?? $addr['town'] ?? $addr['village'] ?? $addr['county'] ?? null, +]); + +$alamat = !empty($parts) + ? implode(', ', $parts) + : ($data['display_name'] ?? "Koordinat: {$lat}, {$lng}"); + +echo json_encode([ + 'success' => true, + 'alamat' => $alamat, + 'display_name' => $data['display_name'] ?? '', + 'detail' => $addr +]); diff --git a/sig-kemiskinan/api/notifikasi.php b/sig-kemiskinan/api/notifikasi.php new file mode 100644 index 0000000..7acc373 --- /dev/null +++ b/sig-kemiskinan/api/notifikasi.php @@ -0,0 +1,161 @@ +prepare($sql); + $stmt->execute($params); + $rows = $stmt->fetchAll(); + + // Hitung unread + $unreadStmt = $db->prepare("SELECT COUNT(*) FROM notifikasi WHERE sudah_dibaca = 0 AND (user_id = ? OR user_id IS NULL)"); + $unreadStmt->execute([$userId ?? 0]); + $unreadCount = (int)$unreadStmt->fetchColumn(); + + jsonResponse(['success' => true, 'data' => $rows, 'unread_count' => $unreadCount]); + break; + + // ════════════════════════════════════════════════════════ + // PUT – Tandai sudah dibaca + // ════════════════════════════════════════════════════════ + case 'PUT': + $in = getInput(); + $id = $in['id'] ?? 'all'; + + if ($id === 'all') { + $userId = (int)($in['user_id'] ?? 0); + $db->prepare("UPDATE notifikasi SET sudah_dibaca = 1 WHERE user_id = ? OR user_id IS NULL") + ->execute([$userId]); + jsonResponse(['success' => true, 'message' => 'Semua notifikasi ditandai dibaca']); + } else { + $db->prepare("UPDATE notifikasi SET sudah_dibaca = 1 WHERE id = ?") + ->execute([(int)$id]); + jsonResponse(['success' => true, 'message' => 'Notifikasi ditandai dibaca']); + } + break; + + // ════════════════════════════════════════════════════════ + // POST – Buat notifikasi manual + // ════════════════════════════════════════════════════════ + case 'POST': + $in = getInput(); + if (empty($in['judul']) || empty($in['pesan'])) { + jsonResponse(['success' => false, 'error' => 'Judul dan pesan wajib diisi'], 400); + } + $db->prepare(" + INSERT INTO notifikasi (user_id, jenis, judul, pesan, penduduk_id) + VALUES (?,?,?,?,?) + ")->execute([ + $in['user_id'] ?? null, + $in['jenis'] ?? 'info', + $in['judul'], + $in['pesan'], + $in['penduduk_id'] ?? null, + ]); + jsonResponse(['success' => true, 'id' => $db->lastInsertId(), 'message' => 'Notifikasi dibuat']); + break; + + default: + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); +} + +// ============================================================ +// FUNGSI: Generate notifikasi otomatis +// ============================================================ +function generateNotifikasi(PDO $db): void { + + // 1. KK belum terverifikasi + $belumVerif = $db->query(" + SELECT id, nama_kk FROM penduduk_miskin + WHERE status_verifikasi = 'belum_diverifikasi' + AND id NOT IN ( + SELECT DISTINCT penduduk_id FROM notifikasi + WHERE jenis = 'belum_verifikasi' AND sudah_dibaca = 0 + ) + LIMIT 20 + ")->fetchAll(); + + foreach ($belumVerif as $p) { + $db->prepare(" + INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id) + VALUES ('belum_verifikasi','Data Menunggu Verifikasi',?,?) + ")->execute(["KK {$p['nama_kk']} belum diverifikasi.", $p['id']]); + } + + // 2. KK belum menerima bantuan apapun (sangat miskin) + $belumBantuan = $db->query(" + SELECT id, nama_kk FROM penduduk_miskin + WHERE kategori_kemiskinan = 'sangat_miskin' + AND id NOT IN ( + SELECT penduduk_id FROM bantuan_penduduk WHERE status = 'aktif' + ) + AND id NOT IN ( + SELECT DISTINCT penduduk_id FROM notifikasi + WHERE jenis = 'belum_bantuan' AND sudah_dibaca = 0 + ) + LIMIT 20 + ")->fetchAll(); + + foreach ($belumBantuan as $p) { + $db->prepare(" + INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id) + VALUES ('belum_bantuan','KK Sangat Miskin Tanpa Bantuan',?,?) + ")->execute(["KK {$p['nama_kk']} berkategori sangat miskin namun belum menerima bantuan apapun.", $p['id']]); + } + + // 3. Data usang (tidak diupdate > DATA_USANG_HARI hari) + $usang = $db->prepare(" + SELECT id, nama_kk, DATEDIFF(NOW(), updated_at) AS hari_usang + FROM penduduk_miskin + WHERE updated_at < DATE_SUB(NOW(), INTERVAL ? DAY) + AND id NOT IN ( + SELECT DISTINCT penduduk_id FROM notifikasi + WHERE jenis = 'data_usang' AND sudah_dibaca = 0 + ) + LIMIT 10 + "); + $usang->execute([DATA_USANG_HARI]); + + foreach ($usang->fetchAll() as $p) { + $db->prepare(" + INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id) + VALUES ('data_usang','Data Tidak Diperbarui',?,?) + ")->execute(["Data KK {$p['nama_kk']} belum diperbarui selama {$p['hari_usang']} hari.", $p['id']]); + } +} diff --git a/sig-kemiskinan/api/penduduk.php b/sig-kemiskinan/api/penduduk.php new file mode 100644 index 0000000..94b2196 --- /dev/null +++ b/sig-kemiskinan/api/penduduk.php @@ -0,0 +1,308 @@ +prepare($SELECT_SQL . " WHERE pm.id = ?"); + $stmt->execute([$id]); + $row = $stmt->fetch(); + if (!$row) jsonResponse(['success' => false, 'error' => 'Data tidak ditemukan'], 404); + + // Ambil semua foto + $fotoStmt = $db->prepare("SELECT * FROM foto_rumah WHERE penduduk_id = ? ORDER BY is_primary DESC, created_at ASC"); + $fotoStmt->execute([$id]); + $row['fotos'] = $fotoStmt->fetchAll(); + + // Ambil semua bantuan + $bantuanStmt = $db->prepare(" + SELECT bp.*, jb.kode, jb.nama AS nama_bantuan, jb.warna_badge + FROM bantuan_penduduk bp + JOIN jenis_bantuan jb ON jb.id = bp.bantuan_id + WHERE bp.penduduk_id = ? + ORDER BY jb.kode + "); + $bantuanStmt->execute([$id]); + $row['bantuans'] = $bantuanStmt->fetchAll(); + + jsonResponse(['success' => true, 'data' => $row]); + } + + // GET list dengan filter + $sql = $SELECT_SQL . " WHERE 1=1"; + $params = []; + + if ($kelurahan) { $sql .= " AND w.kelurahan = ?"; $params[] = $kelurahan; } + if ($kecamatan) { $sql .= " AND w.kecamatan = ?"; $params[] = $kecamatan; } + if ($kategori) { $sql .= " AND pm.kategori_kemiskinan = ?"; $params[] = $kategori; } + if ($verifikasi) { $sql .= " AND pm.status_verifikasi = ?"; $params[] = $verifikasi; } + if ($surveyor) { $sql .= " AND pm.surveyor_id = ?"; $params[] = $surveyor; } + if ($search) { $sql .= " AND (pm.nama_kk LIKE ? OR pm.nik_kk LIKE ? OR pm.alamat LIKE ?)"; + $params[] = "%$search%"; $params[] = "%$search%"; $params[] = "%$search%"; } + if ($bantuan === 'tidak') { + $sql .= " AND (SELECT COUNT(*) FROM bantuan_penduduk bp WHERE bp.penduduk_id = pm.id AND bp.status='aktif') = 0"; + } elseif ($bantuan === 'ada') { + $sql .= " AND (SELECT COUNT(*) FROM bantuan_penduduk bp WHERE bp.penduduk_id = pm.id AND bp.status='aktif') > 0"; + } + + $sql .= " ORDER BY pm.nama_kk ASC"; + + $stmt = $db->prepare($sql); + $stmt->execute($params); + $rows = $stmt->fetchAll(); + + // Statistik ringkas + $stats = [ + 'total' => count($rows), + 'total_jiwa' => array_sum(array_column($rows, 'jumlah_anggota')), + 'penerima_bantuan' => count(array_filter($rows, fn($r) => $r['jumlah_bantuan'] > 0)), + 'belum_verifikasi' => count(array_filter($rows, fn($r) => $r['status_verifikasi'] === 'belum_diverifikasi')), + ]; + + jsonResponse(['success' => true, 'data' => $rows, 'stats' => $stats]); + break; + + // ════════════════════════════════════════════════════════ + // POST – Tambah penduduk baru + // ════════════════════════════════════════════════════════ + case 'POST': + $in = getInput(); + + // Validasi wajib + $required = ['nik_kk', 'nama_kk', 'lat', 'lng']; + foreach ($required as $f) { + if (empty($in[$f])) jsonResponse(['success' => false, 'error' => "Field '$f' wajib diisi"], 400); + } + + // Cek NIK duplikat + $cek = $db->prepare("SELECT id FROM penduduk_miskin WHERE nik_kk = ?"); + $cek->execute([trim($in['nik_kk'])]); + if ($cek->fetch()) jsonResponse(['success' => false, 'error' => 'NIK sudah terdaftar di sistem'], 409); + + // Hitung kategori otomatis + $penghasilan = isset($in['penghasilan_bulanan']) && $in['penghasilan_bulanan'] !== '' + ? (float)$in['penghasilan_bulanan'] : null; + $kategori = hitungKategori($penghasilan); + + $wilayahId = isset($in['wilayah_id']) && $in['wilayah_id'] !== '' ? (int)$in['wilayah_id'] : null; + $surveyorId = isset($in['surveyor_id']) && $in['surveyor_id'] !== '' ? (int)$in['surveyor_id'] : null; + + $statusPekerjaan = $in['status_pekerjaan'] ?? 'tidak_bekerja'; + $allowedPekerjaan = ['tidak_bekerja','buruh_harian','petani','nelayan','pedagang','pegawai_swasta','wiraswasta','lainnya']; + if (!in_array($statusPekerjaan, $allowedPekerjaan)) { + $statusPekerjaan = 'lainnya'; + } + + $db->prepare(" + INSERT INTO penduduk_miskin ( + nik_kk, nama_kk, no_hp, alamat, wilayah_id, rt, rw, lat, lng, + jumlah_anggota, jumlah_anak_sekolah, + penghasilan_bulanan, sumber_penghasilan, status_pekerjaan, + kategori_kemiskinan, kondisi_rumah, kepemilikan_rumah, + punya_bpjs, jenis_bpjs, status_verifikasi, surveyor_id + ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) + ")->execute([ + trim($in['nik_kk']), + trim($in['nama_kk']), + $in['no_hp'] ?? null, + $in['alamat'] ?? null, + $wilayahId, + $in['rt'] ?? null, + $in['rw'] ?? null, + (float)$in['lat'], + (float)$in['lng'], + max(1, (int)($in['jumlah_anggota'] ?? 1)), + max(0, (int)($in['jumlah_anak_sekolah'] ?? 0)), + $penghasilan, + $in['sumber_penghasilan'] ?? null, + $statusPekerjaan, + $kategori, + $in['kondisi_rumah'] ?? 'tidak_layak', + $in['kepemilikan_rumah'] ?? 'milik_sendiri', + (int)($in['punya_bpjs'] ?? 0), + $in['jenis_bpjs'] ?? 'tidak_punya', + 'belum_diverifikasi', + $surveyorId, + ]); + + $newId = (int)$db->lastInsertId(); + assignRumahIbadah($newId); + + // Catat riwayat & notifikasi – tidak block jika gagal (misal user_id tidak ada) + try { + catatRiwayat($newId, (int)($surveyorId ?? 1), 'submit', 'Data baru dari survei'); + } catch(\Exception $e) { /* abaikan error audit trail */ } + + try { + $db->prepare(" + INSERT INTO notifikasi (jenis, judul, pesan, penduduk_id) + VALUES ('belum_verifikasi', 'Data Baru Belum Diverifikasi', ?, ?) + ")->execute(["Data KK {$in['nama_kk']} (NIK: {$in['nik_kk']}) menunggu verifikasi admin.", $newId]); + } catch(\Exception $e) { /* abaikan error notifikasi */ } + + $stmt = $db->prepare($SELECT_SQL . " WHERE pm.id = ?"); + $stmt->execute([$newId]); + jsonResponse(['success' => true, 'data' => $stmt->fetch(), 'message' => 'Data penduduk berhasil ditambahkan']); + break; + + // ════════════════════════════════════════════════════════ + // PUT – Update data penduduk + // ════════════════════════════════════════════════════════ + case 'PUT': + $in = getInput(); + $id = (int)($in['id'] ?? $_GET['id'] ?? 0); + if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); + + // Ambil data lama untuk audit + $old = $db->prepare("SELECT * FROM penduduk_miskin WHERE id = ?"); + $old->execute([$id]); + $dataLama = $old->fetch(); + if (!$dataLama) jsonResponse(['success' => false, 'error' => 'Data tidak ditemukan'], 404); + + // Hitung kategori ulang jika penghasilan berubah + $penghasilan = array_key_exists('penghasilan_bulanan', $in) + ? (($in['penghasilan_bulanan'] !== '') ? (float)$in['penghasilan_bulanan'] : null) + : (float)$dataLama['penghasilan_bulanan']; + $kategori = hitungKategori($penghasilan); + + $allowed = [ + 'nama_kk','no_hp','alamat','wilayah_id','rt','rw','lat','lng', + 'jumlah_anggota','jumlah_anak_sekolah','penghasilan_bulanan', + 'sumber_penghasilan','status_pekerjaan','kondisi_rumah', + 'kepemilikan_rumah','punya_bpjs','jenis_bpjs', + 'status_verifikasi','catatan_verifikasi' + ]; + + $fields = []; $values = []; $posChanged = false; + foreach ($allowed as $f) { + if (!array_key_exists($f, $in)) continue; + $fields[] = "$f = ?"; + if ($f === 'lat' || $f === 'lng') { $values[] = (float)$in[$f]; $posChanged = true; } + elseif ($f === 'wilayah_id') { $values[] = (isset($in[$f]) && $in[$f] !== '') ? (int)$in[$f] : null; } + elseif ($f === 'status_pekerjaan') { + $statusPekerjaan = $in[$f] ?? 'tidak_bekerja'; + $allowedPekerjaan = ['tidak_bekerja','buruh_harian','petani','nelayan','pedagang','pegawai_swasta','wiraswasta','lainnya']; + $values[] = in_array($statusPekerjaan, $allowedPekerjaan) ? $statusPekerjaan : 'lainnya'; + } + elseif (in_array($f, ['jumlah_anggota','jumlah_anak_sekolah','punya_bpjs'])) $values[] = (int)$in[$f]; + elseif ($f === 'penghasilan_bulanan') $values[] = $penghasilan; + else $values[] = trim((string)$in[$f]); + } + + // Update kategori otomatis + $fields[] = "kategori_kemiskinan = ?"; + $values[] = $kategori; + + // Jika diverifikasi, catat verifikator + if (isset($in['status_verifikasi']) && $in['status_verifikasi'] === 'terverifikasi') { + $fields[] = "verified_by = ?"; $values[] = $in['verified_by'] ?? 1; + $fields[] = "verified_at = NOW()"; + } + + if (empty($fields)) jsonResponse(['success' => false, 'error' => 'Tidak ada data untuk diupdate'], 400); + + $values[] = $id; + $db->prepare("UPDATE penduduk_miskin SET " . implode(', ', $fields) . " WHERE id = ?") + ->execute($values); + + if ($posChanged) assignRumahIbadah($id); + + $aksi = 'update'; + if (isset($in['status_verifikasi'])) { + if ($in['status_verifikasi'] === 'terverifikasi') { + $aksi = 'verifikasi'; + } elseif ($in['status_verifikasi'] === 'ditolak') { + $aksi = 'tolak'; + } + } + try { + catatRiwayat($id, (int)($in['updated_by'] ?? 1), $aksi, $in['catatan_verifikasi'] ?? null, $dataLama); + } catch(\Exception $e) { /* abaikan error audit trail */ } + + $stmt = $db->prepare($SELECT_SQL . " WHERE pm.id = ?"); + $stmt->execute([$id]); + jsonResponse(['success' => true, 'data' => $stmt->fetch(), 'message' => 'Data berhasil diperbarui']); + break; + + // ════════════════════════════════════════════════════════ + // DELETE – Hapus penduduk + // ════════════════════════════════════════════════════════ + case 'DELETE': + $id = (int)($_GET['id'] ?? getInput()['id'] ?? 0); + if (!$id) jsonResponse(['success' => false, 'error' => 'ID diperlukan'], 400); + + // Hapus foto fisik terlebih dahulu + $fotos = $db->prepare("SELECT file_path FROM foto_rumah WHERE penduduk_id = ?"); + $fotos->execute([$id]); + foreach ($fotos->fetchAll() as $foto) { + $path = __DIR__ . '/../' . $foto['file_path']; + if (file_exists($path)) @unlink($path); + } + + catatRiwayat($id, 1, 'hapus', 'Data dihapus oleh admin'); + $db->prepare("DELETE FROM penduduk_miskin WHERE id = ?")->execute([$id]); + jsonResponse(['success' => true, 'message' => 'Data penduduk berhasil dihapus']); + break; + + default: + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); + } +} catch (\Throwable $e) { + jsonResponse(['success' => false, 'error' => 'Database error: ' . $e->getMessage()], 500); +} \ No newline at end of file diff --git a/sig-kemiskinan/api/rumah_ibadah.php b/sig-kemiskinan/api/rumah_ibadah.php new file mode 100644 index 0000000..1624c84 --- /dev/null +++ b/sig-kemiskinan/api/rumah_ibadah.php @@ -0,0 +1,131 @@ +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); +} diff --git a/sig-kemiskinan/api/update_radius.php b/sig-kemiskinan/api/update_radius.php new file mode 100644 index 0000000..177fb95 --- /dev/null +++ b/sig-kemiskinan/api/update_radius.php @@ -0,0 +1,29 @@ + false, 'error' => 'id dan radius diperlukan'], 400); +} + +$radius = max(100, min(5000, (int)$radius)); // clamp 100–5000m + +$db = getDB(); +$db->prepare("UPDATE rumah_ibadah SET radius = ? WHERE id = ?")->execute([$radius, $id]); + +reassignAll(); + +jsonResponse(['success' => true, 'radius' => $radius, 'message' => "Radius diubah ke {$radius}m, penduduk di-reassign"]); diff --git a/sig-kemiskinan/api/wilayah.php b/sig-kemiskinan/api/wilayah.php new file mode 100644 index 0000000..f02bae1 --- /dev/null +++ b/sig-kemiskinan/api/wilayah.php @@ -0,0 +1,68 @@ +query("SELECT DISTINCT kelurahan, kecamatan FROM wilayah ORDER BY kelurahan")->fetchAll(); + jsonResponse(['success' => true, 'data' => $rows]); + } + if ($type === 'kecamatan') { + $rows = $db->query("SELECT DISTINCT kecamatan FROM wilayah ORDER BY kecamatan")->fetchAll(); + jsonResponse(['success' => true, 'data' => array_column($rows, 'kecamatan')]); + } + } + + $sql = "SELECT * FROM wilayah WHERE 1=1"; + $params = []; + if ($kelurahan) { $sql .= " AND kelurahan = ?"; $params[] = $kelurahan; } + if ($kecamatan) { $sql .= " AND kecamatan = ?"; $params[] = $kecamatan; } + $sql .= " ORDER BY kelurahan, rt, rw"; + + $stmt = $db->prepare($sql); + $stmt->execute($params); + jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]); + break; + + // ── POST tambah wilayah ─────────────────────────────── + case 'POST': + $in = getInput(); + if (empty($in['kelurahan']) || empty($in['kecamatan'])) { + jsonResponse(['success' => false, 'error' => 'Kelurahan dan kecamatan wajib diisi'], 400); + } + $db->prepare("INSERT INTO wilayah (kelurahan, kecamatan, kota, rt, rw) VALUES (?,?,?,?,?)") + ->execute([ + trim($in['kelurahan']), + trim($in['kecamatan']), + trim($in['kota'] ?? 'Pontianak'), + $in['rt'] ?? null, + $in['rw'] ?? null, + ]); + jsonResponse(['success' => true, 'id' => $db->lastInsertId(), 'message' => 'Wilayah ditambahkan']); + break; + + default: + jsonResponse(['success' => false, 'error' => 'Method tidak diizinkan'], 405); +} diff --git a/sig-kemiskinan/assets/img/uploads/foto_14_1781095115_a7fa167f.jpeg b/sig-kemiskinan/assets/img/uploads/foto_14_1781095115_a7fa167f.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..588efd0498829c2540505a1be6fbc9dd8a823e96 GIT binary patch literal 84292 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 literal 0 HcmV?d00001 diff --git a/sig-kemiskinan/assets/img/uploads/foto_15_1781099424_25542d1c.jpg b/sig-kemiskinan/assets/img/uploads/foto_15_1781099424_25542d1c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..758621ce15df728a27c91503821cf18d5a746d46 GIT binary patch literal 37906 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 Za7Gz7f0!gjJfrW#Eg-1k3 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 literal 0 HcmV?d00001 diff --git a/sig-kemiskinan/database.sql b/sig-kemiskinan/database.sql new file mode 100644 index 0000000..f6ed1c4 --- /dev/null +++ b/sig-kemiskinan/database.sql @@ -0,0 +1,363 @@ +-- ============================================================ +-- SIG Penduduk Miskin v2.0 – Database Schema +-- WebGIS Pendataan & Monitoring Bantuan Sosial +-- Update: 2026 | Versi: 2.0 +-- ============================================================ + +CREATE DATABASE IF NOT EXISTS sig_kemiskinan CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE sig_kemiskinan; + +SET FOREIGN_KEY_CHECKS = 0; + +-- ============================================================ +-- TABEL 1: users +-- ============================================================ +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama VARCHAR(100) NOT NULL, + username VARCHAR(50) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL COMMENT 'bcrypt hash', + role ENUM('admin','petugas','pimpinan') NOT NULL DEFAULT 'petugas', + wilayah_tugas VARCHAR(100) NULL COMMENT 'Kelurahan/RT wilayah tugas petugas', + aktif TINYINT(1) DEFAULT 1, + last_login TIMESTAMP NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + INDEX idx_username (username), + INDEX idx_role (role) +); + +-- ============================================================ +-- TABEL 2: wilayah +-- ============================================================ +CREATE TABLE IF NOT EXISTS wilayah ( + id INT AUTO_INCREMENT PRIMARY KEY, + kelurahan VARCHAR(100) NOT NULL, + kecamatan VARCHAR(100) NOT NULL, + kota VARCHAR(100) NOT NULL DEFAULT 'Pontianak', + rt VARCHAR(10) NULL, + rw VARCHAR(10) NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_kelurahan (kelurahan), + INDEX idx_kecamatan (kecamatan) +); + +-- ============================================================ +-- TABEL 3: rumah_ibadah (Tidak berubah) +-- ============================================================ +CREATE TABLE IF NOT EXISTS rumah_ibadah ( + id INT AUTO_INCREMENT PRIMARY KEY, + nama VARCHAR(255) NOT NULL, + jenis ENUM('masjid','musholla','gereja','pura','vihara','klenteng','lainnya') DEFAULT 'masjid', + alamat TEXT, + pic VARCHAR(255) COMMENT 'Person In Charge / Penanggung Jawab', + no_wa VARCHAR(20), + lat DECIMAL(10, 8) NOT NULL, + lng DECIMAL(11, 8) NOT NULL, + radius INT DEFAULT 500 COMMENT 'Radius dalam meter', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +-- ============================================================ +-- TABEL 4: penduduk_miskin (DIPERLUAS dari v1.1) +-- ============================================================ +CREATE TABLE IF NOT EXISTS penduduk_miskin ( + id INT AUTO_INCREMENT PRIMARY KEY, + + -- Identitas Kepala Keluarga + nik_kk VARCHAR(16) NOT NULL UNIQUE COMMENT 'NIK KK 16 digit', + nama_kk VARCHAR(255) NOT NULL COMMENT 'Nama Kepala Keluarga', + no_hp VARCHAR(20) NULL COMMENT 'No HP/WhatsApp', + + -- Lokasi + alamat TEXT NULL, + wilayah_id INT NULL, + rt VARCHAR(10) NULL, + rw VARCHAR(10) NULL, + lat DECIMAL(10,8) NOT NULL, + lng DECIMAL(11,8) NOT NULL, + + -- Data Keluarga + jumlah_anggota INT NOT NULL DEFAULT 1, + jumlah_anak_sekolah INT NOT NULL DEFAULT 0, + + -- Data Ekonomi + penghasilan_bulanan DECIMAL(12,2) NULL COMMENT 'Penghasilan per bulan (Rp)', + sumber_penghasilan VARCHAR(255) NULL, + status_pekerjaan ENUM( + 'tidak_bekerja','buruh_harian','petani','nelayan', + 'pedagang','pegawai_swasta','wiraswasta','lainnya' + ) DEFAULT 'tidak_bekerja', + + -- Kategori Kemiskinan (dihitung otomatis) + kategori_kemiskinan ENUM('sangat_miskin','miskin','hampir_miskin','mampu') DEFAULT 'sangat_miskin', + + -- Kondisi Rumah + kondisi_rumah ENUM('sangat_tidak_layak','tidak_layak','layak') DEFAULT 'tidak_layak', + kepemilikan_rumah ENUM('milik_sendiri','kontrak','menumpang','lainnya') DEFAULT 'milik_sendiri', + + -- Status BPJS + punya_bpjs TINYINT(1) DEFAULT 0, + jenis_bpjs ENUM('PBI','mandiri','tidak_punya') DEFAULT 'tidak_punya', + + -- Relasi ke Rumah Ibadah (kompatibel v1.1) + rumah_ibadah_id INT NULL, + jarak_ke_ibadah DECIMAL(10,2) NULL COMMENT 'Jarak dalam meter', + + -- Status Verifikasi + status_verifikasi ENUM('belum_diverifikasi','terverifikasi','ditolak') DEFAULT 'belum_diverifikasi', + catatan_verifikasi TEXT NULL, + + -- Audit Trail + surveyor_id INT NULL COMMENT 'FK users - petugas input', + verified_by INT NULL COMMENT 'FK users - admin verifikator', + verified_at TIMESTAMP NULL, + + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + -- Foreign Keys + CONSTRAINT fk_pm_wilayah FOREIGN KEY (wilayah_id) REFERENCES wilayah(id) ON DELETE SET NULL, + CONSTRAINT fk_pm_ibadah FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL, + CONSTRAINT fk_pm_surveyor FOREIGN KEY (surveyor_id) REFERENCES users(id) ON DELETE SET NULL, + CONSTRAINT fk_pm_verif FOREIGN KEY (verified_by) REFERENCES users(id) ON DELETE SET NULL, + + INDEX idx_nik (nik_kk), + INDEX idx_lat_lng (lat, lng), + INDEX idx_kategori (kategori_kemiskinan), + INDEX idx_wilayah (wilayah_id), + INDEX idx_status_v (status_verifikasi), + INDEX idx_surveyor (surveyor_id) +); + +-- ============================================================ +-- TABEL 5: foto_rumah +-- ============================================================ +CREATE TABLE IF NOT EXISTS foto_rumah ( + id INT AUTO_INCREMENT PRIMARY KEY, + penduduk_id INT NOT NULL, + file_path VARCHAR(500) NOT NULL COMMENT 'Path relatif dari root web', + lat_foto DECIMAL(10,8) NULL COMMENT 'Koordinat GPS saat foto diambil', + lng_foto DECIMAL(11,8) NULL, + accuracy_meter DECIMAL(8,2) NULL COMMENT 'Akurasi GPS dalam meter', + is_primary TINYINT(1) DEFAULT 0 COMMENT '1 = foto utama (thumbnail peta)', + ukuran_kb INT NULL, + keterangan VARCHAR(255) NULL, + diambil_oleh INT NULL COMMENT 'FK users', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT fk_fr_penduduk FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id) ON DELETE CASCADE, + CONSTRAINT fk_fr_user FOREIGN KEY (diambil_oleh) REFERENCES users(id) ON DELETE SET NULL, + + INDEX idx_penduduk (penduduk_id), + INDEX idx_primary (penduduk_id, is_primary) +); + +-- ============================================================ +-- TABEL 6: jenis_bantuan +-- ============================================================ +CREATE TABLE IF NOT EXISTS jenis_bantuan ( + id INT AUTO_INCREMENT PRIMARY KEY, + kode VARCHAR(20) NOT NULL UNIQUE, + nama VARCHAR(100) NOT NULL, + deskripsi TEXT NULL, + warna_badge VARCHAR(7) DEFAULT '#4f8ef7' COMMENT 'Hex color badge', + aktif TINYINT(1) DEFAULT 1, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- ============================================================ +-- TABEL 7: bantuan_penduduk (Many-to-Many pivot) +-- ============================================================ +CREATE TABLE IF NOT EXISTS bantuan_penduduk ( + id INT AUTO_INCREMENT PRIMARY KEY, + penduduk_id INT NOT NULL, + bantuan_id INT NOT NULL, + status ENUM('aktif','tidak_aktif','dicabut') DEFAULT 'aktif', + tanggal_mulai DATE NULL, + tanggal_selesai DATE NULL, + nominal_bulanan DECIMAL(12,2) NULL, + nomor_kpj VARCHAR(50) NULL COMMENT 'Nomor kartu/KPJ bantuan', + keterangan TEXT NULL, + diinput_oleh INT NULL COMMENT 'FK users', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + CONSTRAINT fk_bp_penduduk FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id) ON DELETE CASCADE, + CONSTRAINT fk_bp_bantuan FOREIGN KEY (bantuan_id) REFERENCES jenis_bantuan(id) ON DELETE RESTRICT, + CONSTRAINT fk_bp_user FOREIGN KEY (diinput_oleh) REFERENCES users(id) ON DELETE SET NULL, + + UNIQUE KEY uq_penduduk_bantuan (penduduk_id, bantuan_id), + INDEX idx_penduduk (penduduk_id), + INDEX idx_bantuan (bantuan_id), + INDEX idx_status (status) +); + +-- ============================================================ +-- TABEL 8: riwayat_verifikasi (Audit Trail) +-- ============================================================ +CREATE TABLE IF NOT EXISTS riwayat_verifikasi ( + id INT AUTO_INCREMENT PRIMARY KEY, + penduduk_id INT NOT NULL, + user_id INT NOT NULL, + aksi ENUM('submit','verifikasi','tolak','update','hapus') NOT NULL, + catatan TEXT NULL, + data_lama JSON NULL COMMENT 'Snapshot data sebelum perubahan', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT fk_rv_penduduk FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id) ON DELETE CASCADE, + CONSTRAINT fk_rv_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT, + + INDEX idx_penduduk (penduduk_id), + INDEX idx_user (user_id), + INDEX idx_tanggal (created_at) +); + +-- ============================================================ +-- TABEL 9: notifikasi +-- ============================================================ +CREATE TABLE IF NOT EXISTS notifikasi ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NULL COMMENT 'NULL = broadcast semua admin', + jenis ENUM('belum_bantuan','belum_verifikasi','data_usang','info') DEFAULT 'info', + judul VARCHAR(255) NOT NULL, + pesan TEXT NOT NULL, + penduduk_id INT NULL COMMENT 'Referensi penduduk terkait', + sudah_dibaca TINYINT(1) DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT fk_notif_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + CONSTRAINT fk_notif_penduduk FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id) ON DELETE SET NULL, + + INDEX idx_user_baca (user_id, sudah_dibaca), + INDEX idx_jenis (jenis) +); + +-- ============================================================ +-- INDEX SPASIAL +-- ============================================================ +CREATE INDEX idx_ri_lat_lng ON rumah_ibadah(lat, lng); + +SET FOREIGN_KEY_CHECKS = 1; + +-- ============================================================ +-- DATA AWAL: users +-- ============================================================ +INSERT INTO users (nama, username, password, role) VALUES +('Administrator', 'admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin'), +('Petugas Survei', 'petugas', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'petugas'), +('Kepala Dinas', 'pimpinan', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'pimpinan'); +-- Password semua akun: "password" (bcrypt) + +-- ============================================================ +-- DATA AWAL: wilayah +-- ============================================================ +INSERT INTO wilayah (kelurahan, kecamatan, kota, rt, rw) VALUES +('Siantan Tengah', 'Pontianak Utara', 'Pontianak', '01', '01'), +('Siantan Tengah', 'Pontianak Utara', 'Pontianak', '02', '01'), +('Siantan Hilir', 'Pontianak Utara', 'Pontianak', '01', '02'), +('Batu Layang', 'Pontianak Utara', 'Pontianak', '01', '01'), +('Batu Layang', 'Pontianak Utara', 'Pontianak', '02', '02'), +('Saigon', 'Pontianak Timur', 'Pontianak', '01', '01'), +('Saigon', 'Pontianak Timur', 'Pontianak', '02', '01'), +('Tanjung Hulu', 'Pontianak Timur', 'Pontianak', '01', '01'), +('Parit Mayor', 'Pontianak Timur', 'Pontianak', '01', '01'), +('Pontianak Kota', 'Pontianak Kota', 'Pontianak', '01', '01'); + +-- ============================================================ +-- DATA AWAL: rumah_ibadah +-- ============================================================ +INSERT INTO rumah_ibadah (nama, jenis, alamat, pic, no_wa, lat, lng, radius) VALUES +('Masjid Al-Ikhlas', 'masjid', 'Jl. Merdeka No. 1, Pontianak', 'Ahmad Fauzi', '081234567890', -0.0263303, 109.3425094, 500), +('Masjid Ar-Rahmat', 'masjid', 'Jl. Gajah Mada No. 45, Pontianak', 'Budi Santoso', '082345678901', -0.0320000, 109.3380000, 500), +('Gereja Bethel', 'gereja', 'Jl. Diponegoro No. 12, Pontianak', 'Pendeta Yusuf', '083456789012', -0.0290000, 109.3450000, 500); + +-- ============================================================ +-- DATA AWAL: jenis_bantuan +-- ============================================================ +INSERT INTO jenis_bantuan (kode, nama, deskripsi, warna_badge) VALUES +('PKH', 'Program Keluarga Harapan', 'Bantuan tunai bersyarat untuk KK miskin', '#22c55e'), +('BPNT', 'Bantuan Pangan Non Tunai', 'Sembako via e-warong setiap 2 bulan', '#3b82f6'), +('KIS', 'Kartu Indonesia Sehat', 'Akses layanan kesehatan gratis (BPJS PBI)', '#ec4899'), +('BLT', 'Bantuan Langsung Tunai', 'Bantuan tunai darurat/sementara dari desa/kel', '#f59e0b'), +('BST', 'Bantuan Sosial Tunai', 'Bantuan sosial tunai dari Kemensos', '#8b5cf6'), +('PIP', 'Program Indonesia Pintar', 'Bantuan pendidikan untuk anak sekolah', '#06b6d4'); + +-- ============================================================ +-- DATA AWAL: penduduk_miskin (contoh) +-- ============================================================ +INSERT INTO penduduk_miskin ( + nik_kk, nama_kk, no_hp, alamat, wilayah_id, rt, rw, + lat, lng, jumlah_anggota, jumlah_anak_sekolah, + penghasilan_bulanan, sumber_penghasilan, status_pekerjaan, + kategori_kemiskinan, kondisi_rumah, kepemilikan_rumah, + punya_bpjs, jenis_bpjs, status_verifikasi, surveyor_id +) VALUES +('6171010101010001', 'Suyatno', '081200000001', 'Jl. Merdeka Gg. III No. 5', 1, '01', '01', -0.0270000, 109.3430000, 4, 2, 850000, 'Buruh bangunan', 'buruh_harian', 'miskin', 'tidak_layak', 'menumpang', 1, 'PBI', 'terverifikasi', 1), +('6171010101010002', 'Rohani', '081200000002', 'Jl. Merdeka Gg. IV No. 2', 1, '02', '01', -0.0255000, 109.3420000, 3, 1, 450000, 'Jualan kecil', 'pedagang', 'sangat_miskin', 'sangat_tidak_layak','menumpang', 1, 'PBI', 'terverifikasi', 1), +('6171010101010003', 'Hamid Husin', '081200000003', 'Jl. Gajah Mada Gg. II No. 8', 2, '01', '02', -0.0315000, 109.3375000, 5, 3, 1200000, 'Ojek online', 'buruh_harian', 'mampu', 'tidak_layak', 'kontrak', 0, 'tidak_punya','belum_diverifikasi',2), +('6171010101010004', 'Yanti Susanti', '081200000004', 'Jl. Veteran No. 99', 3, '01', '01', -0.0500000, 109.3600000, 2, 0, 300000, 'Tidak ada', 'tidak_bekerja', 'sangat_miskin', 'sangat_tidak_layak','menumpang', 1, 'PBI', 'terverifikasi', 1), +('6171010101010005', 'Supriyadi', '081200000005', 'Jl. Budi Utomo No. 12', 4, '02', '01', -0.0340000, 109.3510000, 6, 4, 600000, 'Petani kecil', 'petani', 'miskin', 'tidak_layak', 'milik_sendiri', 1, 'PBI', 'terverifikasi', 1), +('6171010101010006', 'Marlina', '081200000006', 'Gg. Damai No. 3', 5, '01', '02', -0.0410000, 109.3480000, 3, 1, 200000, 'Buruh cuci', 'buruh_harian', 'sangat_miskin', 'sangat_tidak_layak','menumpang', 0, 'tidak_punya','belum_diverifikasi',2), +('6171010101010007', 'Junaidi', '081200000007', 'Jl. Khatulistiwa No. 45', 6, '01', '01', -0.0380000, 109.3550000, 4, 2, 950000, 'Nelayan', 'nelayan', 'miskin', 'tidak_layak', 'milik_sendiri', 1, 'mandiri', 'terverifikasi', 1), +('6171010101010008', 'Siti Aminah', '081200000008', 'Gg. Melati No. 7', 7, '02', '02', -0.0290000, 109.3395000, 5, 3, 400000, 'Pembantu RT', 'buruh_harian', 'sangat_miskin', 'sangat_tidak_layak','menumpang', 1, 'PBI', 'belum_diverifikasi',2), +('6171010101010009', 'Rahman', '081200000009', 'Jl. Tanjung Pura No. 88', 8, '01', '01', -0.0220000, 109.3460000, 3, 1, 750000, 'Pedagang kaki lima','pedagang', 'miskin', 'tidak_layak', 'kontrak', 0, 'tidak_punya','terverifikasi', 1), +('6171010101010010', 'Dewi Kartika', '081200000010', 'Gg. Bahagia No. 2', 9, '01', '01', -0.0450000, 109.3530000, 4, 2, 500000, 'Buruh pabrik', 'buruh_harian', 'sangat_miskin', 'tidak_layak', 'kontrak', 1, 'PBI', 'terverifikasi', 1); + +-- ============================================================ +-- DATA AWAL: bantuan_penduduk +-- ============================================================ +INSERT INTO bantuan_penduduk (penduduk_id, bantuan_id, status, tanggal_mulai, nominal_bulanan, diinput_oleh) VALUES +(1, 1, 'aktif', '2024-01-01', 500000, 1), -- Suyatno: PKH +(1, 2, 'aktif', '2024-01-01', 200000, 1), -- Suyatno: BPNT +(2, 1, 'aktif', '2023-07-01', 500000, 1), -- Rohani: PKH +(2, 3, 'aktif', '2023-07-01', 0, 1), -- Rohani: KIS +(4, 1, 'aktif', '2024-03-01', 500000, 1), -- Yanti: PKH +(4, 3, 'aktif', '2024-03-01', 0, 1), -- Yanti: KIS +(5, 2, 'aktif', '2024-02-01', 200000, 1), -- Supriyadi: BPNT +(7, 3, 'aktif', '2023-09-01', 0, 1), -- Junaidi: KIS +(9, 2, 'aktif', '2024-01-01', 200000, 1), -- Rahman: BPNT +(10, 1, 'aktif','2024-04-01', 500000, 1), -- Dewi: PKH +(10, 3, 'aktif','2024-04-01', 0, 1); -- Dewi: KIS + +-- ============================================================ +-- Update rumah_ibadah assignment (kompatibel v1.1) +-- ============================================================ +UPDATE penduduk_miskin pm +SET + rumah_ibadah_id = ( + SELECT ri.id FROM rumah_ibadah ri + WHERE ( + 6371000 * ACOS(GREATEST(-1, LEAST(1, + COS(RADIANS(pm.lat)) * COS(RADIANS(ri.lat)) * + COS(RADIANS(ri.lng) - RADIANS(pm.lng)) + + SIN(RADIANS(pm.lat)) * SIN(RADIANS(ri.lat)) + ))) + ) <= ri.radius + ORDER BY ( + 6371000 * ACOS(GREATEST(-1, LEAST(1, + COS(RADIANS(pm.lat)) * COS(RADIANS(ri.lat)) * + COS(RADIANS(ri.lng) - RADIANS(pm.lng)) + + SIN(RADIANS(pm.lat)) * SIN(RADIANS(ri.lat)) + ))) + ) ASC + LIMIT 1 + ), + jarak_ke_ibadah = ( + SELECT ROUND( + 6371000 * ACOS(GREATEST(-1, LEAST(1, + COS(RADIANS(pm.lat)) * COS(RADIANS(ri.lat)) * + COS(RADIANS(ri.lng) - RADIANS(pm.lng)) + + SIN(RADIANS(pm.lat)) * SIN(RADIANS(ri.lat)) + ))), 2 + ) FROM rumah_ibadah ri + WHERE ( + 6371000 * ACOS(GREATEST(-1, LEAST(1, + COS(RADIANS(pm.lat)) * COS(RADIANS(ri.lat)) * + COS(RADIANS(ri.lng) - RADIANS(pm.lng)) + + SIN(RADIANS(pm.lat)) * SIN(RADIANS(ri.lat)) + ))) + ) <= ri.radius + LIMIT 1 + ); diff --git a/sig-kemiskinan/includes/auth.php b/sig-kemiskinan/includes/auth.php new file mode 100644 index 0000000..faa8b26 --- /dev/null +++ b/sig-kemiskinan/includes/auth.php @@ -0,0 +1,30 @@ + false, 'error' => 'Unauthorized – silakan login', 'redirect' => '/index.html'], 401); + } + $user = $_SESSION['user']; + if (!empty($allowedRoles) && !in_array($user['role'], $allowedRoles)) { + jsonResponse(['success' => false, 'error' => 'Akses ditolak untuk role: ' . $user['role']], 403); + } + return $user; +} + +// ── Ambil user saat ini (null jika belum login) ─────────── +function currentUser(): ?array { + return $_SESSION['user'] ?? null; +} + +// ── Cek apakah sudah login (tanpa redirect) ─────────────── +function isLoggedIn(): bool { + return isset($_SESSION['user_id']); +} diff --git a/sig-kemiskinan/includes/config.php b/sig-kemiskinan/includes/config.php new file mode 100644 index 0000000..3a8face --- /dev/null +++ b/sig-kemiskinan/includes/config.php @@ -0,0 +1,144 @@ += 5jt → mampu +// ── Notifikasi ──────────────────────────────────────────── +define('DATA_USANG_HARI', 30); // data > 30 hari belum update = notif usang + +// ============================================================ +// FUNGSI: Koneksi Database (Singleton PDO) +// ============================================================ +function getDB(): PDO { + static $pdo = null; + if ($pdo === null) { + $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET; + $options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + try { + $pdo = new PDO($dsn, DB_USER, DB_PASS, $options); + } catch (PDOException $e) { + http_response_code(500); + die(json_encode(['success' => false, 'error' => 'Database connection failed: ' . $e->getMessage()])); + } + } + return $pdo; +} + +// ============================================================ +// FUNGSI: Response JSON +// ============================================================ +function jsonResponse(mixed $data, int $code = 200): void { + http_response_code($code); + header('Content-Type: application/json; charset=utf-8'); + header('Access-Control-Allow-Origin: *'); + header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); + header('Access-Control-Allow-Headers: Content-Type, Authorization'); + echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +// ============================================================ +// FUNGSI: Baca Input (JSON body atau $_POST) +// ============================================================ +function getInput(): array { + $raw = file_get_contents('php://input'); + $data = json_decode($raw, true); + if (json_last_error() !== JSON_ERROR_NONE) { + $data = $_POST; + } + return $data ?? []; +} + +// ============================================================ +// FUNGSI: Hitung Jarak Haversine (meter) +// ============================================================ +function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float { + $R = 6371000; + $dLat = deg2rad($lat2 - $lat1); + $dLng = deg2rad($lng2 - $lng1); + $a = sin($dLat/2)**2 + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng/2)**2; + return $R * 2 * atan2(sqrt($a), sqrt(1 - $a)); +} + +// ============================================================ +// FUNGSI: Hitung Kategori Kemiskinan Otomatis +// ============================================================ +function hitungKategori(?float $penghasilan): string { + if ($penghasilan === null || $penghasilan < BATAS_SANGAT_MISKIN) return 'sangat_miskin'; + if ($penghasilan < BATAS_MISKIN) return 'miskin'; + if ($penghasilan < BATAS_HAMPIR_MISKIN) return 'hampir_miskin'; + return 'mampu'; +} + +// ============================================================ +// FUNGSI: Assign Rumah Ibadah (kompatibel v1.1) +// ============================================================ +function assignRumahIbadah(int $pendudukId): void { + try { + $db = getDB(); + $p = $db->prepare("SELECT lat, lng FROM penduduk_miskin WHERE id = ?"); + $p->execute([$pendudukId]); + $row = $p->fetch(); + if (!$row) return; + + $ibadahList = $db->query("SELECT id, lat, lng, radius FROM rumah_ibadah")->fetchAll(); + $closest = null; + $closestDist = PHP_FLOAT_MAX; + + foreach ($ibadahList as $ri) { + $dist = haversine((float)$row['lat'], (float)$row['lng'], (float)$ri['lat'], (float)$ri['lng']); + if ($dist <= $ri['radius'] && $dist < $closestDist) { + $closest = $ri['id']; + $closestDist = $dist; + } + } + + $db->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id = ?, jarak_ke_ibadah = ? WHERE id = ?") + ->execute([$closest, $closest ? round($closestDist, 2) : null, $pendudukId]); + } catch (\Exception $e) { /* abaikan error assign ibadah */ } +} + +function reassignAll(): void { + $db = getDB(); + $all = $db->query("SELECT id FROM penduduk_miskin")->fetchAll(); + foreach ($all as $row) assignRumahIbadah((int)$row['id']); +} + +// ============================================================ +// FUNGSI: Catat Riwayat Verifikasi +// ============================================================ +function catatRiwayat(int $pendudukId, int $userId, string $aksi, ?string $catatan = null, ?array $dataLama = null): void { + $db = getDB(); + $db->prepare(" + INSERT INTO riwayat_verifikasi (penduduk_id, user_id, aksi, catatan, data_lama) + VALUES (?, ?, ?, ?, ?) + ")->execute([$pendudukId, $userId, $aksi, $catatan, $dataLama ? json_encode($dataLama, JSON_UNESCAPED_UNICODE) : null]); +} \ No newline at end of file diff --git a/sig-kemiskinan/index.html b/sig-kemiskinan/index.html new file mode 100644 index 0000000..5d341bd --- /dev/null +++ b/sig-kemiskinan/index.html @@ -0,0 +1,2661 @@ + + + + + +WebGIS PovertyMap – WebGIS Monitoring Bantuan Sosial v3.0 + + + + + + + + + + +
+ +
+ + +
+ + +
+
+ 🏠 +
+
+
KK Terdata
+
+
+
+ 👥 +
+
+
Total Jiwa
+
+
+
+ +
+
+
Penerima Bantuan
+
+
+
+ +
+
+
Belum Bantuan
+
+
+ +
+ 🕌 +
+
+
Rumah Ibadah
+
+
+
+ + +
+ + + + + +
+
+ + + + + +
+ Klik peta untuk menentukan lokasi + +
+ + +
+
+
Legenda Peta
+ +
+
+ +
Di Dalam Radius
+
Di Luar Radius
+
+
Masjid (Islam)
+
Gereja (Kristen)
+
Pura (Hindu)
+
Vihara (Buddha)
+
Klenteng (Konghucu)
+
+
+ + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/sig-kemiskinan/update_kategori.php b/sig-kemiskinan/update_kategori.php new file mode 100644 index 0000000..56fa552 --- /dev/null +++ b/sig-kemiskinan/update_kategori.php @@ -0,0 +1,38 @@ +exec("ALTER TABLE penduduk_miskin MODIFY kategori_kemiskinan ENUM('sangat_miskin','miskin','hampir_miskin','mampu') DEFAULT 'sangat_miskin'"); + echo "ENUM updated successfully!\n\n"; + + // 2. Re-calculate all existing records + echo "Re-calculating categories for existing records...\n"; + $stmt = $db->query("SELECT id, penghasilan_bulanan FROM penduduk_miskin"); + $rows = $stmt->fetchAll(); + + $update = $db->prepare("UPDATE penduduk_miskin SET kategori_kemiskinan = ? WHERE id = ?"); + $counts = ['sangat_miskin' => 0, 'miskin' => 0, 'hampir_miskin' => 0, 'mampu' => 0]; + + foreach ($rows as $row) { + $p = $row['penghasilan_bulanan'] !== null ? (float)$row['penghasilan_bulanan'] : null; + if ($p === null || $p < BATAS_SANGAT_MISKIN) $kat = 'sangat_miskin'; + elseif ($p < BATAS_MISKIN) $kat = 'miskin'; + elseif ($p < BATAS_HAMPIR_MISKIN) $kat = 'hampir_miskin'; + else $kat = 'mampu'; + $update->execute([$kat, $row['id']]); + $counts[$kat]++; + } + + echo "Done! Updated " . count($rows) . " records:\n"; + foreach ($counts as $kat => $c) { + echo " $kat: $c\n"; + } + +} catch (\Exception $e) { + echo "ERROR: " . $e->getMessage() . "\n"; +}
+ +
+
+
+ + +
+ +
+ 📊 Export Excel (.xlsx) + 📄 Export PDF +
+ +
+
+ + 🛠 Administrator + +
+