update_poverty

This commit is contained in:
tistopandita
2026-06-11 00:41:49 +07:00
parent 1bb33b9d61
commit 9d22253e40
4 changed files with 1783 additions and 2302 deletions
+806 -224
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+320 -1182
View File
File diff suppressed because it is too large Load Diff
+153 -79
View File
@@ -1,8 +1,5 @@
-- ============================================================ -- Schema Database WebGIS SPBU dan Poverty Mapping Gereja
-- Schema Database WebGIS SPBU Pontianak -- Stack: Node.js, Express.js, MySQL, HTML5, CSS3, Vanilla JavaScript, Leaflet.js
-- Jalankan sekali untuk membuat database & tabel secara manual
-- (Opsional — server.js sudah auto-create tabel saat start)
-- ============================================================
CREATE DATABASE IF NOT EXISTS spbu_pontianak CREATE DATABASE IF NOT EXISTS spbu_pontianak
CHARACTER SET utf8mb4 CHARACTER SET utf8mb4
@@ -10,91 +7,168 @@ CREATE DATABASE IF NOT EXISTS spbu_pontianak
USE spbu_pontianak; USE spbu_pontianak;
-- ── Tabel SPBU ──────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS spbu ( CREATE TABLE IF NOT EXISTS spbu (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
kode VARCHAR(20) NOT NULL UNIQUE COMMENT 'Kode unik SPBU, mis: 64.781.01', kode VARCHAR(20) NOT NULL UNIQUE,
nama VARCHAR(100) NOT NULL, nama VARCHAR(100) NOT NULL,
alamat TEXT NOT NULL, alamat TEXT NOT NULL,
lat DOUBLE NOT NULL COMMENT 'Latitude (desimal)', lat DOUBLE NOT NULL,
lng DOUBLE NOT NULL COMMENT 'Longitude (desimal)', lng DOUBLE NOT NULL,
jam_buka TIME NOT NULL DEFAULT '06:00' COMMENT 'Format HH:MM', jam_buka TIME NOT NULL DEFAULT '06:00:00',
jam_tutup TIME NOT NULL DEFAULT '22:00' COMMENT 'Format HH:MM', jam_tutup TIME NOT NULL DEFAULT '22:00:00',
jenis_bbm JSON NOT NULL COMMENT 'Array jenis BBM, contoh: ["Pertalite","Pertamax"]', jenis_bbm JSON NOT NULL,
manual_override ENUM('auto','open','closed') NOT NULL DEFAULT 'auto', manual_override ENUM('auto','open','closed') NOT NULL DEFAULT 'auto',
aktif TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=aktif, 0=dihapus (soft delete)', aktif TINYINT(1) NOT NULL DEFAULT 1,
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; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ── Tabel Jalan ─────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS jalan ( CREATE TABLE IF NOT EXISTS jalan (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
nama_jalan VARCHAR(150) NOT NULL COMMENT 'Nama jalan, mis: Jl. Ahmad Yani', nama_jalan VARCHAR(150) NOT NULL,
jenis_jalan ENUM('nasional','provinsi','kota_kabupaten') NOT NULL DEFAULT 'kota_kabupaten' jenis_jalan ENUM('nasional','provinsi','kota_kabupaten') NOT NULL DEFAULT 'kota_kabupaten',
COMMENT 'Klasifikasi jalan', koordinat LONGTEXT NOT NULL,
koordinat LONGTEXT NOT NULL COMMENT 'GeoJSON LineString koordinat polyline', aktif TINYINT(1) NOT NULL DEFAULT 1,
aktif TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=aktif, 0=dihapus (soft delete)', 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; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ── Tabel Bangunan ──────────────────────────────────────────
CREATE TABLE IF NOT EXISTS bangunan ( CREATE TABLE IF NOT EXISTS bangunan (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
nama_bangunan VARCHAR(150) NOT NULL COMMENT 'Nama bangunan atau kavling', nama_bangunan VARCHAR(150) NOT NULL,
jenis_bangunan ENUM('SHM','HGB','HGU','HP','HPL') NOT NULL DEFAULT 'SHM' jenis_bangunan ENUM('SHM','HGB','HGU','HP','HPL') NOT NULL DEFAULT 'SHM',
COMMENT 'SHM=Sertifikat Hak Milik, HGB=Hak Guna Bangunan, HGU=Hak Guna Usaha, HP=Hak Pakai, HPL=Hak Pengelolaan', nama_jalan VARCHAR(150),
nama_jalan VARCHAR(150) COMMENT 'Nama jalan lokasi bangunan', koordinat LONGTEXT NOT NULL,
koordinat LONGTEXT NOT NULL COMMENT 'GeoJSON Polygon koordinat area bangunan', aktif TINYINT(1) NOT NULL DEFAULT 1,
aktif TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=aktif, 0=dihapus (soft delete)', 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; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ── Tabel Poverty Mapping ─────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS users (
-- Catatan: project ini memakai MySQL/MariaDB. Kolom geom dibuat kompatibel id_user INT AUTO_INCREMENT PRIMARY KEY,
-- dengan MySQL spatial dan query radius memakai ST_Distance_Sphere. nama VARCHAR(120) NOT NULL,
username VARCHAR(80) NOT NULL UNIQUE,
CREATE TABLE IF NOT EXISTS tempat_ibadah ( password VARCHAR(255) NOT NULL,
id INT AUTO_INCREMENT PRIMARY KEY, role ENUM('admin','pengurus') NOT NULL DEFAULT 'pengurus',
nama VARCHAR(255) NOT NULL, aktif TINYINT(1) NOT NULL DEFAULT 1,
jenis ENUM('masjid','gereja','pura','vihara','kelenteng','lainnya') NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
alamat TEXT,
kelurahan VARCHAR(100),
lat DOUBLE NOT NULL,
lng DOUBLE NOT NULL,
geom POINT GENERATED ALWAYS AS (ST_SRID(POINT(lng, lat), 4326)) STORED,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
SPATIAL INDEX idx_tempat_ibadah_geom (geom)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS keluarga_miskin ( CREATE TABLE IF NOT EXISTS keluarga (
id INT AUTO_INCREMENT PRIMARY KEY, id_keluarga INT AUTO_INCREMENT PRIMARY KEY,
nama_kk VARCHAR(255) NOT NULL COMMENT 'Nama Kepala Keluarga', nomor_kartu_keluarga VARCHAR(40) NOT NULL UNIQUE,
jumlah_anggota INT NOT NULL DEFAULT 1, nama_kepala_keluarga VARCHAR(160) NOT NULL,
kategori ENUM('sangat_miskin','miskin','rentan_miskin') NOT NULL, alamat TEXT NOT NULL,
alamat TEXT, wilayah VARCHAR(120) NOT NULL DEFAULT 'Belum Dipetakan',
rt VARCHAR(5), latitude DOUBLE NOT NULL,
rw VARCHAR(5), longitude DOUBLE NOT NULL,
kelurahan VARCHAR(100), jumlah_anggota INT NOT NULL DEFAULT 1,
keterangan TEXT, jumlah_tanggungan INT NOT NULL DEFAULT 0,
lat DOUBLE NOT NULL, pendapatan_bulanan DECIMAL(14,2) NOT NULL DEFAULT 0,
lng DOUBLE NOT NULL, pekerjaan VARCHAR(60) NOT NULL DEFAULT 'lainnya',
geom POINT GENERATED ALWAYS AS (ST_SRID(POINT(lng, lat), 4326)) STORED, pendidikan VARCHAR(60) NOT NULL DEFAULT 'sma',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, kondisi_rumah VARCHAR(60) NOT NULL DEFAULT 'sederhana',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, kondisi_kesehatan VARCHAR(60) NOT NULL DEFAULT 'sehat',
SPATIAL INDEX idx_keluarga_geom (geom) status_verifikasi ENUM('pending','terverifikasi','ditolak') NOT NULL DEFAULT 'pending',
tanggal_update DATE NOT NULL,
aktif TINYINT(1) NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_keluarga_lokasi (latitude, longitude),
INDEX idx_keluarga_wilayah (wilayah),
INDEX idx_keluarga_verifikasi (status_verifikasi)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tempat_ibadah (nama, jenis, alamat, kelurahan, lat, lng) VALUES CREATE TABLE IF NOT EXISTS kriteria (
('Masjid Jami Sultan Syarif Abdurrahman', 'masjid', 'Jl. Tanjungpura', 'Dalam Bugis', -0.0226, 109.3316), id_kriteria INT AUTO_INCREMENT PRIMARY KEY,
('Gereja Bethel Indonesia', 'gereja', 'Jl. Gajahmada', 'Sungai Bangkong', -0.0334, 109.3253), kode VARCHAR(60) NOT NULL UNIQUE,
('Vihara Bodhisattva', 'vihara', 'Jl. Diponegoro', 'Mariana', -0.0289, 109.3401); nama_kriteria VARCHAR(120) NOT NULL,
bobot DECIMAL(6,4) NOT NULL,
atribut ENUM('benefit','cost') NOT NULL,
aktif TINYINT(1) NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO keluarga_miskin (nama_kk, jumlah_anggota, kategori, kelurahan, lat, lng) VALUES CREATE TABLE IF NOT EXISTS penilaian (
('Ahmad Fauzi', 5, 'sangat_miskin', 'Dalam Bugis', -0.0231, 109.3321), id_penilaian INT AUTO_INCREMENT PRIMARY KEY,
('Siti Rahmah', 3, 'miskin', 'Dalam Bugis', -0.0219, 109.3308), id_keluarga INT NOT NULL,
('Budi Santoso', 6, 'rentan_miskin', 'Sungai Bangkong', -0.0341, 109.3261), id_kriteria INT NOT NULL,
('Maria Goretti', 4, 'miskin', 'Mariana', -0.0295, 109.3412), nilai DECIMAL(14,4) NOT NULL DEFAULT 0,
('Lim Ah Kow', 2, 'sangat_miskin', 'Mariana', -0.0501, 109.3600); nilai_normalisasi DECIMAL(14,6) NOT NULL DEFAULT 0,
nilai_terbobot DECIMAL(14,6) NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_penilaian (id_keluarga, id_kriteria),
CONSTRAINT fk_penilaian_keluarga FOREIGN KEY (id_keluarga) REFERENCES keluarga(id_keluarga) ON DELETE CASCADE,
CONSTRAINT fk_penilaian_kriteria FOREIGN KEY (id_kriteria) REFERENCES kriteria(id_kriteria) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS hasil_saw (
id_hasil INT AUTO_INCREMENT PRIMARY KEY,
id_keluarga INT NOT NULL UNIQUE,
skor_saw DECIMAL(12,6) NOT NULL DEFAULT 0,
kategori VARCHAR(40) NOT NULL,
ranking INT NOT NULL DEFAULT 0,
calculated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_hasil_keluarga FOREIGN KEY (id_keluarga) REFERENCES keluarga(id_keluarga) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS bantuan (
id_bantuan INT AUTO_INCREMENT PRIMARY KEY,
jenis_bantuan VARCHAR(120) NOT NULL,
tanggal_bantuan DATE NOT NULL,
nilai_bantuan DECIMAL(14,2) NOT NULL DEFAULT 0,
keterangan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS riwayat_bantuan (
id_riwayat INT AUTO_INCREMENT PRIMARY KEY,
id_keluarga INT NOT NULL,
id_bantuan INT NOT NULL,
tanggal_diterima DATE NOT NULL,
jumlah_bantuan DECIMAL(14,2) NOT NULL DEFAULT 0,
keterangan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_riwayat_keluarga FOREIGN KEY (id_keluarga) REFERENCES keluarga(id_keluarga) ON DELETE CASCADE,
CONSTRAINT fk_riwayat_bantuan FOREIGN KEY (id_bantuan) REFERENCES bantuan(id_bantuan) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT IGNORE INTO users (nama, username, password, role) VALUES
('Administrator', 'admin', 'admin123', 'admin'),
('Pengurus Gereja', 'pengurus', 'pengurus123', 'pengurus');
INSERT INTO kriteria (kode, nama_kriteria, bobot, atribut) VALUES
('pendapatan', 'Pendapatan', 0.3500, 'cost'),
('jumlah_tanggungan', 'Jumlah Tanggungan', 0.2000, 'benefit'),
('kondisi_rumah', 'Kondisi Rumah', 0.1500, 'benefit'),
('pekerjaan', 'Pekerjaan', 0.1500, 'benefit'),
('pendidikan', 'Pendidikan Kepala Keluarga', 0.1000, 'benefit'),
('kondisi_kesehatan', 'Kondisi Kesehatan', 0.0500, 'benefit')
ON DUPLICATE KEY UPDATE
nama_kriteria = VALUES(nama_kriteria),
bobot = VALUES(bobot),
atribut = VALUES(atribut),
aktif = 1;
INSERT IGNORE INTO keluarga
(nomor_kartu_keluarga, nama_kepala_keluarga, alamat, wilayah, latitude, longitude,
jumlah_anggota, jumlah_tanggungan, pendapatan_bulanan, pekerjaan, pendidikan,
kondisi_rumah, kondisi_kesehatan, status_verifikasi, tanggal_update)
VALUES
('6171010101010001', 'Maria Goretti', 'Jl. Gajah Mada Gang Damai', 'Paroki Katedral', -0.0339, 109.3367, 5, 4, 1250000, 'buruh_harian', 'smp', 'buruk', 'sakit_sering', 'terverifikasi', CURDATE()),
('6171010101010002', 'Yohanes Rudi', 'Jl. Tanjung Raya II', 'Paroki Santo Yosef', -0.0278, 109.3695, 6, 5, 900000, 'pengangguran', 'sd', 'sangat_buruk', 'kronis', 'terverifikasi', CURDATE()),
('6171010101010003', 'Agnes Lestari', 'Jl. Husein Hamzah', 'Paroki Santo Hieronymus', -0.0252, 109.3062, 4, 3, 1750000, 'pedagang_kecil', 'sma', 'semi_permanen', 'sehat', 'terverifikasi', CURDATE()),
('6171010101010004', 'Petrus Antoni', 'Jl. Imam Bonjol', 'Paroki Keluarga Kudus', -0.0266, 109.3444, 3, 2, 2800000, 'karyawan', 'sma', 'sederhana', 'sehat', 'terverifikasi', CURDATE()),
('6171010101010005', 'Theresia Ani', 'Jl. Khatulistiwa', 'Paroki Santo Agustinus', 0.0023, 109.3237, 7, 6, 1150000, 'buruh_harian', 'sd', 'buruk', 'disabilitas', 'terverifikasi', CURDATE()),
('6171010101010006', 'Fransiskus Deni', 'Jl. Dr. Wahidin', 'Paroki Santo Paulus', -0.0364, 109.3151, 2, 1, 4200000, 'wiraswasta', 'diploma', 'layak', 'sehat', 'terverifikasi', CURDATE());
INSERT INTO bantuan (jenis_bantuan, tanggal_bantuan, nilai_bantuan, keterangan)
SELECT 'Paket Sembako', CURDATE(), 350000, 'Bantuan pangan bulanan'
WHERE NOT EXISTS (SELECT 1 FROM bantuan WHERE jenis_bantuan = 'Paket Sembako');
INSERT INTO bantuan (jenis_bantuan, tanggal_bantuan, nilai_bantuan, keterangan)
SELECT 'Bantuan Pendidikan', CURDATE(), 500000, 'Dukungan biaya sekolah'
WHERE NOT EXISTS (SELECT 1 FROM bantuan WHERE jenis_bantuan = 'Bantuan Pendidikan');