mengupdate database.sql

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