mengupdate database.sql

This commit is contained in:
2026-06-10 17:10:53 +07:00
parent a6543643a8
commit 073b9ac895
3 changed files with 502 additions and 342 deletions
+54 -11
View File
@@ -2,10 +2,6 @@
-- DATABASE: webgis_sig
-- Sistem Manajemen Data Jalan, Parsil Tanah & SPBU
-- ============================================================
CREATE DATABASE IF NOT EXISTS webgis_sig CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE webgis_sig;
-- ============================================================
-- TABEL: data_jalan (Line / Polyline)
-- Menyimpan data ruas jalan berdasarkan status jalan
@@ -51,7 +47,15 @@ CREATE TABLE IF NOT EXISTS data_parsil (
-- ============================================================
-- DATA CONTOH Jalan
-- ============================================================
INSERT INTO data_jalan (nama_jalan, status_jalan, panjang_m, geojson, keterangan) VALUES
INSERT INTO
data_jalan (
nama_jalan,
status_jalan,
panjang_m,
geojson,
keterangan
)
VALUES
(
'Jl. Sudirman',
'Jalan Nasional',
@@ -77,7 +81,16 @@ INSERT INTO data_jalan (nama_jalan, status_jalan, panjang_m, geojson, keterangan
-- ============================================================
-- DATA CONTOH Parsil Tanah
-- ============================================================
INSERT INTO data_parsil (nama_parsil, status_hak, luas_m2, geojson, pemilik, keterangan) VALUES
INSERT INTO
data_parsil (
nama_parsil,
status_hak,
luas_m2,
geojson,
pemilik,
keterangan
)
VALUES
(
'Parsil A-001',
'Sertifikat Hak Milik',
@@ -131,8 +144,38 @@ CREATE TABLE IF NOT EXISTS data_spbu (
-- ============================================================
-- DATA CONTOH SPBU di Pontianak
-- ============================================================
INSERT INTO data_spbu (nama_spbu, telepon, buka_24jam, lat, lng, geojson) VALUES
('SPBU Jl. Ahmad Yani', '0561-123456', 1, -0.0200, 109.3300, '{"type":"Point","coordinates":[109.3300,-0.0200]}'),
('SPBU Jl. Gajah Mada', '0561-654321', 0, -0.0350, 109.3200, '{"type":"Point","coordinates":[109.3200,-0.0350]}'),
('SPBU Jl. Tanjungpura', '0561-789012', 1, -0.0100, 109.3450, '{"type":"Point","coordinates":[109.3450,-0.0100]}'),
('SPBU Jl. Sutan Syahrir','0561-345678', 0, -0.0480, 109.3380, '{"type":"Point","coordinates":[109.3380,-0.0480]}');
INSERT INTO
data_spbu (nama_spbu, telepon, buka_24jam, lat, lng, geojson)
VALUES
(
'SPBU Jl. Ahmad Yani',
'0561-123456',
1,
-0.0200,
109.3300,
'{"type":"Point","coordinates":[109.3300,-0.0200]}'
),
(
'SPBU Jl. Gajah Mada',
'0561-654321',
0,
-0.0350,
109.3200,
'{"type":"Point","coordinates":[109.3200,-0.0350]}'
),
(
'SPBU Jl. Tanjungpura',
'0561-789012',
1,
-0.0100,
109.3450,
'{"type":"Point","coordinates":[109.3450,-0.0100]}'
),
(
'SPBU Jl. Sutan Syahrir',
'0561-345678',
0,
-0.0480,
109.3380,
'{"type":"Point","coordinates":[109.3380,-0.0480]}'
);
+25 -12
View File
@@ -6,6 +6,7 @@
// Konfigurasi database
define('DB_HOST', 'vg4so4ccs0444o4cgkssgos8');
define('DB_PORT', 3306);
define('DB_NAME', 'default');
define('DB_USER', 'mysql');
define('DB_PASS', 'tg9lvPlr4hgUhgtT7aPq9XelkCEvvMGtsoV8eB4dD5FAkz891PwkJT340xmaEWxL');
@@ -22,13 +23,14 @@ if (session_status() === PHP_SESSION_NONE) {
// ── Koneksi PDO ──────────────────────────────────────────────
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET,
"mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET,
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
]
);
} catch (PDOException $e) {
@@ -61,7 +63,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
* Kirim respon JSON standar lalu hentikan eksekusi.
* Format: {"success": true/false, "data": ..., "message": "..."}
*/
function jsonResponse($data = null, string $message = '', bool $success = true, int $httpCode = 200, array $extra = []): void {
function jsonResponse($data = null, string $message = '', bool $success = true, int $httpCode = 200, array $extra = []): void
{
http_response_code($httpCode);
header('Content-Type: application/json; charset=utf-8');
$response = [
@@ -80,14 +83,16 @@ function jsonResponse($data = null, string $message = '', bool $success = true,
/**
* Bersihkan input string dari tag HTML.
*/
function clean(string $value): string {
function clean(string $value): string
{
return htmlspecialchars(strip_tags(trim($value)), ENT_QUOTES, 'UTF-8');
}
/**
* Hitung jarak Haversine antara dua koordinat dalam kilometer.
*/
function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float {
function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float
{
$R = 6371; // Radius bumi dalam km
$dLat = deg2rad($lat2 - $lat1);
$dLng = deg2rad($lng2 - $lng1);
@@ -102,7 +107,8 @@ function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float {
* Auto-assign: cari rumah ibadah terdekat yang radius-nya mencakup lokasi KK.
* Mengembalikan ['rumah_ibadah_id' => int|null, 'jarak_km' => float|null]
*/
function autoAssign(PDO $pdo, float $lat, float $lng): array {
function autoAssign(PDO $pdo, float $lat, float $lng): array
{
$result = ['rumah_ibadah_id' => null, 'jarak_km' => null];
$stmt = $pdo->query("SELECT id, lat, lng, radius_km FROM rumah_ibadah");
@@ -132,7 +138,8 @@ function autoAssign(PDO $pdo, float $lat, float $lng): array {
* Cek apakah user sudah login. Jika belum, kirim 401.
* Mengembalikan data session user.
*/
function requireLogin(): array {
function requireLogin(): array
{
if (empty($_SESSION['user'])) {
jsonResponse(null, 'Tidak diizinkan. Silakan login terlebih dahulu.', false, 401);
}
@@ -143,7 +150,8 @@ function requireLogin(): array {
* Cek apakah role user termasuk dalam daftar yang diizinkan.
* Jika tidak, kirim 403.
*/
function requireRole(array $allowedRoles): array {
function requireRole(array $allowedRoles): array
{
$user = requireLogin();
if (!in_array($user['role'], $allowedRoles)) {
jsonResponse(null, 'Akses ditolak. Role Anda tidak memiliki izin.', false, 403);
@@ -155,7 +163,8 @@ function requireRole(array $allowedRoles): array {
* Blokir aksi tulis (POST/PUT/DELETE) untuk role walikota.
* Walikota hanya boleh GET.
*/
function blockWalikotaWrite(): void {
function blockWalikotaWrite(): void
{
if (!empty($_SESSION['user']) && $_SESSION['user']['role'] === 'walikota') {
$method = $_SERVER['REQUEST_METHOD'];
if (in_array($method, ['POST', 'PUT', 'DELETE'])) {
@@ -168,7 +177,8 @@ function blockWalikotaWrite(): void {
* Generate kode pengurus dengan format: RI-[JENIS 3 HURUF]-[RANDOM 4 DIGIT]
* Contoh: RI-MSJ-4821, RI-GRJ-7153
*/
function generateKodePengurus(PDO $pdo, string $jenis): string {
function generateKodePengurus(PDO $pdo, string $jenis): string
{
// Mapping jenis ke 3 huruf
$map = [
'Masjid' => 'MSJ',
@@ -199,7 +209,8 @@ function generateKodePengurus(PDO $pdo, string $jenis): string {
* Cek rate limit untuk IP tertentu. Maks 5 submit per jam.
* Mengembalikan true jika masih diizinkan, false jika melebihi batas.
*/
function checkRateLimit(PDO $pdo, string $ip): bool {
function checkRateLimit(PDO $pdo, string $ip): bool
{
// Hapus record yang lebih dari 1 jam
$pdo->prepare("DELETE FROM rate_limit WHERE created_at < NOW() - INTERVAL 1 HOUR")->execute();
@@ -222,7 +233,8 @@ function checkRateLimit(PDO $pdo, string $ip): bool {
/**
* Handle upload file foto. Mengembalikan path relatif file atau null.
*/
function handleUpload(string $fieldName): ?string {
function handleUpload(string $fieldName): ?string
{
if (!isset($_FILES[$fieldName]) || $_FILES[$fieldName]['error'] !== UPLOAD_ERR_OK) {
return null;
}
@@ -259,7 +271,8 @@ function handleUpload(string $fieldName): ?string {
/**
* Dapatkan IP address client (mendukung proxy).
*/
function getClientIP(): string {
function getClientIP(): string
{
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
}
+148 -44
View File
@@ -2,17 +2,17 @@
-- DATABASE: webgis_rumah_ibadah
-- WebGIS Pontianak — Pengentasan Kemiskinan Berbasis Rumah Ibadah
-- ============================================================
CREATE DATABASE IF NOT EXISTS webgis_rumah_ibadah
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE webgis_rumah_ibadah;
-- Hapus tabel lama (urutan sesuai dependensi FK)
DROP TABLE IF EXISTS histori_bantuan;
DROP TABLE IF EXISTS laporan_masyarakat;
DROP TABLE IF EXISTS keluarga_miskin;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS rumah_ibadah;
DROP TABLE IF EXISTS rate_limit;
-- ============================================================
@@ -22,17 +22,28 @@ DROP TABLE IF EXISTS rate_limit;
CREATE TABLE rumah_ibadah (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(200) NOT NULL COMMENT 'Nama rumah ibadah',
jenis ENUM('Masjid','Gereja','Pura','Vihara','Klenteng','Lainnya')
NOT NULL COMMENT 'Jenis rumah ibadah',
jenis ENUM (
'Masjid',
'Gereja',
'Pura',
'Vihara',
'Klenteng',
'Lainnya'
) NOT NULL COMMENT 'Jenis rumah ibadah',
alamat TEXT NOT NULL COMMENT 'Alamat lengkap',
lat DECIMAL(10, 7) NOT NULL COMMENT 'Latitude',
lng DECIMAL(10, 7) NOT NULL COMMENT 'Longitude',
radius_km FLOAT NOT NULL DEFAULT 2.0 COMMENT 'Radius cakupan (km)',
kode_pengurus VARCHAR(20) NULL UNIQUE COMMENT 'Kode unik login pengurus, format RI-XXX-9999',
password_pengurus VARCHAR(255) NULL COMMENT 'Password pengurus (hashed)',
kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur',
'Pontianak Barat','Pontianak Tenggara','Pontianak Kota')
NOT NULL COMMENT 'Kecamatan lokasi',
kecamatan ENUM (
'Pontianak Utara',
'Pontianak Selatan',
'Pontianak Timur',
'Pontianak Barat',
'Pontianak Tenggara',
'Pontianak Kota'
) NOT NULL COMMENT 'Kecamatan lokasi',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
@@ -45,8 +56,7 @@ CREATE TABLE users (
nama VARCHAR(150) NOT NULL COMMENT 'Nama lengkap pengguna',
username VARCHAR(100) NOT NULL UNIQUE COMMENT 'Username login',
password VARCHAR(255) NOT NULL COMMENT 'Password ter-hash (bcrypt)',
role ENUM('admin','pengurus','walikota')
NOT NULL DEFAULT 'pengurus' COMMENT 'Role pengguna',
role ENUM ('admin', 'pengurus', 'walikota') NOT NULL DEFAULT 'pengurus' COMMENT 'Role pengguna',
rumah_ibadah_id INT DEFAULT NULL COMMENT 'FK ke rumah_ibadah (hanya untuk pengurus)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah (id) ON DELETE SET NULL
@@ -61,19 +71,33 @@ CREATE TABLE keluarga_miskin (
nik VARCHAR(20) NOT NULL UNIQUE COMMENT 'NIK Kepala Keluarga',
nama_kepala_keluarga VARCHAR(200) NOT NULL COMMENT 'Nama Kepala Keluarga',
tanggal_lahir DATE NULL COMMENT 'Tanggal lahir KK',
pendidikan ENUM('Tidak Sekolah','SD','SMP','SMA','D3','S1','S2/S3')
NOT NULL DEFAULT 'Tidak Sekolah',
pendidikan ENUM (
'Tidak Sekolah',
'SD',
'SMP',
'SMA',
'D3',
'S1',
'S2/S3'
) NOT NULL DEFAULT 'Tidak Sekolah',
jumlah_anggota INT NOT NULL DEFAULT 1 COMMENT 'Jumlah anggota keluarga',
alamat TEXT NOT NULL COMMENT 'Alamat lengkap',
kecamatan ENUM('Pontianak Utara','Pontianak Selatan','Pontianak Timur',
'Pontianak Barat','Pontianak Tenggara','Pontianak Kota')
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',
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 COMMENT 'Array penyakit: Stunting, TBC, Hipertensi, dll',
rumah_ibadah_id INT DEFAULT NULL COMMENT 'Auto-assign ke RI terdekat',
jarak_ke_ibadah FLOAT DEFAULT NULL COMMENT 'Jarak ke RI terdekat (km)',
@@ -97,8 +121,7 @@ CREATE TABLE laporan_masyarakat (
lng DECIMAL(10, 7) NOT NULL,
deskripsi TEXT NOT NULL COMMENT 'Deskripsi laporan',
foto VARCHAR(255) NULL COMMENT 'Path file foto',
status ENUM('Baru','Diverifikasi','Ditolak')
NOT NULL DEFAULT 'Baru',
status ENUM ('Baru', 'Diverifikasi', 'Ditolak') NOT NULL DEFAULT 'Baru',
alasan_tolak TEXT NULL COMMENT 'Alasan jika ditolak',
ditangani_oleh INT NULL COMMENT 'FK ke users.id',
converted_to_kk_id INT NULL COMMENT 'FK ke keluarga_miskin.id jika dikonversi',
@@ -114,15 +137,21 @@ CREATE TABLE laporan_masyarakat (
CREATE TABLE histori_bantuan (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
kk_id INT NOT NULL COMMENT 'FK ke keluarga_miskin',
jenis_bantuan ENUM('PKH','BPNT/Sembako','Beras Bansos','KIS-PBI',
'Bansos Tunai Pemkot','Rutilahu','PMT Stunting',
'CSR Swasta','Lainnya')
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 COMMENT 'Nominal dalam rupiah (0 jika non-uang)',
keterangan TEXT NULL COMMENT 'Catatan bebas: 10 kg beras, 3 karung, dll',
tanggal_penyaluran DATE NOT NULL,
sumber_dana ENUM('APBN','APBD','CSR','Lainnya')
NOT NULL DEFAULT 'APBD',
sumber_dana ENUM ('APBN', 'APBD', 'CSR', 'Lainnya') NOT NULL DEFAULT 'APBD',
penanggung_jawab INT NOT NULL COMMENT 'FK ke users.id',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kk_id) REFERENCES keluarga_miskin (id) ON DELETE CASCADE,
@@ -143,12 +172,25 @@ CREATE TABLE rate_limit (
-- ============================================================
-- DATA SEED: Rumah Ibadah (2 data)
-- ============================================================
INSERT INTO rumah_ibadah (nama, jenis, alamat, lat, lng, radius_km, kode_pengurus, password_pengurus, kecamatan) VALUES
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,
-0.0263330,
109.3425200,
2.5,
'RI-MSJ-4821',
-- password: pengurus123
@@ -159,7 +201,8 @@ INSERT INTO rumah_ibadah (nama, jenis, alamat, lat, lng, radius_km, kode_penguru
'Gereja Katedral Santo Yosef',
'Gereja',
'Jl. Diponegoro No. 120, Pontianak Kota',
-0.0380000, 109.3422000,
-0.0380000,
109.3422000,
2.0,
'RI-GRJ-7153',
-- password: pengurus123
@@ -171,7 +214,9 @@ INSERT INTO rumah_ibadah (nama, jenis, alamat, lat, lng, radius_km, kode_penguru
-- DATA SEED: Users (1 admin, 1 walikota)
-- Password semua: admin123
-- ============================================================
INSERT INTO users (nama, username, password, role, rumah_ibadah_id) VALUES
INSERT INTO
users (nama, username, password, role, rumah_ibadah_id)
VALUES
(
'Administrator Sistem',
'admin',
@@ -191,7 +236,24 @@ INSERT INTO users (nama, username, password, role, rumah_ibadah_id) VALUES
-- DATA SEED: Keluarga Miskin (5 data)
-- Auto-assign rumah_ibadah_id dilakukan oleh aplikasi saat disimpan
-- ============================================================
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
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',
@@ -200,7 +262,8 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
4,
'Gg. Mawar No. 3, Benua Melayu Darat',
'Pontianak Tenggara',
-0.0283000, 109.3440000,
-0.0283000,
109.3440000,
'Sangat Miskin',
'Terdaftar DTKS',
'["Stunting","Gizi Buruk"]',
@@ -215,7 +278,8 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
6,
'Jl. Merdeka Gg. 5 No. 7, Mariana',
'Pontianak Kota',
-0.0370000, 109.3430000,
-0.0370000,
109.3430000,
'Miskin',
'Terdaftar DTKS',
'["TBC","Hipertensi"]',
@@ -230,7 +294,8 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
3,
'Gg. Bali No. 2, Bansir Laut',
'Pontianak Tenggara',
-0.0290000, 109.3410000,
-0.0290000,
109.3410000,
'Sangat Miskin',
'Belum DTKS',
'["Diabetes","Hipertensi","ODGJ"]',
@@ -245,7 +310,8 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
5,
'Jl. Tanjungpura Gg. 12, Parit Tokaya',
'Pontianak Selatan',
-0.0310000, 109.3350000,
-0.0310000,
109.3350000,
'Miskin',
'Sedang Diusulkan',
'["Stunting"]',
@@ -260,7 +326,8 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
7,
'Jl. Sutan Syahrir Gg. Melati, Batu Layang',
'Pontianak Utara',
-0.0200000, 109.3460000,
-0.0200000,
109.3460000,
'Hampir Miskin',
'Terdaftar DTKS',
'["Jantung","DBD"]',
@@ -271,12 +338,23 @@ INSERT INTO keluarga_miskin (nik, nama_kepala_keluarga, tanggal_lahir, pendidika
-- ============================================================
-- DATA SEED: Laporan Masyarakat (1 contoh)
-- ============================================================
INSERT INTO laporan_masyarakat (nama_pelapor, no_hp, alamat_terlapor, lat, lng, deskripsi, status) VALUES
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,
-0.0275000,
109.3435000,
'Terdapat keluarga dengan 5 anak yang sangat membutuhkan bantuan. Rumah tidak layak huni dan anak-anak putus sekolah.',
'Baru'
);
@@ -284,6 +362,32 @@ INSERT INTO laporan_masyarakat (nama_pelapor, no_hp, alamat_terlapor, lat, lng,
-- ============================================================
-- DATA SEED: Histori Bantuan (2 contoh)
-- ============================================================
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);
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
);