This commit is contained in:
2026-06-10 19:26:40 +07:00
parent 02c8394972
commit 7e2d324c2e
49 changed files with 6334 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
<?php
include 'koneksi.php';
$data = [];
// ===== RUMAH IBADAH =====
$q = $conn->query("SELECT *, 'ibadah' AS tipe FROM rumah_ibadah");
while ($r = $q->fetch_assoc()) {
$data[] = $r;
}
// ===== PENDUDUK (dengan umur otomatis) =====
$q2 = $conn->query("
SELECT
p.id, p.nik, p.nama, p.jenis_kelamin,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
p.status_keluarga, p.status_perkawinan, p.status_hidup,
p.alamat, p.lat, p.lng, p.no_hp,
p.pekerjaan, p.penghasilan, p.status_ekonomi,
p.pendidikan_terakhir, p.status_pendidikan,
p.keluarga_id, p.rumah_ibadah_id,
k.no_kk,
r.nama AS nama_ibadah,
r.jenis AS jenis_ibadah,
(SELECT COUNT(*) FROM histori_bantuan hb WHERE hb.penduduk_id = p.id AND hb.status='selesai') AS total_bantuan,
'penduduk' AS tipe
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id
WHERE p.status_hidup = 'hidup'
");
while ($r = $q2->fetch_assoc()) {
$r['penghasilan'] = (float)$r['penghasilan'];
$r['total_bantuan'] = (int)$r['total_bantuan'];
$r['umur'] = (int)$r['umur'];
$data[] = $r;
}
// ===== LAPORAN =====
$q3 = $conn->query("
SELECT l.*, p.nama AS nama_penduduk, 'laporan' AS tipe
FROM laporan l
LEFT JOIN penduduk p ON l.penduduk_id = p.id
WHERE l.lat IS NOT NULL AND l.lng IS NOT NULL
");
while ($r = $q3->fetch_assoc()) {
$data[] = $r;
}
header('Content-Type: application/json');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
+57
View File
@@ -0,0 +1,57 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$action = $_GET['action'] ?? $_POST['action'] ?? 'list';
// ===== LIST PESAN =====
if ($action === 'list') {
$limit = (int)($_GET['limit'] ?? 50);
$q = $conn->query("
SELECT c.id, c.pesan, c.dibaca, c.created_at,
u.nama_lengkap AS dari, u.username,
t.nama_lengkap AS ke
FROM chat c
JOIN user u ON c.from_user = u.id
LEFT JOIN user t ON c.to_user = t.id
ORDER BY c.created_at DESC
LIMIT $limit
");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode(array_reverse($rows), JSON_UNESCAPED_UNICODE);
}
// ===== KIRIM PESAN =====
elseif ($action === 'kirim') {
$from = (int)$_POST['from_user'];
$to = ($_POST['to_user'] ?? '') ? (int)$_POST['to_user'] : null;
$pesan = trim($_POST['pesan'] ?? '');
if (!$from || !$pesan) {
echo json_encode(['status'=>'error','msg'=>'Data tidak lengkap']);
exit;
}
$stmt = $conn->prepare("INSERT INTO chat (from_user, to_user, pesan) VALUES (?,?,?)");
$stmt->bind_param("iis", $from, $to, $pesan);
$stmt->execute()
? print json_encode(['status'=>'success','id'=>$conn->insert_id])
: print json_encode(['status'=>'error','msg'=>$stmt->error]);
// Log aktivitas
$log = $conn->prepare("INSERT INTO log_aktivitas (user_id, aksi, tabel, record_id, detail) VALUES (?,?,?,?,?)");
$aksi = 'kirim_chat'; $tbl = 'chat'; $rid = $conn->insert_id;
$det = "Pesan: ".substr($pesan,0,80);
$log->bind_param("issis", $from, $aksi, $tbl, $rid, $det);
$log->execute();
}
// ===== DAFTAR PENGURUS =====
elseif ($action === 'users') {
$q = $conn->query("SELECT id, username, nama_lengkap, role_id FROM user WHERE aktif=1 ORDER BY nama_lengkap");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
?>
+35
View File
@@ -0,0 +1,35 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$stats = [];
// Total penduduk hidup
$r = $conn->query("SELECT COUNT(*) AS total, SUM(status_ekonomi='miskin') AS miskin, SUM(status_ekonomi='rentan') AS rentan, SUM(status_ekonomi='mampu') AS mampu FROM penduduk WHERE status_hidup='hidup'");
$stats['penduduk'] = $r->fetch_assoc();
// Rumah ibadah
$r2 = $conn->query("SELECT COUNT(*) AS total FROM rumah_ibadah");
$stats['rumah_ibadah'] = $r2->fetch_assoc();
// Laporan pending / darurat
$r3 = $conn->query("SELECT COUNT(*) AS total, SUM(urgensi='darurat') AS darurat, SUM(status='pending') AS pending FROM laporan");
$stats['laporan'] = $r3->fetch_assoc();
// Bantuan bulan ini
$r4 = $conn->query("SELECT COUNT(*) AS total, SUM(status='selesai') AS selesai FROM histori_bantuan WHERE MONTH(tanggal)=MONTH(CURDATE()) AND YEAR(tanggal)=YEAR(CURDATE())");
$stats['bantuan_bulan_ini'] = $r4->fetch_assoc();
// Belum pernah dibantu (miskin)
$r5 = $conn->query("SELECT COUNT(*) AS total FROM penduduk p WHERE p.status_ekonomi='miskin' AND p.status_hidup='hidup' AND NOT EXISTS (SELECT 1 FROM histori_bantuan h WHERE h.penduduk_id=p.id AND h.status='selesai')");
$stats['miskin_belum_dibantu'] = $r5->fetch_assoc();
// Sebaran per rumah ibadah
$r6 = $conn->query("SELECT ri.nama, ri.jenis, COUNT(p.id) AS jumlah_penduduk, SUM(p.status_ekonomi='miskin') AS miskin FROM rumah_ibadah ri LEFT JOIN penduduk p ON p.rumah_ibadah_id=ri.id AND p.status_hidup='hidup' GROUP BY ri.id");
$stats['per_rumah_ibadah'] = $r6->fetch_all(MYSQLI_ASSOC);
// Tren bantuan 6 bulan terakhir
$r7 = $conn->query("SELECT DATE_FORMAT(tanggal,'%Y-%m') AS bulan, COUNT(*) AS total FROM histori_bantuan WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY bulan ORDER BY bulan");
$stats['tren_bantuan'] = $r7->fetch_all(MYSQLI_ASSOC);
echo json_encode($stats, JSON_UNESCAPED_UNICODE);
+72
View File
@@ -0,0 +1,72 @@
<?php
include 'koneksi.php';
$id = (int)$_GET['id'];
$tipe = $_GET['tipe'] ?? '';
header('Content-Type: application/json');
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("SELECT ri.*, u.nama_lengkap AS pengurus FROM rumah_ibadah ri LEFT JOIN user u ON ri.user_id=u.id WHERE ri.id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
// Jumlah penduduk terdaftar
$s2 = $conn->prepare("SELECT COUNT(*) AS total, SUM(status_ekonomi='miskin') AS miskin, SUM(status_ekonomi='rentan') AS rentan FROM penduduk WHERE rumah_ibadah_id=? AND status_hidup='hidup'");
$s2->bind_param("i", $id);
$s2->execute();
$data['statistik'] = $s2->get_result()->fetch_assoc();
echo json_encode($data, JSON_UNESCAPED_UNICODE);
} elseif ($tipe === 'penduduk') {
$stmt = $conn->prepare("
SELECT p.*,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
k.no_kk, r.nama AS nama_ibadah
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id
WHERE p.id=?
");
$stmt->bind_param("i", $id);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
// Anggota keluarga (sesama KK)
if ($data['keluarga_id']) {
$s2 = $conn->prepare("SELECT id, nama, jenis_kelamin, TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur, status_keluarga FROM penduduk WHERE keluarga_id=? AND id!=? AND status_hidup='hidup'");
$s2->bind_param("ii", $data['keluarga_id'], $id);
$s2->execute();
$data['anggota_keluarga'] = $s2->get_result()->fetch_all(MYSQLI_ASSOC);
} else {
$data['anggota_keluarga'] = [];
}
// Histori bantuan
$s3 = $conn->prepare("
SELECT hb.*, jb.nama AS nama_bantuan, jb.kategori
FROM histori_bantuan hb
JOIN jenis_bantuan jb ON hb.jenis_bantuan_id = jb.id
WHERE hb.penduduk_id=?
ORDER BY hb.tanggal DESC
");
$s3->bind_param("i", $id);
$s3->execute();
$data['histori_bantuan'] = $s3->get_result()->fetch_all(MYSQLI_ASSOC);
// Pelatihan
$s4 = $conn->prepare("SELECT * FROM pelatihan WHERE penduduk_id=?");
$s4->bind_param("i", $id);
$s4->execute();
$data['pelatihan'] = $s4->get_result()->fetch_all(MYSQLI_ASSOC);
echo json_encode($data, JSON_UNESCAPED_UNICODE);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("SELECT l.*, p.nama AS nama_penduduk FROM laporan l LEFT JOIN penduduk p ON l.penduduk_id=p.id WHERE l.id=?");
$stmt->bind_param("i", $id);
$stmt->execute();
echo json_encode($stmt->get_result()->fetch_assoc(), JSON_UNESCAPED_UNICODE);
}
+52
View File
@@ -0,0 +1,52 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$id = (int)$_POST['id'];
$tipe = $_POST['tipe'] ?? '';
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("UPDATE rumah_ibadah SET nama=?,jenis=?,kontak=?,alamat=?,radius=? WHERE id=?");
$stmt->bind_param("ssssdi",
$_POST['nama'], $_POST['jenis'], $_POST['kontak'],
$_POST['alamat'], (float)$_POST['radius'], $id
);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'penduduk') {
$stmt = $conn->prepare("UPDATE penduduk SET nama=?,jenis_kelamin=?,tanggal_lahir=?,status_keluarga=?,status_perkawinan=?,status_hidup=?,alamat=?,no_hp=?,pekerjaan=?,penghasilan=?,status_ekonomi=?,pendidikan_terakhir=?,status_pendidikan=? WHERE id=?");
$stmt->bind_param("sssssssssdsssi",
$_POST['nama'],
$_POST['jenis_kelamin'],
$_POST['tanggal_lahir'],
$_POST['status_keluarga'],
$_POST['status_perkawinan'],
$_POST['status_hidup'],
$_POST['alamat'],
$_POST['no_hp'],
$_POST['pekerjaan'],
(float)$_POST['penghasilan'],
$_POST['status_ekonomi'],
$_POST['pendidikan_terakhir'],
$_POST['status_pendidikan'],
$id
);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("UPDATE laporan SET status=?,ditangani_oleh=? WHERE id=?");
$handler = ($_POST['ditangani_oleh'] ?? '') ? (int)$_POST['ditangani_oleh'] : null;
$stmt->bind_param("sii", $_POST['status'], $handler, $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} else {
http_response_code(400);
echo json_encode(["status" => "error", "msg" => "Tipe tidak dikenal"]);
}
+39
View File
@@ -0,0 +1,39 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$id = (int)$_POST['id'];
$tipe = $_POST['tipe'] ?? '';
if ($tipe === 'ibadah') {
$stmt = $conn->prepare("DELETE FROM rumah_ibadah WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'penduduk') {
// Hapus histori & pelatihan dulu (FK)
foreach (['histori_bantuan', 'pelatihan'] as $tbl) {
$s = $conn->prepare("DELETE FROM $tbl WHERE penduduk_id=?");
$s->bind_param("i", $id);
$s->execute();
}
$stmt = $conn->prepare("DELETE FROM penduduk WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} elseif ($tipe === 'laporan') {
$stmt = $conn->prepare("DELETE FROM laporan WHERE id=?");
$stmt->bind_param("i", $id);
$stmt->execute()
? print json_encode(["status" => "success"])
: print json_encode(["status" => "error", "msg" => $stmt->error]);
} else {
http_response_code(400);
echo json_encode(["status" => "error", "msg" => "Tipe tidak dikenal"]);
}
+2286
View File
File diff suppressed because it is too large Load Diff
+15
View File
@@ -0,0 +1,15 @@
<?php
$host = getenv('DB_HOST') ?: 'localhost';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASSWORD');
$pass = ($pass === false) ? '' : $pass;
$db = getenv('DB_NAME') ?: 'webgis_uas';
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
http_response_code(500);
die(json_encode(["error" => "Koneksi database gagal: " . $conn->connect_error]));
}
$conn->set_charset("utf8mb4");
+37
View File
@@ -0,0 +1,37 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$action = $_GET['action'] ?? 'list';
// ===== LIST LOG =====
if ($action === 'list') {
$limit = (int)($_GET['limit'] ?? 100);
$q = $conn->query("
SELECT l.*, u.nama_lengkap AS nama_user, u.username
FROM log_aktivitas l
LEFT JOIN user u ON l.user_id = u.id
ORDER BY l.created_at DESC
LIMIT $limit
");
$rows = [];
while ($r = $q->fetch_assoc()) $rows[] = $r;
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
// ===== TAMBAH LOG =====
elseif ($action === 'tambah') {
$uid = (int)$_POST['user_id'];
$aksi = $_POST['aksi'] ?? '';
$tabel = $_POST['tabel'] ?? '';
$rid = (int)($_POST['record_id'] ?? 0);
$detail = $_POST['detail'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$stmt = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$stmt->bind_param("ississs", $uid, $aksi, $tabel, $rid, $detail, $ip);
$stmt->execute()
? print json_encode(['status'=>'success'])
: print json_encode(['status'=>'error','msg'=>$stmt->error]);
}
?>
+104
View File
@@ -0,0 +1,104 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
// ===== AUTO-CREATE TABEL JIKA BELUM ADA =====
$conn->query("
CREATE TABLE IF NOT EXISTS riwayat_pendidikan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
jenis ENUM('formal','pelatihan') DEFAULT 'formal',
institusi VARCHAR(150),
jenjang VARCHAR(100),
jurusan VARCHAR(100),
thn_masuk INT,
thn_lulus INT,
status ENUM('lulus','sedang_belajar','putus') DEFAULT 'lulus',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
");
$action = $_GET['action'] ?? $_POST['action'] ?? 'list';
// ===== LIST =====
if ($action === 'list') {
$result = $conn->query("
SELECT rp.*,
p.nama AS penduduk_nama,
p.nik
FROM riwayat_pendidikan rp
JOIN penduduk p ON rp.penduduk_id = p.id
ORDER BY rp.created_at DESC
");
$rows = [];
if ($result) {
while ($r = $result->fetch_assoc()) $rows[] = $r;
}
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
}
// ===== SIMPAN =====
elseif ($action === 'simpan') {
$pid = (int)($_POST['penduduk_id'] ?? 0);
$jenis = $_POST['jenis'] ?? 'formal';
$inst = $_POST['institusi'] ?? '';
$jenjang = $_POST['jenjang'] ?? '';
$jurusan = $_POST['jurusan'] ?? '';
$thn_msk = !empty($_POST['thn_masuk']) ? (int)$_POST['thn_masuk'] : null;
$thn_lls = !empty($_POST['thn_lulus']) ? (int)$_POST['thn_lulus'] : null;
$status = $_POST['status'] ?? 'lulus';
if (!$pid) {
echo json_encode(["status" => "error", "msg" => "penduduk_id tidak valid"]);
exit;
}
$stmt = $conn->prepare("
INSERT INTO riwayat_pendidikan
(penduduk_id, jenis, institusi, jenjang, jurusan, thn_masuk, thn_lulus, status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->bind_param("issssiis",
$pid, $jenis, $inst, $jenjang, $jurusan, $thn_msk, $thn_lls, $status
);
if ($stmt->execute()) {
$new_id = $conn->insert_id;
// Log aktivitas
$uid = (int)($_POST['user_id'] ?? 0);
if ($uid) {
$aksi = 'tambah_pendidikan';
$tbl = 'riwayat_pendidikan';
$det = "Tambah $jenis: $jenjang (penduduk ID $pid)";
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$log = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$log->bind_param("issiiss", $uid, $aksi, $tbl, $new_id, $det, $ip);
$log->execute();
}
echo json_encode(["status" => "success", "id" => $new_id]);
} else {
echo json_encode(["status" => "error", "msg" => $stmt->error]);
}
$stmt->close();
}
// ===== HAPUS =====
elseif ($action === 'hapus') {
$id = (int)($_POST['id'] ?? 0);
$stmt = $conn->prepare("DELETE FROM riwayat_pendidikan WHERE id=?");
$stmt->bind_param("i", $id);
if ($stmt->execute()) {
echo json_encode(["status" => "success"]);
} else {
echo json_encode(["status" => "error", "msg" => $stmt->error]);
}
$stmt->close();
}
else {
echo json_encode(["status" => "error", "msg" => "Action tidak dikenal"]);
}
+168
View File
@@ -0,0 +1,168 @@
<?php
include 'koneksi.php';
header('Content-Type: application/json');
$tipe = $_POST['tipe'] ?? '';
// ===== RUMAH IBADAH =====
if ($tipe === 'ibadah') {
$nama = trim($_POST['nama'] ?? '');
$jenis = $_POST['jenis'] ?? 'lainnya';
$kontak = $_POST['kontak'] ?? '';
$alamat = $_POST['alamat'] ?? '';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
$radius = (float)($_POST['radius'] ?? 500);
if (!$nama) { echo json_encode(["status"=>"error","msg"=>"Nama tidak boleh kosong"]); exit; }
$stmt = $conn->prepare("INSERT INTO rumah_ibadah (nama,jenis,kontak,alamat,lat,lng,radius) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("ssssddd", $nama,$jenis,$kontak,$alamat,$lat,$lng,$radius);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== PENDUDUK =====
elseif ($tipe === 'penduduk') {
$nik = trim($_POST['nik'] ?? '');
$nama = trim($_POST['nama'] ?? '');
$jk = $_POST['jenis_kelamin'] ?? 'L';
$tgl_lahir = !empty($_POST['tanggal_lahir']) ? $_POST['tanggal_lahir'] : null;
$status_kel = $_POST['status_keluarga'] ?? 'lainnya';
$status_kawin = $_POST['status_perkawinan'] ?? 'belum_kawin';
$alamat = $_POST['alamat'] ?? '';
$no_hp = $_POST['no_hp'] ?? '';
$pekerjaan = $_POST['pekerjaan'] ?? '';
$penghasilan = (float)($_POST['penghasilan'] ?? 0);
$status_ekonomi = $_POST['status_ekonomi'] ?? 'rentan';
$pend_terakhir = $_POST['pendidikan_terakhir'] ?? 'tidak_sekolah';
$status_pend = $_POST['status_pendidikan'] ?? 'tidak_sekolah';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$nik || !$nama) {
echo json_encode(["status"=>"error","msg"=>"NIK dan Nama wajib diisi"]);
exit;
}
// Cari rumah ibadah terdekat otomatis
$rumah_ibadah_id = null;
if ($lat && $lng) {
$s = $conn->prepare("SELECT id FROM rumah_ibadah ORDER BY (6371*acos(cos(radians(?))*cos(radians(lat))*cos(radians(lng)-radians(?))+sin(radians(?))*sin(radians(lat)))) ASC LIMIT 1");
$s->bind_param("ddd", $lat, $lng, $lat);
$s->execute();
$row = $s->get_result()->fetch_assoc();
$rumah_ibadah_id = $row ? (int)$row['id'] : null;
$s->close();
}
// INSERT — semua 16 kolom, tipe dijaga ketat
// Gunakan query langsung dengan escape untuk menghindari masalah nullable
$nik_e = $conn->real_escape_string($nik);
$nama_e = $conn->real_escape_string($nama);
$jk_e = $conn->real_escape_string($jk);
$tgl_e = $tgl_lahir ? "'".$conn->real_escape_string($tgl_lahir)."'" : 'NULL';
$stkel_e = $conn->real_escape_string($status_kel);
$stkaw_e = $conn->real_escape_string($status_kawin);
$almt_e = $conn->real_escape_string($alamat);
$hp_e = $conn->real_escape_string($no_hp);
$pkrj_e = $conn->real_escape_string($pekerjaan);
$ekn_e = $conn->real_escape_string($status_ekonomi);
$pend_e = $conn->real_escape_string($pend_terakhir);
$spnd_e = $conn->real_escape_string($status_pend);
$rid_e = $rumah_ibadah_id ? (int)$rumah_ibadah_id : 'NULL';
$sql = "INSERT INTO penduduk
(nik,nama,jenis_kelamin,tanggal_lahir,status_keluarga,status_perkawinan,
alamat,no_hp,pekerjaan,penghasilan,status_ekonomi,
pendidikan_terakhir,status_pendidikan,lat,lng,rumah_ibadah_id)
VALUES
('{$nik_e}','{$nama_e}','{$jk_e}',{$tgl_e},'{$stkel_e}','{$stkaw_e}',
'{$almt_e}','{$hp_e}','{$pkrj_e}',{$penghasilan},'{$ekn_e}',
'{$pend_e}','{$spnd_e}',{$lat},{$lng},{$rid_e})";
$stmt = $conn; // dummy untuk cek execute
if ($conn->query($sql)) {
$new_id = (int)$conn->insert_id;
// Log
$uid = (int)($_POST['user_id'] ?? 0);
if ($uid) {
$l = $conn->prepare("INSERT INTO log_aktivitas (user_id,aksi,tabel,record_id,detail,ip) VALUES (?,?,?,?,?,?)");
$aksi='tambah_penduduk'; $tbl='penduduk'; $det="Tambah penduduk: $nama"; $ip=$_SERVER['REMOTE_ADDR']??'';
$l->bind_param("ississ",$uid,$aksi,$tbl,$new_id,$det,$ip);
$l->execute();
}
echo json_encode(["status"=>"success","id"=>$new_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$conn->error]);
}
}
// ===== LAPORAN =====
elseif ($tipe === 'laporan') {
$nama_pelapor = trim($_POST['nama_pelapor'] ?? 'Anonim') ?: 'Anonim';
$deskripsi = trim($_POST['deskripsi'] ?? '');
$urgensi = $_POST['urgensi'] ?? 'sedang';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$deskripsi) { echo json_encode(["status"=>"error","msg"=>"Deskripsi wajib diisi"]); exit; }
$stmt = $conn->prepare("INSERT INTO laporan (nama_pelapor,deskripsi,lat,lng,urgensi) VALUES (?,?,?,?,?)");
$stmt->bind_param("ssdds", $nama_pelapor,$deskripsi,$lat,$lng,$urgensi);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== BANTUAN =====
elseif ($tipe === 'bantuan') {
$pid = (int)($_POST['penduduk_id'] ?? 0);
$jid = (int)($_POST['jenis_bantuan_id'] ?? 0);
$src = $_POST['sumber_bantuan'] ?? '';
$tgl = $_POST['tanggal'] ?? date('Y-m-d');
$jml = (float)($_POST['jumlah'] ?? 0);
$cat = $_POST['catatan'] ?? '';
$stat = $_POST['status'] ?? 'direncanakan';
$stmt = $conn->prepare("INSERT INTO histori_bantuan (penduduk_id,jenis_bantuan_id,sumber_bantuan,tanggal,jumlah,catatan,status) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("iissdss",$pid,$jid,$src,$tgl,$jml,$cat,$stat);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
// ===== KELUARGA =====
elseif ($tipe === 'keluarga') {
$no_kk = trim($_POST['no_kk'] ?? '');
$alamat = $_POST['alamat'] ?? '';
$lat = (float)($_POST['lat'] ?? 0);
$lng = (float)($_POST['lng'] ?? 0);
if (!$no_kk) { echo json_encode(["status"=>"error","msg"=>"No. KK wajib diisi"]); exit; }
$stmt = $conn->prepare("INSERT INTO keluarga (no_kk,alamat,lat,lng) VALUES (?,?,?,?)");
$stmt->bind_param("ssdd",$no_kk,$alamat,$lat,$lng);
if ($stmt->execute()) {
echo json_encode(["status"=>"success","id"=>(int)$conn->insert_id]);
} else {
echo json_encode(["status"=>"error","msg"=>$stmt->error]);
}
$stmt->close();
}
else {
http_response_code(400);
echo json_encode(["status"=>"error","msg"=>"Tipe tidak dikenal: $tipe"]);
}
+318
View File
@@ -0,0 +1,318 @@
-- ============================================================
-- WebGIS Pengentasan Kemiskinan
-- Database: webgis_uas
-- Versi: 2.0 (Full System)
-- ============================================================
CREATE DATABASE IF NOT EXISTS webgis_uas
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE webgis_uas;
-- ============================================================
-- 1. ROLE (hak akses)
-- ============================================================
CREATE TABLE role (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(50) NOT NULL, -- masyarakat | pengurus | pimpinan | admin
deskripsi TEXT
) ENGINE=InnoDB;
-- ============================================================
-- 2. USER (login)
-- ============================================================
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(80) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, -- bcrypt
nama_lengkap VARCHAR(120),
email VARCHAR(120),
role_id INT NOT NULL,
aktif TINYINT(1) DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (role_id) REFERENCES role(id)
) ENGINE=InnoDB;
-- ============================================================
-- 3. RUMAH IBADAH
-- ============================================================
CREATE TABLE rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
jenis ENUM('masjid','gereja','pura','vihara','klenteng','lainnya') NOT NULL,
kontak VARCHAR(50),
alamat TEXT,
lat DOUBLE NOT NULL,
lng DOUBLE NOT NULL,
radius DOUBLE DEFAULT 500, -- meter, zona layanan
user_id INT, -- pengurus penanggung-jawab
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 4. KELUARGA (Kartu Keluarga)
-- ============================================================
CREATE TABLE keluarga (
id INT AUTO_INCREMENT PRIMARY KEY,
no_kk VARCHAR(20) UNIQUE NOT NULL,
alamat TEXT,
lat DOUBLE,
lng DOUBLE,
rumah_ibadah_id INT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 5. PENDUDUK
-- ============================================================
CREATE TABLE penduduk (
id INT AUTO_INCREMENT PRIMARY KEY,
nik VARCHAR(16) UNIQUE NOT NULL,
nama VARCHAR(150) NOT NULL,
jenis_kelamin ENUM('L','P') NOT NULL,
tanggal_lahir DATE,
-- umur dihitung via VIEW / fungsi, tidak disimpan statis
status_keluarga ENUM('kepala_keluarga','istri','anak','orang_tua','lainnya') DEFAULT 'lainnya',
status_perkawinan ENUM('belum_kawin','kawin','cerai_hidup','cerai_mati') DEFAULT 'belum_kawin',
status_hidup ENUM('hidup','meninggal') DEFAULT 'hidup',
alamat TEXT,
lat DOUBLE,
lng DOUBLE,
no_hp VARCHAR(20),
pekerjaan VARCHAR(100),
penghasilan DECIMAL(15,2) DEFAULT 0,
status_ekonomi ENUM('miskin','rentan','mampu') DEFAULT 'rentan',
-- pendidikan
pendidikan_terakhir ENUM('tidak_sekolah','sd','smp','sma','d1','d2','d3','s1','s2','s3') DEFAULT 'tidak_sekolah',
status_pendidikan ENUM('sekolah','tidak_sekolah','lulus','putus_sekolah') DEFAULT 'tidak_sekolah',
-- relasi
keluarga_id INT,
rumah_ibadah_id INT,
-- meta
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (keluarga_id) REFERENCES keluarga(id) ON DELETE SET NULL,
FOREIGN KEY (rumah_ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 6. RIWAYAT PELATIHAN
-- ============================================================
CREATE TABLE pelatihan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
nama_pelatihan VARCHAR(150),
penyelenggara VARCHAR(100),
tanggal DATE,
sertifikat TINYINT(1) DEFAULT 0,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ============================================================
-- 7. JENIS BANTUAN (master)
-- ============================================================
CREATE TABLE jenis_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL, -- sembako, pendidikan, kesehatan, …
kategori ENUM('sembako','pendidikan','kesehatan','ekonomi','lainnya') DEFAULT 'lainnya',
satuan VARCHAR(50), -- karung, paket, rupiah, …
deskripsi TEXT
) ENGINE=InnoDB;
-- ============================================================
-- 8. HISTORI BANTUAN
-- ============================================================
CREATE TABLE histori_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
jenis_bantuan_id INT NOT NULL,
sumber_bantuan VARCHAR(100), -- rumah ibadah / pemerintah / donatur
tanggal DATE NOT NULL,
jumlah DECIMAL(10,2),
status ENUM('direncanakan','disalurkan','selesai') DEFAULT 'direncanakan',
catatan TEXT,
user_id INT, -- yg menginput
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE,
FOREIGN KEY (jenis_bantuan_id) REFERENCES jenis_bantuan(id),
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 9. LAPORAN MASYARAKAT
-- ============================================================
CREATE TABLE laporan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(100),
penduduk_id INT, -- opsional, terkait siapa
deskripsi TEXT NOT NULL,
lat DOUBLE,
lng DOUBLE,
foto VARCHAR(255),
urgensi ENUM('rendah','sedang','tinggi','darurat') DEFAULT 'sedang',
status ENUM('pending','diverifikasi','diproses','selesai') DEFAULT 'pending',
ditangani_oleh INT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE SET NULL,
FOREIGN KEY (ditangani_oleh) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 10. CHAT / KOMUNIKASI ANTAR PENGURUS
-- ============================================================
CREATE TABLE chat (
id INT AUTO_INCREMENT PRIMARY KEY,
from_user INT NOT NULL,
to_user INT, -- NULL = broadcast ke semua pengurus
pesan TEXT NOT NULL,
dibaca TINYINT(1) DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (from_user) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY (to_user) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- 11. LOG AKTIVITAS
-- ============================================================
CREATE TABLE log_aktivitas (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
aksi VARCHAR(100), -- create_penduduk, update_bantuan, …
tabel VARCHAR(50),
record_id INT,
detail TEXT,
ip VARCHAR(45),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL
) ENGINE=InnoDB;
-- ============================================================
-- VIEW: umur otomatis
-- ============================================================
CREATE OR REPLACE VIEW v_penduduk AS
SELECT
p.*,
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
k.no_kk,
r.nama AS nama_ibadah,
r.jenis AS jenis_ibadah
FROM penduduk p
LEFT JOIN keluarga k ON p.keluarga_id = k.id
LEFT JOIN rumah_ibadah r ON p.rumah_ibadah_id = r.id;
-- ============================================================
-- DATA AWAL: ROLE
-- ============================================================
INSERT INTO role (nama, deskripsi) VALUES
('admin', 'Administrator sistem penuh'),
('pengurus', 'Pengurus Rumah Ibadah input & verifikasi'),
('pimpinan', 'Pimpinan Daerah read-only & dashboard'),
('masyarakat','Warga biasa lapor & lihat data terbatas');
-- ============================================================
-- DATA AWAL: USER (password semua = "password123" → bcrypt)
-- ============================================================
INSERT INTO user (username, password, nama_lengkap, email, role_id) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Administrator', 'admin@webgis.id', 1),
('pengurus1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Ahmad Fauzi', 'ahmad@masjid.id', 2),
('pengurus2', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Budi Santoso', 'budi@gereja.id', 2),
('pimpinan1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Camat Pontianak Kota', 'camat@pontianak.id', 3),
('warga1', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Dewi Lestari', 'dewi@gmail.com', 4);
-- ============================================================
-- DATA AWAL: RUMAH IBADAH (Pontianak area)
-- ============================================================
INSERT INTO rumah_ibadah (nama, jenis, kontak, alamat, lat, lng, radius, user_id) VALUES
('Masjid Raya Mujahidin', 'masjid', '0561-7001234', 'Jl. Ahmad Yani, Pontianak', -0.0231, 109.3294, 600, 2),
('Masjid Al-Falah', 'masjid', '0561-7005678', 'Jl. Gajah Mada, Pontianak', -0.0312, 109.3215, 500, 2),
('Gereja Katolik Katedral', 'gereja', '0561-7009012', 'Jl. Rahadi Usman, Pontianak', -0.0280, 109.3320, 550, 3),
('Vihara Bodhicitta Maitreya','vihara', '0561-7003456', 'Jl. Diponegoro, Pontianak', -0.0265, 109.3341, 400, NULL),
('Gereja GPIB Imanuel', 'gereja', '0561-7007890', 'Jl. Tanjungpura, Pontianak', -0.0245, 109.3270, 500, 3);
-- ============================================================
-- DATA AWAL: KELUARGA
-- ============================================================
INSERT INTO keluarga (no_kk, alamat, lat, lng, rumah_ibadah_id) VALUES
('6171010101230001', 'Jl. Veteran No.12, RT01 RW01', -0.0250, 109.3280, 1),
('6171010101230002', 'Jl. Tanjungpura No.45, RT02 RW01',-0.0270, 109.3310, 3),
('6171010101230003', 'Jl. Gajah Mada No.7, RT01 RW02', -0.0235, 109.3225, 2),
('6171010101230004', 'Jl. Diponegoro No.33, RT03 RW02',-0.0280, 109.3355, 4),
('6171010101230005', 'Jl. Ahmad Yani No.88, RT02 RW03',-0.0195, 109.3290, 1);
-- ============================================================
-- DATA AWAL: PENDUDUK (dummy realistis)
-- ============================================================
INSERT INTO penduduk
(nik, nama, jenis_kelamin, tanggal_lahir, status_keluarga, status_perkawinan,
status_hidup, alamat, lat, lng, no_hp, pekerjaan, penghasilan,
status_ekonomi, pendidikan_terakhir, status_pendidikan, keluarga_id, rumah_ibadah_id)
VALUES
('6171010101800001','Hasan Basri', 'L','1980-05-15','kepala_keluarga','kawin', 'hidup','Jl. Veteran No.12', -0.02510,109.32810,'081234560001','buruh_harian', 800000, 'miskin', 'sd', 'tidak_sekolah',1,1),
('6171010101820002','Siti Rahmawati', 'P','1982-08-22','istri', 'kawin', 'hidup','Jl. Veteran No.12', -0.02510,109.32810,'081234560002','ibu_rumah_tangga',0, 'miskin', 'sd', 'tidak_sekolah',1,1),
('6171010101070003','Rizky Pratama', 'L','2007-03-10','anak', 'belum_kawin', 'hidup','Jl. Veteran No.12', -0.02520,109.32820,'', 'pelajar', 0, 'miskin', 'smp', 'sekolah', 1,1),
('6171010101750004','Widodo Santoso', 'L','1975-11-30','kepala_keluarga','kawin', 'hidup','Jl. Tanjungpura No.45',-0.02700,109.33100,'081234560004','pedagang', 1500000,'rentan', 'sma', 'lulus', 2,3),
('6171010101780005','Maria Goretti', 'P','1978-06-18','istri', 'kawin', 'hidup','Jl. Tanjungpura No.45',-0.02700,109.33100,'081234560005','penjahit', 700000, 'rentan', 'smp', 'lulus', 2,3),
('6171010101090006','Anastasia Dewi', 'P','2009-01-25','anak', 'belum_kawin', 'hidup','Jl. Tanjungpura No.45',-0.02710,109.33110,'', 'pelajar', 0, 'rentan', 'sd', 'sekolah', 2,3),
('6171010101650007','Darman Husin', 'L','1965-04-04','kepala_keluarga','kawin', 'hidup','Jl. Gajah Mada No.7', -0.02355,109.32260,'081234560007','nelayan', 600000, 'miskin', 'sd', 'tidak_sekolah',3,2),
('6171010101680008','Aminah Binti Umar','P','1968-09-12','istri', 'kawin', 'hidup','Jl. Gajah Mada No.7', -0.02355,109.32260,'081234560008','ibu_rumah_tangga',0, 'miskin', 'tidak_sekolah','tidak_sekolah',3,2),
('6171010101200009','Fadhil Rahmat', 'L','2020-07-07','anak', 'belum_kawin', 'hidup','Jl. Gajah Mada No.7', -0.02360,109.32270,'', '', 0, 'miskin', 'tidak_sekolah','tidak_sekolah',3,2),
('6171010101550010','Candra Wijaya', 'L','1955-12-01','kepala_keluarga','cerai_mati', 'hidup','Jl. Diponegoro No.33',-0.02800,109.33550,'081234560010','pensiunan', 2500000,'mampu', 's1', 'lulus', 4,4),
('6171010101850011','Rudi Hartono', 'L','1985-02-14','kepala_keluarga','kawin', 'hidup','Jl. Ahmad Yani No.88',-0.01960,109.32910,'081234560011','wiraswasta', 3000000,'mampu', 's1', 'lulus', 5,1),
('6171010101880012','Lina Kusuma', 'P','1988-07-30','istri', 'kawin', 'hidup','Jl. Ahmad Yani No.88',-0.01960,109.32910,'081234560012','guru', 2800000,'mampu', 's1', 'lulus', 5,1),
('6171010101700013','Suparman', 'L','1970-03-20','kepala_keluarga','kawin', 'hidup','Jl. Veteran No.22', -0.02430,109.32750,'081234560013','tukang_bangunan',900000,'miskin', 'smp', 'lulus', 1,1),
('6171010101120014','Nurul Hidayah', 'P','2012-11-11','anak', 'belum_kawin', 'hidup','Jl. Veteran No.22', -0.02440,109.32760,'', 'pelajar', 0, 'miskin', 'sd', 'sekolah', 1,1),
('6171010101920015','Bagas Setiawan', 'L','1992-05-05','kepala_keluarga','kawin', 'hidup','Jl. KH Wahid Hasyim', -0.02900,109.32500,'081234560015','ojek_online', 1200000,'rentan', 'sma', 'lulus', NULL,2);
-- ============================================================
-- DATA AWAL: JENIS BANTUAN
-- ============================================================
INSERT INTO jenis_bantuan (nama, kategori, satuan, deskripsi) VALUES
('Sembako Bulanan', 'sembako', 'paket', 'Paket beras 10kg + minyak + gula'),
('Bantuan Pendidikan', 'pendidikan', 'rupiah', 'Biaya SPP / seragam / buku'),
('Bantuan Kesehatan', 'kesehatan', 'paket', 'Obat-obatan dan biaya berobat'),
('Modal Usaha Kecil', 'ekonomi', 'rupiah', 'Pinjaman tanpa bunga untuk usaha'),
('Pakaian Layak Pakai', 'lainnya', 'koli', 'Pakaian bekas layak pakai');
-- ============================================================
-- DATA AWAL: HISTORI BANTUAN
-- ============================================================
INSERT INTO histori_bantuan (penduduk_id, jenis_bantuan_id, sumber_bantuan, tanggal, jumlah, status, catatan, user_id) VALUES
(1, 1, 'Masjid Raya Mujahidin', '2025-01-15', 1, 'selesai', 'Periode Januari 2025', 2),
(1, 1, 'Masjid Raya Mujahidin', '2025-02-15', 1, 'selesai', 'Periode Februari 2025',2),
(1, 3, 'Puskesmas Kota', '2025-03-10', 1, 'selesai', 'Berobat influenza', 2),
(2, 1, 'Masjid Raya Mujahidin', '2025-01-15', 1, 'selesai', 'Periode Januari 2025', 2),
(3, 2, 'Dinas Pendidikan', '2025-01-20', 500000,'selesai', 'Bantuan seragam SD', 2),
(7, 1, 'Masjid Al-Falah', '2025-02-01', 1, 'selesai', 'Paket sembako', 2),
(7, 3, 'Puskesmas Kota', '2025-04-05', 1, 'disalurkan', 'Pengobatan rutin', 2),
(8, 1, 'Masjid Al-Falah', '2025-02-01', 1, 'selesai', 'Paket sembako', 2),
(13,1, 'Masjid Raya Mujahidin', '2025-03-15', 1, 'selesai', 'Paket sembako Maret', 2),
(15,4, 'Gereja GPIB Imanuel', '2025-05-01', 2000000,'direncanakan','Modal usaha warung',3);
-- ============================================================
-- DATA AWAL: LAPORAN MASYARAKAT
-- ============================================================
INSERT INTO laporan (nama_pelapor, penduduk_id, deskripsi, lat, lng, urgensi, status) VALUES
('Anonim', 7, 'Pak Darman sudah 3 hari tidak bisa makan, sakit dan tidak ada yang merawat.', -0.02355,109.32260,'darurat', 'diverifikasi'),
('Ibu RT 02', 1, 'Keluarga Hasan Basri membutuhkan bantuan sembako, penghasilan turun drastis.', -0.02510,109.32810,'tinggi', 'diproses'),
('Warga Setempat',NULL,'Ada anak kecil di Jl. Gajah Mada yg tidak sekolah dan terlihat kurang gizi.', -0.02360,109.32280,'tinggi', 'pending'),
('Bagas S.', NULL,'Kebutuhan modal usaha kecil di kawasan Jl. KH Wahid Hasyim.', -0.02900,109.32500,'sedang', 'pending'),
('Anonim', NULL,'Lansia sebatang kara di Jl. Diponegoro membutuhkan perhatian.', -0.02810,109.33560,'sedang', 'pending');
-- ============================================================
-- DATA AWAL: CHAT
-- ============================================================
INSERT INTO chat (from_user, to_user, pesan) VALUES
(2, 3, 'Pak Budi, apakah gereja bisa bantu keluarga Widodo di Jl. Tanjungpura? Kondisi cukup memprihatinkan.'),
(3, 2, 'Insya Allah siap. Minggu depan kami ada jadwal distribusi. Boleh koordinasi lebih lanjut.'),
(2, NULL, '[BROADCAST] Pengumpulan sembako bulan ini dimulai 10 Juni. Mohon kontribusi semua pihak.');
-- ============================================================
-- DATA AWAL: LOG AKTIVITAS
-- ============================================================
INSERT INTO log_aktivitas (user_id, aksi, tabel, record_id, detail) VALUES
(2,'create','penduduk',1,'Menambah data penduduk Hasan Basri'),
(2,'create','histori_bantuan',1,'Menyalurkan sembako ke penduduk ID 1'),
(3,'update','laporan',1,'Memverifikasi laporan darurat Darman Husin');