diff --git a/setup_db.php b/setup_db.php
new file mode 100644
index 0000000..9c537ed
--- /dev/null
+++ b/setup_db.php
@@ -0,0 +1,257 @@
+body{font-family:monospace;background:#0b1120;color:#e0e6f0;padding:20px} .ok{color:#00c9aa} .err{color:#f03e5a} .info{color:#f59e0b} h2{color:#1a5fff}";
+echo "
🔧 WebGIS Database Installer
";
+
+// Koneksi tanpa pilih database
+$conn = new mysqli($host, $user, $pass);
+if ($conn->connect_error) {
+ die("❌ Gagal konek ke MySQL: " . $conn->connect_error . "
");
+}
+echo "✅ Koneksi ke MySQL berhasil! (Host: $host)
";
+
+// ── 1. Buat database webgis ──────────────────────────────────
+$conn->query("CREATE DATABASE IF NOT EXISTS webgis CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
+echo "✅ Database webgis dibuat/sudah ada.
";
+
+// ── 2. Buat database geososial ───────────────────────────────
+$conn->query("CREATE DATABASE IF NOT EXISTS geososial CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
+echo "✅ Database geososial dibuat/sudah ada.
";
+
+// ── 3. Import tabel webgis ───────────────────────────────────
+echo "📦 Import Database SPBU (webgis)
";
+$conn->select_db('webgis');
+$webgis_sql = "
+SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';
+SET time_zone = '+00:00';
+
+CREATE TABLE IF NOT EXISTS `spbu` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `nama_spbu` varchar(100) DEFAULT NULL,
+ `no_wa` varchar(20) DEFAULT NULL,
+ `buka_24jam` enum('Ya','Tidak') DEFAULT NULL,
+ `latitude` double DEFAULT NULL,
+ `longitude` double DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+CREATE TABLE IF NOT EXISTS `jalan` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `nama_jalan` varchar(150) DEFAULT NULL,
+ `geojson` longtext,
+ `created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE IF NOT EXISTS `parsil` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `nama_parsil` varchar(150) DEFAULT NULL,
+ `geojson` longtext,
+ `created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+INSERT IGNORE INTO `spbu` (`id`, `nama_spbu`, `no_wa`, `buka_24jam`, `latitude`, `longitude`) VALUES
+(1, 'SPBU TanjungPura', '12345678', 'Ya', -0.028881894870255782, 109.3369621038437),
+(2, 'SPBU tak tau', '1111111', 'Ya', -0.019509077149319303, 109.33181762695314),
+(3, 'SPBU TanjungPura', '1111', 'Tidak', -0.027379988581930446, 109.34041678905488);
+";
+
+$stmts = array_filter(array_map('trim', explode(';', $webgis_sql)));
+$ok = 0; $fail = 0;
+foreach ($stmts as $stmt) {
+ if (empty($stmt)) continue;
+ if ($conn->query($stmt)) {
+ $ok++;
+ } else {
+ echo "⚠️ " . htmlspecialchars(substr($stmt,0,80)) . "... → " . $conn->error . "
";
+ $fail++;
+ }
+}
+echo "✅ webgis: $ok query berhasil, $fail gagal.
";
+
+// ── 4. Import tabel geososial ────────────────────────────────
+echo "📦 Import Database GeoSosial (geososial)
";
+$conn->select_db('geososial');
+
+$queries = [
+ "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",
+
+ "CREATE TABLE IF NOT EXISTS kelurahan (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ nama VARCHAR(100) NOT NULL,
+ kecamatan VARCHAR(100) NOT NULL
+ ) ENGINE=InnoDB",
+
+ "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",
+
+ "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",
+
+ "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",
+
+ "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",
+
+ "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",
+
+ "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,
+ 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",
+
+ "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",
+
+ "INSERT IGNORE 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)",
+
+ "INSERT IGNORE INTO kelurahan (nama, kecamatan) VALUES
+ ('Kel. Tengah', 'Pontianak Kota'),('Kel. Darat Sekip', 'Pontianak Kota'),
+ ('Kel. Sungai Bangkong', 'Pontianak Kota'),('Kel. Mariana', 'Pontianak Kota'),
+ ('Kel. Sungai Jawi', 'Pontianak Kota'),('Kel. Parit Tokaya', 'Pontianak Selatan'),
+ ('Kel. Benua Melayu Darat', 'Pontianak Selatan'),('Kel. Benua Melayu Laut', 'Pontianak Selatan'),
+ ('Kel. Kota Baru', 'Pontianak Selatan'),('Kel. Sungai Beliung', 'Pontianak Barat'),
+ ('Kel. Pal Lima', 'Pontianak Barat'),('Kel. Akcaya', 'Pontianak Barat'),
+ ('Kel. Sungai Jawi Luar', 'Pontianak Barat'),('Kel. Siantan Hulu', 'Pontianak Utara'),
+ ('Kel. Batu Layang', 'Pontianak Utara'),('Kel. Saigon', 'Pontianak Utara'),
+ ('Kel. Siantan Hilir', 'Pontianak Utara'),('Kel. Tanjung Hulu', 'Pontianak Timur'),
+ ('Kel. Banjar Serasan', 'Pontianak Timur'),('Kel. Dalam Bugis', 'Pontianak Timur'),
+ ('Kel. Bangka Belitung Darat', 'Pontianak Tenggara'),('Kel. Bangka Belitung Laut', 'Pontianak Tenggara'),
+ ('Kel. Bansir Laut', 'Pontianak Tenggara'),('Kel. Bansir Darat', 'Pontianak Tenggara')",
+
+ "INSERT IGNORE 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')",
+];
+
+$ok2 = 0; $fail2 = 0;
+foreach ($queries as $q) {
+ if ($conn->query(trim($q))) {
+ $ok2++;
+ } else {
+ echo "⚠️ " . htmlspecialchars(substr(trim($q),0,80)) . "... → " . $conn->error . "
";
+ $fail2++;
+ }
+}
+echo "✅ geososial: $ok2 query berhasil, $fail2 gagal.
";
+
+$conn->close();
+
+echo "
";
+echo "🎉 Setup Selesai!
";
+echo "Database webgis dan geososial sudah siap digunakan.
";
+echo "⚠️ PENTING: Segera hapus file ini setelah setup selesai!
Akses ke file ini bisa berbahaya jika dibiarkan terbuka.
";
+echo "→ Kembali ke Portal WebGIS
";
+?>