diff --git a/Web GIS Layer/database.sql b/Web GIS Layer/database.sql index 35a8379..23eae80 100644 --- a/Web GIS Layer/database.sql +++ b/Web GIS Layer/database.sql @@ -2,29 +2,25 @@ -- DATABASE: webgis_sig -- Sistem Manajemen Data Jalan, Parsil Tanah & SPBU -- ============================================================ - -CREATE DATABASE IF NOT EXISTS webgis_sig CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -USE webgis_sig; - -- ============================================================ -- TABEL: data_jalan (Line / Polyline) -- Menyimpan data ruas jalan berdasarkan status jalan -- Geometri disimpan dalam format GeoJSON (LineString) -- ============================================================ CREATE TABLE IF NOT EXISTS data_jalan ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama_jalan VARCHAR(150) NOT NULL COMMENT 'Nama ruas jalan', - status_jalan ENUM( - 'Jalan Nasional', - 'Jalan Provinsi', - 'Jalan Kabupaten' - ) NOT NULL COMMENT 'Status / klasifikasi jalan', - panjang_m DECIMAL(12,2) DEFAULT 0.00 COMMENT 'Panjang jalan dalam meter (dihitung otomatis oleh LeafletJS)', - geojson LONGTEXT NOT NULL COMMENT 'Geometri LineString dalam format GeoJSON', - keterangan TEXT DEFAULT NULL COMMENT 'Keterangan tambahan', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama_jalan VARCHAR(150) NOT NULL COMMENT 'Nama ruas jalan', + status_jalan ENUM ( + 'Jalan Nasional', + 'Jalan Provinsi', + 'Jalan Kabupaten' + ) NOT NULL COMMENT 'Status / klasifikasi jalan', + panjang_m DECIMAL(12, 2) DEFAULT 0.00 COMMENT 'Panjang jalan dalam meter (dihitung otomatis oleh LeafletJS)', + geojson LONGTEXT NOT NULL COMMENT 'Geometri LineString dalam format GeoJSON', + keterangan TEXT DEFAULT NULL COMMENT 'Keterangan tambahan', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: data_parsil (Polygon) @@ -32,84 +28,101 @@ CREATE TABLE IF NOT EXISTS data_jalan ( -- Geometri disimpan dalam format GeoJSON (Polygon) -- ============================================================ CREATE TABLE IF NOT EXISTS data_parsil ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama_parsil VARCHAR(150) NOT NULL COMMENT 'Nama / nomor parsil', - status_hak ENUM( - 'Sertifikat Hak Milik', - 'Sertifikat Hak Guna Bangunan', - 'Sertifikat Hak Guna Usaha', - 'Sertifikat Hak Pakai' - ) NOT NULL COMMENT 'Status kepemilikan / hak atas tanah', - luas_m2 DECIMAL(15,2) DEFAULT 0.00 COMMENT 'Luas tanah dalam meter persegi (dihitung otomatis oleh LeafletJS)', - geojson LONGTEXT NOT NULL COMMENT 'Geometri Polygon dalam format GeoJSON', - pemilik VARCHAR(150) DEFAULT NULL COMMENT 'Nama pemilik (opsional)', - keterangan TEXT DEFAULT NULL COMMENT 'Keterangan tambahan', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama_parsil VARCHAR(150) NOT NULL COMMENT 'Nama / nomor parsil', + status_hak ENUM ( + 'Sertifikat Hak Milik', + 'Sertifikat Hak Guna Bangunan', + 'Sertifikat Hak Guna Usaha', + 'Sertifikat Hak Pakai' + ) NOT NULL COMMENT 'Status kepemilikan / hak atas tanah', + luas_m2 DECIMAL(15, 2) DEFAULT 0.00 COMMENT 'Luas tanah dalam meter persegi (dihitung otomatis oleh LeafletJS)', + geojson LONGTEXT NOT NULL COMMENT 'Geometri Polygon dalam format GeoJSON', + pemilik VARCHAR(150) DEFAULT NULL COMMENT 'Nama pemilik (opsional)', + keterangan TEXT DEFAULT NULL COMMENT 'Keterangan tambahan', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- DATA CONTOH – Jalan -- ============================================================ -INSERT INTO data_jalan (nama_jalan, status_jalan, panjang_m, geojson, keterangan) VALUES -( - 'Jl. Sudirman', - 'Jalan Nasional', - 1250.50, - '{"type":"LineString","coordinates":[[106.8272,-6.2088],[106.8290,-6.2075],[106.8310,-6.2060],[106.8330,-6.2045]]}', - 'Jalan protokol pusat kota' -), -( - 'Jl. Gatot Subroto', - 'Jalan Provinsi', - 980.00, - '{"type":"LineString","coordinates":[[106.8200,-6.2100],[106.8220,-6.2095],[106.8240,-6.2090],[106.8260,-6.2085]]}', - 'Penghubung antar kecamatan' -), -( - 'Jl. Pramuka', - 'Jalan Kabupaten', - 620.75, - '{"type":"LineString","coordinates":[[106.8150,-6.2180],[106.8160,-6.2170],[106.8175,-6.2160],[106.8185,-6.2150]]}', - 'Jalan lingkungan kabupaten' -); +INSERT INTO + data_jalan ( + nama_jalan, + status_jalan, + panjang_m, + geojson, + keterangan + ) +VALUES + ( + 'Jl. Sudirman', + 'Jalan Nasional', + 1250.50, + '{"type":"LineString","coordinates":[[106.8272,-6.2088],[106.8290,-6.2075],[106.8310,-6.2060],[106.8330,-6.2045]]}', + 'Jalan protokol pusat kota' + ), + ( + 'Jl. Gatot Subroto', + 'Jalan Provinsi', + 980.00, + '{"type":"LineString","coordinates":[[106.8200,-6.2100],[106.8220,-6.2095],[106.8240,-6.2090],[106.8260,-6.2085]]}', + 'Penghubung antar kecamatan' + ), + ( + 'Jl. Pramuka', + 'Jalan Kabupaten', + 620.75, + '{"type":"LineString","coordinates":[[106.8150,-6.2180],[106.8160,-6.2170],[106.8175,-6.2160],[106.8185,-6.2150]]}', + 'Jalan lingkungan kabupaten' + ); -- ============================================================ -- DATA CONTOH – Parsil Tanah -- ============================================================ -INSERT INTO data_parsil (nama_parsil, status_hak, luas_m2, geojson, pemilik, keterangan) VALUES -( - 'Parsil A-001', - 'Sertifikat Hak Milik', - 1200.00, - '{"type":"Polygon","coordinates":[[[106.8200,-6.2000],[106.8210,-6.2000],[106.8210,-6.2010],[106.8200,-6.2010],[106.8200,-6.2000]]]}', - 'Budi Santoso', - 'Tanah kavling perumahan' -), -( - 'Parsil B-002', - 'Sertifikat Hak Guna Bangunan', - 850.50, - '{"type":"Polygon","coordinates":[[[106.8220,-6.2000],[106.8230,-6.2000],[106.8230,-6.2008],[106.8220,-6.2008],[106.8220,-6.2000]]]}', - 'PT. Maju Bersama', - 'Kavling komersial' -), -( - 'Parsil C-003', - 'Sertifikat Hak Guna Usaha', - 2500.00, - '{"type":"Polygon","coordinates":[[[106.8240,-6.1990],[106.8260,-6.1990],[106.8260,-6.2010],[106.8240,-6.2010],[106.8240,-6.1990]]]}', - 'CV. Tani Makmur', - 'Lahan pertanian/perkebunan' -), -( - 'Parsil D-004', - 'Sertifikat Hak Pakai', - 4000.00, - '{"type":"Polygon","coordinates":[[[106.8270,-6.1985],[106.8295,-6.1985],[106.8295,-6.2005],[106.8270,-6.2005],[106.8270,-6.1985]]]}', - 'Pemerintah Kota', - 'Lahan fasilitas umum' -); +INSERT INTO + data_parsil ( + nama_parsil, + status_hak, + luas_m2, + geojson, + pemilik, + keterangan + ) +VALUES + ( + 'Parsil A-001', + 'Sertifikat Hak Milik', + 1200.00, + '{"type":"Polygon","coordinates":[[[106.8200,-6.2000],[106.8210,-6.2000],[106.8210,-6.2010],[106.8200,-6.2010],[106.8200,-6.2000]]]}', + 'Budi Santoso', + 'Tanah kavling perumahan' + ), + ( + 'Parsil B-002', + 'Sertifikat Hak Guna Bangunan', + 850.50, + '{"type":"Polygon","coordinates":[[[106.8220,-6.2000],[106.8230,-6.2000],[106.8230,-6.2008],[106.8220,-6.2008],[106.8220,-6.2000]]]}', + 'PT. Maju Bersama', + 'Kavling komersial' + ), + ( + 'Parsil C-003', + 'Sertifikat Hak Guna Usaha', + 2500.00, + '{"type":"Polygon","coordinates":[[[106.8240,-6.1990],[106.8260,-6.1990],[106.8260,-6.2010],[106.8240,-6.2010],[106.8240,-6.1990]]]}', + 'CV. Tani Makmur', + 'Lahan pertanian/perkebunan' + ), + ( + 'Parsil D-004', + 'Sertifikat Hak Pakai', + 4000.00, + '{"type":"Polygon","coordinates":[[[106.8270,-6.1985],[106.8295,-6.1985],[106.8295,-6.2005],[106.8270,-6.2005],[106.8270,-6.1985]]]}', + 'Pemerintah Kota', + 'Lahan fasilitas umum' + ); -- ============================================================ -- TABEL: data_spbu (Point) @@ -117,22 +130,52 @@ INSERT INTO data_parsil (nama_parsil, status_hak, luas_m2, geojson, pemilik, ket -- Geometri disimpan dalam format GeoJSON (Point) -- ============================================================ CREATE TABLE IF NOT EXISTS data_spbu ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama_spbu VARCHAR(150) NOT NULL COMMENT 'Nama SPBU / nama cabang', - telepon VARCHAR(20) DEFAULT NULL COMMENT 'Nomor telepon SPBU', - buka_24jam TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 = buka 24 jam (marker hijau), 0 = tidak (marker merah)', - lat DECIMAL(10,7) NOT NULL COMMENT 'Latitude titik SPBU', - lng DECIMAL(10,7) NOT NULL COMMENT 'Longitude titik SPBU', - geojson LONGTEXT NOT NULL COMMENT 'Geometri Point dalam format GeoJSON', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama_spbu VARCHAR(150) NOT NULL COMMENT 'Nama SPBU / nama cabang', + telepon VARCHAR(20) DEFAULT NULL COMMENT 'Nomor telepon SPBU', + buka_24jam TINYINT (1) NOT NULL DEFAULT 0 COMMENT '1 = buka 24 jam (marker hijau), 0 = tidak (marker merah)', + lat DECIMAL(10, 7) NOT NULL COMMENT 'Latitude titik SPBU', + lng DECIMAL(10, 7) NOT NULL COMMENT 'Longitude titik SPBU', + geojson LONGTEXT NOT NULL COMMENT 'Geometri Point dalam format GeoJSON', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- DATA CONTOH – SPBU di Pontianak -- ============================================================ -INSERT INTO data_spbu (nama_spbu, telepon, buka_24jam, lat, lng, geojson) VALUES -('SPBU Jl. Ahmad Yani', '0561-123456', 1, -0.0200, 109.3300, '{"type":"Point","coordinates":[109.3300,-0.0200]}'), -('SPBU Jl. Gajah Mada', '0561-654321', 0, -0.0350, 109.3200, '{"type":"Point","coordinates":[109.3200,-0.0350]}'), -('SPBU Jl. Tanjungpura', '0561-789012', 1, -0.0100, 109.3450, '{"type":"Point","coordinates":[109.3450,-0.0100]}'), -('SPBU Jl. Sutan Syahrir','0561-345678', 0, -0.0480, 109.3380, '{"type":"Point","coordinates":[109.3380,-0.0480]}'); +INSERT INTO + data_spbu (nama_spbu, telepon, buka_24jam, lat, lng, geojson) +VALUES + ( + 'SPBU Jl. Ahmad Yani', + '0561-123456', + 1, + -0.0200, + 109.3300, + '{"type":"Point","coordinates":[109.3300,-0.0200]}' + ), + ( + 'SPBU Jl. Gajah Mada', + '0561-654321', + 0, + -0.0350, + 109.3200, + '{"type":"Point","coordinates":[109.3200,-0.0350]}' + ), + ( + 'SPBU Jl. Tanjungpura', + '0561-789012', + 1, + -0.0100, + 109.3450, + '{"type":"Point","coordinates":[109.3450,-0.0100]}' + ), + ( + 'SPBU Jl. Sutan Syahrir', + '0561-345678', + 0, + -0.0480, + 109.3380, + '{"type":"Point","coordinates":[109.3380,-0.0480]}' + ); \ No newline at end of file diff --git a/Web GIS Rumah Ibadah/config.php b/Web GIS Rumah Ibadah/config.php index a0ba2fc..757988d 100644 --- a/Web GIS Rumah Ibadah/config.php +++ b/Web GIS Rumah Ibadah/config.php @@ -5,10 +5,11 @@ // ============================================================ // Konfigurasi database -define('DB_HOST', 'vg4so4ccs0444o4cgkssgos8'); -define('DB_NAME', 'default'); -define('DB_USER', 'mysql'); -define('DB_PASS', 'tg9lvPlr4hgUhgtT7aPq9XelkCEvvMGtsoV8eB4dD5FAkz891PwkJT340xmaEWxL'); +define('DB_HOST', 'vg4so4ccs0444o4cgkssgos8'); +define('DB_PORT', 3306); +define('DB_NAME', 'default'); +define('DB_USER', 'mysql'); +define('DB_PASS', 'tg9lvPlr4hgUhgtT7aPq9XelkCEvvMGtsoV8eB4dD5FAkz891PwkJT340xmaEWxL'); define('DB_CHARSET', 'utf8mb4'); // Direktori upload foto laporan @@ -22,13 +23,14 @@ if (session_status() === PHP_SESSION_NONE) { // ── Koneksi PDO ────────────────────────────────────────────── try { $pdo = new PDO( - "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, + "mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS, [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false, ] ); } catch (PDOException $e) { @@ -61,7 +63,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { * Kirim respon JSON standar lalu hentikan eksekusi. * Format: {"success": true/false, "data": ..., "message": "..."} */ -function jsonResponse($data = null, string $message = '', bool $success = true, int $httpCode = 200, array $extra = []): void { +function jsonResponse($data = null, string $message = '', bool $success = true, int $httpCode = 200, array $extra = []): void +{ http_response_code($httpCode); header('Content-Type: application/json; charset=utf-8'); $response = [ @@ -80,20 +83,22 @@ function jsonResponse($data = null, string $message = '', bool $success = true, /** * Bersihkan input string dari tag HTML. */ -function clean(string $value): string { +function clean(string $value): string +{ return htmlspecialchars(strip_tags(trim($value)), ENT_QUOTES, 'UTF-8'); } /** * Hitung jarak Haversine antara dua koordinat dalam kilometer. */ -function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float { +function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float +{ $R = 6371; // Radius bumi dalam km $dLat = deg2rad($lat2 - $lat1); $dLng = deg2rad($lng2 - $lng1); $a = sin($dLat / 2) * sin($dLat / 2) + - cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * - sin($dLng / 2) * sin($dLng / 2); + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * + sin($dLng / 2) * sin($dLng / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); return round($R * $c, 4); } @@ -102,7 +107,8 @@ function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float { * Auto-assign: cari rumah ibadah terdekat yang radius-nya mencakup lokasi KK. * Mengembalikan ['rumah_ibadah_id' => int|null, 'jarak_km' => float|null] */ -function autoAssign(PDO $pdo, float $lat, float $lng): array { +function autoAssign(PDO $pdo, float $lat, float $lng): array +{ $result = ['rumah_ibadah_id' => null, 'jarak_km' => null]; $stmt = $pdo->query("SELECT id, lat, lng, radius_km FROM rumah_ibadah"); @@ -132,7 +138,8 @@ function autoAssign(PDO $pdo, float $lat, float $lng): array { * Cek apakah user sudah login. Jika belum, kirim 401. * Mengembalikan data session user. */ -function requireLogin(): array { +function requireLogin(): array +{ if (empty($_SESSION['user'])) { jsonResponse(null, 'Tidak diizinkan. Silakan login terlebih dahulu.', false, 401); } @@ -143,7 +150,8 @@ function requireLogin(): array { * Cek apakah role user termasuk dalam daftar yang diizinkan. * Jika tidak, kirim 403. */ -function requireRole(array $allowedRoles): array { +function requireRole(array $allowedRoles): array +{ $user = requireLogin(); if (!in_array($user['role'], $allowedRoles)) { jsonResponse(null, 'Akses ditolak. Role Anda tidak memiliki izin.', false, 403); @@ -155,7 +163,8 @@ function requireRole(array $allowedRoles): array { * Blokir aksi tulis (POST/PUT/DELETE) untuk role walikota. * Walikota hanya boleh GET. */ -function blockWalikotaWrite(): void { +function blockWalikotaWrite(): void +{ if (!empty($_SESSION['user']) && $_SESSION['user']['role'] === 'walikota') { $method = $_SERVER['REQUEST_METHOD']; if (in_array($method, ['POST', 'PUT', 'DELETE'])) { @@ -168,7 +177,8 @@ function blockWalikotaWrite(): void { * Generate kode pengurus dengan format: RI-[JENIS 3 HURUF]-[RANDOM 4 DIGIT] * Contoh: RI-MSJ-4821, RI-GRJ-7153 */ -function generateKodePengurus(PDO $pdo, string $jenis): string { +function generateKodePengurus(PDO $pdo, string $jenis): string +{ // Mapping jenis ke 3 huruf $map = [ 'Masjid' => 'MSJ', @@ -199,7 +209,8 @@ function generateKodePengurus(PDO $pdo, string $jenis): string { * Cek rate limit untuk IP tertentu. Maks 5 submit per jam. * Mengembalikan true jika masih diizinkan, false jika melebihi batas. */ -function checkRateLimit(PDO $pdo, string $ip): bool { +function checkRateLimit(PDO $pdo, string $ip): bool +{ // Hapus record yang lebih dari 1 jam $pdo->prepare("DELETE FROM rate_limit WHERE created_at < NOW() - INTERVAL 1 HOUR")->execute(); @@ -222,7 +233,8 @@ function checkRateLimit(PDO $pdo, string $ip): bool { /** * Handle upload file foto. Mengembalikan path relatif file atau null. */ -function handleUpload(string $fieldName): ?string { +function handleUpload(string $fieldName): ?string +{ if (!isset($_FILES[$fieldName]) || $_FILES[$fieldName]['error'] !== UPLOAD_ERR_OK) { return null; } @@ -259,7 +271,8 @@ function handleUpload(string $fieldName): ?string { /** * Dapatkan IP address client (mendukung proxy). */ -function getClientIP(): string { +function getClientIP(): string +{ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; } diff --git a/Web GIS Rumah Ibadah/database.sql b/Web GIS Rumah Ibadah/database.sql index df8e1c6..8536c07 100644 --- a/Web GIS Rumah Ibadah/database.sql +++ b/Web GIS Rumah Ibadah/database.sql @@ -2,17 +2,17 @@ -- DATABASE: webgis_rumah_ibadah -- WebGIS Pontianak — Pengentasan Kemiskinan Berbasis Rumah Ibadah -- ============================================================ - -CREATE DATABASE IF NOT EXISTS webgis_rumah_ibadah - CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -USE webgis_rumah_ibadah; - -- Hapus tabel lama (urutan sesuai dependensi FK) DROP TABLE IF EXISTS histori_bantuan; + DROP TABLE IF EXISTS laporan_masyarakat; + DROP TABLE IF EXISTS keluarga_miskin; + DROP TABLE IF EXISTS users; + DROP TABLE IF EXISTS rumah_ibadah; + DROP TABLE IF EXISTS rate_limit; -- ============================================================ @@ -20,270 +20,374 @@ DROP TABLE IF EXISTS rate_limit; -- Menyimpan data titik lokasi rumah ibadah beserta radius cakupan -- ============================================================ CREATE TABLE rumah_ibadah ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama VARCHAR(200) NOT NULL COMMENT 'Nama rumah ibadah', - jenis ENUM('Masjid','Gereja','Pura','Vihara','Klenteng','Lainnya') - NOT NULL COMMENT 'Jenis rumah ibadah', - alamat TEXT NOT NULL COMMENT 'Alamat lengkap', - lat DECIMAL(10,7) NOT NULL COMMENT 'Latitude', - lng DECIMAL(10,7) NOT NULL COMMENT 'Longitude', - radius_km FLOAT NOT NULL DEFAULT 2.0 COMMENT 'Radius cakupan (km)', - kode_pengurus VARCHAR(20) NULL UNIQUE COMMENT 'Kode unik login pengurus, format RI-XXX-9999', - password_pengurus VARCHAR(255) NULL COMMENT 'Password pengurus (hashed)', - kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur', - 'Pontianak Barat','Pontianak Tenggara','Pontianak Kota') - NOT NULL COMMENT 'Kecamatan lokasi', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama VARCHAR(200) NOT NULL COMMENT 'Nama rumah ibadah', + jenis ENUM ( + 'Masjid', + 'Gereja', + 'Pura', + 'Vihara', + 'Klenteng', + 'Lainnya' + ) NOT NULL COMMENT 'Jenis rumah ibadah', + alamat TEXT NOT NULL COMMENT 'Alamat lengkap', + lat DECIMAL(10, 7) NOT NULL COMMENT 'Latitude', + lng DECIMAL(10, 7) NOT NULL COMMENT 'Longitude', + radius_km FLOAT NOT NULL DEFAULT 2.0 COMMENT 'Radius cakupan (km)', + kode_pengurus VARCHAR(20) NULL UNIQUE COMMENT 'Kode unik login pengurus, format RI-XXX-9999', + password_pengurus VARCHAR(255) NULL COMMENT 'Password pengurus (hashed)', + kecamatan ENUM ( + 'Pontianak Utara', + 'Pontianak Selatan', + 'Pontianak Timur', + 'Pontianak Barat', + 'Pontianak Tenggara', + 'Pontianak Kota' + ) NOT NULL COMMENT 'Kecamatan lokasi', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: users -- Manajemen pengguna dengan 3 role: admin, pengurus, walikota -- ============================================================ CREATE TABLE users ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama VARCHAR(150) NOT NULL COMMENT 'Nama lengkap pengguna', - username VARCHAR(100) NOT NULL UNIQUE COMMENT 'Username login', - password VARCHAR(255) NOT NULL COMMENT 'Password ter-hash (bcrypt)', - role ENUM('admin','pengurus','walikota') - NOT NULL DEFAULT 'pengurus' COMMENT 'Role pengguna', - rumah_ibadah_id INT DEFAULT NULL COMMENT 'FK ke rumah_ibadah (hanya untuk pengurus)', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama VARCHAR(150) NOT NULL COMMENT 'Nama lengkap pengguna', + username VARCHAR(100) NOT NULL UNIQUE COMMENT 'Username login', + password VARCHAR(255) NOT NULL COMMENT 'Password ter-hash (bcrypt)', + role ENUM ('admin', 'pengurus', 'walikota') NOT NULL DEFAULT 'pengurus' COMMENT 'Role pengguna', + rumah_ibadah_id INT DEFAULT NULL COMMENT 'FK ke rumah_ibadah (hanya untuk pengurus)', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah (id) ON DELETE SET NULL +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: keluarga_miskin -- Data keluarga miskin dengan auto-assign ke rumah ibadah terdekat -- ============================================================ CREATE TABLE keluarga_miskin ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nik VARCHAR(20) NOT NULL UNIQUE COMMENT 'NIK Kepala Keluarga', - nama_kepala_keluarga VARCHAR(200) NOT NULL COMMENT 'Nama Kepala Keluarga', - tanggal_lahir DATE NULL COMMENT 'Tanggal lahir KK', - pendidikan ENUM('Tidak Sekolah','SD','SMP','SMA','D3','S1','S2/S3') - NOT NULL DEFAULT 'Tidak Sekolah', - jumlah_anggota INT NOT NULL DEFAULT 1 COMMENT 'Jumlah anggota keluarga', - alamat TEXT NOT NULL COMMENT 'Alamat lengkap', - kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur', - 'Pontianak Barat','Pontianak Tenggara','Pontianak Kota') - NOT NULL, - lat DECIMAL(10,7) NOT NULL, - lng DECIMAL(10,7) NOT NULL, - tingkat_kemiskinan ENUM('Sangat Miskin','Miskin','Hampir Miskin') - NOT NULL DEFAULT 'Miskin', - status_dtks ENUM('Terdaftar DTKS','Belum DTKS','Sedang Diusulkan') - NOT NULL DEFAULT 'Belum DTKS', - riwayat_penyakit JSON NULL COMMENT 'Array penyakit: Stunting, TBC, Hipertensi, dll', - rumah_ibadah_id INT DEFAULT NULL COMMENT 'Auto-assign ke RI terdekat', - jarak_ke_ibadah FLOAT DEFAULT NULL COMMENT 'Jarak ke RI terdekat (km)', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nik VARCHAR(20) NOT NULL UNIQUE COMMENT 'NIK Kepala Keluarga', + nama_kepala_keluarga VARCHAR(200) NOT NULL COMMENT 'Nama Kepala Keluarga', + tanggal_lahir DATE NULL COMMENT 'Tanggal lahir KK', + pendidikan ENUM ( + 'Tidak Sekolah', + 'SD', + 'SMP', + 'SMA', + 'D3', + 'S1', + 'S2/S3' + ) NOT NULL DEFAULT 'Tidak Sekolah', + jumlah_anggota INT NOT NULL DEFAULT 1 COMMENT 'Jumlah anggota keluarga', + alamat TEXT NOT NULL COMMENT 'Alamat lengkap', + kecamatan ENUM ( + 'Pontianak Utara', + 'Pontianak Selatan', + 'Pontianak Timur', + 'Pontianak Barat', + 'Pontianak Tenggara', + 'Pontianak Kota' + ) NOT NULL, + lat DECIMAL(10, 7) NOT NULL, + lng DECIMAL(10, 7) NOT NULL, + tingkat_kemiskinan ENUM ('Sangat Miskin', 'Miskin', 'Hampir Miskin') NOT NULL DEFAULT 'Miskin', + status_dtks ENUM ( + 'Terdaftar DTKS', + 'Belum DTKS', + 'Sedang Diusulkan' + ) NOT NULL DEFAULT 'Belum DTKS', + riwayat_penyakit JSON NULL COMMENT 'Array penyakit: Stunting, TBC, Hipertensi, dll', + rumah_ibadah_id INT DEFAULT NULL COMMENT 'Auto-assign ke RI terdekat', + jarak_ke_ibadah FLOAT DEFAULT NULL COMMENT 'Jarak ke RI terdekat (km)', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah (id) ON DELETE SET NULL +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: laporan_masyarakat -- Laporan warga tentang kemiskinan (bisa anonim, tanpa login) -- ============================================================ CREATE TABLE laporan_masyarakat ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - nama_terlapor VARCHAR(150) NULL COMMENT 'Nama warga yang dilaporkan (boleh null)', - nik_terlapor VARCHAR(16) NULL COMMENT 'NIK warga yang dilaporkan (boleh null)', - nama_pelapor VARCHAR(150) NULL COMMENT 'Boleh anonim (null)', - no_hp VARCHAR(20) NULL, - alamat_terlapor TEXT NOT NULL COMMENT 'Alamat yang dilaporkan', - lat DECIMAL(10,7) NOT NULL, - lng DECIMAL(10,7) NOT NULL, - deskripsi TEXT NOT NULL COMMENT 'Deskripsi laporan', - foto VARCHAR(255) NULL COMMENT 'Path file foto', - status ENUM('Baru','Diverifikasi','Ditolak') - NOT NULL DEFAULT 'Baru', - alasan_tolak TEXT NULL COMMENT 'Alasan jika ditolak', - ditangani_oleh INT NULL COMMENT 'FK ke users.id', - converted_to_kk_id INT NULL COMMENT 'FK ke keluarga_miskin.id jika dikonversi', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (ditangani_oleh) REFERENCES users(id) ON DELETE SET NULL, - FOREIGN KEY (converted_to_kk_id) REFERENCES keluarga_miskin(id) ON DELETE SET NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + nama_terlapor VARCHAR(150) NULL COMMENT 'Nama warga yang dilaporkan (boleh null)', + nik_terlapor VARCHAR(16) NULL COMMENT 'NIK warga yang dilaporkan (boleh null)', + nama_pelapor VARCHAR(150) NULL COMMENT 'Boleh anonim (null)', + no_hp VARCHAR(20) NULL, + alamat_terlapor TEXT NOT NULL COMMENT 'Alamat yang dilaporkan', + lat DECIMAL(10, 7) NOT NULL, + lng DECIMAL(10, 7) NOT NULL, + deskripsi TEXT NOT NULL COMMENT 'Deskripsi laporan', + foto VARCHAR(255) NULL COMMENT 'Path file foto', + status ENUM ('Baru', 'Diverifikasi', 'Ditolak') NOT NULL DEFAULT 'Baru', + alasan_tolak TEXT NULL COMMENT 'Alasan jika ditolak', + ditangani_oleh INT NULL COMMENT 'FK ke users.id', + converted_to_kk_id INT NULL COMMENT 'FK ke keluarga_miskin.id jika dikonversi', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (ditangani_oleh) REFERENCES users (id) ON DELETE SET NULL, + FOREIGN KEY (converted_to_kk_id) REFERENCES keluarga_miskin (id) ON DELETE SET NULL +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: histori_bantuan -- Riwayat bantuan yang diterima keluarga miskin -- ============================================================ CREATE TABLE histori_bantuan ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - kk_id INT NOT NULL COMMENT 'FK ke keluarga_miskin', - jenis_bantuan ENUM('PKH','BPNT/Sembako','Beras Bansos','KIS-PBI', - 'Bansos Tunai Pemkot','Rutilahu','PMT Stunting', - 'CSR Swasta','Lainnya') - NOT NULL, - nominal BIGINT NOT NULL DEFAULT 0 COMMENT 'Nominal dalam rupiah (0 jika non-uang)', - keterangan TEXT NULL COMMENT 'Catatan bebas: 10 kg beras, 3 karung, dll', - tanggal_penyaluran DATE NOT NULL, - sumber_dana ENUM('APBN','APBD','CSR','Lainnya') - NOT NULL DEFAULT 'APBD', - penanggung_jawab INT NOT NULL COMMENT 'FK ke users.id', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (kk_id) REFERENCES keluarga_miskin(id) ON DELETE CASCADE, - FOREIGN KEY (penanggung_jawab) REFERENCES users(id) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + kk_id INT NOT NULL COMMENT 'FK ke keluarga_miskin', + jenis_bantuan ENUM ( + 'PKH', + 'BPNT/Sembako', + 'Beras Bansos', + 'KIS-PBI', + 'Bansos Tunai Pemkot', + 'Rutilahu', + 'PMT Stunting', + 'CSR Swasta', + 'Lainnya' + ) NOT NULL, + nominal BIGINT NOT NULL DEFAULT 0 COMMENT 'Nominal dalam rupiah (0 jika non-uang)', + keterangan TEXT NULL COMMENT 'Catatan bebas: 10 kg beras, 3 karung, dll', + tanggal_penyaluran DATE NOT NULL, + sumber_dana ENUM ('APBN', 'APBD', 'CSR', 'Lainnya') NOT NULL DEFAULT 'APBD', + penanggung_jawab INT NOT NULL COMMENT 'FK ke users.id', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (kk_id) REFERENCES keluarga_miskin (id) ON DELETE CASCADE, + FOREIGN KEY (penanggung_jawab) REFERENCES users (id) ON DELETE CASCADE +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- TABEL: rate_limit -- Pembatasan submit laporan masyarakat per IP (maks 5/jam) -- ============================================================ CREATE TABLE rate_limit ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - ip_address VARCHAR(45) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + ip_address VARCHAR(45) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_ip_time (ip_address, created_at) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- ============================================================ -- DATA SEED: Rumah Ibadah (2 data) -- ============================================================ -INSERT INTO rumah_ibadah (nama, jenis, alamat, lat, lng, radius_km, kode_pengurus, password_pengurus, kecamatan) VALUES -( - 'Masjid Raya Mujahidin', - 'Masjid', - 'Jl. Ahmad Yani No. 1, Pontianak Tenggara', - -0.0263330, 109.3425200, - 2.5, - 'RI-MSJ-4821', - -- password: pengurus123 - '$2y$10$EQKGMwtGqPsn3kxOGkUf3eh3cnXOCEYqVNfCKDVk.Q7WYTCKvi5iG', - 'Pontianak Tenggara' -), -( - 'Gereja Katedral Santo Yosef', - 'Gereja', - 'Jl. Diponegoro No. 120, Pontianak Kota', - -0.0380000, 109.3422000, - 2.0, - 'RI-GRJ-7153', - -- password: pengurus123 - '$2y$10$EQKGMwtGqPsn3kxOGkUf3eh3cnXOCEYqVNfCKDVk.Q7WYTCKvi5iG', - 'Pontianak Kota' -); +INSERT INTO + rumah_ibadah ( + nama, + jenis, + alamat, + lat, + lng, + radius_km, + kode_pengurus, + password_pengurus, + kecamatan + ) +VALUES + ( + 'Masjid Raya Mujahidin', + 'Masjid', + 'Jl. Ahmad Yani No. 1, Pontianak Tenggara', + -0.0263330, + 109.3425200, + 2.5, + 'RI-MSJ-4821', + -- password: pengurus123 + '$2y$10$EQKGMwtGqPsn3kxOGkUf3eh3cnXOCEYqVNfCKDVk.Q7WYTCKvi5iG', + 'Pontianak Tenggara' + ), + ( + 'Gereja Katedral Santo Yosef', + 'Gereja', + 'Jl. Diponegoro No. 120, Pontianak Kota', + -0.0380000, + 109.3422000, + 2.0, + 'RI-GRJ-7153', + -- password: pengurus123 + '$2y$10$EQKGMwtGqPsn3kxOGkUf3eh3cnXOCEYqVNfCKDVk.Q7WYTCKvi5iG', + 'Pontianak Kota' + ); -- ============================================================ -- DATA SEED: Users (1 admin, 1 walikota) -- Password semua: admin123 -- ============================================================ -INSERT INTO users (nama, username, password, role, rumah_ibadah_id) VALUES -( - 'Administrator Sistem', - 'admin', - '$2y$10$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi', - 'admin', - NULL -), -( - 'Walikota Pontianak', - 'walikota', - '$2y$10$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi', - 'walikota', - NULL -); +INSERT INTO + users (nama, username, password, role, rumah_ibadah_id) +VALUES + ( + 'Administrator Sistem', + 'admin', + '$2y$10$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi', + 'admin', + NULL + ), + ( + 'Walikota Pontianak', + 'walikota', + '$2y$10$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi', + 'walikota', + NULL + ); -- ============================================================ -- DATA SEED: Keluarga Miskin (5 data) -- Auto-assign rumah_ibadah_id dilakukan oleh aplikasi saat disimpan -- ============================================================ -INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidikan, jumlah_anggota, alamat, kecamatan, lat, lng, tingkat_kemiskinan, status_dtks, riwayat_penyakit, rumah_ibadah_id, jarak_ke_ibadah) VALUES -( - '6171010101010001', - 'Budi Santoso', - '1978-03-15', - 'SD', - 4, - 'Gg. Mawar No. 3, Benua Melayu Darat', - 'Pontianak Tenggara', - -0.0283000, 109.3440000, - 'Sangat Miskin', - 'Terdaftar DTKS', - '["Stunting","Gizi Buruk"]', - 1, - 0.2500 -), -( - '6171010101010002', - 'Siti Rahayu', - '1985-07-22', - 'SMP', - 6, - 'Jl. Merdeka Gg. 5 No. 7, Mariana', - 'Pontianak Kota', - -0.0370000, 109.3430000, - 'Miskin', - 'Terdaftar DTKS', - '["TBC","Hipertensi"]', - 2, - 0.1200 -), -( - '6171010101010003', - 'Wayan Dharma', - '1972-11-08', - 'Tidak Sekolah', - 3, - 'Gg. Bali No. 2, Bansir Laut', - 'Pontianak Tenggara', - -0.0290000, 109.3410000, - 'Sangat Miskin', - 'Belum DTKS', - '["Diabetes","Hipertensi","ODGJ"]', - 1, - 0.3400 -), -( - '6171010101010004', - 'Ahmad Fauzan', - '1990-01-30', - 'SMA', - 5, - 'Jl. Tanjungpura Gg. 12, Parit Tokaya', - 'Pontianak Selatan', - -0.0310000, 109.3350000, - 'Miskin', - 'Sedang Diusulkan', - '["Stunting"]', - NULL, - NULL -), -( - '6171010101010005', - 'Ruslan Effendi', - '1968-09-05', - 'SD', - 7, - 'Jl. Sutan Syahrir Gg. Melati, Batu Layang', - 'Pontianak Utara', - -0.0200000, 109.3460000, - 'Hampir Miskin', - 'Terdaftar DTKS', - '["Jantung","DBD"]', - 1, - 0.7800 -); +INSERT INTO + keluarga_miskin ( + nik, + nama_kepala_keluarga, + tanggal_lahir, + pendidikan, + jumlah_anggota, + alamat, + kecamatan, + lat, + lng, + tingkat_kemiskinan, + status_dtks, + riwayat_penyakit, + rumah_ibadah_id, + jarak_ke_ibadah + ) +VALUES + ( + '6171010101010001', + 'Budi Santoso', + '1978-03-15', + 'SD', + 4, + 'Gg. Mawar No. 3, Benua Melayu Darat', + 'Pontianak Tenggara', + -0.0283000, + 109.3440000, + 'Sangat Miskin', + 'Terdaftar DTKS', + '["Stunting","Gizi Buruk"]', + 1, + 0.2500 + ), + ( + '6171010101010002', + 'Siti Rahayu', + '1985-07-22', + 'SMP', + 6, + 'Jl. Merdeka Gg. 5 No. 7, Mariana', + 'Pontianak Kota', + -0.0370000, + 109.3430000, + 'Miskin', + 'Terdaftar DTKS', + '["TBC","Hipertensi"]', + 2, + 0.1200 + ), + ( + '6171010101010003', + 'Wayan Dharma', + '1972-11-08', + 'Tidak Sekolah', + 3, + 'Gg. Bali No. 2, Bansir Laut', + 'Pontianak Tenggara', + -0.0290000, + 109.3410000, + 'Sangat Miskin', + 'Belum DTKS', + '["Diabetes","Hipertensi","ODGJ"]', + 1, + 0.3400 + ), + ( + '6171010101010004', + 'Ahmad Fauzan', + '1990-01-30', + 'SMA', + 5, + 'Jl. Tanjungpura Gg. 12, Parit Tokaya', + 'Pontianak Selatan', + -0.0310000, + 109.3350000, + 'Miskin', + 'Sedang Diusulkan', + '["Stunting"]', + NULL, + NULL + ), + ( + '6171010101010005', + 'Ruslan Effendi', + '1968-09-05', + 'SD', + 7, + 'Jl. Sutan Syahrir Gg. Melati, Batu Layang', + 'Pontianak Utara', + -0.0200000, + 109.3460000, + 'Hampir Miskin', + 'Terdaftar DTKS', + '["Jantung","DBD"]', + 1, + 0.7800 + ); -- ============================================================ -- DATA SEED: Laporan Masyarakat (1 contoh) -- ============================================================ -INSERT INTO laporan_masyarakat (nama_pelapor, no_hp, alamat_terlapor, lat, lng, deskripsi, status) VALUES -( - 'Pak RT 03', - '081234567890', - 'Gg. Flamboyan No. 5, Pontianak Tenggara', - -0.0275000, 109.3435000, - 'Terdapat keluarga dengan 5 anak yang sangat membutuhkan bantuan. Rumah tidak layak huni dan anak-anak putus sekolah.', - 'Baru' -); +INSERT INTO + laporan_masyarakat ( + nama_pelapor, + no_hp, + alamat_terlapor, + lat, + lng, + deskripsi, + status + ) +VALUES + ( + 'Pak RT 03', + '081234567890', + 'Gg. Flamboyan No. 5, Pontianak Tenggara', + -0.0275000, + 109.3435000, + 'Terdapat keluarga dengan 5 anak yang sangat membutuhkan bantuan. Rumah tidak layak huni dan anak-anak putus sekolah.', + 'Baru' + ); -- ============================================================ -- DATA SEED: Histori Bantuan (2 contoh) -- ============================================================ -INSERT INTO histori_bantuan (kk_id, jenis_bantuan, nominal, keterangan, tanggal_penyaluran, sumber_dana, penanggung_jawab) VALUES -(1, 'PKH', 3000000, 'Bantuan tahap I tahun 2026', '2026-01-15', 'APBN', 1), -(2, 'BPNT/Sembako', 0, '10 kg beras + minyak goreng', '2026-02-20', 'APBN', 1); +INSERT INTO + histori_bantuan ( + kk_id, + jenis_bantuan, + nominal, + keterangan, + tanggal_penyaluran, + sumber_dana, + penanggung_jawab + ) +VALUES + ( + 1, + 'PKH', + 3000000, + 'Bantuan tahap I tahun 2026', + '2026-01-15', + 'APBN', + 1 + ), + ( + 2, + 'BPNT/Sembako', + 0, + '10 kg beras + minyak goreng', + '2026-02-20', + 'APBN', + 1 + ); \ No newline at end of file