diff --git a/Web GIS Rumah Ibadah/migrate.php b/Web GIS Rumah Ibadah/migrate.php
new file mode 100644
index 0000000..7439270
--- /dev/null
+++ b/Web GIS Rumah Ibadah/migrate.php
@@ -0,0 +1,273 @@
+connect_error) {
+ die('
Koneksi gagal: ' . $conn->connect_error . '
');
+}
+$conn->set_charset('utf8mb4');
+
+header('Content-Type: text/html; charset=utf-8');
+
+$results = [];
+
+function run(mysqli $c, string $label, string $sql): array {
+ // Hapus komentar SQL (-- ...) agar tidak error
+ $sql = preg_replace('/--[^\n]*/', '', $sql);
+ if ($c->query($sql) === true) {
+ return ['label' => $label, 'status' => 'OK', 'msg' => ''];
+ }
+ return ['label' => $label, 'status' => 'ERROR', 'msg' => $c->error];
+}
+
+// ── DROP (urutan sesuai FK) ───────────────────────────────────
+$results[] = run($conn, 'DROP TABLE histori_bantuan', "DROP TABLE IF EXISTS histori_bantuan");
+$results[] = run($conn, 'DROP TABLE laporan_masyarakat', "DROP TABLE IF EXISTS laporan_masyarakat");
+$results[] = run($conn, 'DROP TABLE keluarga_miskin', "DROP TABLE IF EXISTS keluarga_miskin");
+$results[] = run($conn, 'DROP TABLE users', "DROP TABLE IF EXISTS users");
+$results[] = run($conn, 'DROP TABLE rumah_ibadah', "DROP TABLE IF EXISTS rumah_ibadah");
+$results[] = run($conn, 'DROP TABLE rate_limit', "DROP TABLE IF EXISTS rate_limit");
+
+// ── CREATE TABLE: rumah_ibadah ────────────────────────────────
+$results[] = run($conn, 'CREATE TABLE rumah_ibadah', "
+ CREATE TABLE rumah_ibadah (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ nama VARCHAR(200) NOT NULL,
+ jenis ENUM('Masjid','Gereja','Pura','Vihara','Klenteng','Lainnya') NOT NULL,
+ alamat TEXT NOT NULL,
+ lat DECIMAL(10,7) NOT NULL,
+ lng DECIMAL(10,7) NOT NULL,
+ radius_km FLOAT NOT NULL DEFAULT 2.0,
+ kode_pengurus VARCHAR(20) NULL UNIQUE,
+ password_pengurus VARCHAR(255) NULL,
+ kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur','Pontianak Barat','Pontianak Tenggara','Pontianak Kota') NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+");
+
+// ── CREATE TABLE: users ───────────────────────────────────────
+$results[] = run($conn, 'CREATE TABLE users', "
+ CREATE TABLE users (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ nama VARCHAR(150) NOT NULL,
+ username VARCHAR(100) NOT NULL UNIQUE,
+ password VARCHAR(255) NOT NULL,
+ role ENUM('admin','pengurus','walikota') NOT NULL DEFAULT 'pengurus',
+ rumah_ibadah_id INT DEFAULT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+");
+
+// ── CREATE TABLE: keluarga_miskin ─────────────────────────────
+$results[] = run($conn, 'CREATE TABLE keluarga_miskin', "
+ CREATE TABLE keluarga_miskin (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ nik VARCHAR(20) NOT NULL UNIQUE,
+ nama_kepala_keluarga VARCHAR(200) NOT NULL,
+ tanggal_lahir DATE NULL,
+ pendidikan ENUM('Tidak Sekolah','SD','SMP','SMA','D3','S1','S2/S3') NOT NULL DEFAULT 'Tidak Sekolah',
+ jumlah_anggota INT NOT NULL DEFAULT 1,
+ alamat TEXT NOT NULL,
+ kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur','Pontianak Barat','Pontianak Tenggara','Pontianak Kota') NOT NULL,
+ 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,
+ rumah_ibadah_id INT DEFAULT NULL,
+ jarak_ke_ibadah FLOAT DEFAULT NULL,
+ 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
+");
+
+// ── CREATE TABLE: laporan_masyarakat ──────────────────────────
+$results[] = run($conn, 'CREATE TABLE laporan_masyarakat', "
+ CREATE TABLE laporan_masyarakat (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ nama_terlapor VARCHAR(150) NULL,
+ nik_terlapor VARCHAR(16) NULL,
+ nama_pelapor VARCHAR(150) NULL,
+ no_hp VARCHAR(20) NULL,
+ alamat_terlapor TEXT NOT NULL,
+ lat DECIMAL(10,7) NOT NULL,
+ lng DECIMAL(10,7) NOT NULL,
+ deskripsi TEXT NOT NULL,
+ foto VARCHAR(255) NULL,
+ status ENUM('Baru','Diverifikasi','Ditolak') NOT NULL DEFAULT 'Baru',
+ alasan_tolak TEXT NULL,
+ ditangani_oleh INT NULL,
+ converted_to_kk_id INT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ 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
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+");
+
+// ── CREATE TABLE: histori_bantuan ─────────────────────────────
+$results[] = run($conn, 'CREATE TABLE histori_bantuan', "
+ CREATE TABLE histori_bantuan (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ kk_id INT NOT NULL,
+ jenis_bantuan ENUM('PKH','BPNT/Sembako','Beras Bansos','KIS-PBI','Bansos Tunai Pemkot','Rutilahu','PMT Stunting','CSR Swasta','Lainnya') NOT NULL,
+ nominal BIGINT NOT NULL DEFAULT 0,
+ keterangan TEXT NULL,
+ tanggal_penyaluran DATE NOT NULL,
+ sumber_dana ENUM('APBN','APBD','CSR','Lainnya') NOT NULL DEFAULT 'APBD',
+ penanggung_jawab INT NOT NULL,
+ 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
+");
+
+// ── CREATE TABLE: rate_limit ──────────────────────────────────
+$results[] = run($conn, 'CREATE TABLE rate_limit', "
+ CREATE TABLE rate_limit (
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ ip_address VARCHAR(45) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ INDEX idx_ip_time (ip_address, created_at)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+");
+
+// ── SEED: rumah_ibadah ────────────────────────────────────────
+$results[] = run($conn, 'SEED rumah_ibadah (2 data)', "
+ INSERT INTO rumah_ibadah (nama,jenis,alamat,lat,lng,radius_km,kode_pengurus,password_pengurus,kecamatan) VALUES
+ ('Masjid Raya Mujahidin','Masjid','Jl. Ahmad Yani No. 1, Pontianak Tenggara',
+ -0.0263330,109.3425200,2.5,'RI-MSJ-4821',
+ '\$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',
+ '\$2y\$10\$EQKGMwtGqPsn3kxOGkUf3eh3cnXOCEYqVNfCKDVk.Q7WYTCKvi5iG',
+ 'Pontianak Kota')
+");
+
+// ── SEED: users (admin + walikota) ────────────────────────────
+$results[] = run($conn, 'SEED users (admin, walikota)', "
+ INSERT INTO users (nama,username,password,role,rumah_ibadah_id) VALUES
+ ('Administrator Sistem','admin',
+ '\$2y\$10\$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi',
+ 'admin',NULL),
+ ('Walikota Pontianak','walikota',
+ '\$2y\$10\$AIO3pPEflVaouN/G.rvgWeZmSjr0Nnjsd2PTna4lSHEoDTWr9KQpi',
+ 'walikota',NULL)
+");
+
+// ── SEED: keluarga_miskin (5 data) ────────────────────────────
+$results[] = run($conn, 'SEED keluarga_miskin (5 data)', "
+ 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
+ ('6171010101010001','Budi Santoso','1978-03-15','SD',4,'Gg. Mawar No. 3, Benua Melayu Darat','Pontianak Tenggara',-0.0283000,109.3440000,'Sangat Miskin','Terdaftar DTKS','[\"Stunting\",\"Gizi Buruk\"]',1,0.2500),
+ ('6171010101010002','Siti Rahayu','1985-07-22','SMP',6,'Jl. Merdeka Gg. 5 No. 7, Mariana','Pontianak Kota',-0.0370000,109.3430000,'Miskin','Terdaftar DTKS','[\"TBC\",\"Hipertensi\"]',2,0.1200),
+ ('6171010101010003','Wayan Dharma','1972-11-08','Tidak Sekolah',3,'Gg. Bali No. 2, Bansir Laut','Pontianak Tenggara',-0.0290000,109.3410000,'Sangat Miskin','Belum DTKS','[\"Diabetes\",\"Hipertensi\",\"ODGJ\"]',1,0.3400),
+ ('6171010101010004','Ahmad Fauzan','1990-01-30','SMA',5,'Jl. Tanjungpura Gg. 12, Parit Tokaya','Pontianak Selatan',-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)
+");
+
+// ── SEED: laporan_masyarakat ──────────────────────────────────
+$results[] = run($conn, 'SEED laporan_masyarakat (1 data)', "
+ INSERT INTO laporan_masyarakat (nama_pelapor,no_hp,alamat_terlapor,lat,lng,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')
+");
+
+// ── SEED: histori_bantuan ─────────────────────────────────────
+$results[] = run($conn, 'SEED histori_bantuan (2 data)', "
+ INSERT INTO histori_bantuan (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)
+");
+
+$conn->close();
+
+$allOk = !in_array('ERROR', array_column($results, 'status'));
+?>
+
+
+
+
+Migration — Web GIS Rumah Ibadah
+
+
+
+🕌 Migration — Web GIS Rumah Ibadah
+Membuat tabel dan seed data di database default
+
+
+
+
= $r['status'] ?>
+
+ = htmlspecialchars($r['label']) ?>
+
⚠ = htmlspecialchars($r['msg']) ?>
+
+
+
+
+
+
+
✅ Migrasi Berhasil!
+
Semua tabel dan data seed berhasil dibuat.
+
Buka Aplikasi →
+
+
❌ Ada Error
+
Periksa pesan error di atas dan coba lagi.
+
+
+
+
+
+
🔑 Akun Demo
+
+ | Role | Username | Password |
+ | Admin | admin | admin123 |
+ | Walikota | walikota | admin123 |
+ | Pengurus Masjid | RI-MSJ-4821 | pengurus123 |
+ | Pengurus Gereja | RI-GRJ-7153 | pengurus123 |
+
+
+
+ ⚠️ PENTING: Segera hapus file migrate.php setelah migrasi berhasil untuk keamanan sistem!
+
+
+
+