Files
UAS_WEBGIS_CindyDyraIslamay…/03PovertyMapping/database/structure.sql
T

327 lines
15 KiB
SQL

-- ============================================================
-- structure.sql — Full Schema for poverty_mapping
-- Database: poverty_mapping
-- Charset: utf8mb4 / utf8mb4_unicode_ci
-- Generated by: DB Reconstruction from source code analysis
-- ============================================================
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+07:00";
-- ============================================================
-- CREATE DATABASE
-- ============================================================
CREATE DATABASE IF NOT EXISTS `poverty_mapping`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE `poverty_mapping`;
-- ============================================================
-- TABLE 1: users
-- Source: api/auth/check.php — SELECT id, name, email,
-- password_hash, role, is_active, last_login_at
-- ============================================================
CREATE TABLE IF NOT EXISTS `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(150) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`password_hash` VARCHAR(255) NOT NULL,
`role` ENUM('admin','field_officer','viewer') NOT NULL DEFAULT 'viewer',
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`last_login_at` TIMESTAMP NULL DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_users_email` (`email`),
KEY `idx_users_role` (`role`),
KEY `idx_users_is_active` (`is_active`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 2: religious_centers
-- Source: api/centers/index.php — worship_type, address,
-- kelurahan, kecamatan, latitude, longitude, radius,
-- contact_person, contact_phone, notes, is_active
-- ============================================================
CREATE TABLE IF NOT EXISTS `religious_centers` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`worship_type` ENUM('masjid','gereja','klenteng','pura','vihara') NOT NULL DEFAULT 'masjid',
`address` TEXT NOT NULL,
`kelurahan` VARCHAR(100) NULL DEFAULT NULL,
`kecamatan` VARCHAR(100) NULL DEFAULT NULL,
`latitude` DECIMAL(10,7) NOT NULL,
`longitude` DECIMAL(10,7) NOT NULL,
`radius` INT UNSIGNED NOT NULL DEFAULT 300 COMMENT 'Coverage radius in meters',
`contact_person` VARCHAR(150) NULL DEFAULT NULL,
`contact_phone` VARCHAR(20) NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_rc_worship_type` (`worship_type`),
KEY `idx_rc_is_active` (`is_active`),
KEY `idx_rc_location` (`latitude`, `longitude`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 3: households
-- Source: api/houses/index.php — the main data table.
-- Columns verified from INSERT, UPDATE, SELECT queries.
-- ============================================================
CREATE TABLE IF NOT EXISTS `households` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
-- Location (administrative)
`rt` VARCHAR(10) NULL DEFAULT NULL,
`rw` VARCHAR(10) NULL DEFAULT NULL,
`kelurahan` VARCHAR(100) NULL DEFAULT NULL,
`kecamatan` VARCHAR(100) NULL DEFAULT NULL,
`full_address` TEXT NOT NULL,
-- Spatial coordinates
`latitude` DECIMAL(10,7) NOT NULL,
`longitude` DECIMAL(10,7) NOT NULL,
-- House characteristics
`house_condition` ENUM('layak','tidak_layak') NOT NULL DEFAULT 'layak',
`land_ownership` ENUM('milik','sewa','numpang','lainnya') NOT NULL DEFAULT 'milik',
`house_photos` JSON NULL DEFAULT NULL COMMENT 'JSON array of photo filenames',
-- Household head info
`head_name` VARCHAR(150) NOT NULL,
`head_nik` VARCHAR(16) NULL DEFAULT NULL,
`head_gender` ENUM('male','female') NOT NULL DEFAULT 'male',
`head_date_of_birth` DATE NULL DEFAULT NULL,
`head_education` ENUM('tidak_sekolah','sd','smp','sma','diploma','sarjana','pascasarjana') NOT NULL DEFAULT 'sd',
`head_employment_status` VARCHAR(50) NOT NULL DEFAULT 'unemployed',
`head_job_name` VARCHAR(150) NULL DEFAULT NULL,
`head_institution_name` VARCHAR(200) NULL DEFAULT NULL,
`head_monthly_income` INT UNSIGNED NOT NULL DEFAULT 0,
-- Poverty assessment
`poverty_score` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-100 poverty score',
`poverty_status` ENUM('terdata','rentan_miskin','miskin','sangat_miskin') NOT NULL DEFAULT 'terdata',
-- Aid tracking
`aid_status` ENUM('not_yet','received') NOT NULL DEFAULT 'not_yet',
-- Relations
`managing_center_id` INT UNSIGNED NULL DEFAULT NULL,
-- Meta
`notes` TEXT NULL DEFAULT NULL,
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_hh_poverty_status` (`poverty_status`),
KEY `idx_hh_aid_status` (`aid_status`),
KEY `idx_hh_house_condition` (`house_condition`),
KEY `idx_hh_managing_center` (`managing_center_id`),
KEY `idx_hh_is_active` (`is_active`),
KEY `idx_hh_location` (`latitude`, `longitude`),
KEY `idx_hh_head_nik` (`head_nik`),
KEY `idx_hh_created_at` (`created_at`),
CONSTRAINT `fk_hh_managing_center`
FOREIGN KEY (`managing_center_id`)
REFERENCES `religious_centers` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 4: household_members
-- Source: api/houses/index.php — saveMembers() function &
-- SELECT * FROM household_members in SHOW action.
-- Stats: SELECT COUNT(*) FROM household_members
-- ============================================================
CREATE TABLE IF NOT EXISTS `household_members` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`household_id` INT UNSIGNED NOT NULL,
`name` VARCHAR(150) NOT NULL,
`nik` VARCHAR(16) NULL DEFAULT NULL,
`gender` ENUM('male','female') NOT NULL DEFAULT 'male',
`date_of_birth` DATE NULL DEFAULT NULL,
`education` ENUM('tidak_sekolah','sd','smp','sma','diploma','sarjana','pascasarjana') NOT NULL DEFAULT 'sd',
`relationship` VARCHAR(50) NOT NULL DEFAULT 'lainnya'
COMMENT 'e.g. suami,istri,anak,orang_tua,lainnya',
`employment_status` VARCHAR(50) NOT NULL DEFAULT 'unemployed',
`job_name` VARCHAR(150) NULL DEFAULT NULL,
`institution_name` VARCHAR(200) NULL DEFAULT NULL,
`monthly_income` INT UNSIGNED NOT NULL DEFAULT 0,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_hm_household_id` (`household_id`),
KEY `idx_hm_nik` (`nik`),
CONSTRAINT `fk_hm_household`
FOREIGN KEY (`household_id`)
REFERENCES `households` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 5: aid_history
-- Source: api/aid/index.php — INSERT/UPDATE/SELECT queries.
-- Columns: household_id, center_id, aid_type, aid_date,
-- amount, description, given_by
-- ============================================================
CREATE TABLE IF NOT EXISTS `aid_history` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`household_id` INT UNSIGNED NOT NULL,
`center_id` INT UNSIGNED NULL DEFAULT NULL,
`aid_type` ENUM(
'sembako',
'pendanaan',
'pelatihan',
'sembako_pendanaan',
'sembako_pelatihan',
'pendanaan_pelatihan',
'lengkap'
) NOT NULL,
`aid_date` DATE NOT NULL,
`amount` INT UNSIGNED NULL DEFAULT NULL COMMENT 'Monetary value in IDR (optional)',
`description` TEXT NULL DEFAULT NULL COMMENT 'Notes / keterangan bantuan',
`given_by` INT UNSIGNED NULL DEFAULT NULL COMMENT 'FK to users.id (who recorded the aid)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_ah_household_id` (`household_id`),
KEY `idx_ah_center_id` (`center_id`),
KEY `idx_ah_aid_date` (`aid_date`),
KEY `idx_ah_aid_type` (`aid_type`),
CONSTRAINT `fk_ah_household`
FOREIGN KEY (`household_id`)
REFERENCES `households` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_ah_center`
FOREIGN KEY (`center_id`)
REFERENCES `religious_centers` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT `fk_ah_given_by`
FOREIGN KEY (`given_by`)
REFERENCES `users` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 6: emergency_reports
-- Source: api/reports/index.php — INSERT, UPDATE, SELECT.
-- Columns: household_id, type, severity, description,
-- status, resolved_at
-- ============================================================
CREATE TABLE IF NOT EXISTS `emergency_reports` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`household_id` INT UNSIGNED NOT NULL,
`type` ENUM('sakit','kecelakaan','bencana','kehilangan_pekerjaan','kematian','lainnya') NOT NULL,
`severity` ENUM('ringan','sedang','berat','kritis') NOT NULL DEFAULT 'ringan',
`description` TEXT NOT NULL,
`status` ENUM('open','in_progress','resolved','closed') NOT NULL DEFAULT 'open',
`resolved_at` TIMESTAMP NULL DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_er_household_id` (`household_id`),
KEY `idx_er_status` (`status`),
KEY `idx_er_severity` (`severity`),
KEY `idx_er_created_at` (`created_at`),
CONSTRAINT `fk_er_household`
FOREIGN KEY (`household_id`)
REFERENCES `households` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 7: public_reports
-- Source: api/public/report.php — INSERT, SELECT, UPDATE.
-- Columns: reporter_name, reporter_phone, rt, rw,
-- head_name, address, kelurahan, kecamatan,
-- latitude, longitude, description, severity,
-- urgent_need, status, proof_photos,
-- ip_address, converted_household_id,
-- admin_notes, reviewed_at
-- ============================================================
CREATE TABLE IF NOT EXISTS `public_reports` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`reporter_name` VARCHAR(150) NOT NULL,
`reporter_phone` VARCHAR(20) NOT NULL,
`rt` VARCHAR(10) NOT NULL DEFAULT '',
`rw` VARCHAR(10) NOT NULL DEFAULT '',
`head_name` VARCHAR(150) NOT NULL,
`address` TEXT NOT NULL,
`kelurahan` VARCHAR(100) NOT NULL,
`kecamatan` VARCHAR(100) NOT NULL,
`latitude` DECIMAL(10,7) NOT NULL,
`longitude` DECIMAL(10,7) NOT NULL,
`description` TEXT NOT NULL,
`severity` ENUM('ringan','sedang','berat','kritis') NOT NULL DEFAULT 'ringan',
`urgent_need` TEXT NULL DEFAULT NULL,
`proof_photos` JSON NULL DEFAULT NULL COMMENT 'JSON array of photo filenames',
`status` ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending',
`admin_notes` TEXT NULL DEFAULT NULL,
`reviewed_at` TIMESTAMP NULL DEFAULT NULL,
`converted_household_id` INT UNSIGNED NULL DEFAULT NULL
COMMENT 'Set when admin approves and creates household',
`ip_address` VARCHAR(45) NOT NULL DEFAULT '' COMMENT 'Supports IPv6',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_pr_status` (`status`),
KEY `idx_pr_severity` (`severity`),
KEY `idx_pr_ip_address` (`ip_address`),
KEY `idx_pr_created_at` (`created_at`),
KEY `idx_pr_converted` (`converted_household_id`),
CONSTRAINT `fk_pr_converted_household`
FOREIGN KEY (`converted_household_id`)
REFERENCES `households` (`id`)
ON DELETE SET NULL
ON UPDATE CASCADE
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- TABLE 8: audit_logs
-- Source: models/AuditLog.php — INSERT INTO audit_logs
-- (action, table_name, record_id, old_values,
-- new_values, ip_address, user_agent)
-- ============================================================
CREATE TABLE IF NOT EXISTS `audit_logs` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`action` VARCHAR(100) NOT NULL COMMENT 'e.g. auth.login, Tambah Rumah, Update Bantuan',
`table_name` VARCHAR(100) NOT NULL,
`record_id` INT UNSIGNED NULL DEFAULT NULL,
`old_values` JSON NULL DEFAULT NULL,
`new_values` JSON NULL DEFAULT NULL,
`ip_address` VARCHAR(45) NOT NULL DEFAULT '',
`user_agent` TEXT NULL DEFAULT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_al_table_name` (`table_name`),
KEY `idx_al_record_id` (`record_id`),
KEY `idx_al_action` (`action`),
KEY `idx_al_created_at` (`created_at`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;