edit files
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
// api/controllers/AuthController.php
|
||||
class AuthController {
|
||||
|
||||
public function index(): void { jsonError('Method tidak diizinkan', 405); }
|
||||
public function show(string $id): void { jsonError('Method tidak diizinkan', 405); }
|
||||
public function update(string $id): void { jsonError('Method tidak diizinkan', 405); }
|
||||
public function destroy(string $id): void { jsonError('Method tidak diizinkan', 405); }
|
||||
|
||||
/** POST /api/auth — login */
|
||||
public function store(): void {
|
||||
$body = getBody();
|
||||
$errs = required($body, ['username', 'password']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
|
||||
$user = login(sanitize($body['username']), $body['password']);
|
||||
if (!$user) jsonError('Username atau password salah', 401);
|
||||
|
||||
startSession();
|
||||
$_SESSION['user'] = $user;
|
||||
logActivity('login', 'user', $user['id']);
|
||||
jsonSuccess($user, 'Login berhasil');
|
||||
}
|
||||
|
||||
/** DELETE /api/auth/:any — logout */
|
||||
public function logout(): void {
|
||||
startSession();
|
||||
$user = currentUser();
|
||||
if ($user) logActivity('logout', 'user', $user['id']);
|
||||
session_destroy();
|
||||
jsonSuccess([], 'Logout berhasil');
|
||||
}
|
||||
|
||||
/** GET /api/auth/me */
|
||||
public function me(): void {
|
||||
$user = currentUser();
|
||||
if (!$user) jsonError('Tidak login', 401);
|
||||
jsonSuccess($user);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
// api/controllers/BantuanController.php
|
||||
class BantuanController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$rows = $db->query("SELECT * FROM bantuan ORDER BY kategori, nama_bantuan")->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare("SELECT * FROM bantuan WHERE id = ?");
|
||||
$stmt->execute([$id]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Jenis bantuan tidak ditemukan', 404);
|
||||
jsonSuccess($row);
|
||||
}
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$errs = required($body, ['nama_bantuan', 'kategori']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"INSERT INTO bantuan (nama_bantuan, kategori, sumber, deskripsi, satuan)
|
||||
VALUES (?,?,?,?,?)"
|
||||
)->execute([
|
||||
sanitize($body['nama_bantuan']),
|
||||
$body['kategori'],
|
||||
sanitize($body['sumber'] ?? ''),
|
||||
sanitize($body['deskripsi'] ?? ''),
|
||||
sanitize($body['satuan'] ?? ''),
|
||||
]);
|
||||
jsonSuccess(['id' => getDB()->lastInsertId()], 'Jenis bantuan ditambahkan', 201);
|
||||
}
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"UPDATE bantuan SET nama_bantuan=?, kategori=?, sumber=?, deskripsi=?, satuan=?, aktif=?
|
||||
WHERE id=?"
|
||||
)->execute([
|
||||
sanitize($body['nama_bantuan'] ?? ''),
|
||||
$body['kategori'] ?? 'lainnya',
|
||||
sanitize($body['sumber'] ?? ''),
|
||||
sanitize($body['deskripsi'] ?? ''),
|
||||
sanitize($body['satuan'] ?? ''),
|
||||
(int)($body['aktif'] ?? 1),
|
||||
$id,
|
||||
]);
|
||||
jsonSuccess([], 'Jenis bantuan diperbarui');
|
||||
}
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$db->prepare("DELETE FROM bantuan WHERE id = ?")->execute([$id]);
|
||||
jsonSuccess([], 'Jenis bantuan dihapus');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
// api/controllers/ChatController.php
|
||||
class ChatController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
$roomId = $_GET['room'] ?? null;
|
||||
$sql = "SELECT c.id, c.pesan, c.created_at, u.nama_lengkap, u.id_role,
|
||||
cr.nama AS nama_room
|
||||
FROM chat c JOIN user u ON c.id_user=u.id
|
||||
LEFT JOIN chat_room cr ON c.id_room=cr.id
|
||||
WHERE " . ($roomId ? "c.id_room=?" : "c.id_room IS NULL") .
|
||||
" ORDER BY c.created_at DESC LIMIT 50";
|
||||
$stmt = $db->prepare($sql);
|
||||
$roomId ? $stmt->execute([$roomId]) : $stmt->execute();
|
||||
jsonSuccess(array_reverse($stmt->fetchAll()));
|
||||
}
|
||||
public function show(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
$rows = $db->query("SELECT id, nama, deskripsi FROM chat_room ORDER BY nama")->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$user = currentUser();
|
||||
$body = getBody();
|
||||
$errs = required($body, ['pesan']);
|
||||
if ($errs) jsonError(implode('; ',$errs));
|
||||
$db = getDB();
|
||||
$db->prepare("INSERT INTO chat (id_user, id_room, pesan) VALUES (?,?,?)")->execute([
|
||||
$user['id'],
|
||||
$body['id_room'] ?? null,
|
||||
sanitize($body['pesan']),
|
||||
]);
|
||||
jsonSuccess(['id' => $db->lastInsertId()], 'Pesan terkirim', 201);
|
||||
}
|
||||
public function update(string $id): void { jsonError('N/A',405); }
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
getDB()->prepare("DELETE FROM chat WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([],'Pesan dihapus');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
// api/controllers/DashboardController.php
|
||||
class DashboardController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
|
||||
// Ringkasan utama
|
||||
$stat = $db->query(
|
||||
"SELECT
|
||||
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup') AS total_penduduk,
|
||||
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='miskin') AS total_miskin,
|
||||
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='rentan') AS total_rentan,
|
||||
(SELECT COUNT(*) FROM penduduk WHERE status_hidup='hidup' AND status_ekonomi='mampu') AS total_mampu,
|
||||
(SELECT COUNT(*) FROM keluarga) AS total_kk,
|
||||
(SELECT COUNT(*) FROM rumah_ibadah WHERE aktif=1) AS total_ri,
|
||||
(SELECT COUNT(*) FROM laporan WHERE status='pending') AS laporan_pending,
|
||||
(SELECT COUNT(*) FROM laporan WHERE urgensi='darurat' AND status NOT IN('selesai')) AS laporan_darurat,
|
||||
(SELECT COUNT(DISTINCT nik) FROM histori_bantuan WHERE status_penyaluran='disalurkan') AS sudah_dibantu,
|
||||
(SELECT COUNT(*) FROM histori_bantuan WHERE MONTH(tanggal)=MONTH(CURDATE()) AND YEAR(tanggal)=YEAR(CURDATE())) AS bantuan_bulan_ini"
|
||||
)->fetch();
|
||||
|
||||
// Sebaran per kecamatan
|
||||
$kec = $db->query(
|
||||
"SELECT k.kecamatan,
|
||||
COUNT(DISTINCT k.id) AS jumlah_kk,
|
||||
SUM(CASE WHEN k.status_ekonomi='miskin' THEN 1 ELSE 0 END) AS miskin,
|
||||
SUM(CASE WHEN k.status_ekonomi='rentan' THEN 1 ELSE 0 END) AS rentan
|
||||
FROM keluarga k GROUP BY k.kecamatan ORDER BY miskin DESC"
|
||||
)->fetchAll();
|
||||
|
||||
// Trend bantuan 6 bulan
|
||||
$trend = $db->query(
|
||||
"SELECT DATE_FORMAT(tanggal,'%Y-%m') AS bulan, COUNT(*) AS jumlah
|
||||
FROM histori_bantuan
|
||||
WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
|
||||
GROUP BY bulan ORDER BY bulan"
|
||||
)->fetchAll();
|
||||
|
||||
// Belum pernah dibantu (miskin)
|
||||
$belum = $db->query(
|
||||
"SELECT COUNT(*) AS c FROM penduduk p
|
||||
WHERE p.status_ekonomi IN ('miskin','rentan')
|
||||
AND p.status_hidup='hidup'
|
||||
AND NOT EXISTS (SELECT 1 FROM histori_bantuan hb WHERE hb.nik=p.nik AND hb.status_penyaluran='disalurkan')"
|
||||
)->fetch()['c'];
|
||||
|
||||
// Prioritas darurat
|
||||
$prioritas = $db->query(
|
||||
"SELECT * FROM v_prioritas_bantuan
|
||||
WHERE level_prioritas IN ('SANGAT TINGGI','TINGGI')
|
||||
LIMIT 10"
|
||||
)->fetchAll();
|
||||
|
||||
// Beban per RI
|
||||
$bebanRI = $db->query(
|
||||
"SELECT ri.nama, ri.jenis,
|
||||
COUNT(DISTINCT k.id) AS jumlah_kk,
|
||||
SUM(CASE WHEN k.status_ekonomi='miskin' THEN 1 ELSE 0 END) AS kk_miskin
|
||||
FROM rumah_ibadah ri
|
||||
LEFT JOIN keluarga k ON k.id_rumah_ibadah=ri.id
|
||||
WHERE ri.aktif=1
|
||||
GROUP BY ri.id ORDER BY kk_miskin DESC"
|
||||
)->fetchAll();
|
||||
|
||||
jsonSuccess([
|
||||
'statistik' => $stat,
|
||||
'sebaran_kecamatan' => $kec,
|
||||
'trend_bantuan' => $trend,
|
||||
'belum_dibantu' => (int)$belum,
|
||||
'prioritas_darurat' => $prioritas,
|
||||
'beban_per_ri' => $bebanRI,
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(string $id): void { jsonError('Not implemented', 501); }
|
||||
public function store(): void { jsonError('Not implemented', 501); }
|
||||
public function update(string $id): void { jsonError('Not implemented', 501); }
|
||||
public function destroy(string $id): void { jsonError('Not implemented', 501); }
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
// api/controllers/HistoriController.php
|
||||
class HistoriController {
|
||||
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$sql = "SELECT hb.*, b.nama_bantuan, b.kategori,
|
||||
p.nama_lengkap, p.status_ekonomi,
|
||||
ri.nama AS nama_ri
|
||||
FROM histori_bantuan hb
|
||||
JOIN bantuan b ON hb.id_bantuan = b.id
|
||||
JOIN penduduk p ON hb.nik = p.nik
|
||||
LEFT JOIN rumah_ibadah ri ON hb.id_rumah_ibadah = ri.id
|
||||
WHERE 1=1";
|
||||
$params = [];
|
||||
if (!empty($_GET['nik'])) {
|
||||
$sql .= " AND hb.nik = ?"; $params[] = $_GET['nik'];
|
||||
}
|
||||
if (!empty($_GET['id_bantuan'])) {
|
||||
$sql .= " AND hb.id_bantuan = ?"; $params[] = (int)$_GET['id_bantuan'];
|
||||
}
|
||||
if (!empty($_GET['status'])) {
|
||||
$sql .= " AND hb.status_penyaluran = ?"; $params[] = $_GET['status'];
|
||||
}
|
||||
$sql .= " ORDER BY hb.tanggal DESC LIMIT 200";
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
jsonSuccess($stmt->fetchAll());
|
||||
}
|
||||
|
||||
public function show(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT hb.*, b.nama_bantuan, b.kategori, p.nama_lengkap, ri.nama AS nama_ri
|
||||
FROM histori_bantuan hb
|
||||
JOIN bantuan b ON hb.id_bantuan=b.id
|
||||
JOIN penduduk p ON hb.nik=p.nik
|
||||
LEFT JOIN rumah_ibadah ri ON hb.id_rumah_ibadah=ri.id
|
||||
WHERE hb.id=?"
|
||||
);
|
||||
$stmt->execute([$id]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Histori tidak ditemukan', 404);
|
||||
jsonSuccess($row);
|
||||
}
|
||||
|
||||
/** POST /api/histori — catat penyaluran bantuan */
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$errs = required($body, ['nik', 'id_bantuan', 'tanggal']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
|
||||
$user = currentUser();
|
||||
$db = getDB();
|
||||
|
||||
// Cek penduduk ada
|
||||
$chk = $db->prepare("SELECT nik FROM penduduk WHERE nik = ?");
|
||||
$chk->execute([$body['nik']]);
|
||||
if (!$chk->fetch()) jsonError('NIK penduduk tidak ditemukan', 404);
|
||||
|
||||
$db->prepare(
|
||||
"INSERT INTO histori_bantuan
|
||||
(nik, id_bantuan, id_rumah_ibadah, id_user, tanggal, jumlah, keterangan, status_penyaluran)
|
||||
VALUES (?,?,?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
$body['nik'],
|
||||
(int)$body['id_bantuan'],
|
||||
$body['id_rumah_ibadah'] ?? null,
|
||||
$user['id'],
|
||||
$body['tanggal'],
|
||||
(float)($body['jumlah'] ?? 1),
|
||||
sanitize($body['keterangan'] ?? ''),
|
||||
$body['status_penyaluran'] ?? 'disalurkan',
|
||||
]);
|
||||
$newId = $db->lastInsertId();
|
||||
logActivity('create_histori_bantuan', 'histori_bantuan', $newId, [], $body);
|
||||
jsonSuccess(['id' => $newId], 'Histori bantuan dicatat', 201);
|
||||
}
|
||||
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"UPDATE histori_bantuan SET status_penyaluran=?, keterangan=?, jumlah=? WHERE id=?"
|
||||
)->execute([
|
||||
$body['status_penyaluran'] ?? 'disalurkan',
|
||||
sanitize($body['keterangan'] ?? ''),
|
||||
(float)($body['jumlah'] ?? 1),
|
||||
$id,
|
||||
]);
|
||||
logActivity('update_histori_bantuan', 'histori_bantuan', $id, [], $body);
|
||||
jsonSuccess([], 'Histori bantuan diperbarui');
|
||||
}
|
||||
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$db->prepare("DELETE FROM histori_bantuan WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([], 'Histori bantuan dihapus');
|
||||
}
|
||||
|
||||
/** GET /api/histori/:nik/cek */
|
||||
public function cek(string $nik): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT COUNT(*) AS total,
|
||||
GROUP_CONCAT(DISTINCT b.nama_bantuan ORDER BY b.nama_bantuan SEPARATOR ', ') AS jenis_bantuan,
|
||||
MAX(hb.tanggal) AS terakhir_dibantu
|
||||
FROM histori_bantuan hb
|
||||
JOIN bantuan b ON hb.id_bantuan=b.id
|
||||
WHERE hb.nik=? AND hb.status_penyaluran='disalurkan'"
|
||||
);
|
||||
$stmt->execute([$nik]);
|
||||
jsonSuccess($stmt->fetch());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
// api/controllers/KeluargaController.php
|
||||
class KeluargaController {
|
||||
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$sql = "SELECT k.*, ri.nama AS nama_ri,
|
||||
COUNT(p.nik) AS jumlah_anggota,
|
||||
SUM(p.penghasilan) AS total_penghasilan,
|
||||
COUNT(DISTINCT hb.id) AS total_bantuan
|
||||
FROM keluarga k
|
||||
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
|
||||
LEFT JOIN penduduk p ON p.id_keluarga = k.id AND p.status_hidup='hidup'
|
||||
LEFT JOIN histori_bantuan hb ON hb.nik = p.nik
|
||||
WHERE 1=1";
|
||||
$params = [];
|
||||
if (!empty($_GET['status_ekonomi'])) {
|
||||
$sql .= " AND k.status_ekonomi = ?"; $params[] = $_GET['status_ekonomi'];
|
||||
}
|
||||
if (!empty($_GET['kecamatan'])) {
|
||||
$sql .= " AND k.kecamatan = ?"; $params[] = $_GET['kecamatan'];
|
||||
}
|
||||
$sql .= " GROUP BY k.id ORDER BY k.status_ekonomi, k.nama_kepala";
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
jsonSuccess($stmt->fetchAll());
|
||||
}
|
||||
|
||||
public function show(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT k.*, ri.nama AS nama_ri FROM keluarga k
|
||||
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
|
||||
WHERE k.id = ?"
|
||||
);
|
||||
$stmt->execute([$id]);
|
||||
$kk = $stmt->fetch();
|
||||
if (!$kk) jsonError('Keluarga tidak ditemukan', 404);
|
||||
|
||||
$anggota = $db->prepare(
|
||||
"SELECT nik, nama_lengkap, jenis_kelamin, status_keluarga,
|
||||
TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur,
|
||||
pekerjaan, penghasilan, status_ekonomi, kondisi_kesehatan,
|
||||
pendidikan_terakhir, status_pendidikan, status_hidup
|
||||
FROM penduduk WHERE id_keluarga = ? ORDER BY status_keluarga"
|
||||
);
|
||||
$anggota->execute([$id]);
|
||||
$kk['anggota'] = $anggota->fetchAll();
|
||||
jsonSuccess($kk);
|
||||
}
|
||||
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$errs = required($body, ['no_kk', 'nama_kepala']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
if (!preg_match('/^\d{16}$/', $body['no_kk'])) jsonError('No KK harus 16 digit');
|
||||
|
||||
$db = getDB();
|
||||
$chk = $db->prepare("SELECT id FROM keluarga WHERE no_kk = ?");
|
||||
$chk->execute([$body['no_kk']]);
|
||||
if ($chk->fetch()) jsonError('No KK sudah terdaftar', 409);
|
||||
|
||||
$db->prepare(
|
||||
"INSERT INTO keluarga (no_kk, id_rumah_ibadah, nama_kepala, alamat, rt, rw,
|
||||
kelurahan, kecamatan, lat, lng, status_ekonomi)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
$body['no_kk'],
|
||||
$body['id_rumah_ibadah'] ?? null,
|
||||
sanitize($body['nama_kepala']),
|
||||
sanitize($body['alamat'] ?? ''),
|
||||
sanitize($body['rt'] ?? ''),
|
||||
sanitize($body['rw'] ?? ''),
|
||||
sanitize($body['kelurahan'] ?? ''),
|
||||
sanitize($body['kecamatan'] ?? ''),
|
||||
$body['lat'] ?? null,
|
||||
$body['lng'] ?? null,
|
||||
$body['status_ekonomi'] ?? 'rentan',
|
||||
]);
|
||||
$newId = $db->lastInsertId();
|
||||
logActivity('create_keluarga', 'keluarga', $newId, [], $body);
|
||||
jsonSuccess(['id' => $newId], 'Data keluarga berhasil disimpan', 201);
|
||||
}
|
||||
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
$body = getBody();
|
||||
$db->prepare(
|
||||
"UPDATE keluarga SET id_rumah_ibadah=?, nama_kepala=?, alamat=?,
|
||||
rt=?, rw=?, kelurahan=?, kecamatan=?, lat=?, lng=?, status_ekonomi=?
|
||||
WHERE id=?"
|
||||
)->execute([
|
||||
$body['id_rumah_ibadah'] ?? null,
|
||||
sanitize($body['nama_kepala'] ?? ''),
|
||||
sanitize($body['alamat'] ?? ''),
|
||||
sanitize($body['rt'] ?? ''),
|
||||
sanitize($body['rw'] ?? ''),
|
||||
sanitize($body['kelurahan'] ?? ''),
|
||||
sanitize($body['kecamatan'] ?? ''),
|
||||
$body['lat'] ?? null,
|
||||
$body['lng'] ?? null,
|
||||
$body['status_ekonomi'] ?? 'rentan',
|
||||
$id,
|
||||
]);
|
||||
logActivity('update_keluarga', 'keluarga', $id, [], $body);
|
||||
jsonSuccess([], 'Data keluarga diperbarui');
|
||||
}
|
||||
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$chk = $db->prepare("SELECT COUNT(*) AS c FROM penduduk WHERE id_keluarga = ?");
|
||||
$chk->execute([$id]);
|
||||
if ($chk->fetch()['c'] > 0) jsonError('Tidak bisa hapus — masih ada anggota keluarga', 409);
|
||||
$db->prepare("DELETE FROM keluarga WHERE id = ?")->execute([$id]);
|
||||
logActivity('delete_keluarga', 'keluarga', $id);
|
||||
jsonSuccess([], 'Data keluarga dihapus');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
// api/controllers/LaporanController.php
|
||||
class LaporanController {
|
||||
|
||||
public function index(): void {
|
||||
$user = currentUser();
|
||||
// Masyarakat bisa lihat laporan mereka sendiri; pengurus+ lihat semua
|
||||
$db = getDB();
|
||||
$sql = "SELECT l.*, ri.nama AS nama_ri, p.nama_lengkap AS nama_terdampak
|
||||
FROM laporan l
|
||||
LEFT JOIN rumah_ibadah ri ON l.id_rumah_ibadah=ri.id
|
||||
LEFT JOIN penduduk p ON l.nik_terdampak=p.nik
|
||||
WHERE 1=1";
|
||||
$params = [];
|
||||
if (!empty($_GET['status'])) { $sql .= " AND l.status=?"; $params[] = $_GET['status']; }
|
||||
if (!empty($_GET['urgensi'])) { $sql .= " AND l.urgensi=?"; $params[] = $_GET['urgensi']; }
|
||||
$sql .= " ORDER BY FIELD(l.urgensi,'darurat','tinggi','sedang','rendah'), l.created_at DESC LIMIT 100";
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
jsonSuccess($stmt->fetchAll());
|
||||
}
|
||||
|
||||
public function show(string $id): void {
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT l.*, ri.nama AS nama_ri, p.nama_lengkap AS nama_terdampak
|
||||
FROM laporan l
|
||||
LEFT JOIN rumah_ibadah ri ON l.id_rumah_ibadah=ri.id
|
||||
LEFT JOIN penduduk p ON l.nik_terdampak=p.nik
|
||||
WHERE l.id=?"
|
||||
);
|
||||
$stmt->execute([$id]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Laporan tidak ditemukan', 404);
|
||||
jsonSuccess($row);
|
||||
}
|
||||
|
||||
/** POST /api/laporan — siapa saja bisa lapor */
|
||||
public function store(): void {
|
||||
$body = getBody();
|
||||
$errs = required($body, ['deskripsi']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"INSERT INTO laporan
|
||||
(nama_pelapor, no_hp_pelapor, nik_terdampak, id_rumah_ibadah,
|
||||
deskripsi, lat, lng, alamat_laporan, urgensi)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
sanitize($body['nama_pelapor'] ?? ''),
|
||||
sanitize($body['no_hp_pelapor'] ?? ''),
|
||||
$body['nik_terdampak'] ?? null,
|
||||
$body['id_rumah_ibadah'] ?? null,
|
||||
sanitize($body['deskripsi']),
|
||||
$body['lat'] ?? null,
|
||||
$body['lng'] ?? null,
|
||||
sanitize($body['alamat_laporan'] ?? ''),
|
||||
$body['urgensi'] ?? 'sedang',
|
||||
]);
|
||||
$newId = $db->lastInsertId();
|
||||
jsonSuccess(['id' => $newId], 'Laporan berhasil dikirim. Terima kasih!', 201);
|
||||
}
|
||||
|
||||
/** PUT /api/laporan/:id — verifikasi / update status */
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$user = currentUser();
|
||||
$body = getBody();
|
||||
$db = getDB();
|
||||
|
||||
$db->prepare(
|
||||
"UPDATE laporan SET status=?, catatan_verifikasi=?,
|
||||
id_verifikator=?, tgl_verifikasi=NOW()
|
||||
WHERE id=?"
|
||||
)->execute([
|
||||
$body['status'] ?? 'diverifikasi',
|
||||
sanitize($body['catatan_verifikasi'] ?? ''),
|
||||
$user['id'],
|
||||
$id,
|
||||
]);
|
||||
logActivity('update_laporan', 'laporan', $id, [], $body);
|
||||
jsonSuccess([], 'Status laporan diperbarui');
|
||||
}
|
||||
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
getDB()->prepare("DELETE FROM laporan WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([], 'Laporan dihapus');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
// api/controllers/LogController.php
|
||||
class LogController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$rows = $db->query(
|
||||
"SELECT l.*, u.nama_lengkap FROM log_aktivitas l
|
||||
LEFT JOIN user u ON l.id_user=u.id
|
||||
ORDER BY l.created_at DESC LIMIT 100"
|
||||
)->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void { jsonError('N/A',501); }
|
||||
public function store(): void { jsonError('N/A',405); }
|
||||
public function update(string $id): void { jsonError('N/A',405); }
|
||||
public function destroy(string $id): void { jsonError('N/A',405); }
|
||||
}
|
||||
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
// api/controllers/PendudukController.php
|
||||
class PendudukController {
|
||||
|
||||
/** GET /api/penduduk */
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
|
||||
$where = ['p.status_hidup = ?'];
|
||||
$params = ['hidup'];
|
||||
|
||||
// Filter
|
||||
if (!empty($_GET['status_ekonomi'])) {
|
||||
$where[] = 'p.status_ekonomi = ?';
|
||||
$params[] = $_GET['status_ekonomi'];
|
||||
}
|
||||
if (!empty($_GET['kecamatan'])) {
|
||||
$where[] = 'k.kecamatan = ?';
|
||||
$params[] = $_GET['kecamatan'];
|
||||
}
|
||||
if (!empty($_GET['id_keluarga'])) {
|
||||
$where[] = 'p.id_keluarga = ?';
|
||||
$params[] = (int)$_GET['id_keluarga'];
|
||||
}
|
||||
if (!empty($_GET['q'])) {
|
||||
$where[] = '(p.nama_lengkap LIKE ? OR p.nik LIKE ?)';
|
||||
$q = '%' . $_GET['q'] . '%';
|
||||
$params[] = $q; $params[] = $q;
|
||||
}
|
||||
|
||||
$sql = "SELECT p.nik, p.nama_lengkap, p.jenis_kelamin, p.tanggal_lahir,
|
||||
TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
|
||||
p.status_keluarga, p.status_perkawinan, p.status_hidup,
|
||||
p.agama, p.pekerjaan, p.penghasilan, p.status_ekonomi,
|
||||
p.pendidikan_terakhir, p.status_pendidikan, p.kondisi_kesehatan,
|
||||
p.lat, p.lng, p.id_keluarga, p.updated_at,
|
||||
k.no_kk, k.nama_kepala, k.alamat, k.rt, k.rw, k.kelurahan, k.kecamatan,
|
||||
ri.nama AS nama_ri, ri.jenis AS jenis_ri
|
||||
FROM penduduk p
|
||||
JOIN keluarga k ON p.id_keluarga = k.id
|
||||
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
|
||||
WHERE " . implode(' AND ', $where) . "
|
||||
ORDER BY p.status_ekonomi, p.nama_lengkap";
|
||||
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$rows = $stmt->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
|
||||
/** GET /api/penduduk/:nik */
|
||||
public function show(string $nik): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"SELECT p.*, TIMESTAMPDIFF(YEAR, p.tanggal_lahir, CURDATE()) AS umur,
|
||||
k.no_kk, k.nama_kepala, k.alamat, k.rt, k.rw, k.kelurahan, k.kecamatan,
|
||||
ri.nama AS nama_ri, ri.jenis AS jenis_ri
|
||||
FROM penduduk p
|
||||
JOIN keluarga k ON p.id_keluarga = k.id
|
||||
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah = ri.id
|
||||
WHERE p.nik = ?"
|
||||
);
|
||||
$stmt->execute([$nik]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Penduduk tidak ditemukan', 404);
|
||||
|
||||
// Histori bantuan
|
||||
$stmt2 = $db->prepare(
|
||||
"SELECT hb.*, b.nama_bantuan, b.kategori, ri.nama AS nama_ri
|
||||
FROM histori_bantuan hb
|
||||
JOIN bantuan b ON hb.id_bantuan = b.id
|
||||
LEFT JOIN rumah_ibadah ri ON hb.id_rumah_ibadah = ri.id
|
||||
WHERE hb.nik = ? ORDER BY hb.tanggal DESC"
|
||||
);
|
||||
$stmt2->execute([$nik]);
|
||||
$row['histori_bantuan'] = $stmt2->fetchAll();
|
||||
|
||||
// Riwayat pendidikan
|
||||
$stmt3 = $db->prepare("SELECT * FROM riwayat_pendidikan WHERE nik = ? ORDER BY tahun_masuk DESC");
|
||||
$stmt3->execute([$nik]);
|
||||
$row['riwayat_pendidikan'] = $stmt3->fetchAll();
|
||||
|
||||
// Peristiwa
|
||||
$stmt4 = $db->prepare("SELECT * FROM peristiwa_kependudukan WHERE nik = ? ORDER BY tanggal DESC");
|
||||
$stmt4->execute([$nik]);
|
||||
$row['peristiwa'] = $stmt4->fetchAll();
|
||||
|
||||
jsonSuccess($row);
|
||||
}
|
||||
|
||||
/** POST /api/penduduk */
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
|
||||
$errs = required($body, ['nik','id_keluarga','nama_lengkap','jenis_kelamin','tanggal_lahir']);
|
||||
if ($errs) jsonError(implode('; ', $errs));
|
||||
|
||||
// Validasi NIK 16 digit
|
||||
if (!preg_match('/^\d{16}$/', $body['nik'])) jsonError('NIK harus 16 digit angka');
|
||||
|
||||
$db = getDB();
|
||||
|
||||
// Cek duplikat
|
||||
$chk = $db->prepare("SELECT nik FROM penduduk WHERE nik = ?");
|
||||
$chk->execute([$body['nik']]);
|
||||
if ($chk->fetch()) jsonError('NIK sudah terdaftar', 409);
|
||||
|
||||
// Hitung umur
|
||||
$tgl = new DateTime($body['tanggal_lahir']);
|
||||
$umur = (new DateTime())->diff($tgl)->y;
|
||||
|
||||
// Validasi pendidikan
|
||||
$warnings = validasiPendidikan(
|
||||
$umur,
|
||||
$body['pendidikan_terakhir'] ?? 'tidak_sekolah',
|
||||
$body['status_pendidikan'] ?? 'tidak_sekolah'
|
||||
);
|
||||
|
||||
$db->prepare(
|
||||
"INSERT INTO penduduk
|
||||
(nik, id_keluarga, nama_lengkap, jenis_kelamin, tanggal_lahir, tempat_lahir,
|
||||
status_keluarga, status_perkawinan, status_hidup, agama, pekerjaan, penghasilan,
|
||||
status_ekonomi, pendidikan_terakhir, status_pendidikan, kondisi_kesehatan,
|
||||
keterangan_kesehatan, lat, lng)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
$body['nik'],
|
||||
(int)$body['id_keluarga'],
|
||||
sanitize($body['nama_lengkap']),
|
||||
$body['jenis_kelamin'],
|
||||
$body['tanggal_lahir'],
|
||||
sanitize($body['tempat_lahir'] ?? ''),
|
||||
$body['status_keluarga'] ?? 'anak',
|
||||
$body['status_perkawinan'] ?? 'belum_kawin',
|
||||
$body['status_hidup'] ?? 'hidup',
|
||||
$body['agama'] ?? null,
|
||||
sanitize($body['pekerjaan'] ?? ''),
|
||||
(int)($body['penghasilan'] ?? 0),
|
||||
$body['status_ekonomi'] ?? 'rentan',
|
||||
$body['pendidikan_terakhir'] ?? 'tidak_sekolah',
|
||||
$body['status_pendidikan'] ?? 'tidak_sekolah',
|
||||
$body['kondisi_kesehatan'] ?? 'sehat',
|
||||
sanitize($body['keterangan_kesehatan'] ?? ''),
|
||||
$body['lat'] ?? null,
|
||||
$body['lng'] ?? null,
|
||||
]);
|
||||
|
||||
logActivity('create_penduduk', 'penduduk', $body['nik'], [], $body);
|
||||
jsonSuccess(['nik' => $body['nik'], 'warnings' => $warnings], 'Data penduduk berhasil disimpan', 201);
|
||||
}
|
||||
|
||||
/** PUT /api/penduduk/:nik */
|
||||
public function update(string $nik): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
|
||||
$old = $db->prepare("SELECT * FROM penduduk WHERE nik = ?");
|
||||
$old->execute([$nik]);
|
||||
$existing = $old->fetch();
|
||||
if (!$existing) jsonError('Penduduk tidak ditemukan', 404);
|
||||
|
||||
$body = getBody();
|
||||
|
||||
$tgl = new DateTime($body['tanggal_lahir'] ?? $existing['tanggal_lahir']);
|
||||
$umur = (new DateTime())->diff($tgl)->y;
|
||||
$warnings = validasiPendidikan(
|
||||
$umur,
|
||||
$body['pendidikan_terakhir'] ?? $existing['pendidikan_terakhir'],
|
||||
$body['status_pendidikan'] ?? $existing['status_pendidikan']
|
||||
);
|
||||
|
||||
$db->prepare(
|
||||
"UPDATE penduduk SET
|
||||
nama_lengkap=?, jenis_kelamin=?, tanggal_lahir=?, tempat_lahir=?,
|
||||
status_keluarga=?, status_perkawinan=?, status_hidup=?, agama=?,
|
||||
pekerjaan=?, penghasilan=?, status_ekonomi=?,
|
||||
pendidikan_terakhir=?, status_pendidikan=?,
|
||||
kondisi_kesehatan=?, keterangan_kesehatan=?, lat=?, lng=?
|
||||
WHERE nik=?"
|
||||
)->execute([
|
||||
sanitize($body['nama_lengkap'] ?? $existing['nama_lengkap']),
|
||||
$body['jenis_kelamin'] ?? $existing['jenis_kelamin'],
|
||||
$body['tanggal_lahir'] ?? $existing['tanggal_lahir'],
|
||||
sanitize($body['tempat_lahir'] ?? $existing['tempat_lahir']),
|
||||
$body['status_keluarga'] ?? $existing['status_keluarga'],
|
||||
$body['status_perkawinan'] ?? $existing['status_perkawinan'],
|
||||
$body['status_hidup'] ?? $existing['status_hidup'],
|
||||
$body['agama'] ?? $existing['agama'],
|
||||
sanitize($body['pekerjaan'] ?? $existing['pekerjaan']),
|
||||
(int)($body['penghasilan'] ?? $existing['penghasilan']),
|
||||
$body['status_ekonomi'] ?? $existing['status_ekonomi'],
|
||||
$body['pendidikan_terakhir'] ?? $existing['pendidikan_terakhir'],
|
||||
$body['status_pendidikan'] ?? $existing['status_pendidikan'],
|
||||
$body['kondisi_kesehatan'] ?? $existing['kondisi_kesehatan'],
|
||||
sanitize($body['keterangan_kesehatan'] ?? $existing['keterangan_kesehatan']),
|
||||
$body['lat'] ?? $existing['lat'],
|
||||
$body['lng'] ?? $existing['lng'],
|
||||
$nik,
|
||||
]);
|
||||
|
||||
logActivity('update_penduduk', 'penduduk', $nik, $existing, $body);
|
||||
jsonSuccess(['nik' => $nik, 'warnings' => $warnings], 'Data penduduk berhasil diperbarui');
|
||||
}
|
||||
|
||||
/** DELETE /api/penduduk/:nik */
|
||||
public function destroy(string $nik): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare("SELECT nik FROM penduduk WHERE nik = ?");
|
||||
$stmt->execute([$nik]);
|
||||
if (!$stmt->fetch()) jsonError('Penduduk tidak ditemukan', 404);
|
||||
|
||||
$db->prepare("DELETE FROM penduduk WHERE nik = ?")->execute([$nik]);
|
||||
logActivity('delete_penduduk', 'penduduk', $nik);
|
||||
jsonSuccess([], 'Data penduduk dihapus');
|
||||
}
|
||||
|
||||
/** GET /api/penduduk/:nik/validasi-pendidikan */
|
||||
public function validasiPendidikan(string $nik): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT nik, nama_lengkap,
|
||||
TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE()) AS umur,
|
||||
pendidikan_terakhir, status_pendidikan
|
||||
FROM penduduk WHERE nik = ?"
|
||||
);
|
||||
$stmt->execute([$nik]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Penduduk tidak ditemukan', 404);
|
||||
|
||||
$warnings = validasiPendidikan($row['umur'], $row['pendidikan_terakhir'], $row['status_pendidikan']);
|
||||
jsonSuccess(['penduduk' => $row, 'warnings' => $warnings]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
// api/controllers/PeristiwaController.php
|
||||
class PeristiwaController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$rows = $db->query(
|
||||
"SELECT pk.*, p.nama_lengkap FROM peristiwa_kependudukan pk
|
||||
JOIN penduduk p ON pk.nik=p.nik
|
||||
ORDER BY pk.tanggal DESC LIMIT 100"
|
||||
)->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void { jsonError('N/A',501); }
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$user = currentUser();
|
||||
$body = getBody();
|
||||
$errs = required($body, ['nik','jenis','tanggal']);
|
||||
if ($errs) jsonError(implode('; ',$errs));
|
||||
$db = getDB();
|
||||
|
||||
$db->prepare(
|
||||
"INSERT INTO peristiwa_kependudukan (nik,jenis,tanggal,keterangan,id_user)
|
||||
VALUES (?,?,?,?,?)"
|
||||
)->execute([
|
||||
$body['nik'], $body['jenis'], $body['tanggal'],
|
||||
sanitize($body['keterangan'] ?? ''), $user['id'],
|
||||
]);
|
||||
|
||||
// Otomatis update status penduduk
|
||||
switch ($body['jenis']) {
|
||||
case 'kematian':
|
||||
$db->prepare("UPDATE penduduk SET status_hidup='meninggal' WHERE nik=?")->execute([$body['nik']]);
|
||||
break;
|
||||
case 'pernikahan':
|
||||
$db->prepare("UPDATE penduduk SET status_perkawinan='kawin' WHERE nik=?")->execute([$body['nik']]);
|
||||
break;
|
||||
case 'perceraian':
|
||||
$db->prepare("UPDATE penduduk SET status_perkawinan='cerai_hidup' WHERE nik=?")->execute([$body['nik']]);
|
||||
break;
|
||||
}
|
||||
|
||||
logActivity('peristiwa_'.$body['jenis'], 'penduduk', $body['nik'], [], $body);
|
||||
jsonSuccess(['id' => $db->lastInsertId()], 'Peristiwa dicatat', 201);
|
||||
}
|
||||
public function update(string $id): void { jsonError('N/A',405); }
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
getDB()->prepare("DELETE FROM peristiwa_kependudukan WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([],'Peristiwa dihapus');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
// api/controllers/PetaController.php
|
||||
// Returns GeoJSON-ready data for Leaflet
|
||||
class PetaController {
|
||||
public function index(): void {
|
||||
$db = getDB();
|
||||
$layer = $_GET['layer'] ?? 'penduduk';
|
||||
|
||||
if ($layer === 'rumah_ibadah') {
|
||||
$rows = $db->query("SELECT id,nama,jenis,lat,lng,radius_meter,alamat FROM rumah_ibadah WHERE aktif=1 AND lat IS NOT NULL")->fetchAll();
|
||||
$features = [];
|
||||
foreach ($rows as $r) {
|
||||
$features[] = [
|
||||
'type' => 'Feature',
|
||||
'geometry' => ['type'=>'Point','coordinates'=>[(float)$r['lng'],(float)$r['lat']]],
|
||||
'properties' => $r,
|
||||
];
|
||||
}
|
||||
jsonSuccess(['type'=>'FeatureCollection','features'=>$features]);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($layer === 'laporan') {
|
||||
$rows = $db->query(
|
||||
"SELECT id,nama_pelapor,deskripsi,lat,lng,urgensi,status,alamat_laporan FROM laporan
|
||||
WHERE lat IS NOT NULL ORDER BY FIELD(urgensi,'darurat','tinggi','sedang','rendah')"
|
||||
)->fetchAll();
|
||||
$features = [];
|
||||
foreach ($rows as $r) {
|
||||
$features[] = [
|
||||
'type' => 'Feature',
|
||||
'geometry' => ['type'=>'Point','coordinates'=>[(float)$r['lng'],(float)$r['lat']]],
|
||||
'properties' => $r,
|
||||
];
|
||||
}
|
||||
jsonSuccess(['type'=>'FeatureCollection','features'=>$features]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Default: penduduk (keluarga sebagai titik)
|
||||
$sql = "SELECT k.id, k.no_kk, k.nama_kepala, k.alamat, k.kecamatan,
|
||||
k.lat, k.lng, k.status_ekonomi,
|
||||
ri.nama AS nama_ri,
|
||||
COUNT(p.nik) AS jumlah_anggota,
|
||||
COUNT(DISTINCT hb.id) AS total_bantuan
|
||||
FROM keluarga k
|
||||
LEFT JOIN rumah_ibadah ri ON k.id_rumah_ibadah=ri.id
|
||||
LEFT JOIN penduduk p ON p.id_keluarga=k.id AND p.status_hidup='hidup'
|
||||
LEFT JOIN histori_bantuan hb ON hb.nik=p.nik
|
||||
WHERE k.lat IS NOT NULL";
|
||||
$params = [];
|
||||
if (!empty($_GET['status_ekonomi'])) {
|
||||
$sql .= " AND k.status_ekonomi=?"; $params[] = $_GET['status_ekonomi'];
|
||||
}
|
||||
$sql .= " GROUP BY k.id";
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$rows = $stmt->fetchAll();
|
||||
|
||||
$features = [];
|
||||
foreach ($rows as $r) {
|
||||
$color = match($r['status_ekonomi']) {
|
||||
'miskin' => '#ef4444',
|
||||
'rentan' => '#f59e0b',
|
||||
default => '#22c55e',
|
||||
};
|
||||
$r['color'] = $color;
|
||||
$features[] = [
|
||||
'type' => 'Feature',
|
||||
'geometry' => ['type'=>'Point','coordinates'=>[(float)$r['lng'],(float)$r['lat']]],
|
||||
'properties' => $r,
|
||||
];
|
||||
}
|
||||
jsonSuccess(['type'=>'FeatureCollection','features'=>$features]);
|
||||
}
|
||||
public function show(string $id): void { jsonError('Not implemented', 501); }
|
||||
public function store(): void { jsonError('Not implemented', 501); }
|
||||
public function update(string $id): void { jsonError('Not implemented', 501); }
|
||||
public function destroy(string $id): void { jsonError('Not implemented', 501); }
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
// api/controllers/PrioritasController.php
|
||||
class PrioritasController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS, ROLE_PIMPINAN]);
|
||||
$db = getDB();
|
||||
$rows = $db->query("SELECT * FROM v_prioritas_bantuan ORDER BY FIELD(level_prioritas,'SANGAT TINGGI','TINGGI','SEDANG','RENDAH'), jumlah_dibantu ASC")->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void { jsonError('N/A',501); }
|
||||
public function store(): void { jsonError('N/A',501); }
|
||||
public function update(string $id): void { jsonError('N/A',501); }
|
||||
public function destroy(string $id): void { jsonError('N/A',501); }
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// api/controllers/ChatController.php (in same file for brevity)
|
||||
// ----------------------------------------------------------------
|
||||
// Normally in its own file — included separately below
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
// api/controllers/RumahIbadahController.php
|
||||
class RumahIbadahController {
|
||||
public function index(): void {
|
||||
$db = getDB();
|
||||
$rows = $db->query(
|
||||
"SELECT ri.*, u.nama_lengkap AS nama_pengurus,
|
||||
COUNT(DISTINCT k.id) AS jumlah_kk,
|
||||
COUNT(DISTINCT p.nik) AS jumlah_penduduk
|
||||
FROM rumah_ibadah ri
|
||||
LEFT JOIN user u ON ri.id_user=u.id
|
||||
LEFT JOIN keluarga k ON k.id_rumah_ibadah=ri.id
|
||||
LEFT JOIN penduduk p ON p.id_keluarga=k.id AND p.status_hidup='hidup'
|
||||
WHERE ri.aktif=1
|
||||
GROUP BY ri.id ORDER BY ri.jenis, ri.nama"
|
||||
)->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void {
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare("SELECT ri.*, u.nama_lengkap AS nama_pengurus FROM rumah_ibadah ri LEFT JOIN user u ON ri.id_user=u.id WHERE ri.id=?");
|
||||
$stmt->execute([$id]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('Rumah ibadah tidak ditemukan', 404);
|
||||
jsonSuccess($row);
|
||||
}
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$errs = required($body, ['nama','jenis','lat','lng']);
|
||||
if ($errs) jsonError(implode('; ',$errs));
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"INSERT INTO rumah_ibadah (id_user,nama,jenis,alamat,lat,lng,radius_meter,kontak,kecamatan,kelurahan)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
$body['id_user'] ?? null,
|
||||
sanitize($body['nama']),
|
||||
$body['jenis'],
|
||||
sanitize($body['alamat'] ?? ''),
|
||||
$body['lat'], $body['lng'],
|
||||
(int)($body['radius_meter'] ?? 300),
|
||||
sanitize($body['kontak'] ?? ''),
|
||||
sanitize($body['kecamatan'] ?? ''),
|
||||
sanitize($body['kelurahan'] ?? ''),
|
||||
]);
|
||||
jsonSuccess(['id' => $db->lastInsertId()], 'Rumah ibadah ditambahkan', 201);
|
||||
}
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN, ROLE_PENGURUS]);
|
||||
$body = getBody();
|
||||
$db = getDB();
|
||||
$db->prepare(
|
||||
"UPDATE rumah_ibadah SET nama=?,jenis=?,alamat=?,lat=?,lng=?,radius_meter=?,kontak=?,kecamatan=?,kelurahan=? WHERE id=?"
|
||||
)->execute([
|
||||
sanitize($body['nama'] ?? ''),
|
||||
$body['jenis'] ?? 'Masjid',
|
||||
sanitize($body['alamat'] ?? ''),
|
||||
$body['lat'] ?? 0, $body['lng'] ?? 0,
|
||||
(int)($body['radius_meter'] ?? 300),
|
||||
sanitize($body['kontak'] ?? ''),
|
||||
sanitize($body['kecamatan'] ?? ''),
|
||||
sanitize($body['kelurahan'] ?? ''),
|
||||
$id,
|
||||
]);
|
||||
jsonSuccess([], 'Rumah ibadah diperbarui');
|
||||
}
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
getDB()->prepare("UPDATE rumah_ibadah SET aktif=0 WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([], 'Rumah ibadah dinonaktifkan');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
// api/controllers/UserController.php
|
||||
class UserController {
|
||||
public function index(): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$rows = $db->query(
|
||||
"SELECT u.id, u.username, u.nama_lengkap, u.email, u.no_hp,
|
||||
u.aktif, u.last_login, u.created_at, r.nama_role
|
||||
FROM user u JOIN role r ON u.id_role=r.id ORDER BY r.id, u.nama_lengkap"
|
||||
)->fetchAll();
|
||||
jsonSuccess($rows);
|
||||
}
|
||||
public function show(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare(
|
||||
"SELECT u.id, u.username, u.nama_lengkap, u.email, u.no_hp, u.aktif, r.nama_role
|
||||
FROM user u JOIN role r ON u.id_role=r.id WHERE u.id=?"
|
||||
);
|
||||
$stmt->execute([$id]);
|
||||
$row = $stmt->fetch();
|
||||
if (!$row) jsonError('User tidak ditemukan',404);
|
||||
jsonSuccess($row);
|
||||
}
|
||||
public function store(): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$body = getBody();
|
||||
$errs = required($body, ['username','password','nama_lengkap','id_role']);
|
||||
if ($errs) jsonError(implode('; ',$errs));
|
||||
if (strlen($body['password']) < 6) jsonError('Password minimal 6 karakter');
|
||||
$db = getDB();
|
||||
$chk = $db->prepare("SELECT id FROM user WHERE username=?");
|
||||
$chk->execute([$body['username']]);
|
||||
if ($chk->fetch()) jsonError('Username sudah dipakai',409);
|
||||
$db->prepare(
|
||||
"INSERT INTO user (id_role,username,password_hash,nama_lengkap,email,no_hp)
|
||||
VALUES (?,?,?,?,?,?)"
|
||||
)->execute([
|
||||
(int)$body['id_role'],
|
||||
sanitize($body['username']),
|
||||
password_hash($body['password'], PASSWORD_BCRYPT),
|
||||
sanitize($body['nama_lengkap']),
|
||||
sanitize($body['email'] ?? ''),
|
||||
sanitize($body['no_hp'] ?? ''),
|
||||
]);
|
||||
jsonSuccess(['id' => $db->lastInsertId()], 'User dibuat',201);
|
||||
}
|
||||
public function update(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
$body = getBody();
|
||||
$db = getDB();
|
||||
$sets = ["nama_lengkap=?","email=?","no_hp=?","id_role=?","aktif=?"];
|
||||
$vals = [
|
||||
sanitize($body['nama_lengkap'] ?? ''),
|
||||
sanitize($body['email'] ?? ''),
|
||||
sanitize($body['no_hp'] ?? ''),
|
||||
(int)($body['id_role'] ?? 4),
|
||||
(int)($body['aktif'] ?? 1),
|
||||
];
|
||||
if (!empty($body['password'])) {
|
||||
$sets[] = "password_hash=?";
|
||||
$vals[] = password_hash($body['password'], PASSWORD_BCRYPT);
|
||||
}
|
||||
$vals[] = $id;
|
||||
$db->prepare("UPDATE user SET " . implode(',',$sets) . " WHERE id=?")->execute($vals);
|
||||
jsonSuccess([],'User diperbarui');
|
||||
}
|
||||
public function destroy(string $id): void {
|
||||
requireAuth([ROLE_ADMIN]);
|
||||
getDB()->prepare("UPDATE user SET aktif=0 WHERE id=?")->execute([$id]);
|
||||
jsonSuccess([],'User dinonaktifkan');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,417 @@
|
||||
<?php
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
|
||||
|
||||
require_once __DIR__ . '/../config/app.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
// Support 2 cara routing:
|
||||
// 1. ?r=resource/id (dipakai api.js baru)
|
||||
// 2. RewriteRule /api/resource/id (htaccess)
|
||||
if (!empty($_GET['r'])) {
|
||||
$uri = trim($_GET['r'], '/');
|
||||
} else {
|
||||
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
$uri = preg_replace('#^.*/api(?:/index\.php)?#', '', $uri);
|
||||
$uri = trim($uri, '/');
|
||||
}
|
||||
|
||||
$segments = explode('/', $uri);
|
||||
$resource = $segments[0] ?? '';
|
||||
$id = $segments[1] ?? null;
|
||||
$action = $segments[2] ?? null;
|
||||
|
||||
// Coba koneksi DB — jika gagal, pakai demo mode
|
||||
$dbOk = false;
|
||||
try {
|
||||
require_once __DIR__ . '/../config/database.php';
|
||||
$testDb = getDB();
|
||||
$testDb->query("SELECT 1");
|
||||
$dbOk = true;
|
||||
require_once __DIR__ . '/../includes/helpers.php';
|
||||
} catch (Throwable $e) {
|
||||
// DB tidak tersedia — pakai demo mode
|
||||
$dbOk = false;
|
||||
}
|
||||
|
||||
// ── DEMO MODE (tanpa database) ──────────────────────────────
|
||||
if (!$dbOk) {
|
||||
demoRouter($resource, $id, $action, $method);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ── LIVE MODE ───────────────────────────────────────────────
|
||||
$routes = [
|
||||
'auth' => 'AuthController',
|
||||
'penduduk' => 'PendudukController',
|
||||
'keluarga' => 'KeluargaController',
|
||||
'bantuan' => 'BantuanController',
|
||||
'histori' => 'HistoriController',
|
||||
'laporan' => 'LaporanController',
|
||||
'rumah-ibadah' => 'RumahIbadahController',
|
||||
'user' => 'UserController',
|
||||
'dashboard' => 'DashboardController',
|
||||
'chat' => 'ChatController',
|
||||
'log' => 'LogController',
|
||||
'peta' => 'PetaController',
|
||||
'prioritas' => 'PrioritasController',
|
||||
'peristiwa' => 'PeristiwaController',
|
||||
];
|
||||
|
||||
if (!isset($routes[$resource])) {
|
||||
http_response_code(404);
|
||||
echo json_encode(['success'=>false,'message'=>"Endpoint '$resource' tidak ditemukan"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$cls = $routes[$resource];
|
||||
$file = __DIR__ . "/controllers/{$cls}.php";
|
||||
if (!file_exists($file)) {
|
||||
http_response_code(500);
|
||||
echo json_encode(['success'=>false,'message'=>"Controller $cls tidak ada"]);
|
||||
exit;
|
||||
}
|
||||
require_once $file;
|
||||
$ctrl = new $cls();
|
||||
|
||||
switch ($method) {
|
||||
case 'GET':
|
||||
if ($id && $action) method_exists($ctrl,$action) ? $ctrl->$action($id) : jsonError("Aksi tidak ada",404);
|
||||
elseif ($id) $ctrl->show($id);
|
||||
else $ctrl->index();
|
||||
break;
|
||||
case 'POST':
|
||||
if ($id && $action) method_exists($ctrl,$action) ? $ctrl->$action($id) : jsonError("Aksi tidak ada",404);
|
||||
else $ctrl->store();
|
||||
break;
|
||||
case 'PUT': $id ? $ctrl->update($id) : jsonError('ID diperlukan',400); break;
|
||||
case 'DELETE': $id ? $ctrl->destroy($id): jsonError('ID diperlukan',400); break;
|
||||
default: jsonError('Method tidak diizinkan',405);
|
||||
}
|
||||
|
||||
function jsonError($msg,$code=400){
|
||||
http_response_code($code);
|
||||
echo json_encode(['success'=>false,'message'=>$msg]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// DEMO ROUTER — berjalan tanpa database sama sekali
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
function demoRouter($resource, $id, $action, $method) {
|
||||
$body = json_decode(file_get_contents('php://input'), true) ?? [];
|
||||
|
||||
// Session sederhana
|
||||
if (session_status() === PHP_SESSION_NONE) { session_name('webgis_demo'); session_start(); }
|
||||
|
||||
// ── AUTH ──
|
||||
if ($resource === 'auth') {
|
||||
if ($method === 'GET' && $id === 'me') {
|
||||
$u = $_SESSION['demo_user'] ?? null;
|
||||
if ($u) ok($u); else err('Belum login',401);
|
||||
}
|
||||
if ($method === 'POST') {
|
||||
$users = demoUsers();
|
||||
$un = $body['username'] ?? ''; $pw = $body['password'] ?? '';
|
||||
foreach ($users as $u) {
|
||||
if ($u['username'] === $un && $pw === 'admin123') {
|
||||
$_SESSION['demo_user'] = $u;
|
||||
ok($u, 'Login berhasil'); return;
|
||||
}
|
||||
}
|
||||
err('Username atau password salah', 401);
|
||||
}
|
||||
if ($method === 'DELETE') {
|
||||
session_destroy(); ok([], 'Logout berhasil');
|
||||
}
|
||||
err('Not found',404);
|
||||
}
|
||||
|
||||
// ── DASHBOARD ──
|
||||
if ($resource === 'dashboard') {
|
||||
ok([
|
||||
'statistik' => ['total_penduduk'=>14,'total_miskin'=>6,'total_rentan'=>4,'total_mampu'=>2,'total_kk'=>8,'total_ri'=>6,'laporan_pending'=>2,'laporan_darurat'=>1,'sudah_dibantu'=>5,'bantuan_bulan_ini'=>3],
|
||||
'sebaran_kecamatan' => [
|
||||
['kecamatan'=>'Pontianak Timur','jumlah_kk'=>2,'miskin'=>2,'rentan'=>1],
|
||||
['kecamatan'=>'Pontianak Selatan','jumlah_kk'=>3,'miskin'=>2,'rentan'=>2],
|
||||
['kecamatan'=>'Pontianak Kota','jumlah_kk'=>3,'miskin'=>2,'rentan'=>1],
|
||||
],
|
||||
'trend_bantuan' => [
|
||||
['bulan'=>'2025-01','jumlah'=>2],['bulan'=>'2025-02','jumlah'=>1],
|
||||
['bulan'=>'2025-03','jumlah'=>3],['bulan'=>'2025-04','jumlah'=>1],['bulan'=>'2025-05','jumlah'=>2],
|
||||
],
|
||||
'belum_dibantu' => 4,
|
||||
'prioritas_darurat' => [
|
||||
['nik'=>'6171010101010006','nama_lengkap'=>'Maria Magdalena','umur'=>54,'kondisi_kesehatan'=>'sakit_berat','status_ekonomi'=>'miskin','kecamatan'=>'Pontianak Selatan','jumlah_dibantu'=>1,'level_prioritas'=>'SANGAT TINGGI'],
|
||||
['nik'=>'6171010101010014','nama_lengkap'=>'Tan Eng Huat','umur'=>65,'kondisi_kesehatan'=>'disabilitas','status_ekonomi'=>'miskin','kecamatan'=>'Pontianak Kota','jumlah_dibantu'=>1,'level_prioritas'=>'SANGAT TINGGI'],
|
||||
['nik'=>'6171010101010010','nama_lengkap'=>'Lim Ah Kow','umur'=>59,'kondisi_kesehatan'=>'sakit_berat','status_ekonomi'=>'miskin','kecamatan'=>'Pontianak Kota','jumlah_dibantu'=>1,'level_prioritas'=>'TINGGI'],
|
||||
],
|
||||
'beban_per_ri' => [
|
||||
["nama"=>"Masjid Jami'",'jumlah_kk'=>3,'kk_miskin'=>2],
|
||||
['nama'=>'Katedral','jumlah_kk'=>2,'kk_miskin'=>2],
|
||||
['nama'=>'Mujahidin','jumlah_kk'=>1,'kk_miskin'=>1],
|
||||
['nama'=>'Vihara','jumlah_kk'=>2,'kk_miskin'=>2],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
// ── PENDUDUK ──
|
||||
if ($resource === 'penduduk') {
|
||||
if ($method === 'GET') {
|
||||
if ($id) ok(demoPendudukDetail($id));
|
||||
else ok(demoPenduduk());
|
||||
}
|
||||
if ($method === 'POST') ok(['nik'=>$body['nik']??''], 'Penduduk ditambahkan (demo)', 201);
|
||||
if ($method === 'PUT') ok([], 'Penduduk diperbarui (demo)');
|
||||
if ($method === 'DELETE') ok([], 'Penduduk dihapus (demo)');
|
||||
}
|
||||
|
||||
// ── KELUARGA ──
|
||||
if ($resource === 'keluarga') {
|
||||
if ($method === 'GET') {
|
||||
if ($id) ok(['id'=>$id,'no_kk'=>'6171010101010001','nama_kepala'=>'Ahmad Suryana','anggota'=>[]]);
|
||||
else ok(demoKeluarga());
|
||||
}
|
||||
if ($method === 'POST') ok(['id'=>99], 'KK ditambahkan (demo)', 201);
|
||||
if ($method === 'PUT') ok([], 'KK diperbarui (demo)');
|
||||
if ($method === 'DELETE') ok([], 'KK dihapus (demo)');
|
||||
}
|
||||
|
||||
// ── BANTUAN ──
|
||||
if ($resource === 'bantuan') {
|
||||
if ($method === 'GET') ok(demoBantuan());
|
||||
if ($method === 'POST') ok(['id'=>99], 'Bantuan ditambahkan (demo)', 201);
|
||||
if ($method === 'DELETE') ok([], 'Bantuan dihapus (demo)');
|
||||
}
|
||||
|
||||
// ── HISTORI ──
|
||||
if ($resource === 'histori') {
|
||||
if ($method === 'GET') {
|
||||
if ($action === 'cek') ok(['total'=>1,'jenis_bantuan'=>'Sembako Ramadan','terakhir_dibantu'=>'2025-03-15']);
|
||||
else ok(demoHistori());
|
||||
}
|
||||
if ($method === 'POST') ok(['id'=>99], 'Bantuan dicatat (demo)', 201);
|
||||
}
|
||||
|
||||
// ── LAPORAN ──
|
||||
if ($resource === 'laporan') {
|
||||
if ($method === 'GET') ok(demoLaporan());
|
||||
if ($method === 'POST') ok(['id'=>99], 'Laporan dikirim (demo)', 201);
|
||||
if ($method === 'PUT') ok([], 'Status diperbarui (demo)');
|
||||
if ($method === 'DELETE') ok([], 'Dihapus (demo)');
|
||||
}
|
||||
|
||||
// ── RUMAH IBADAH ──
|
||||
if ($resource === 'rumah-ibadah') {
|
||||
if ($method === 'GET') ok(demoRI());
|
||||
if ($method === 'POST') ok(['id'=>99], 'RI ditambahkan (demo)', 201);
|
||||
if ($method === 'PUT') ok([], 'RI diperbarui (demo)');
|
||||
if ($method === 'DELETE') ok([], 'RI dihapus (demo)');
|
||||
}
|
||||
|
||||
// ── PETA ──
|
||||
if ($resource === 'peta') {
|
||||
$layer = $_GET['layer'] ?? 'penduduk';
|
||||
if ($layer === 'penduduk') {
|
||||
$features = array_map(fn($p) => [
|
||||
'type'=>'Feature',
|
||||
'geometry'=>['type'=>'Point','coordinates'=>[$p['lng'],$p['lat']]],
|
||||
'properties'=>$p
|
||||
], demoPetaPenduduk());
|
||||
ok(['type'=>'FeatureCollection','features'=>$features]);
|
||||
}
|
||||
if ($layer === 'rumah_ibadah') {
|
||||
$features = array_map(fn($r) => [
|
||||
'type'=>'Feature',
|
||||
'geometry'=>['type'=>'Point','coordinates'=>[$r['lng'],$r['lat']]],
|
||||
'properties'=>$r
|
||||
], demoPetaRI());
|
||||
ok(['type'=>'FeatureCollection','features'=>$features]);
|
||||
}
|
||||
if ($layer === 'laporan') {
|
||||
ok(['type'=>'FeatureCollection','features'=>[
|
||||
['type'=>'Feature','geometry'=>['type'=>'Point','coordinates'=>[109.3311,-0.0330]],'properties'=>['deskripsi'=>'Ibu Maria sakit keras','urgensi'=>'darurat','status'=>'diverifikasi','alamat_laporan'=>'Jl. Kemuning No.3']],
|
||||
['type'=>'Feature','geometry'=>['type'=>'Point','coordinates'=>[109.3415,-0.0200]],'properties'=>['deskripsi'=>'Pak Tan penyandang disabilitas','urgensi'=>'tinggi','status'=>'diproses','alamat_laporan'=>'Jl. Gusti Situt No.7']],
|
||||
]]);
|
||||
}
|
||||
ok(['type'=>'FeatureCollection','features'=>[]]);
|
||||
}
|
||||
|
||||
// ── PRIORITAS ──
|
||||
if ($resource === 'prioritas') {
|
||||
ok([
|
||||
['nik'=>'6171010101010006','nama_lengkap'=>'Maria Magdalena','umur'=>54,'status_ekonomi'=>'miskin','kondisi_kesehatan'=>'sakit_berat','kecamatan'=>'Pontianak Selatan','nama_ri'=>'Katedral','jumlah_dibantu'=>1,'level_prioritas'=>'SANGAT TINGGI'],
|
||||
['nik'=>'6171010101010014','nama_lengkap'=>'Tan Eng Huat','umur'=>65,'status_ekonomi'=>'miskin','kondisi_kesehatan'=>'disabilitas','kecamatan'=>'Pontianak Kota','nama_ri'=>'Klenteng','jumlah_dibantu'=>1,'level_prioritas'=>'SANGAT TINGGI'],
|
||||
['nik'=>'6171010101010010','nama_lengkap'=>'Lim Ah Kow','umur'=>59,'status_ekonomi'=>'miskin','kondisi_kesehatan'=>'sakit_berat','kecamatan'=>'Pontianak Kota','nama_ri'=>'Vihara','jumlah_dibantu'=>1,'level_prioritas'=>'SANGAT TINGGI'],
|
||||
['nik'=>'6171010101010002','nama_lengkap'=>'Siti Rahma','umur'=>39,'status_ekonomi'=>'miskin','kondisi_kesehatan'=>'sakit_ringan','kecamatan'=>'Pontianak Timur','nama_ri'=>"Masjid Jami'",'jumlah_dibantu'=>2,'level_prioritas'=>'TINGGI'],
|
||||
['nik'=>'6171010101010001','nama_lengkap'=>'Ahmad Suryana','umur'=>44,'status_ekonomi'=>'miskin','kondisi_kesehatan'=>'sehat','kecamatan'=>'Pontianak Timur','nama_ri'=>"Masjid Jami'",'jumlah_dibantu'=>2,'level_prioritas'=>'SEDANG'],
|
||||
['nik'=>'6171010101010005','nama_lengkap'=>'Dewi Kartika','umur'=>46,'status_ekonomi'=>'rentan','kondisi_kesehatan'=>'sehat','kecamatan'=>'Pontianak Kota','nama_ri'=>"Masjid Jami'",'jumlah_dibantu'=>0,'level_prioritas'=>'SEDANG'],
|
||||
]);
|
||||
}
|
||||
|
||||
// ── CHAT ──
|
||||
if ($resource === 'chat') {
|
||||
if ($method === 'GET') {
|
||||
if ($id === 'rooms') ok([['id'=>1,'nama'=>'# Koordinasi Umum'],['id'=>2,'nama'=>'# Bantuan Darurat'],['id'=>3,'nama'=>'# Distribusi Sembako']]);
|
||||
else ok([
|
||||
['id'=>1,'id_user'=>2,'nama_lengkap'=>'Ahmad Fauzi','pesan'=>'Salam. Ada keluarga di Gg. Mawar yang butuh bantuan sembako segera.','created_at'=>date('Y-m-d').' 08:00:00'],
|
||||
['id'=>2,'id_user'=>3,'nama_lengkap'=>'Romo Benediktus','pesan'=>'Baik. Ibu Maria juga perlu bantuan medis darurat. Mari koordinasikan.','created_at'=>date('Y-m-d').' 08:05:00'],
|
||||
['id'=>3,'id_user'=>2,'nama_lengkap'=>'Ahmad Fauzi','pesan'=>'Distribusi Jumat pagi. Tolong update data ke sistem ya.','created_at'=>date('Y-m-d').' 08:10:00'],
|
||||
]);
|
||||
}
|
||||
if ($method === 'POST') ok(['id'=>99], 'Pesan terkirim (demo)', 201);
|
||||
}
|
||||
|
||||
// ── LOG ──
|
||||
if ($resource === 'log') {
|
||||
ok([
|
||||
['created_at'=>date('Y-m-d').' 10:32:00','nama_lengkap'=>'Ahmad Fauzi','aksi'=>'create_histori_bantuan','tabel'=>'histori_bantuan','id_record'=>'5','ip_address'=>'192.168.1.10'],
|
||||
['created_at'=>date('Y-m-d').' 09:15:00','nama_lengkap'=>'Romo Benediktus','aksi'=>'update_laporan','tabel'=>'laporan','id_record'=>'1','ip_address'=>'192.168.1.20'],
|
||||
['created_at'=>date('Y-m-d').' 08:00:00','nama_lengkap'=>'Ahmad Fauzi','aksi'=>'login','tabel'=>'user','id_record'=>'2','ip_address'=>'192.168.1.10'],
|
||||
]);
|
||||
}
|
||||
|
||||
// ── USER ──
|
||||
if ($resource === 'user') {
|
||||
ok(demoUsers());
|
||||
}
|
||||
|
||||
err("Endpoint '$resource' tidak ditemukan", 404);
|
||||
}
|
||||
|
||||
function ok($data, $msg='OK', $code=200) {
|
||||
http_response_code($code);
|
||||
echo json_encode(['success'=>true,'message'=>$msg,'data'=>$data], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
function err($msg, $code=400) {
|
||||
http_response_code($code);
|
||||
echo json_encode(['success'=>false,'message'=>$msg,'data'=>null], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ═══ DEMO DATA FUNCTIONS ═══════════════════════════════════════
|
||||
|
||||
function demoUsers() {
|
||||
return [
|
||||
['id'=>1,'id_role'=>1,'username'=>'admin', 'nama_lengkap'=>'Administrator Sistem', 'email'=>'admin@webgis.id', 'nama_role'=>'admin'],
|
||||
['id'=>2,'id_role'=>2,'username'=>'pengurus_jami', 'nama_lengkap'=>'Ahmad Fauzi (Masjid Jami)', 'email'=>'fauzi@webgis.id', 'nama_role'=>'pengurus'],
|
||||
['id'=>3,'id_role'=>2,'username'=>'pengurus_ktdr', 'nama_lengkap'=>'Romo Benediktus (Katedral)','email'=>'romo@webgis.id', 'nama_role'=>'pengurus'],
|
||||
['id'=>4,'id_role'=>3,'username'=>'pimpinan', 'nama_lengkap'=>'Camat Pontianak Kota', 'email'=>'camat@webgis.id', 'nama_role'=>'pimpinan'],
|
||||
['id'=>5,'id_role'=>4,'username'=>'warga1', 'nama_lengkap'=>'Budi Santoso', 'email'=>'budi@gmail.com', 'nama_role'=>'masyarakat'],
|
||||
];
|
||||
}
|
||||
|
||||
function demoPenduduk() {
|
||||
return [
|
||||
['nik'=>'6171010101010001','id_keluarga'=>1,'nama_lengkap'=>'Ahmad Suryana', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1980-05-15','umur'=>44,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'Buruh Harian','penghasilan'=>900000,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SMP','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.027,'lng'=>109.344,'no_kk'=>'6171010101010001','kecamatan'=>'Pontianak Timur','kelurahan'=>'Dalam Bugis','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010002','id_keluarga'=>1,'nama_lengkap'=>'Siti Rahma', 'jenis_kelamin'=>'P','tanggal_lahir'=>'1985-08-20','umur'=>39,'tempat_lahir'=>'Pontianak','status_keluarga'=>'istri', 'status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'Ibu Rumah Tangga','penghasilan'=>0,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sakit_ringan','lat'=>-0.027,'lng'=>109.344,'no_kk'=>'6171010101010001','kecamatan'=>'Pontianak Timur','kelurahan'=>'Dalam Bugis','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010003','id_keluarga'=>1,'nama_lengkap'=>'Budi Suryana', 'jenis_kelamin'=>'L','tanggal_lahir'=>'2012-03-10','umur'=>12,'tempat_lahir'=>'Pontianak','status_keluarga'=>'anak', 'status_perkawinan'=>'belum_kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'Pelajar','penghasilan'=>0,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SMP','status_pendidikan'=>'sekolah','kondisi_kesehatan'=>'sehat','lat'=>-0.027,'lng'=>109.344,'no_kk'=>'6171010101010001','kecamatan'=>'Pontianak Timur','kelurahan'=>'Dalam Bugis','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010004','id_keluarga'=>2,'nama_lengkap'=>'Samsul Bahri', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1975-11-22','umur'=>49,'tempat_lahir'=>'Sambas','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'Pedagang Kaki Lima','penghasilan'=>1200000,'status_ekonomi'=>'rentan','pendidikan_terakhir'=>'SMA_SMK','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.0315,'lng'=>109.339,'no_kk'=>'6171010101010002','kecamatan'=>'Pontianak Kota','kelurahan'=>'Sungai Bangkong','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010005','id_keluarga'=>2,'nama_lengkap'=>'Dewi Kartika', 'jenis_kelamin'=>'P','tanggal_lahir'=>'1978-06-14','umur'=>46,'tempat_lahir'=>'Pontianak','status_keluarga'=>'istri', 'status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'Buruh Cuci','penghasilan'=>500000,'status_ekonomi'=>'rentan','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.0315,'lng'=>109.339,'no_kk'=>'6171010101010002','kecamatan'=>'Pontianak Kota','kelurahan'=>'Sungai Bangkong','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010006','id_keluarga'=>3,'nama_lengkap'=>'Maria Magdalena', 'jenis_kelamin'=>'P','tanggal_lahir'=>'1970-12-03','umur'=>54,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'cerai_mati','status_hidup'=>'hidup','agama'=>'Kristen','pekerjaan'=>'Penjual Gorengan','penghasilan'=>800000,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sakit_berat','lat'=>-0.033,'lng'=>109.331,'no_kk'=>'6171010101010003','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Akcaya','nama_ri'=>'Katedral'],
|
||||
['nik'=>'6171010101010007','id_keluarga'=>3,'nama_lengkap'=>'Petrus Yulius', 'jenis_kelamin'=>'L','tanggal_lahir'=>'2005-04-17','umur'=>19,'tempat_lahir'=>'Pontianak','status_keluarga'=>'anak', 'status_perkawinan'=>'belum_kawin','status_hidup'=>'hidup','agama'=>'Kristen','pekerjaan'=>'Pelajar','penghasilan'=>0,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SMA_SMK','status_pendidikan'=>'sekolah','kondisi_kesehatan'=>'sehat','lat'=>-0.033,'lng'=>109.331,'no_kk'=>'6171010101010003','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Akcaya','nama_ri'=>'Katedral'],
|
||||
['nik'=>'6171010101010009','id_keluarga'=>4,'nama_lengkap'=>'Hendra Wijaya', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1988-02-11','umur'=>36,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Buddha','pekerjaan'=>'Ojek Online','penghasilan'=>1500000,'status_ekonomi'=>'rentan','pendidikan_terakhir'=>'SMA_SMK','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.049,'lng'=>109.326,'no_kk'=>'6171010101010004','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Parit Tokaya','nama_ri'=>'Mujahidin'],
|
||||
['nik'=>'6171010101010010','id_keluarga'=>5,'nama_lengkap'=>'Lim Ah Kow', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1965-07-30','umur'=>59,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Buddha','pekerjaan'=>'Tidak Bekerja','penghasilan'=>0,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sakit_berat','lat'=>-0.022,'lng'=>109.337,'no_kk'=>'6171010101010005','kecamatan'=>'Pontianak Kota','kelurahan'=>'Darat Sekip','nama_ri'=>'Vihara'],
|
||||
['nik'=>'6171010101010011','id_keluarga'=>5,'nama_lengkap'=>'Tan Siu Lan', 'jenis_kelamin'=>'P','tanggal_lahir'=>'1968-03-19','umur'=>56,'tempat_lahir'=>'Pontianak','status_keluarga'=>'istri', 'status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Buddha','pekerjaan'=>'Penjual Sayur','penghasilan'=>700000,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.022,'lng'=>109.337,'no_kk'=>'6171010101010005','kecamatan'=>'Pontianak Kota','kelurahan'=>'Darat Sekip','nama_ri'=>'Vihara'],
|
||||
['nik'=>'6171010101010012','id_keluarga'=>6,'nama_lengkap'=>'Mulyadi', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1979-10-05','umur'=>45,'tempat_lahir'=>'Singkawang','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Islam','pekerjaan'=>'PNS Golongan III','penghasilan'=>4500000,'status_ekonomi'=>'mampu','pendidikan_terakhir'=>'S1','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.0265,'lng'=>109.346,'no_kk'=>'6171010101010006','kecamatan'=>'Pontianak Timur','kelurahan'=>'Dalam Bugis','nama_ri'=>"Masjid Jami'"],
|
||||
['nik'=>'6171010101010013','id_keluarga'=>7,'nama_lengkap'=>'Yohanes Kristian', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1982-01-25','umur'=>43,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Katolik','pekerjaan'=>'Sopir Angkot','penghasilan'=>1100000,'status_ekonomi'=>'rentan','pendidikan_terakhir'=>'SMA_SMK','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'sehat','lat'=>-0.034,'lng'=>109.330,'no_kk'=>'6171010101010007','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Akcaya','nama_ri'=>'Katedral'],
|
||||
['nik'=>'6171010101010014','id_keluarga'=>8,'nama_lengkap'=>'Tan Eng Huat', 'jenis_kelamin'=>'L','tanggal_lahir'=>'1960-08-08','umur'=>64,'tempat_lahir'=>'Pontianak','status_keluarga'=>'kepala','status_perkawinan'=>'kawin','status_hidup'=>'hidup','agama'=>'Konghucu','pekerjaan'=>'Pemulung','penghasilan'=>600000,'status_ekonomi'=>'miskin','pendidikan_terakhir'=>'SD','status_pendidikan'=>'lulus','kondisi_kesehatan'=>'disabilitas','lat'=>-0.020,'lng'=>109.4415,'no_kk'=>'6171010101010008','kecamatan'=>'Pontianak Kota','kelurahan'=>'Pontianak Kota','nama_ri'=>'Klenteng'],
|
||||
];
|
||||
}
|
||||
|
||||
function demoPendudukDetail($nik) {
|
||||
$list = demoPenduduk();
|
||||
foreach ($list as $p) { if ($p['nik'] === $nik) {
|
||||
$p['histori_bantuan'] = [['nama_bantuan'=>'Sembako Ramadan','tanggal'=>'2025-03-15','jumlah'=>1,'satuan'=>'paket','nama_ri'=>"Masjid Jami'",'status_penyaluran'=>'disalurkan']];
|
||||
$p['riwayat_pendidikan'] = [];
|
||||
$p['peristiwa'] = [];
|
||||
return $p;
|
||||
}}
|
||||
return [];
|
||||
}
|
||||
|
||||
function demoKeluarga() {
|
||||
return [
|
||||
['id'=>1,'no_kk'=>'6171010101010001','id_rumah_ibadah'=>1,'nama_kepala'=>'Ahmad Suryana', 'alamat'=>'Gg. Mawar No.5','rt'=>'002','rw'=>'004','kelurahan'=>'Dalam Bugis', 'kecamatan'=>'Pontianak Timur', 'lat'=>-0.027, 'lng'=>109.344, 'status_ekonomi'=>'miskin','nama_ri'=>"Masjid Jami'",'jumlah_anggota'=>3,'total_penghasilan'=>900000, 'total_bantuan'=>2],
|
||||
['id'=>2,'no_kk'=>'6171010101010002','id_rumah_ibadah'=>1,'nama_kepala'=>'Samsul Bahri', 'alamat'=>'Jl. Veteran No.12','rt'=>'003','rw'=>'002','kelurahan'=>'Sungai Bangkong','kecamatan'=>'Pontianak Kota', 'lat'=>-0.0315,'lng'=>109.339,'status_ekonomi'=>'rentan','nama_ri'=>"Masjid Jami'",'jumlah_anggota'=>2,'total_penghasilan'=>1700000,'total_bantuan'=>0],
|
||||
['id'=>3,'no_kk'=>'6171010101010003','id_rumah_ibadah'=>2,'nama_kepala'=>'Maria Magdalena', 'alamat'=>'Jl. Kemuning No.3','rt'=>'001','rw'=>'001','kelurahan'=>'Akcaya', 'kecamatan'=>'Pontianak Selatan','lat'=>-0.033, 'lng'=>109.331,'status_ekonomi'=>'miskin','nama_ri'=>'Katedral', 'jumlah_anggota'=>3,'total_penghasilan'=>800000, 'total_bantuan'=>1],
|
||||
['id'=>4,'no_kk'=>'6171010101010004','id_rumah_ibadah'=>5,'nama_kepala'=>'Hendra Wijaya', 'alamat'=>'Jl. Ahmad Yani Gg.7','rt'=>'005','rw'=>'003','kelurahan'=>'Parit Tokaya','kecamatan'=>'Pontianak Selatan','lat'=>-0.049, 'lng'=>109.326,'status_ekonomi'=>'rentan','nama_ri'=>'Mujahidin', 'jumlah_anggota'=>2,'total_penghasilan'=>1500000,'total_bantuan'=>0],
|
||||
['id'=>5,'no_kk'=>'6171010101010005','id_rumah_ibadah'=>3,'nama_kepala'=>'Lim Ah Kow', 'alamat'=>'Jl. Diponegoro Gg.2','rt'=>'001','rw'=>'002','kelurahan'=>'Darat Sekip', 'kecamatan'=>'Pontianak Kota', 'lat'=>-0.022, 'lng'=>109.337,'status_ekonomi'=>'miskin','nama_ri'=>'Vihara', 'jumlah_anggota'=>2,'total_penghasilan'=>700000, 'total_bantuan'=>1],
|
||||
['id'=>6,'no_kk'=>'6171010101010006','id_rumah_ibadah'=>1,'nama_kepala'=>'Mulyadi', 'alamat'=>'Gg. Teratai No.8','rt'=>'004','rw'=>'003','kelurahan'=>'Dalam Bugis', 'kecamatan'=>'Pontianak Timur', 'lat'=>-0.0265,'lng'=>109.346,'status_ekonomi'=>'mampu', 'nama_ri'=>"Masjid Jami'",'jumlah_anggota'=>2,'total_penghasilan'=>4500000,'total_bantuan'=>0],
|
||||
['id'=>7,'no_kk'=>'6171010101010007','id_rumah_ibadah'=>2,'nama_kepala'=>'Yohanes Kristian','alamat'=>'Jl. HOS Cokro No.4','rt'=>'002','rw'=>'001','kelurahan'=>'Akcaya', 'kecamatan'=>'Pontianak Selatan','lat'=>-0.034, 'lng'=>109.330,'status_ekonomi'=>'rentan','nama_ri'=>'Katedral', 'jumlah_anggota'=>2,'total_penghasilan'=>1100000,'total_bantuan'=>0],
|
||||
['id'=>8,'no_kk'=>'6171010101010008','id_rumah_ibadah'=>4,'nama_kepala'=>'Tan Eng Huat', 'alamat'=>'Jl. Gusti Situt No.7','rt'=>'003','rw'=>'001','kelurahan'=>'Pontianak Kota','kecamatan'=>'Pontianak Kota','lat'=>-0.020, 'lng'=>109.4415,'status_ekonomi'=>'miskin','nama_ri'=>'Klenteng', 'jumlah_anggota'=>1,'total_penghasilan'=>600000, 'total_bantuan'=>1],
|
||||
];
|
||||
}
|
||||
|
||||
function demoBantuan() {
|
||||
return [
|
||||
['id'=>1,'nama_bantuan'=>'Sembako Ramadan', 'kategori'=>'sembako', 'sumber'=>'Zakat Masjid', 'satuan'=>'paket', 'aktif'=>1],
|
||||
['id'=>2,'nama_bantuan'=>'PKH (Prog. Keluarga Harapan)', 'kategori'=>'ekonomi', 'sumber'=>'APBN', 'satuan'=>'Rp', 'aktif'=>1],
|
||||
['id'=>3,'nama_bantuan'=>'BPNT / Kartu Sembako', 'kategori'=>'sembako', 'sumber'=>'APBN', 'satuan'=>'bulan', 'aktif'=>1],
|
||||
['id'=>4,'nama_bantuan'=>'Beasiswa Pendidikan', 'kategori'=>'pendidikan', 'sumber'=>'CSR Perusahaan', 'satuan'=>'paket/tahun','aktif'=>1],
|
||||
['id'=>5,'nama_bantuan'=>'BPJS Kesehatan PBI', 'kategori'=>'kesehatan', 'sumber'=>'APBD', 'satuan'=>'bulan', 'aktif'=>1],
|
||||
['id'=>6,'nama_bantuan'=>'Bantuan Sembako Gereja', 'kategori'=>'sembako', 'sumber'=>'Kolekte Gereja', 'satuan'=>'paket', 'aktif'=>1],
|
||||
['id'=>7,'nama_bantuan'=>'Bantuan Vihara (Kwan Im)', 'kategori'=>'sembako', 'sumber'=>'Dana Sosial Vihara','satuan'=>'paket', 'aktif'=>1],
|
||||
['id'=>8,'nama_bantuan'=>'Raskin / Beras Miskin', 'kategori'=>'sembako', 'sumber'=>'Bulog', 'satuan'=>'kg', 'aktif'=>1],
|
||||
];
|
||||
}
|
||||
|
||||
function demoHistori() {
|
||||
return [
|
||||
['id'=>1,'nik'=>'6171010101010001','id_bantuan'=>1,'nama_lengkap'=>'Ahmad Suryana', 'nama_bantuan'=>'Sembako Ramadan', 'kategori'=>'sembako','tanggal'=>'2025-03-15','jumlah'=>1,'satuan'=>'paket','nama_ri'=>"Masjid Jami'",'status_penyaluran'=>'disalurkan'],
|
||||
['id'=>2,'nik'=>'6171010101010001','id_bantuan'=>3,'nama_lengkap'=>'Ahmad Suryana', 'nama_bantuan'=>'BPNT', 'kategori'=>'sembako','tanggal'=>'2025-01-10','jumlah'=>1,'satuan'=>'bulan','nama_ri'=>"Masjid Jami'",'status_penyaluran'=>'disalurkan'],
|
||||
['id'=>3,'nik'=>'6171010101010006','id_bantuan'=>6,'nama_lengkap'=>'Maria Magdalena', 'nama_bantuan'=>'Bantuan Sembako Gereja','kategori'=>'sembako','tanggal'=>'2025-02-20','jumlah'=>1,'satuan'=>'paket','nama_ri'=>'Katedral', 'status_penyaluran'=>'disalurkan'],
|
||||
['id'=>4,'nik'=>'6171010101010010','id_bantuan'=>7,'nama_lengkap'=>'Lim Ah Kow', 'nama_bantuan'=>'Bantuan Vihara', 'kategori'=>'sembako','tanggal'=>'2025-04-01','jumlah'=>1,'satuan'=>'paket','nama_ri'=>'Vihara', 'status_penyaluran'=>'disalurkan'],
|
||||
['id'=>5,'nik'=>'6171010101010014','id_bantuan'=>8,'nama_lengkap'=>'Tan Eng Huat', 'nama_bantuan'=>'Raskin', 'kategori'=>'sembako','tanggal'=>'2025-03-05','jumlah'=>10,'satuan'=>'kg', 'nama_ri'=>'Klenteng', 'status_penyaluran'=>'disalurkan'],
|
||||
];
|
||||
}
|
||||
|
||||
function demoLaporan() {
|
||||
return [
|
||||
['id'=>1,'nama_pelapor'=>'Anonim', 'nik_terdampak'=>'6171010101010006','id_rumah_ibadah'=>2,'deskripsi'=>'Ibu Maria sakit keras sudah seminggu, tidak bisa berobat karena tidak ada biaya. Butuh bantuan medis segera.','lat'=>-0.0330,'lng'=>109.3311,'alamat_laporan'=>'Jl. Kemuning No.3, Akcaya','urgensi'=>'darurat','foto'=>null,'status'=>'diverifikasi','nama_ri'=>'Katedral','nama_terdampak'=>'Maria Magdalena','created_at'=>date('Y-m-d').' 08:00:00'],
|
||||
['id'=>2,'nama_pelapor'=>'Eko Prasetyo', 'nik_terdampak'=>null,'id_rumah_ibadah'=>1,'deskripsi'=>'Ada keluarga baru pindah ke Gg. Melati yang sepertinya sangat membutuhkan bantuan. Anak-anak tidak sekolah.','lat'=>-0.0268,'lng'=>109.3448,'alamat_laporan'=>'Gg. Melati, Dalam Bugis','urgensi'=>'sedang','foto'=>null,'status'=>'pending','nama_ri'=>"Masjid Jami'",'nama_terdampak'=>null,'created_at'=>date('Y-m-d').' 10:00:00'],
|
||||
['id'=>3,'nama_pelapor'=>'Anonim', 'nik_terdampak'=>'6171010101010014','id_rumah_ibadah'=>4,'deskripsi'=>'Pak Tan penyandang disabilitas, hidup sebatang kara dan sangat sulit mendapat penghasilan.','lat'=>-0.0200,'lng'=>109.3415,'alamat_laporan'=>'Jl. Gusti Situt No.7','urgensi'=>'tinggi','foto'=>null,'status'=>'diproses','nama_ri'=>'Klenteng Kwan Ti Miau','nama_terdampak'=>'Tan Eng Huat','created_at'=>date('Y-m-d').' 14:00:00'],
|
||||
['id'=>4,'nama_pelapor'=>'Hendra', 'nik_terdampak'=>null,'id_rumah_ibadah'=>5,'deskripsi'=>'Balita 2 tahun kondisi gizi buruk. Orang tua tidak mampu memenuhi kebutuhan gizi anak.','lat'=>-0.0490,'lng'=>109.3260,'alamat_laporan'=>'Gg. Teratai, Parit Tokaya','urgensi'=>'darurat','foto'=>null,'status'=>'pending','nama_ri'=>'Masjid Mujahidin','nama_terdampak'=>null,'created_at'=>date('Y-m-d').' 09:00:00'],
|
||||
];
|
||||
}
|
||||
|
||||
function demoRI() {
|
||||
return [
|
||||
['id'=>1,'id_user'=>2,'nama'=>"Masjid Jami' Pontianak", 'jenis'=>'Masjid', 'alamat'=>'Jl. Tanjungpura, Dalam Bugis', 'lat'=>-0.02596,'lng'=>109.34307,'radius_meter'=>350,'kontak'=>'0561-732001','kecamatan'=>'Pontianak Timur', 'kelurahan'=>'Dalam Bugis', 'aktif'=>1,'nama_pengurus'=>'Ahmad Fauzi','jumlah_kk'=>3,'jumlah_penduduk'=>8],
|
||||
['id'=>2,'id_user'=>3,'nama'=>'Gereja Katedral Pontianak', 'jenis'=>'Gereja', 'alamat'=>'Jl. Patimura No.9, Akcaya', 'lat'=>-0.03200,'lng'=>109.33200,'radius_meter'=>300,'kontak'=>'0561-766000','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Akcaya', 'aktif'=>1,'nama_pengurus'=>'Romo Benediktus','jumlah_kk'=>2,'jumlah_penduduk'=>5],
|
||||
['id'=>3,'id_user'=>null,'nama'=>'Vihara Bodhisattva Karaniya Metta','jenis'=>'Vihara', 'alamat'=>'Jl. Diponegoro, Pontianak Kota','lat'=>-0.02100,'lng'=>109.33800,'radius_meter'=>300,'kontak'=>'0561-733456','kecamatan'=>'Pontianak Kota', 'kelurahan'=>'Darat Sekip', 'aktif'=>1,'nama_pengurus'=>null,'jumlah_kk'=>2,'jumlah_penduduk'=>4],
|
||||
['id'=>4,'id_user'=>null,'nama'=>'Klenteng Kwan Ti Miau', 'jenis'=>'Klenteng','alamat'=>'Jl. Gusti Situt Mahmud', 'lat'=>-0.01900,'lng'=>109.34100,'radius_meter'=>280,'kontak'=>'0561-740123','kecamatan'=>'Pontianak Kota', 'kelurahan'=>'Pontianak Kota', 'aktif'=>1,'nama_pengurus'=>null,'jumlah_kk'=>1,'jumlah_penduduk'=>2],
|
||||
['id'=>5,'id_user'=>2, 'nama'=>'Masjid Mujahidin Pontianak', 'jenis'=>'Masjid', 'alamat'=>'Jl. Ahmad Yani, Parit Tokaya', 'lat'=>-0.04800,'lng'=>109.32500,'radius_meter'=>400,'kontak'=>'0561-764567','kecamatan'=>'Pontianak Selatan','kelurahan'=>'Parit Tokaya', 'aktif'=>1,'nama_pengurus'=>'Ahmad Fauzi','jumlah_kk'=>1,'jumlah_penduduk'=>2],
|
||||
['id'=>6,'id_user'=>3, 'nama'=>'Gereja GPIB Immanuel', 'jenis'=>'Gereja', 'alamat'=>'Jl. Rahadi Usman, Darat Sekip', 'lat'=>-0.02800,'lng'=>109.34500,'radius_meter'=>300,'kontak'=>'0561-735890','kecamatan'=>'Pontianak Kota', 'kelurahan'=>'Darat Sekip', 'aktif'=>1,'nama_pengurus'=>'Romo Benediktus','jumlah_kk'=>1,'jumlah_penduduk'=>1],
|
||||
];
|
||||
}
|
||||
|
||||
function demoPetaPenduduk() {
|
||||
return [
|
||||
['nama_kepala'=>'Ahmad Suryana', 'alamat'=>'Gg. Mawar No.5', 'lat'=>-0.0270,'lng'=>109.3440,'status_ekonomi'=>'miskin','jumlah_anggota'=>3,'no_kk'=>'6171010101010001',"nama_ri"=>"Masjid Jami'",'total_bantuan'=>2,'kecamatan'=>'Pontianak Timur'],
|
||||
['nama_kepala'=>'Samsul Bahri', 'alamat'=>'Jl. Veteran No.12', 'lat'=>-0.0315,'lng'=>109.3390,'status_ekonomi'=>'rentan','jumlah_anggota'=>2,'no_kk'=>'6171010101010002',"nama_ri"=>"Masjid Jami'",'total_bantuan'=>0,'kecamatan'=>'Pontianak Kota'],
|
||||
['nama_kepala'=>'Maria Magdalena', 'alamat'=>'Jl. Kemuning No.3', 'lat'=>-0.0330,'lng'=>109.3310,'status_ekonomi'=>'miskin','jumlah_anggota'=>3,'no_kk'=>'6171010101010003','nama_ri'=>'Katedral','total_bantuan'=>1,'kecamatan'=>'Pontianak Selatan'],
|
||||
['nama_kepala'=>'Hendra Wijaya', 'alamat'=>'Jl. Ahmad Yani Gg.7', 'lat'=>-0.0490,'lng'=>109.3260,'status_ekonomi'=>'rentan','jumlah_anggota'=>2,'no_kk'=>'6171010101010004','nama_ri'=>'Mujahidin','total_bantuan'=>0,'kecamatan'=>'Pontianak Selatan'],
|
||||
['nama_kepala'=>'Lim Ah Kow', 'alamat'=>'Jl. Diponegoro Gg.2', 'lat'=>-0.0220,'lng'=>109.3370,'status_ekonomi'=>'miskin','jumlah_anggota'=>2,'no_kk'=>'6171010101010005','nama_ri'=>'Vihara','total_bantuan'=>1,'kecamatan'=>'Pontianak Kota'],
|
||||
['nama_kepala'=>'Mulyadi', 'alamat'=>'Gg. Teratai No.8', 'lat'=>-0.0265,'lng'=>109.3460,'status_ekonomi'=>'mampu', 'jumlah_anggota'=>2,'no_kk'=>'6171010101010006',"nama_ri"=>"Masjid Jami'",'total_bantuan'=>0,'kecamatan'=>'Pontianak Timur'],
|
||||
['nama_kepala'=>'Yohanes Kristian', 'alamat'=>'Jl. HOS Cokro No.4', 'lat'=>-0.0340,'lng'=>109.3300,'status_ekonomi'=>'rentan','jumlah_anggota'=>2,'no_kk'=>'6171010101010007','nama_ri'=>'Katedral','total_bantuan'=>0,'kecamatan'=>'Pontianak Selatan'],
|
||||
['nama_kepala'=>'Tan Eng Huat', 'alamat'=>'Jl. Gusti Situt No.7', 'lat'=>-0.0200,'lng'=>109.3415,'status_ekonomi'=>'miskin','jumlah_anggota'=>1,'no_kk'=>'6171010101010008','nama_ri'=>'Klenteng','total_bantuan'=>1,'kecamatan'=>'Pontianak Kota'],
|
||||
];
|
||||
}
|
||||
|
||||
function demoPetaRI() {
|
||||
return [
|
||||
["nama"=>"Masjid Jami' Pontianak", 'jenis'=>'Masjid', 'lat'=>-0.02596,'lng'=>109.34307,'radius_meter'=>350,'alamat'=>'Jl. Tanjungpura','kontak'=>'0561-732001'],
|
||||
['nama'=>'Gereja Katedral Pontianak', 'jenis'=>'Gereja', 'lat'=>-0.03200,'lng'=>109.33200,'radius_meter'=>300,'alamat'=>'Jl. Patimura No.9','kontak'=>'0561-766000'],
|
||||
['nama'=>'Vihara Bodhisattva Karaniya Metta', 'jenis'=>'Vihara', 'lat'=>-0.02100,'lng'=>109.33800,'radius_meter'=>300,'alamat'=>'Jl. Diponegoro','kontak'=>'0561-733456'],
|
||||
['nama'=>'Klenteng Kwan Ti Miau', 'jenis'=>'Klenteng','lat'=>-0.01900,'lng'=>109.34100,'radius_meter'=>280,'alamat'=>'Jl. Gusti Situt','kontak'=>'0561-740123'],
|
||||
['nama'=>'Masjid Mujahidin Pontianak', 'jenis'=>'Masjid', 'lat'=>-0.04800,'lng'=>109.32500,'radius_meter'=>400,'alamat'=>'Jl. Ahmad Yani','kontak'=>'0561-764567'],
|
||||
['nama'=>'Gereja GPIB Immanuel', 'jenis'=>'Gereja', 'lat'=>-0.02800,'lng'=>109.34500,'radius_meter'=>300,'alamat'=>'Jl. Rahadi Usman','kontak'=>'0561-735890'],
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user