Files
2026-06-11 21:20:59 +07:00

265 lines
13 KiB
SQL

-- ============================================================
-- GeoSosial Database Schema
-- Sistem Informasi Sosial Kota Pontianak
-- ============================================================
CREATE DATABASE IF NOT EXISTS geososial CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE geososial;
-- ============================================================
-- TABEL: users (autentikasi)
-- ============================================================
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
role ENUM('admin','petugas','walikota','viewer') NOT NULL DEFAULT 'viewer',
jabatan VARCHAR(100),
can_edit TINYINT(1) NOT NULL DEFAULT 0,
is_admin TINYINT(1) NOT NULL DEFAULT 0,
is_wali TINYINT(1) NOT NULL DEFAULT 0,
aktif TINYINT(1) NOT NULL DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: kelurahan (master data)
-- ============================================================
CREATE TABLE IF NOT EXISTS kelurahan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
kecamatan VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: rumah_ibadah
-- ============================================================
CREATE TABLE IF NOT EXISTS rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
tipe ENUM('masjid','gereja','pura','vihara','klenteng') NOT NULL,
ikon VARCHAR(10) DEFAULT '🕌',
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
kapasitas INT DEFAULT 0,
kelurahan_id INT,
alamat TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kelurahan_id) REFERENCES kelurahan(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: warga (data kepala keluarga)
-- ============================================================
CREATE TABLE IF NOT EXISTS warga (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
nik VARCHAR(16),
kelurahan_id INT,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
kategori ENUM('sangat_miskin','miskin','hampir_miskin') NOT NULL,
jumlah_anggota INT DEFAULT 1,
penghasilan BIGINT DEFAULT 0,
tgl_lahir DATE,
pendidikan ENUM('tidak_sekolah','sd','smp','sma','d3','s1','s2','') DEFAULT '',
keterangan TEXT,
status ENUM('aktif','nonaktif') DEFAULT 'aktif',
pelapor VARCHAR(150),
no_laporan VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (kelurahan_id) REFERENCES kelurahan(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: anggota_keluarga
-- ============================================================
CREATE TABLE IF NOT EXISTS anggota_keluarga (
id INT AUTO_INCREMENT PRIMARY KEY,
warga_id INT NOT NULL,
nama VARCHAR(150) NOT NULL,
usia INT DEFAULT 0,
hubungan VARCHAR(50) DEFAULT 'Anak',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (warga_id) REFERENCES warga(id) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: riwayat_penyakit (per anggota keluarga)
-- ============================================================
CREATE TABLE IF NOT EXISTS riwayat_penyakit (
id INT AUTO_INCREMENT PRIMARY KEY,
anggota_id INT NOT NULL,
penyakit ENUM('hipertensi','diabetes','tbc','asma','stroke','jantung','odgj','stunting','kanker') NOT NULL,
FOREIGN KEY (anggota_id) REFERENCES anggota_keluarga(id) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: histori_bantuan
-- ============================================================
CREATE TABLE IF NOT EXISTS histori_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
warga_id INT NOT NULL,
tanggal DATE NOT NULL,
jenis VARCHAR(50) NOT NULL,
nominal BIGINT DEFAULT 0,
sumber_dana VARCHAR(100),
keterangan TEXT,
created_by INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (warga_id) REFERENCES warga(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- TABEL: laporan (dari masyarakat)
-- ============================================================
CREATE TABLE IF NOT EXISTS laporan (
id INT AUTO_INCREMENT PRIMARY KEY,
no_laporan VARCHAR(20) NOT NULL UNIQUE,
nama_pelapor VARCHAR(100),
hp_pelapor VARCHAR(20),
nama_dilaporkan VARCHAR(150) NOT NULL,
nik VARCHAR(16),
kelurahan_id INT,
kategori ENUM('sangat_miskin','miskin','hampir_miskin') NOT NULL,
jumlah_anggota INT DEFAULT 0,
penghasilan BIGINT DEFAULT 0,
keterangan TEXT NOT NULL,
lat DECIMAL(10,7),
lng DECIMAL(10,7),
status ENUM('menunggu','disetujui','ditolak') DEFAULT 'menunggu',
warga_id INT COMMENT 'warga_id jika laporan disetujui',
approved_by INT,
tgl_laporan DATE NOT NULL,
tgl_proses TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kelurahan_id) REFERENCES kelurahan(id) ON DELETE SET NULL,
FOREIGN KEY (warga_id) REFERENCES warga(id) ON DELETE SET NULL,
FOREIGN KEY (approved_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- SEED DATA: users
-- ============================================================
INSERT INTO users (username, password, role, jabatan, can_edit, is_admin, is_wali) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin', 'Kadis Sosial', 1, 1, 0),
('petugas', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'petugas', 'Staf Verifikasi', 1, 0, 0),
('walikota', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'walikota', 'Walikota Pontianak', 0, 0, 1),
('viewer', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'viewer', 'Pemangku Kepentingan', 0, 0, 0);
-- NOTE: Password hash di atas adalah hash bcrypt dari kata "password"
-- Ubah password melalui phpMyAdmin atau script update_password.php
-- Password asli: admin=admin123, petugas=petugas123, walikota=wali2024, viewer=viewer123
-- (Hash akan diupdate otomatis saat pertama login via generate_passwords.php)
-- ============================================================
-- SEED DATA: kelurahan (6 kecamatan, 24 kelurahan)
-- ============================================================
INSERT INTO kelurahan (nama, kecamatan) VALUES
-- Pontianak Kota
('Kel. Tengah', 'Pontianak Kota'),
('Kel. Darat Sekip', 'Pontianak Kota'),
('Kel. Sungai Bangkong', 'Pontianak Kota'),
('Kel. Mariana', 'Pontianak Kota'),
('Kel. Sungai Jawi', 'Pontianak Kota'),
-- Pontianak Selatan
('Kel. Parit Tokaya', 'Pontianak Selatan'),
('Kel. Benua Melayu Darat', 'Pontianak Selatan'),
('Kel. Benua Melayu Laut', 'Pontianak Selatan'),
('Kel. Kota Baru', 'Pontianak Selatan'),
-- Pontianak Barat
('Kel. Sungai Beliung', 'Pontianak Barat'),
('Kel. Pal Lima', 'Pontianak Barat'),
('Kel. Akcaya', 'Pontianak Barat'),
('Kel. Sungai Jawi Luar', 'Pontianak Barat'),
-- Pontianak Utara
('Kel. Siantan Hulu', 'Pontianak Utara'),
('Kel. Batu Layang', 'Pontianak Utara'),
('Kel. Saigon', 'Pontianak Utara'),
('Kel. Siantan Hilir', 'Pontianak Utara'),
-- Pontianak Timur
('Kel. Tanjung Hulu', 'Pontianak Timur'),
('Kel. Banjar Serasan', 'Pontianak Timur'),
('Kel. Dalam Bugis', 'Pontianak Timur'),
-- Pontianak Tenggara
('Kel. Bangka Belitung Darat', 'Pontianak Tenggara'),
('Kel. Bangka Belitung Laut', 'Pontianak Tenggara'),
('Kel. Bansir Laut', 'Pontianak Tenggara'),
('Kel. Bansir Darat', 'Pontianak Tenggara');
-- ============================================================
-- SEED DATA: rumah_ibadah
-- ============================================================
INSERT INTO rumah_ibadah (nama, tipe, ikon, lat, lng, kapasitas, kelurahan_id, alamat) VALUES
('Masjid Al-Ikhlas', 'masjid', '🕌', -0.0180000, 109.3320000, 150, 4, 'Jl. Mariana, Pontianak Kota'),
('Masjid Raya Mujahidin', 'masjid', '🕌', -0.0428000, 109.3373000, 500, 12, 'Jl. Jend. Ahmad Yani, Pontianak Selatan'),
('Masjid Jami Sultan', 'masjid', '🕌', -0.0400000, 109.3440000, 300, 20, 'Jl. Tanjungpura, Pontianak Timur'),
('Masjid Nurul Hidayah', 'masjid', '🕌', -0.0100000, 109.3360000, 100, 14, 'Jl. Siantan Hulu, Pontianak Utara'),
('Gereja GPIB Immanuel', 'gereja', '⛪', -0.0130000, 109.3480000, 200, 14, 'Jl. Sisingamangaraja, Pontianak Utara'),
('Gereja Bethel Indonesia','gereja', '⛪', -0.0300000, 109.3370000, 180, 6, 'Jl. Parit Tokaya, Pontianak Selatan'),
('Gereja Katedral', 'gereja', '⛪', -0.0350000, 109.3620000, 350, 15, 'Jl. Diponegoro, Pontianak Utara'),
('Pura Girinatha', 'pura', '🛕', -0.0220000, 109.3550000, 80, 3, 'Jl. Sungai Bangkong, Pontianak Kota'),
('Vihara Bodhisatva', 'vihara', '🏛️', -0.0080000, 109.3400000, 60, 14, 'Jl. Siantan, Pontianak Utara'),
('Klenteng Tua Pek Kong', 'klenteng', '🏯', -0.0260000, 109.3420000, 70, 1, 'Jl. Diponegoro, Pontianak Kota');
-- ============================================================
-- VIEWS berguna
-- ============================================================
CREATE OR REPLACE VIEW v_warga_lengkap AS
SELECT
w.id, w.nama, w.nik, w.lat, w.lng, w.kategori,
w.jumlah_anggota, w.penghasilan, w.tgl_lahir, w.pendidikan,
w.keterangan, w.status, w.pelapor, w.no_laporan, w.created_at,
k.nama AS kelurahan, k.kecamatan,
(SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.warga_id = w.id) AS total_bantuan,
(SELECT COALESCE(SUM(hb2.nominal),0) FROM histori_bantuan hb2 WHERE hb2.warga_id = w.id) AS total_nominal_bantuan
FROM warga w
LEFT JOIN kelurahan k ON w.kelurahan_id = k.id;
CREATE OR REPLACE VIEW v_laporan_lengkap AS
SELECT
l.id, l.no_laporan, l.nama_pelapor, l.hp_pelapor,
l.nama_dilaporkan, l.nik, l.kategori, l.jumlah_anggota,
l.penghasilan, l.keterangan, l.lat, l.lng, l.status,
l.tgl_laporan, l.created_at,
k.nama AS kelurahan, k.kecamatan
FROM laporan l
LEFT JOIN kelurahan k ON l.kelurahan_id = k.id;
-- ============================================================
-- TABEL: fasilitas_umum (opsional)
-- ============================================================
CREATE TABLE IF NOT EXISTS fasilitas_umum (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
kategori VARCHAR(50) NOT NULL,
lat DECIMAL(10,7) NOT NULL,
lng DECIMAL(10,7) NOT NULL,
alamat TEXT,
keterangan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- ============================================================
-- SEED DATA: fasilitas_umum
-- ============================================================
INSERT INTO fasilitas_umum (nama, kategori, lat, lng, alamat, keterangan) VALUES
-- Kesehatan
('RSUD Dr. Soedarso', 'kesehatan', -0.0461000, 109.3458000, 'Jl. Dr. Soedarso, Pontianak Tenggara', 'Rumah Sakit Umum Daerah Provinsi Kalbar'),
('Puskesmas Parit Tokaya', 'kesehatan', -0.0396000, 109.3364000, 'Jl. Paris II, Pontianak Selatan', 'Pelayanan Kesehatan Tingkat Pertama'),
('RS Katolik Antonius', 'kesehatan', -0.0336000, 109.3242000, 'Jl. K.H. Wahid Hasyim, Pontianak Kota', 'Rumah Sakit Swasta Tipe B'),
-- Pendidikan
('Universitas Tanjungpura', 'pendidikan', -0.0622000, 109.3468000, 'Jl. Prof. Dr. H. Hadari Nawawi, Pontianak Tenggara', 'Perguruan Tinggi Negeri Utama Kalbar'),
('SMA Negeri 1 Pontianak', 'pendidikan', -0.0354000, 109.3328000, 'Jl. Anjungan, Pontianak Kota', 'Sekolah Menengah Atas Negeri'),
('SMP Negeri 1 Pontianak', 'pendidikan', -0.0248000, 109.3344000, 'Jl. Jend. Urip Sumoharjo, Pontianak Kota', 'Sekolah Menengah Pertama Negeri'),
-- Pasar Tradisional
('Pasar Flamboyan', 'pasar', -0.0381000, 109.3394000, 'Jl. Pahlawan, Pontianak Selatan', 'Pasar Tradisional Terbesar di Kota Pontianak'),
('Pasar Mawar', 'pasar', -0.0279000, 109.3387000, 'Jl. Cokroaminoto, Pontianak Kota', 'Pasar Tradisional Sayur & Kebutuhan Pokok'),
('Pasar Kemuning', 'pasar', -0.0456000, 109.3218000, 'Jl. Prof. M. Yamin, Pontianak Kota', 'Pasar Rakyat Modern Kelurahan Kota Baru'),
-- Kantor Kelurahan
('Kantor Lurah Akcaya', 'kelurahan', -0.0352000, 109.3236000, 'Jl. Sutan Syahrir, Pontianak Selatan', 'Pelayanan Publik Kelurahan Akcaya'),
('Kantor Lurah Parit Tokaya', 'kelurahan', -0.0478000, 109.3415000, 'Jl. Paris I, Pontianak Selatan', 'Pelayanan Publik Kelurahan Parit Tokaya'),
('Kantor Lurah Benua Melayu Darat', 'kelurahan', -0.0345000, 109.3444000, 'Jl. Gajah Mada, Pontianak Selatan', 'Pelayanan Publik Kelurahan BMD');