# WebGIS Poverty Mapping Aplikasi utama Tugas Besar SIG untuk pemetaan warga miskin, rumah ibadah, kebutuhan bantuan, status bantuan, dan blank spot layanan berbasis Leaflet, PHP, dan MySQL/MariaDB. Status audit terakhir: 2026-06-03. Kode aktif sudah memakai validasi koordinat bersama, CSRF untuk mutasi terautentikasi, session cookie hardening, scope operator, masking data publik, verifikasi warga sebelum workflow bantuan/kebutuhan, dan kebijakan import admin langsung `Terverifikasi`. Catatan submit: project final ini sekarang dijalankan lewat Docker Compose dari root repository `webgis/`. Runtime utama memakai PHP 8.2 Apache dan MariaDB 11.4; database `db_webgis` otomatis dibuat dari `setup_database.sql` saat volume MariaDB masih kosong. SQL setup menggunakan syntax MariaDB-friendly seperti `ADD COLUMN IF NOT EXISTS`. ## Stack - PHP procedural dengan MySQLi - MySQL/MariaDB - Leaflet untuk peta interaktif - Chart.js untuk statistik - Vanilla JavaScript modules - Docker Compose sebagai runtime utama - XAMPP/Laragon/WAMP hanya sebagai opsi legacy lokal ## Struktur Utama ```text WebgisPovertyMapping/ ├── index.php # Shell peta utama ├── dashboard.php # Dashboard administrator ├── config.php # Konfigurasi app, session, dan database ├── koneksi.php # Koneksi DB + Haversine/proximity helper ├── setup_database.sql # Schema database dan seed admin ├── auth/ # Login, change password, session/RBAC helper ├── api/ # Endpoint JSON/CSV/HTML per domain ├── pages/ # Halaman admin/operator ├── modules/ # JavaScript map modules ├── css/ # CSS admin ├── tests/ # Test PHP ad-hoc └── docs/ # Dokumentasi audit, deployment, dan superpowers plans/specs ``` ## Setup Lokal Dengan Docker Jalankan dari root repository `webgis/`, bukan dari folder `WebgisPovertyMapping/`: ```bash cp .env.example .env docker compose -f docker-compose.yml -f docker-compose.local.yml up --build -d ``` Akses aplikasi: ```text http://localhost:8080/WebgisPovertyMapping/ ``` Tambahkan `APP_PORT=8081` di file `.env` root jika port `8080` sudah dipakai. Database akan otomatis diinisialisasi oleh container MariaDB dari `WebgisPovertyMapping/setup_database.sql`. Untuk reset database Docker dari awal: ```bash docker compose -f docker-compose.yml -f docker-compose.local.yml down -v docker compose -f docker-compose.yml -f docker-compose.local.yml up --build -d ``` XAMPP tidak lagi menjadi jalur utama. Dokumentasi XAMPP tetap ada sebagai referensi legacy di `docs/deployment-xampp.md`. ## Akun Default Default akun demo untuk penilaian: ```text Administrator: admin / password Operator : operator / password Viewer : viewer / password ``` Untuk demo penilaian, akun tersebut tidak dipaksa mengganti password saat login pertama. ## Role - `viewer`: akses publik/read-only, data sensitif penduduk dimasking. - `operator`: tambah/mengelola warga dan kebutuhan dalam rumah ibadah yang ditugaskan. - `administrator`: kelola semua data, rumah ibadah, pengguna, import/export, verifikasi, dan recalculation. Publik tanpa login tetap bisa membuka peta sebagai `viewer` read-only. Dashboard admin tidak menawarkan pembuatan akun `viewer` baru karena akses publik tidak membutuhkan akun; role tersebut dipertahankan sebagai fallback RBAC dan kompatibilitas akun lama. Operator harus dikaitkan ke satu `rumah_ibadah` melalui halaman manajemen user. Model ownership warga saat ini adalah `proximity-only`: `penduduk_miskin.ibadah_id` dihitung dari radius rumah ibadah terdekat dan menjadi dasar scope operator. Jika posisi/radius rumah ibadah berubah, admin dapat menjalankan hitung ulang proximity dan assignment warga bisa berubah mengikuti hasil spasial terbaru. ## Fitur Utama - Peta interaktif Pontianak berbasis Leaflet. - Layer rumah ibadah dengan radius layanan. - Layer penduduk miskin dengan proximity dan blank spot. - Status bantuan dan riwayat perubahan. - Kebutuhan bantuan per warga dan papan kebutuhan publik. - Dashboard statistik dan heatmap untuk operator/admin. - Import CSV dan export laporan. - RBAC berbasis session. - Proteksi data publik: hanya warga `Terverifikasi` yang tampil, PII dimasking, dan koordinat rumah warga tidak dikirim untuk pengunjung publik. - Workflow bantuan/kebutuhan hanya aktif untuk warga `Terverifikasi`. ## Dokumentasi Teknis - `docs/codebase-navigation.md`: navigasi struktur repo, schema, endpoint, modul frontend, proximity, dan RBAC. - `docs/codebase-audit-report.md`: laporan proses bisnis, wiring backend/frontend, data lifecycle, catatan logika, prioritas fix, dan saran pengembangan. - `docs/business-process-sop.md`: SOP proses bisnis aktif untuk admin, operator, publik, dan donatur. - `docs/deployment-docker.md`: panduan deployment Docker/Coolify, reverse proxy, database container, dan troubleshooting. - `docs/deployment-xampp.md`: referensi legacy jika harus menjalankan aplikasi tanpa Docker. - `docs/audit-fix-task-plan.md`: task plan audit/hardening lintas fase. - `docs/superpowers/README.md`: indeks dokumen superpowers aktif. - `docs/superpowers/plans/2026-06-03-codebase-audit-refresh.md`: ringkasan audit implementasi terbaru. - `Tugas/` dan `DESIGN.md` adalah artifact lama/pendukung; gunakan dokumen di atas sebagai referensi implementasi aktif. ## Catatan Audit 2026-06-03 Yang sudah terlihat terpasang di kode: - Validasi koordinat terpusat di `includes/validation.php` dan bounds wilayah studi di `config.php`. - Import CSV admin menyimpan warga sebagai `Terverifikasi` beserta `verified_by` dan `verified_at`. - Duplikasi NIK dicek terhadap semua record, termasuk arsip/inactive, agar validasi PHP sejalan dengan unique index database. - Endpoint kebutuhan dan status bantuan menolak warga yang belum `Terverifikasi`. - Statistik operator sudah scoped ke rumah ibadah operator. - Heatmap publik disembunyikan; heatmap menggunakan dataset internal untuk operator/admin. - User management mencegah self-demotion administrator dan operator ke rumah ibadah yang sudah dihapus. Sisa pekerjaan yang masih disarankan: - Rate limit session sederhana sudah aktif untuk form kontak donatur publik; pertimbangkan CAPTCHA atau rate limit IP untuk deploy publik serius. - Pertimbangkan model ownership `hybrid` jika tanggung jawab operasional operator harus dipisah dari hasil proximity spasial. - Perluas `tests/run_all.php` jika ingin mencakup semua test DB smoke test dalam satu runner. - Siapkan mirror lokal untuk CDN/tile provider bila deployment berada di jaringan tertutup. ## Test dan Verifikasi Dengan Docker Lint semua file PHP: ```bash docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'find /var/www/html/WebgisPovertyMapping -name "*.php" -print0 | xargs -0 -n1 php -l' ``` Test ad-hoc statis yang aman dijalankan dari root project: ```bash docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/run_all.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_verifikasi_binding.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_update_posisi_scope.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_operator_scope_endpoints.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_public_verification_filters.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_frontend_module_loader.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_frontend_reliability_guards.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_no_legacy_poi.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_viewer_public_filters.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_operator_scope_strict.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_penduduk_binding_types.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_csrf_enforcement.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_session_cookie_security.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_operator_ibadah_highlight.php docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app php /var/www/html/WebgisPovertyMapping/tests/test_viewer_account_ui_hidden.php ``` Test yang memuat `../config.php` atau `../koneksi.php` perlu dijalankan dari folder `tests`: ```bash docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_auth_helper.php' docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_db.php' docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_ibadah.php' docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_kebutuhan.php' docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_penduduk.php' docker compose -f ../docker-compose.yml -f ../docker-compose.local.yml exec app sh -lc 'cd /var/www/html/WebgisPovertyMapping/tests && php test_proximity.php' ``` Beberapa test membutuhkan container database yang sudah sehat. Jika menjalankan mode XAMPP legacy, sesuaikan command PHP dan port database mengikuti `docs/deployment-xampp.md`.