-- ============================================================ -- SINERGI - Sistem Informasi Geografis Penanganan Kemiskinan -- Database Schema v1.0 -- Kota Pontianak -- ============================================================ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; CREATE DATABASE IF NOT EXISTS `sinergi_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `sinergi_db`; -- ============================================================ -- TABLE: roles -- ============================================================ CREATE TABLE `roles` ( `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, `nama` VARCHAR(50) NOT NULL, `slug` VARCHAR(30) NOT NULL, `deskripsi` VARCHAR(255), PRIMARY KEY (`id`), UNIQUE KEY `uq_roles_slug` (`slug`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `roles` (`id`,`nama`,`slug`,`deskripsi`) VALUES (1,'Super Admin','superadmin','Administrator sistem, mengelola seluruh data master'), (2,'Verifikator Kelurahan','verifikator','Petugas verifikasi laporan di tingkat kelurahan'), (3,'Pengurus Rumah Ibadah','rumah_ibadah','Pengurus rumah ibadah yang menangani warga binaan'), (4,'Dinas Sosial','dinsos','Petugas Dinas Sosial untuk monitoring kemiskinan'), (5,'Wali Kota','walikota','Wali Kota untuk dashboard eksekutif'); -- ============================================================ -- TABLE: kecamatan -- ============================================================ CREATE TABLE `kecamatan` ( `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, `nama` VARCHAR(100) NOT NULL, `kode` VARCHAR(20), `lat` DECIMAL(10,7), `lng` DECIMAL(10,7), `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 6 Kecamatan Kota Pontianak INSERT INTO `kecamatan` (`id`,`nama`,`kode`,`lat`,`lng`) VALUES (1,'Pontianak Kota','62.71.01',-0.0233,109.3294), (2,'Pontianak Barat','62.71.02',-0.0500,109.3100), (3,'Pontianak Selatan','62.71.03',-0.0700,109.3400), (4,'Pontianak Tenggara','62.71.04',-0.0900,109.3600), (5,'Pontianak Timur','62.71.05',-0.0400,109.3700), (6,'Pontianak Utara','62.71.06',0.0100,109.3300); -- ============================================================ -- TABLE: kelurahan -- ============================================================ CREATE TABLE `kelurahan` ( `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, `id_kecamatan` SMALLINT UNSIGNED NOT NULL, `nama` VARCHAR(100) NOT NULL, `kode` VARCHAR(20), `lat` DECIMAL(10,7), `lng` DECIMAL(10,7), `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_kel_kec` (`id_kecamatan`), CONSTRAINT `fk_kel_kec` FOREIGN KEY (`id_kecamatan`) REFERENCES `kecamatan` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- Kelurahan Kota Pontianak (sample per kecamatan) INSERT INTO `kelurahan` (`id`,`id_kecamatan`,`nama`,`kode`,`lat`,`lng`) VALUES -- Pontianak Kota (1,1,'Darat Sekip','62.71.01.1001',-0.0175,109.3230), (2,1,'Sungai Bangkong','62.71.01.1002',-0.0290,109.3310), (3,1,'Tengah','62.71.01.1003',-0.0210,109.3290), (4,1,'Mariana','62.71.01.1004',-0.0155,109.3350), -- Pontianak Barat (5,2,'Sungai Jawi Dalam','62.71.02.1001',-0.0467,109.3050), (6,2,'Sungai Jawi Luar','62.71.02.1002',-0.0530,109.3000), (7,2,'Pal Lima','62.71.02.1003',-0.0600,109.2900), (8,2,'Sungai Beliung','62.71.02.1004',-0.0450,109.3150), -- Pontianak Selatan (9,3,'Akcaya','62.71.03.1001',-0.0650,109.3380), (10,3,'Bangka Belitung Darat','62.71.03.1002',-0.0750,109.3420), (11,3,'Bangka Belitung Laut','62.71.03.1003',-0.0820,109.3350), (12,3,'Parit Tokaya','62.71.03.1004',-0.0700,109.3300), -- Pontianak Tenggara (13,4,'Bansir Darat','62.71.04.1001',-0.0870,109.3550), (14,4,'Bansir Laut','62.71.04.1002',-0.0950,109.3600), (15,4,'Tanjung Hulu','62.71.04.1003',-0.0920,109.3700), (16,4,'Tanjung Hilir','62.71.04.1004',-0.0850,109.3650), -- Pontianak Timur (17,5,'Saigon','62.71.05.1001',-0.0380,109.3700), (18,5,'Tambelan Sampit','62.71.05.1002',-0.0450,109.3750), (19,5,'Tanjung Raya','62.71.05.1003',-0.0320,109.3800), (20,5,'Parit Mayor','62.71.05.1004',-0.0500,109.3680), -- Pontianak Utara (21,6,'Siantan Hulu','62.71.06.1001',0.0200,109.3250), (22,6,'Siantan Tengah','62.71.06.1002',0.0100,109.3200), (23,6,'Siantan Hilir','62.71.06.1003',0.0050,109.3300), (24,6,'Batu Layang','62.71.06.1004',0.0300,109.3350); -- ============================================================ -- TABLE: users -- ============================================================ CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `id_role` TINYINT UNSIGNED NOT NULL, `id_kelurahan` SMALLINT UNSIGNED DEFAULT NULL, `nama` VARCHAR(100) NOT NULL, `username` VARCHAR(50) NOT NULL, `email` VARCHAR(100) NOT NULL, `password` VARCHAR(255) NOT NULL, `no_hp` VARCHAR(20), `foto` VARCHAR(255), `is_active` TINYINT(1) NOT NULL DEFAULT 1, `last_login` DATETIME, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uq_users_username` (`username`), UNIQUE KEY `uq_users_email` (`email`), KEY `fk_users_role` (`id_role`), KEY `fk_users_kel` (`id_kelurahan`), CONSTRAINT `fk_users_role` FOREIGN KEY (`id_role`) REFERENCES `roles` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_users_kel` FOREIGN KEY (`id_kelurahan`) REFERENCES `kelurahan` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- Password: Admin@123 (bcrypt) INSERT INTO `users` (`id`,`id_role`,`id_kelurahan`,`nama`,`username`,`email`,`password`,`no_hp`,`is_active`) VALUES (1,1,NULL,'Super Administrator','superadmin','superadmin@sinergi.id','$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi','081200000001',1), (2,2,1,'Budi Santoso','verif_darat','budi.santoso@pontianak.go.id','$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi','081200000002',1), (3,2,5,'Sari Dewi','verif_jawi','sari.dewi@pontianak.go.id','$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi','081200000003',1), (4,4,NULL,'Ahmad Fauzi','dinsos_ahmad','ahmad.fauzi@dinsos.id','$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi','081200000004',1), (5,5,NULL,'H. Edi Kamtono','walikota','walikota@pontianak.go.id','$2y$12$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi','081200000005',1); -- ============================================================ -- TABLE: jenis_rumah_ibadah -- ============================================================ CREATE TABLE `jenis_rumah_ibadah` ( `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, `nama` VARCHAR(50) NOT NULL, `ikon` VARCHAR(100), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `jenis_rumah_ibadah` VALUES (1,'Masjid','masjid.png'), (2,'Gereja','gereja.png'), (3,'Vihara','vihara.png'), (4,'Pura','pura.png'), (5,'Klenteng','klenteng.png'); -- ============================================================ -- TABLE: rumah_ibadah -- ============================================================ CREATE TABLE `rumah_ibadah` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `id_user` INT UNSIGNED DEFAULT NULL COMMENT 'User pengurus', `id_kelurahan` SMALLINT UNSIGNED NOT NULL, `id_jenis` TINYINT UNSIGNED NOT NULL, `nama` VARCHAR(150) NOT NULL, `alamat` TEXT, `lat` DECIMAL(10,7) NOT NULL, `lng` DECIMAL(10,7) NOT NULL, `radius_meter` INT UNSIGNED NOT NULL DEFAULT 500 COMMENT 'Radius pelayanan dalam meter', `no_hp_pengurus` VARCHAR(20), `nama_ketua` VARCHAR(100), `foto` VARCHAR(255), `is_active` TINYINT(1) NOT NULL DEFAULT 1, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_ri_user` (`id_user`), KEY `fk_ri_kel` (`id_kelurahan`), KEY `fk_ri_jenis` (`id_jenis`), CONSTRAINT `fk_ri_user` FOREIGN KEY (`id_user`) REFERENCES `users` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_ri_kel` FOREIGN KEY (`id_kelurahan`) REFERENCES `kelurahan` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_ri_jenis` FOREIGN KEY (`id_jenis`) REFERENCES `jenis_rumah_ibadah` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- TABLE: kategori_bantuan -- ============================================================ CREATE TABLE `kategori_bantuan` ( `id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, `nama` VARCHAR(100) NOT NULL, `deskripsi` TEXT, `satuan` VARCHAR(50) COMMENT 'kg, paket, rupiah, dll', `is_active` TINYINT(1) NOT NULL DEFAULT 1, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `kategori_bantuan` (`id`,`nama`,`deskripsi`,`satuan`) VALUES (1,'Sembako','Bantuan bahan pokok makanan','paket'), (2,'Sandang','Bantuan pakaian dan kebutuhan sandang','paket'), (3,'Uang Tunai','Bantuan uang tunai langsung','rupiah'), (4,'Obat-obatan','Bantuan obat dan layanan kesehatan','paket'), (5,'Peralatan Sekolah','Bantuan perlengkapan pendidikan anak','paket'), (6,'Renovasi Rumah','Bantuan material renovasi rumah tidak layak huni','paket'), (7,'Modal Usaha','Bantuan modal untuk usaha kecil','rupiah'), (8,'Gas & Listrik','Bantuan biaya gas dan listrik','paket'); -- ============================================================ -- TABLE: laporan_masyarakat -- ============================================================ CREATE TABLE `laporan_masyarakat` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `kode_laporan` VARCHAR(20) NOT NULL UNIQUE COMMENT 'LPR-YYYYMMDD-XXXX', `nama_pelapor` VARCHAR(100) NOT NULL, `no_hp_pelapor` VARCHAR(20), `nama_warga` VARCHAR(100) NOT NULL, `alamat_warga` TEXT NOT NULL, `id_kelurahan` SMALLINT UNSIGNED NOT NULL, `lat` DECIMAL(10,7) NOT NULL, `lng` DECIMAL(10,7) NOT NULL, `deskripsi` TEXT, `foto` VARCHAR(255), `status` ENUM('menunggu','diproses','terverifikasi','ditolak') NOT NULL DEFAULT 'menunggu', `catatan_verifikator` TEXT, `id_verifikator` INT UNSIGNED DEFAULT NULL, `tanggal_verifikasi` DATETIME, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_lap_kel` (`id_kelurahan`), KEY `fk_lap_verif` (`id_verifikator`), CONSTRAINT `fk_lap_kel` FOREIGN KEY (`id_kelurahan`) REFERENCES `kelurahan` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_lap_verif` FOREIGN KEY (`id_verifikator`) REFERENCES `users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- TABLE: warga_miskin -- ============================================================ CREATE TABLE `warga_miskin` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `id_laporan` INT UNSIGNED DEFAULT NULL, `id_kelurahan` SMALLINT UNSIGNED NOT NULL, `id_rumah_ibadah` INT UNSIGNED DEFAULT NULL COMMENT 'Rumah ibadah penanggung jawab', `id_verifikator` INT UNSIGNED DEFAULT NULL, -- Data Pribadi `nik` VARCHAR(16) UNIQUE, `nama` VARCHAR(100) NOT NULL, `tempat_lahir` VARCHAR(100), `tanggal_lahir` DATE, `jenis_kelamin` ENUM('L','P') DEFAULT 'L', `agama` ENUM('Islam','Kristen','Katolik','Hindu','Buddha','Konghucu','Lainnya') DEFAULT 'Islam', `alamat` TEXT NOT NULL, `lat` DECIMAL(10,7) NOT NULL, `lng` DECIMAL(10,7) NOT NULL, `no_hp` VARCHAR(20), `foto` VARCHAR(255), -- Data Sosial Ekonomi `pendidikan_terakhir` ENUM('Tidak Sekolah','SD','SMP','SMA','D3','S1','S2','S3') DEFAULT 'SD', `pekerjaan` VARCHAR(100), `penghasilan_bulanan` INT UNSIGNED DEFAULT 0 COMMENT 'Rupiah per bulan', `jumlah_tanggungan` TINYINT UNSIGNED DEFAULT 0, -- Kondisi Khusus `kondisi_rumah` ENUM('Sangat Tidak Layak','Tidak Layak','Cukup Layak','Layak') DEFAULT 'Tidak Layak', `riwayat_penyakit` TEXT COMMENT 'Daftar penyakit yang diderita', `is_lansia` TINYINT(1) DEFAULT 0, `is_disabilitas` TINYINT(1) DEFAULT 0, `disabilitas_jenis` VARCHAR(100), -- Status & Prioritas `status_kemiskinan` ENUM('Miskin Ekstrem','Miskin','Rentan Miskin') DEFAULT 'Miskin', `skor_prioritas` TINYINT UNSIGNED DEFAULT 0 COMMENT '0-100', `level_prioritas` ENUM('Tinggi','Sedang','Rendah') DEFAULT 'Sedang', `is_blind_spot` TINYINT(1) DEFAULT 0, `status` ENUM('aktif','nonaktif','meninggal','pindah') DEFAULT 'aktif', -- Timestamps `tanggal_verifikasi` DATE, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_wm_laporan` (`id_laporan`), KEY `fk_wm_kel` (`id_kelurahan`), KEY `fk_wm_ri` (`id_rumah_ibadah`), KEY `fk_wm_verif` (`id_verifikator`), KEY `idx_wm_blind_spot` (`is_blind_spot`), KEY `idx_wm_prioritas` (`level_prioritas`), KEY `idx_wm_status_kem` (`status_kemiskinan`), CONSTRAINT `fk_wm_laporan` FOREIGN KEY (`id_laporan`) REFERENCES `laporan_masyarakat` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_wm_kel` FOREIGN KEY (`id_kelurahan`) REFERENCES `kelurahan` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_wm_ri` FOREIGN KEY (`id_rumah_ibadah`) REFERENCES `rumah_ibadah` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_wm_verif` FOREIGN KEY (`id_verifikator`) REFERENCES `users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- TABLE: histori_bantuan -- ============================================================ CREATE TABLE `histori_bantuan` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `id_warga` INT UNSIGNED NOT NULL, `id_rumah_ibadah` INT UNSIGNED NOT NULL, `id_kategori_bantuan` TINYINT UNSIGNED NOT NULL, `id_user_pengurus` INT UNSIGNED NOT NULL, `kode_bantuan` VARCHAR(20) NOT NULL UNIQUE COMMENT 'BNT-YYYYMMDD-XXXX', `tanggal_penyaluran` DATE NOT NULL, `jumlah` DECIMAL(12,2), `satuan` VARCHAR(50), `deskripsi` TEXT, `foto_bukti` VARCHAR(255), `status` ENUM('rencana','disalurkan','dibatalkan') DEFAULT 'disalurkan', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_hb_warga` (`id_warga`), KEY `fk_hb_ri` (`id_rumah_ibadah`), KEY `fk_hb_kat` (`id_kategori_bantuan`), KEY `fk_hb_user` (`id_user_pengurus`), CONSTRAINT `fk_hb_warga` FOREIGN KEY (`id_warga`) REFERENCES `warga_miskin` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_hb_ri` FOREIGN KEY (`id_rumah_ibadah`) REFERENCES `rumah_ibadah` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_hb_kat` FOREIGN KEY (`id_kategori_bantuan`) REFERENCES `kategori_bantuan` (`id`) ON DELETE RESTRICT, CONSTRAINT `fk_hb_user` FOREIGN KEY (`id_user_pengurus`) REFERENCES `users` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- TABLE: aktivitas_sistem -- ============================================================ CREATE TABLE `aktivitas_sistem` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `id_user` INT UNSIGNED DEFAULT NULL, `nama_user` VARCHAR(100) COMMENT 'Snapshot nama saat aksi', `role` VARCHAR(30), `aksi` VARCHAR(100) NOT NULL, `modul` VARCHAR(50), `deskripsi` TEXT, `ip_address` VARCHAR(45), `user_agent` VARCHAR(255), `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `fk_as_user` (`id_user`), KEY `idx_as_modul` (`modul`), KEY `idx_as_created` (`created_at`), CONSTRAINT `fk_as_user` FOREIGN KEY (`id_user`) REFERENCES `users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- TABLE: sessions (untuk autentikasi manual) -- ============================================================ CREATE TABLE `sessions` ( `id` VARCHAR(128) NOT NULL, `id_user` INT UNSIGNED NOT NULL, `ip_address` VARCHAR(45), `user_agent` VARCHAR(255), `payload` TEXT, `last_activity` INT UNSIGNED NOT NULL, PRIMARY KEY (`id`), KEY `fk_sess_user` (`id_user`), CONSTRAINT `fk_sess_user` FOREIGN KEY (`id_user`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; SET FOREIGN_KEY_CHECKS = 1;