Files
UAS_WEBGIS_AlifaAisyahRahma…/Web GIS Rumah Ibadah/migrate.php
T

274 lines
15 KiB
PHP

<?php
// ============================================================
// MIGRATION SCRIPT — Web GIS Rumah Ibadah
// Akses sekali via browser untuk membuat semua tabel + seed data
// Hapus file ini setelah migrasi berhasil!
// ============================================================
// Koneksi langsung (tidak pakai config.php agar tidak ada konflik header)
$host = getenv('DB_HOST') ?: 'vg4so4ccs0444o4cgkssgos8';
$port = getenv('DB_PORT') ?: 3306;
$db = getenv('DB_NAME') ?: 'default';
$user = getenv('DB_USER') ?: 'mysql';
$pass = getenv('DB_PASS') ?: 'tg9lvPlr4hgUhgtT7aPq9XelkCEvvMGtsoV8eB4dD5FAkz891PwkJT340xmaEWxL';
$conn = new mysqli($host, $user, $pass, $db, (int)$port);
if ($conn->connect_error) {
die('<h2 style="color:red">Koneksi gagal: ' . $conn->connect_error . '</h2>');
}
$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'));
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Migration — Web GIS Rumah Ibadah</title>
<style>
body { font-family:'Segoe UI',sans-serif; background:#0d1117; color:#e6edf3; padding:40px; max-width:750px; margin:auto; }
h1 { color:#a855f7; margin-bottom:6px; }
p.sub { color:#8b949e; margin-bottom:28px; }
.card { background:#161b22; border:1px solid #30363d; border-radius:10px; padding:16px 20px; margin-bottom:10px; display:flex; align-items:flex-start; gap:16px; }
.badge { padding:3px 12px; border-radius:20px; font-size:.78rem; font-weight:700; white-space:nowrap; margin-top:2px; }
.ok { background:rgba(63,185,80,.15); color:#3fb950; border:1px solid rgba(63,185,80,.4); }
.err { background:rgba(248,81,73,.15); color:#f85149; border:1px solid rgba(248,81,73,.4); }
.label { flex:1; font-size:.88rem; }
.msg { font-size:.74rem; color:#f85149; margin-top:5px; font-family:monospace; }
.result-box { margin-top:28px; padding:24px; border-radius:12px; text-align:center; }
.result-ok { background:rgba(63,185,80,.08); border:1px solid rgba(63,185,80,.3); }
.result-err { background:rgba(248,81,73,.08); border:1px solid rgba(248,81,73,.3); }
.result-ok h2 { color:#3fb950; } .result-err h2 { color:#f85149; }
.btn { display:inline-block; margin-top:16px; padding:10px 28px; background:#a855f7; color:#fff; border-radius:8px; text-decoration:none; font-weight:600; }
.warn { background:rgba(210,153,34,.1); border:1px solid rgba(210,153,34,.3); color:#d29922; border-radius:8px; padding:14px 18px; margin-top:16px; font-size:.84rem; line-height:1.6; }
.accounts { background:#161b22; border:1px solid #30363d; border-radius:10px; padding:18px 20px; margin-top:20px; }
.accounts h3 { color:#58a6ff; margin:0 0 12px; font-size:.9rem; }
table { width:100%; font-size:.82rem; border-collapse:collapse; }
td,th { padding:6px 10px; border-bottom:1px solid #21262d; text-align:left; }
th { color:#8b949e; font-weight:600; }
code { background:#21262d; padding:2px 7px; border-radius:4px; font-size:.78rem; color:#79c0ff; }
</style>
</head>
<body>
<h1>🕌 Migration — Web GIS Rumah Ibadah</h1>
<p class="sub">Membuat tabel dan seed data di database <code>default</code></p>
<?php foreach ($results as $r): ?>
<div class="card">
<span class="badge <?= $r['status']==='OK'?'ok':'err' ?>"><?= $r['status'] ?></span>
<div class="label">
<?= htmlspecialchars($r['label']) ?>
<?php if($r['msg']): ?><div class="msg">⚠ <?= htmlspecialchars($r['msg']) ?></div><?php endif; ?>
</div>
</div>
<?php endforeach; ?>
<div class="result-box <?= $allOk?'result-ok':'result-err' ?>">
<?php if($allOk): ?>
<h2>✅ Migrasi Berhasil!</h2>
<p>Semua tabel dan data seed berhasil dibuat.</p>
<a href="index.html" class="btn">Buka Aplikasi →</a>
<?php else: ?>
<h2>❌ Ada Error</h2>
<p>Periksa pesan error di atas dan coba lagi.</p>
<?php endif; ?>
</div>
<?php if($allOk): ?>
<div class="accounts">
<h3>🔑 Akun Demo</h3>
<table>
<tr><th>Role</th><th>Username</th><th>Password</th></tr>
<tr><td>Admin</td><td><code>admin</code></td><td><code>admin123</code></td></tr>
<tr><td>Walikota</td><td><code>walikota</code></td><td><code>admin123</code></td></tr>
<tr><td>Pengurus Masjid</td><td><code>RI-MSJ-4821</code></td><td><code>pengurus123</code></td></tr>
<tr><td>Pengurus Gereja</td><td><code>RI-GRJ-7153</code></td><td><code>pengurus123</code></td></tr>
</table>
</div>
<div class="warn">
⚠️ <strong>PENTING:</strong> Segera hapus file <code>migrate.php</code> setelah migrasi berhasil untuk keamanan sistem!
</div>
<?php endif; ?>
</body>
</html>