connect_error) { die("Connection failed: " . $conn->connect_error); } echo "=== WebGIS Poverty Mapping - Database Setup ===

"; // ========== 1. CREATE DATABASE ========== $sql_db = "CREATE DATABASE IF NOT EXISTS webgis_unified CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"; if ($conn->query($sql_db) === TRUE) { echo "✓ Database 'webgis_unified' ready
"; } else { die("✗ Error creating database: " . $conn->error . "
"); } $conn->select_db("webgis_unified"); // ========== 2. CREATE MAIN DATA TABLE ========== $sql_table = "CREATE TABLE IF NOT EXISTS data_unified ( id INT AUTO_INCREMENT PRIMARY KEY, tipe ENUM('point','worship','poor_house','jalan','parsil') NOT NULL DEFAULT 'point', -- Atribut Umum nama VARCHAR(200) NULL, jenis VARCHAR(100) NULL, alamat VARCHAR(255) NULL, kontak VARCHAR(100) NULL, no_wa VARCHAR(50) NULL, status VARCHAR(50) NOT NULL DEFAULT 'aktif', -- Atribut Rumah Ibadah kegiatan VARCHAR(255) NULL, kapasitas INT NULL, radius_meter INT NULL, -- Atribut Rumah Miskin nama_kepala_keluarga VARCHAR(200) NULL, jumlah_anggota INT NULL, kondisi_rumah VARCHAR(100) NULL, sumber_penghasilan VARCHAR(255) NULL, kebutuhan_prioritas VARCHAR(255) NULL, status_bantuan VARCHAR(100) NULL, -- Koordinat Geografis latitude DOUBLE NULL, longitude DOUBLE NULL, -- Untuk Jalan & Parsil panjang DECIMAL(10,2) NULL, luas DECIMAL(10,2) NULL, geom LONGTEXT NULL, -- Audit Trail created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, created_by VARCHAR(50) NULL, updated_by VARCHAR(50) NULL, -- Indexes KEY idx_tipe (tipe), KEY idx_status (status), KEY idx_created_at (created_at), KEY idx_koordinat (latitude, longitude), FULLTEXT KEY ft_nama (nama), FULLTEXT KEY ft_alamat (alamat) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_table) === TRUE) { echo "✓ Table 'data_unified' created
"; } else { echo "✗ Error creating table: " . $conn->error . "
"; } // ========== 3. CREATE AUDIT LOG TABLE ========== $sql_audit = "CREATE TABLE IF NOT EXISTS audit_log ( id INT AUTO_INCREMENT PRIMARY KEY, table_name VARCHAR(100) NOT NULL, record_id INT NOT NULL, action ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL, old_values JSON NULL, new_values JSON NULL, user_name VARCHAR(50) NULL, changed_at DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_table (table_name), KEY idx_record (record_id), KEY idx_action (action), KEY idx_changed_at (changed_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_audit) === TRUE) { echo "✓ Table 'audit_log' created
"; } else { echo "✗ Error creating audit_log: " . $conn->error . "
"; } // ========== 3.1 CREATE ACTIVITY LOG TABLE (for API logging) ========== $sql_activity = "CREATE TABLE IF NOT EXISTS activity_log ( id INT AUTO_INCREMENT PRIMARY KEY, action VARCHAR(50) NOT NULL, details JSON NULL, user_name VARCHAR(50) NULL, ip_address VARCHAR(45) NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_action (action), KEY idx_user (user_name), KEY idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_activity) === TRUE) { echo "✓ Table 'activity_log' created
"; } else { echo "✗ Error creating activity_log: " . $conn->error . "
"; } // ========== 4. CREATE REFERENCE TABLES ========== // House Condition Reference $sql_kondisi = "CREATE TABLE IF NOT EXISTS ref_kondisi_rumah ( id INT PRIMARY KEY, kode VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, deskripsi TEXT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_kondisi) === TRUE) { echo "✓ Table 'ref_kondisi_rumah' created
"; // Insert reference data $insert_kondisi = "INSERT IGNORE INTO ref_kondisi_rumah (id, kode, nama, deskripsi) VALUES (1, 'SANGAT_BURUK', 'Sangat Buruk', 'Rumah dalam kondisi sangat buruk/rawan roboh'), (2, 'BURUK', 'Buruk', 'Rumah banyak kerusakan'), (3, 'SEDANG', 'Sedang', 'Rumah dengan kerusakan ringan'), (4, 'BAIK', 'Baik', 'Rumah dalam kondisi baik')"; $conn->query($insert_kondisi); } // Assistance Status Reference $sql_bantuan = "CREATE TABLE IF NOT EXISTS ref_status_bantuan ( id INT PRIMARY KEY, kode VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, deskripsi TEXT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_bantuan) === TRUE) { echo "✓ Table 'ref_status_bantuan' created
"; // Insert reference data $insert_bantuan = "INSERT IGNORE INTO ref_status_bantuan (id, kode, nama, deskripsi) VALUES (1, 'BELUM', 'Belum Menerima', 'Belum menerima bantuan apapun'), (2, 'PENERIMA_PKH', 'Penerima PKH', 'Penerima Program Keluarga Harapan'), (3, 'PENERIMA_BLT', 'Penerima BLT', 'Penerima Bantuan Langsung Tunai'), (4, 'PENERIMA_BANTSOS', 'Penerima Bantuan Sosial', 'Penerima bantuan sosial lainnya')"; $conn->query($insert_bantuan); } // Income Source Reference $sql_penghasilan = "CREATE TABLE IF NOT EXISTS ref_sumber_penghasilan ( id INT PRIMARY KEY, kode VARCHAR(20) NOT NULL UNIQUE, nama VARCHAR(100) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_penghasilan) === TRUE) { echo "✓ Table 'ref_sumber_penghasilan' created
"; // Insert reference data $insert_penghasilan = "INSERT IGNORE INTO ref_sumber_penghasilan (id, kode, nama) VALUES (1, 'PETANI', 'Petani'), (2, 'BURUH', 'Buruh'), (3, 'PEDAGANG', 'Pedagang'), (4, 'PNS', 'PNS'), (5, 'SWASTA', 'Pegawai Swasta'), (6, 'USAHA_KECIL', 'Usaha Kecil'), (7, 'PENSIUN', 'Pensiun'), (8, 'TIDAK_BEKERJA', 'Tidak Bekerja')"; $conn->query($insert_penghasilan); } // ========== 5. CREATE STATISTICS TABLE ========== $sql_stats = "CREATE TABLE IF NOT EXISTS data_statistics ( id INT AUTO_INCREMENT PRIMARY KEY, stat_date DATE NOT NULL UNIQUE, total_records INT DEFAULT 0, total_worship INT DEFAULT 0, total_poor_house INT DEFAULT 0, total_points INT DEFAULT 0, total_roads INT DEFAULT 0, total_parcels INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_stat_date (stat_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_stats) === TRUE) { echo "✓ Table 'data_statistics' created
"; } // ========== 6. CREATE ADMIN USER TABLE ========== $sql_users = "CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, full_name VARCHAR(100) NOT NULL, email VARCHAR(100) NULL, role ENUM('admin', 'user', 'viewer') DEFAULT 'user', is_active TINYINT DEFAULT 1, last_login DATETIME NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_username (username), KEY idx_role (role) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"; if ($conn->query($sql_users) === TRUE) { echo "✓ Table 'users' created
"; } // ========== 7. CREATE TRIGGERS (For Audit Trail) ========== // Trigger for INSERT $trigger_insert = "CREATE TRIGGER IF NOT EXISTS trg_data_unified_insert AFTER INSERT ON data_unified FOR EACH ROW BEGIN INSERT INTO audit_log (table_name, record_id, action, new_values, user_name, changed_at) VALUES ('data_unified', NEW.id, 'INSERT', JSON_OBJECT('tipe', NEW.tipe, 'nama', NEW.nama, 'alamat', NEW.alamat), IFNULL(NEW.created_by, 'system'), NOW()); END"; if ($conn->query($trigger_insert) === TRUE) { echo "✓ Trigger 'trg_data_unified_insert' created
"; } else { echo " Trigger insert: " . $conn->error . "
"; } // Trigger for UPDATE $trigger_update = "CREATE TRIGGER IF NOT EXISTS trg_data_unified_update AFTER UPDATE ON data_unified FOR EACH ROW BEGIN INSERT INTO audit_log (table_name, record_id, action, old_values, new_values, user_name, changed_at) VALUES ('data_unified', NEW.id, 'UPDATE', JSON_OBJECT('nama', OLD.nama, 'alamat', OLD.alamat, 'status', OLD.status), JSON_OBJECT('nama', NEW.nama, 'alamat', NEW.alamat, 'status', NEW.status), IFNULL(NEW.updated_by, 'system'), NOW()); END"; if ($conn->query($trigger_update) === TRUE) { echo "✓ Trigger 'trg_data_unified_update' created
"; } else { echo " Trigger update: " . $conn->error . "
"; } // Trigger for DELETE $trigger_delete = "CREATE TRIGGER IF NOT EXISTS trg_data_unified_delete BEFORE DELETE ON data_unified FOR EACH ROW BEGIN INSERT INTO audit_log (table_name, record_id, action, old_values, changed_at) VALUES ('data_unified', OLD.id, 'DELETE', JSON_OBJECT('tipe', OLD.tipe, 'nama', OLD.nama, 'alamat', OLD.alamat), NOW()); END"; if ($conn->query($trigger_delete) === TRUE) { echo "✓ Trigger 'trg_data_unified_delete' created
"; } else { echo " Trigger delete: " . $conn->error . "
"; } // ========== 8. CREATE VIEWS ========== $view_summary = "CREATE OR REPLACE VIEW v_data_summary AS SELECT tipe, COUNT(*) as count, status FROM data_unified GROUP BY tipe, status"; if ($conn->query($view_summary) === TRUE) { echo "✓ View 'v_data_summary' created
"; } $view_poor_analysis = "CREATE OR REPLACE VIEW v_poor_house_analysis AS SELECT nama_kepala_keluarga, alamat, kondisi_rumah, jumlah_anggota, kebutuhan_prioritas, status_bantuan, latitude, longitude FROM data_unified WHERE tipe = 'poor_house' AND status = 'aktif' ORDER BY jumlah_anggota DESC"; if ($conn->query($view_poor_analysis) === TRUE) { echo "✓ View 'v_poor_house_analysis' created
"; } // ========== COMPLETION MESSAGE ========== echo "
=== Setup Selesai ===" . date('Y-m-d H:i:s') . "
"; echo "Database: webgis_unified
"; echo "Tables: 9 (data_unified, audit_log, ref_kondisi_rumah, ref_status_bantuan, ref_sumber_penghasilan, data_statistics, users, + 2 views)
"; echo "Triggers: 3 (INSERT, UPDATE, DELETE)
"; echo "Ready for production use!
"; $conn->close(); ?>