first commit
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/auth.php — Login / Logout / Session check
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$action = getParam('action', 'login');
|
||||
|
||||
if ($method === 'POST' && $action === 'login') {
|
||||
$data = body();
|
||||
$username = trim($data['username'] ?? '');
|
||||
$password = $data['password'] ?? '';
|
||||
|
||||
if (!$username || !$password) jsonError('Username dan password wajib diisi.');
|
||||
|
||||
$db = getDB();
|
||||
$stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND aktif = 1 LIMIT 1");
|
||||
$stmt->execute([$username]);
|
||||
$user = $stmt->fetch();
|
||||
|
||||
if (!$user || !password_verify($password, $user['password'])) {
|
||||
jsonError('Username atau password salah.', 401);
|
||||
}
|
||||
|
||||
$_SESSION['user'] = [
|
||||
'id' => $user['id'],
|
||||
'username' => $user['username'],
|
||||
'role' => $user['role'],
|
||||
'jabatan' => $user['jabatan'],
|
||||
'can_edit' => (bool)$user['can_edit'],
|
||||
'is_admin' => (bool)$user['is_admin'],
|
||||
'is_wali' => (bool)$user['is_wali'],
|
||||
];
|
||||
|
||||
jsonOk($_SESSION['user'], 'Login berhasil');
|
||||
}
|
||||
|
||||
if ($method === 'POST' && $action === 'logout') {
|
||||
session_destroy();
|
||||
jsonOk(null, 'Logout berhasil');
|
||||
}
|
||||
|
||||
if ($method === 'GET' && $action === 'check') {
|
||||
if (!empty($_SESSION['user'])) {
|
||||
jsonOk($_SESSION['user'], 'Session aktif');
|
||||
}
|
||||
jsonError('Tidak terautentikasi', 401);
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/bantuan.php — CRUD Histori Bantuan Sosial
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// Bantuan hanya bisa diakses oleh user yang login
|
||||
$user = requireAuth();
|
||||
|
||||
// ── GET: List bantuan untuk warga tertentu ──────────────────
|
||||
if ($method === 'GET') {
|
||||
$wargaId = getParam('warga_id');
|
||||
if (!$wargaId) jsonError('ID warga wajib disertakan.');
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"SELECT id, tanggal, jenis, nominal, sumber_dana AS sumber, keterangan
|
||||
FROM histori_bantuan
|
||||
WHERE warga_id = ?
|
||||
ORDER BY tanggal DESC"
|
||||
);
|
||||
$stmt->execute([$wargaId]);
|
||||
jsonOk($stmt->fetchAll());
|
||||
}
|
||||
|
||||
// ── POST: Tambah bantuan baru ────────────────────────────────
|
||||
if ($method === 'POST') {
|
||||
requireEdit();
|
||||
$d = body();
|
||||
|
||||
if (empty($d['warga_id'])) jsonError('ID warga wajib diisi.');
|
||||
if (empty($d['tanggal'])) jsonError('Tanggal wajib diisi.');
|
||||
if (empty($d['jenis'])) jsonError('Program bantuan wajib dipilih.');
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO histori_bantuan (warga_id, tanggal, jenis, nominal, sumber_dana, keterangan, created_by)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['warga_id'],
|
||||
$d['tanggal'],
|
||||
$d['jenis'],
|
||||
$d['nominal'] ?? 0,
|
||||
$d['sumber_dana'] ?? '',
|
||||
$d['keterangan'] ?? '',
|
||||
$user['id']
|
||||
]);
|
||||
|
||||
jsonOk(['id' => $db->lastInsertId()], 'Data bantuan berhasil ditambahkan');
|
||||
}
|
||||
|
||||
// ── DELETE: Hapus bantuan ────────────────────────────────────
|
||||
if ($method === 'DELETE') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID bantuan wajib disertakan.');
|
||||
|
||||
$db->prepare("DELETE FROM histori_bantuan WHERE id = ?")->execute([$id]);
|
||||
jsonOk(null, 'Data bantuan berhasil dihapus');
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/config.php — Konfigurasi Database & Helper Functions
|
||||
// GeoSosial — Sistem Informasi Sosial Kota Pontianak
|
||||
// ============================================================
|
||||
|
||||
// Pastikan PHP errors tidak merusak output JSON
|
||||
error_reporting(0);
|
||||
ini_set('display_errors', '0');
|
||||
ini_set('display_startup_errors', '0');
|
||||
// Mulai output buffering untuk tangkap output tak terduga
|
||||
ob_start();
|
||||
|
||||
define('DB_HOST', getenv('DB_HOST') ?: 'db');
|
||||
define('DB_PORT', getenv('DB_PORT') ?: '3306');
|
||||
define('DB_NAME', getenv('DB_NAME_GEOSOSIAL') ?: 'geososial');
|
||||
define('DB_USER', getenv('DB_USER') ?: 'root');
|
||||
define('DB_PASS', getenv('DB_PASS') ?: 'root');
|
||||
define('DB_CHARSET', 'utf8mb4');
|
||||
|
||||
// CORS Headers
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
||||
header('Content-Type: application/json; charset=UTF-8');
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }
|
||||
|
||||
// Session
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_name('geososial_session');
|
||||
session_start();
|
||||
}
|
||||
|
||||
// PDO Connection
|
||||
function getDB(): PDO {
|
||||
static $pdo = null;
|
||||
if ($pdo === null) {
|
||||
$dsn = "mysql:host=" . DB_HOST . ";port=" . DB_PORT . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
|
||||
try {
|
||||
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
]);
|
||||
} catch (PDOException $e) {
|
||||
jsonError('Koneksi database gagal: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
return $pdo;
|
||||
}
|
||||
|
||||
// Response helpers — bersihkan output buffer dulu agar tidak ada PHP warning yang merusak JSON
|
||||
function jsonOk($data = null, string $msg = 'OK'): void {
|
||||
if (ob_get_level()) ob_clean();
|
||||
echo json_encode(['success' => true, 'message' => $msg, 'data' => $data], JSON_UNESCAPED_UNICODE);
|
||||
exit();
|
||||
}
|
||||
function jsonError(string $msg, int $code = 400): void {
|
||||
if (ob_get_level()) ob_clean();
|
||||
http_response_code($code);
|
||||
echo json_encode(['success' => false, 'message' => $msg], JSON_UNESCAPED_UNICODE);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Auth check
|
||||
function requireAuth(): array {
|
||||
if (empty($_SESSION['user'])) {
|
||||
jsonError('Tidak terautentikasi. Silakan login.', 401);
|
||||
}
|
||||
return $_SESSION['user'];
|
||||
}
|
||||
function requireEdit(): array {
|
||||
$user = requireAuth();
|
||||
if (!$user['can_edit']) jsonError('Anda tidak memiliki hak akses edit.', 403);
|
||||
return $user;
|
||||
}
|
||||
|
||||
// Input helper
|
||||
function body(): array {
|
||||
$raw = file_get_contents('php://input');
|
||||
return json_decode($raw, true) ?? [];
|
||||
}
|
||||
function getParam(string $key, $default = null) {
|
||||
return $_GET[$key] ?? $default;
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/dashboard.php — Agregasi Data & Statistik Dashboard Eksekutif
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// Dashboard: data agregat bisa diakses publik (tidak ada data pribadi warga)
|
||||
|
||||
if ($method === 'GET') {
|
||||
// ── 1. KPI STATS ──────────────────────────────────────────
|
||||
// Total KK Terdaftar (aktif)
|
||||
$kpiKK = $db->query("SELECT COUNT(*) FROM warga WHERE status = 'aktif'")->fetchColumn();
|
||||
|
||||
// Keluarga Sangat Miskin (aktif)
|
||||
$kpiSM = $db->query("SELECT COUNT(*) FROM warga WHERE status = 'aktif' AND kategori = 'sangat_miskin'")->fetchColumn();
|
||||
|
||||
// Total Penyaluran Bantuan & Nominal
|
||||
$bantuanStats = $db->query(
|
||||
"SELECT COUNT(*) AS total_penyaluran, COALESCE(SUM(nominal), 0) AS total_nominal
|
||||
FROM histori_bantuan"
|
||||
)->fetch();
|
||||
$kpiBn = $bantuanStats['total_penyaluran'];
|
||||
$kpiBnNom = $bantuanStats['total_nominal'];
|
||||
|
||||
// Penyakit Terbanyak
|
||||
$kpiPyRow = $db->query(
|
||||
"SELECT penyakit, COUNT(*) AS jumlah
|
||||
FROM riwayat_penyakit
|
||||
GROUP BY penyakit
|
||||
ORDER BY jumlah DESC
|
||||
LIMIT 1"
|
||||
)->fetch();
|
||||
$kpiPy = $kpiPyRow ? $kpiPyRow['penyakit'] : 'Tidak Ada';
|
||||
|
||||
// ── 2. CHART 1: KK Miskin per Kelurahan (Top 10) ──────────
|
||||
$chartKelRows = $db->query(
|
||||
"SELECT k.nama AS kelurahan, COUNT(w.id) AS jumlah
|
||||
FROM warga w
|
||||
LEFT JOIN kelurahan k ON w.kelurahan_id = k.id
|
||||
WHERE w.status = 'aktif'
|
||||
GROUP BY w.kelurahan_id
|
||||
ORDER BY jumlah DESC
|
||||
LIMIT 10"
|
||||
)->fetchAll();
|
||||
|
||||
$chartKel = [
|
||||
'labels' => array_column($chartKelRows, 'kelurahan'),
|
||||
'data' => array_map('intval', array_column($chartKelRows, 'jumlah'))
|
||||
];
|
||||
|
||||
// ── 3. CHART 2: Distribusi Kategori Kemiskinan ────────────
|
||||
$chartKatRows = $db->query(
|
||||
"SELECT kategori, COUNT(*) AS jumlah
|
||||
FROM warga
|
||||
WHERE status = 'aktif'
|
||||
GROUP BY kategori"
|
||||
)->fetchAll();
|
||||
|
||||
$katCounts = ['sangat_miskin' => 0, 'miskin' => 0, 'hampir_miskin' => 0];
|
||||
foreach ($chartKatRows as $row) {
|
||||
$katCounts[$row['kategori']] = (int)$row['jumlah'];
|
||||
}
|
||||
$chartKat = [
|
||||
'labels' => ['Sangat Miskin', 'Miskin', 'Hampir Miskin'],
|
||||
'data' => [$katCounts['sangat_miskin'], $katCounts['miskin'], $katCounts['hampir_miskin']]
|
||||
];
|
||||
|
||||
// ── 4. CHART 3: Penyaluran per Program Bantuan ────────────
|
||||
$chartBnRows = $db->query(
|
||||
"SELECT jenis, COUNT(*) AS jumlah
|
||||
FROM histori_bantuan
|
||||
GROUP BY jenis
|
||||
ORDER BY jumlah DESC"
|
||||
)->fetchAll();
|
||||
|
||||
$chartBn = [
|
||||
'labels' => array_column($chartBnRows, 'jenis'),
|
||||
'data' => array_map('intval', array_column($chartBnRows, 'jumlah'))
|
||||
];
|
||||
|
||||
// ── 5. CHART 4: Prevalensi Penyakit ───────────────────────
|
||||
$chartPyRows = $db->query(
|
||||
"SELECT penyakit, COUNT(*) AS jumlah
|
||||
FROM riwayat_penyakit
|
||||
GROUP BY penyakit
|
||||
ORDER BY jumlah DESC"
|
||||
)->fetchAll();
|
||||
|
||||
$chartPy = [
|
||||
'labels' => array_column($chartPyRows, 'penyakit'),
|
||||
'data' => array_map('intval', array_column($chartPyRows, 'jumlah'))
|
||||
];
|
||||
|
||||
// ── 6. TABEL RANKING KELURAHAN LENGKAP ────────────────────
|
||||
$rankingRows = $db->query(
|
||||
"SELECT
|
||||
k.nama AS kelurahan,
|
||||
k.kecamatan,
|
||||
COUNT(CASE WHEN w.kategori = 'sangat_miskin' AND w.status = 'aktif' THEN 1 END) AS sangat_miskin,
|
||||
COUNT(CASE WHEN w.kategori = 'miskin' AND w.status = 'aktif' THEN 1 END) AS miskin,
|
||||
COUNT(CASE WHEN w.kategori = 'hampir_miskin' AND w.status = 'aktif' THEN 1 END) AS hampir_miskin,
|
||||
COUNT(CASE WHEN w.status = 'aktif' THEN 1 END) AS total,
|
||||
COALESCE(SUM(hb.nominal), 0) AS total_bantuan,
|
||||
AVG(CASE WHEN w.status = 'aktif' AND w.lat IS NOT NULL AND w.lat != 0 THEN w.lat END) AS avg_lat,
|
||||
AVG(CASE WHEN w.status = 'aktif' AND w.lng IS NOT NULL AND w.lng != 0 THEN w.lng END) AS avg_lng
|
||||
FROM kelurahan k
|
||||
LEFT JOIN warga w ON w.kelurahan_id = k.id
|
||||
LEFT JOIN histori_bantuan hb ON hb.warga_id = w.id
|
||||
GROUP BY k.id
|
||||
ORDER BY total DESC, kelurahan ASC"
|
||||
)->fetchAll();
|
||||
|
||||
$ranking = [];
|
||||
foreach ($rankingRows as $r) {
|
||||
$ranking[] = [
|
||||
'kelurahan' => $r['kelurahan'],
|
||||
'kecamatan' => $r['kecamatan'],
|
||||
'sangat_miskin' => (int)$r['sangat_miskin'],
|
||||
'miskin' => (int)$r['miskin'],
|
||||
'hampir_miskin' => (int)$r['hampir_miskin'],
|
||||
'total' => (int)$r['total'],
|
||||
'total_bantuan' => (float)$r['total_bantuan'],
|
||||
'lat' => $r['avg_lat'] ? (float)$r['avg_lat'] : null,
|
||||
'lng' => $r['avg_lng'] ? (float)$r['avg_lng'] : null,
|
||||
];
|
||||
}
|
||||
|
||||
// Gabungkan hasil statistik
|
||||
$dashboardData = [
|
||||
'kpis' => [
|
||||
'total_kk' => $kpiKK,
|
||||
'sangat_miskin' => $kpiSM,
|
||||
'total_penyaluran' => $kpiBn,
|
||||
'total_nominal' => $kpiBnNom,
|
||||
'penyakit_top' => $kpiPy
|
||||
],
|
||||
'charts' => [
|
||||
'kelurahan' => $chartKel,
|
||||
'kategori' => $chartKat,
|
||||
'bantuan' => $chartBn,
|
||||
'penyakit' => $chartPy
|
||||
],
|
||||
'ranking' => $ranking
|
||||
];
|
||||
|
||||
jsonOk($dashboardData);
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/fasilitas_umum.php — GET Fasilitas Umum
|
||||
// GeoSosial — Sistem Informasi Sosial Kota Pontianak
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
if ($method === 'GET') {
|
||||
$kategori = getParam('kategori');
|
||||
if ($kategori) {
|
||||
$stmt = $db->prepare("SELECT * FROM fasilitas_umum WHERE kategori = ? ORDER BY nama");
|
||||
$stmt->execute([$kategori]);
|
||||
$rows = $stmt->fetchAll();
|
||||
} else {
|
||||
$rows = $db->query("SELECT * FROM fasilitas_umum ORDER BY kategori, nama")->fetchAll();
|
||||
}
|
||||
jsonOk($rows);
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/kelurahan.php — Master data kelurahan
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$db = getDB();
|
||||
$rows = $db->query("SELECT id, nama, kecamatan FROM kelurahan ORDER BY kecamatan, nama")->fetchAll();
|
||||
jsonOk($rows);
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/laporan.php — CRUD & Approval Laporan Masyarakat
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// ── POST: Submit laporan publik baru (Tanpa Login) ──────────
|
||||
if ($method === 'POST') {
|
||||
$d = body();
|
||||
|
||||
if (empty($d['nama'])) jsonError('Nama warga yang dilaporkan wajib diisi.');
|
||||
if (empty($d['kelurahan_id'])) jsonError('Kelurahan wajib dipilih.');
|
||||
if (empty($d['keterangan'])) jsonError('Keterangan kondisi wajib diisi.');
|
||||
|
||||
// Generate No. Laporan: RPT-YYYY-XXXX (cth: RPT-2026-001)
|
||||
$year = date('Y');
|
||||
|
||||
// Lock table / select max count for transaction safety
|
||||
$stmtCount = $db->prepare("SELECT COUNT(*) FROM laporan WHERE YEAR(created_at) = ?");
|
||||
$stmtCount->execute([$year]);
|
||||
$count = $stmtCount->fetchColumn();
|
||||
$nextNo = $count + 1;
|
||||
$noLaporan = "RPT-" . $year . "-" . str_pad($nextNo, 3, '0', STR_PAD_LEFT);
|
||||
|
||||
// Pastikan no_laporan benar-benar unik
|
||||
$stmtCheck = $db->prepare("SELECT COUNT(*) FROM laporan WHERE no_laporan = ?");
|
||||
$stmtCheck->execute([$noLaporan]);
|
||||
if ($stmtCheck->fetchColumn() > 0) {
|
||||
$noLaporan = "RPT-" . $year . "-" . str_pad($nextNo + 1, 3, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO laporan (no_laporan, nama_pelapor, hp_pelapor, nama_dilaporkan, nik,
|
||||
kelurahan_id, kategori, jumlah_anggota, penghasilan, keterangan,
|
||||
lat, lng, status, tgl_laporan)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'menunggu', CURRENT_DATE())"
|
||||
);
|
||||
$stmt->execute([
|
||||
$noLaporan,
|
||||
$d['pelapor'] ?? null,
|
||||
$d['hp'] ?? null,
|
||||
$d['nama'],
|
||||
$d['nik'] ?? null,
|
||||
$d['kelurahan_id'],
|
||||
$d['kategori'] ?? 'miskin',
|
||||
$d['jumlah_anggota'] ?? 1,
|
||||
$d['penghasilan'] ?? 0,
|
||||
$d['keterangan'],
|
||||
$d['lat'] ?? null,
|
||||
$d['lng'] ?? null
|
||||
]);
|
||||
|
||||
$lapId = $db->lastInsertId();
|
||||
jsonOk(['id' => $lapId, 'no' => $noLaporan], 'Laporan berhasil dikirim');
|
||||
}
|
||||
|
||||
// Laporan read/update butuh autentikasi
|
||||
$user = requireAuth();
|
||||
|
||||
// ── GET: List semua laporan ──────────────────────────────────
|
||||
if ($method === 'GET') {
|
||||
$rows = $db->query(
|
||||
"SELECT l.id, l.no_laporan AS no, l.nama_pelapor AS pelapor, l.hp_pelapor AS hp,
|
||||
l.nama_dilaporkan AS nama, l.nik, l.kategori, l.jumlah_anggota AS jml,
|
||||
l.penghasilan AS ph, l.keterangan AS ket, l.lat, l.lng, l.status,
|
||||
l.tgl_laporan AS tgl, l.created_at, k.id AS kelurahan_id, k.nama AS kel, k.kecamatan
|
||||
FROM laporan l
|
||||
LEFT JOIN kelurahan k ON l.kelurahan_id = k.id
|
||||
ORDER BY l.created_at DESC"
|
||||
)->fetchAll();
|
||||
|
||||
jsonOk($rows);
|
||||
}
|
||||
|
||||
// ── PUT: Approve atau Reject laporan ──────────────────────────
|
||||
if ($method === 'PUT') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
$action = getParam('action'); // 'approve' atau 'reject'
|
||||
|
||||
if (!$id) jsonError('ID laporan wajib disertakan.');
|
||||
if (!in_array($action, ['approve', 'reject'])) jsonError('Aksi tidak valid.');
|
||||
|
||||
$db->beginTransaction();
|
||||
try {
|
||||
// Ambil data laporan
|
||||
$stmtLap = $db->prepare("SELECT * FROM laporan WHERE id = ?");
|
||||
$stmtLap->execute([$id]);
|
||||
$lap = $stmtLap->fetch();
|
||||
|
||||
if (!$lap) jsonError('Laporan tidak ditemukan.');
|
||||
if ($lap['status'] !== 'menunggu') jsonError('Laporan sudah diproses sebelumnya.');
|
||||
|
||||
if ($action === 'reject') {
|
||||
$stmtUp = $db->prepare("UPDATE laporan SET status = 'ditolak', tgl_proses = CURRENT_TIMESTAMP() WHERE id = ?");
|
||||
$stmtUp->execute([$id]);
|
||||
$db->commit();
|
||||
jsonOk(null, 'Laporan ditolak');
|
||||
}
|
||||
|
||||
if ($action === 'approve') {
|
||||
// 1. Tambahkan ke tabel warga
|
||||
$stmtWarga = $db->prepare(
|
||||
"INSERT INTO warga (nama, nik, kelurahan_id, lat, lng, kategori, jumlah_anggota,
|
||||
penghasilan, tgl_lahir, pendidikan, keterangan, status, pelapor, no_laporan)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, '', ?, 'aktif', ?, ?)"
|
||||
);
|
||||
$stmtWarga->execute([
|
||||
$lap['nama_dilaporkan'],
|
||||
$lap['nik'],
|
||||
$lap['kelurahan_id'],
|
||||
$lap['lat'] ?? -0.0230,
|
||||
$lap['lng'] ?? 109.3420,
|
||||
$lap['kategori'],
|
||||
$lap['jumlah_anggota'] ?? 1,
|
||||
$lap['penghasilan'] ?? 0,
|
||||
$lap['keterangan'] . ' (Laporan: ' . $lap['no_laporan'] . ')',
|
||||
$lap['nama_pelapor'],
|
||||
$lap['no_laporan']
|
||||
]);
|
||||
$wargaId = $db->lastInsertId();
|
||||
|
||||
// 2. Tambahkan KK sebagai anggota keluarga pertama
|
||||
$stmtAnggota = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan)
|
||||
VALUES (?, ?, 0, 'Kepala Keluarga')"
|
||||
);
|
||||
$stmtAnggota->execute([$wargaId, $lap['nama_dilaporkan']]);
|
||||
|
||||
// 3. Update status laporan menjadi disetujui & tautkan warga_id
|
||||
$stmtUp = $db->prepare(
|
||||
"UPDATE laporan
|
||||
SET status = 'disetujui', warga_id = ?, approved_by = ?, tgl_proses = CURRENT_TIMESTAMP()
|
||||
WHERE id = ?"
|
||||
);
|
||||
$stmtUp->execute([$wargaId, $user['id'], $id]);
|
||||
|
||||
$db->commit();
|
||||
jsonOk(['warga_id' => $wargaId], 'Laporan disetujui dan warga berhasil ditambahkan');
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
jsonError('Gagal memproses laporan: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
// api/rumah_ibadah.php — CRUD Rumah Ibadah
|
||||
require_once __DIR__ . '/config.php';
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
if ($method === 'GET') {
|
||||
$rows = $db->query(
|
||||
"SELECT ri.*, k.nama AS kelurahan, k.kecamatan
|
||||
FROM rumah_ibadah ri
|
||||
LEFT JOIN kelurahan k ON ri.kelurahan_id = k.id
|
||||
ORDER BY ri.tipe, ri.nama"
|
||||
)->fetchAll();
|
||||
jsonOk($rows);
|
||||
}
|
||||
|
||||
if ($method === 'POST') {
|
||||
requireEdit();
|
||||
$d = body();
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat wajib diisi.');
|
||||
$ikonMap = ['masjid'=>'🕌','gereja'=>'⛪','pura'=>'🛕','vihara'=>'🏛️','klenteng'=>'🏯'];
|
||||
$tipe = $d['tipe'] ?? 'masjid';
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO rumah_ibadah (nama, tipe, ikon, lat, lng, kapasitas, kelurahan_id, alamat)
|
||||
VALUES (?,?,?,?,?,?,?,?)"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'], $tipe, $ikonMap[$tipe] ?? '🛕',
|
||||
$d['lat'], $d['lng'],
|
||||
$d['kapasitas'] ?? 0,
|
||||
!empty($d['kelurahan_id']) ? $d['kelurahan_id'] : null,
|
||||
$d['alamat'] ?? ''
|
||||
]);
|
||||
jsonOk(['id' => $db->lastInsertId()], 'Rumah ibadah berhasil ditambahkan');
|
||||
}
|
||||
|
||||
if ($method === 'PUT') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$d = body();
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat wajib diisi.');
|
||||
$ikonMap = ['masjid'=>'🕌','gereja'=>'⛪','pura'=>'🛕','vihara'=>'🏛️','klenteng'=>'🏯'];
|
||||
$tipe = $d['tipe'] ?? 'masjid';
|
||||
$stmt = $db->prepare(
|
||||
"UPDATE rumah_ibadah
|
||||
SET nama=?, tipe=?, ikon=?, lat=?, lng=?, kapasitas=?, kelurahan_id=?, alamat=?
|
||||
WHERE id=?"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'], $tipe, $ikonMap[$tipe] ?? '🛕',
|
||||
$d['lat'], $d['lng'],
|
||||
$d['kapasitas'] ?? 0,
|
||||
!empty($d['kelurahan_id']) ? $d['kelurahan_id'] : null,
|
||||
$d['alamat'] ?? '',
|
||||
$id
|
||||
]);
|
||||
jsonOk(null, 'Rumah ibadah berhasil diperbarui');
|
||||
}
|
||||
|
||||
if ($method === 'DELETE') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$db->prepare("DELETE FROM rumah_ibadah WHERE id=?")->execute([$id]);
|
||||
jsonOk(null, 'Rumah ibadah berhasil dihapus');
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/users.php — Manajemen Pengguna (Admin only)
|
||||
// GET — list semua pengguna
|
||||
// PUT ?id= — update jabatan, role, can_edit, aktif
|
||||
// POST — tambah pengguna baru
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// ── GET: list semua pengguna ────────────────────────────────
|
||||
if ($method === 'GET') {
|
||||
requireAuth();
|
||||
$rows = $db->query(
|
||||
"SELECT id, username, role, jabatan, can_edit, is_admin, is_wali, aktif, created_at
|
||||
FROM users ORDER BY id"
|
||||
)->fetchAll();
|
||||
// Hapus password dari hasil
|
||||
jsonOk($rows);
|
||||
}
|
||||
|
||||
// ── PUT: update data pengguna ───────────────────────────────
|
||||
if ($method === 'PUT') {
|
||||
$user = requireAuth();
|
||||
if (!$user['is_admin']) jsonError('Hanya admin yang dapat mengubah data pengguna.', 403);
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$d = body();
|
||||
|
||||
$fields = [];
|
||||
$params = [];
|
||||
|
||||
if (isset($d['jabatan'])) { $fields[] = 'jabatan=?'; $params[] = $d['jabatan']; }
|
||||
if (isset($d['role'])) { $fields[] = 'role=?'; $params[] = $d['role'];
|
||||
$params_extra = [];
|
||||
$isAdmin = $d['role'] === 'admin' ? 1 : 0;
|
||||
$isWali = $d['role'] === 'walikota' ? 1 : 0;
|
||||
$fields[] = 'is_admin=?'; $params[] = $isAdmin;
|
||||
$fields[] = 'is_wali=?'; $params[] = $isWali; }
|
||||
if (isset($d['can_edit'])) { $fields[] = 'can_edit=?'; $params[] = $d['can_edit'] ? 1 : 0; }
|
||||
if (isset($d['aktif'])) { $fields[] = 'aktif=?'; $params[] = $d['aktif'] ? 1 : 0; }
|
||||
if (isset($d['password']) && strlen($d['password']) >= 6) {
|
||||
$fields[] = 'password=?';
|
||||
$params[] = password_hash($d['password'], PASSWORD_BCRYPT);
|
||||
}
|
||||
|
||||
if (empty($fields)) jsonError('Tidak ada data yang diubah.');
|
||||
|
||||
$params[] = $id;
|
||||
$db->prepare("UPDATE users SET " . implode(', ', $fields) . " WHERE id=?")->execute($params);
|
||||
jsonOk(null, 'Data pengguna berhasil diperbarui');
|
||||
}
|
||||
|
||||
// ── POST: tambah pengguna baru ──────────────────────────────
|
||||
if ($method === 'POST') {
|
||||
$user = requireAuth();
|
||||
if (!$user['is_admin']) jsonError('Hanya admin yang dapat menambah pengguna.', 403);
|
||||
$d = body();
|
||||
if (empty($d['username'])) jsonError('Username wajib diisi.');
|
||||
if (empty($d['password']) || strlen($d['password']) < 6) jsonError('Password minimal 6 karakter.');
|
||||
|
||||
// Cek username sudah ada
|
||||
$chk = $db->prepare("SELECT id FROM users WHERE username=?");
|
||||
$chk->execute([$d['username']]);
|
||||
if ($chk->fetch()) jsonError('Username sudah digunakan.');
|
||||
|
||||
$role = $d['role'] ?? 'viewer';
|
||||
$isAdmin = $role === 'admin' ? 1 : 0;
|
||||
$isWali = $role === 'walikota' ? 1 : 0;
|
||||
$canEdit = in_array($role, ['admin', 'petugas']) ? 1 : 0;
|
||||
if (isset($d['can_edit'])) $canEdit = $d['can_edit'] ? 1 : 0;
|
||||
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO users (username, password, role, jabatan, can_edit, is_admin, is_wali, aktif)
|
||||
VALUES (?,?,?,?,?,?,?,1)"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['username'],
|
||||
password_hash($d['password'], PASSWORD_BCRYPT),
|
||||
$role,
|
||||
$d['jabatan'] ?? '',
|
||||
$canEdit,
|
||||
$isAdmin,
|
||||
$isWali,
|
||||
]);
|
||||
jsonOk(['id' => $db->lastInsertId()], 'Pengguna berhasil ditambahkan');
|
||||
}
|
||||
|
||||
// ── DELETE: nonaktifkan pengguna ────────────────────────────
|
||||
if ($method === 'DELETE') {
|
||||
$user = requireAuth();
|
||||
if (!$user['is_admin']) jsonError('Hanya admin yang dapat menghapus pengguna.', 403);
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
// Jangan hapus diri sendiri
|
||||
if ($id == $user['id']) jsonError('Tidak dapat menghapus akun sendiri.');
|
||||
$db->prepare("DELETE FROM users WHERE id=?")->execute([$id]);
|
||||
jsonOk(null, 'Pengguna berhasil dihapus');
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
+260
@@ -0,0 +1,260 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// api/warga.php — CRUD Data Warga (Kepala Keluarga)
|
||||
// GET ?kat=&kel_id=&kec=&status=aktif — list warga
|
||||
// POST — tambah warga
|
||||
// PUT ?id= — update warga
|
||||
// DELETE ?id= — hapus warga
|
||||
// ============================================================
|
||||
require_once __DIR__ . '/config.php';
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = getDB();
|
||||
|
||||
// ── GET: list warga dengan filter ──────────────────────────
|
||||
if ($method === 'GET') {
|
||||
$where = ["w.status = 'aktif'"];
|
||||
$params = [];
|
||||
|
||||
if ($kat = getParam('kat')) { $where[] = "w.kategori = ?"; $params[] = $kat; }
|
||||
if ($kid = getParam('kel_id')){ $where[] = "w.kelurahan_id = ?"; $params[] = $kid; }
|
||||
if ($kec = getParam('kec')) { $where[] = "k.kecamatan = ?"; $params[] = $kec; }
|
||||
|
||||
$sql = "SELECT w.id, w.nama, w.nik, w.lat, w.lng, w.kategori,
|
||||
w.jumlah_anggota, w.penghasilan, w.tgl_lahir, w.pendidikan,
|
||||
w.keterangan, w.status, w.pelapor, w.no_laporan, w.created_at,
|
||||
k.id AS kelurahan_id, k.nama AS kelurahan, k.kecamatan
|
||||
FROM warga w
|
||||
LEFT JOIN kelurahan k ON w.kelurahan_id = k.id
|
||||
WHERE " . implode(' AND ', $where) . "
|
||||
ORDER BY w.created_at DESC";
|
||||
|
||||
$stmt = $db->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$wargaList = $stmt->fetchAll();
|
||||
|
||||
// Ambil anggota & penyakit untuk setiap warga
|
||||
foreach ($wargaList as &$w) {
|
||||
$stmt2 = $db->prepare(
|
||||
"SELECT a.id, a.nama, a.usia, a.hubungan,
|
||||
GROUP_CONCAT(rp.penyakit SEPARATOR ',') AS penyakit_csv
|
||||
FROM anggota_keluarga a
|
||||
LEFT JOIN riwayat_penyakit rp ON rp.anggota_id = a.id
|
||||
WHERE a.warga_id = ?
|
||||
GROUP BY a.id"
|
||||
);
|
||||
$stmt2->execute([$w['id']]);
|
||||
$anggota = $stmt2->fetchAll();
|
||||
foreach ($anggota as &$a) {
|
||||
$a['penyakit'] = $a['penyakit_csv'] ? explode(',', $a['penyakit_csv']) : [];
|
||||
unset($a['penyakit_csv']);
|
||||
}
|
||||
$w['anggota'] = $anggota;
|
||||
|
||||
// Riwayat penyakit KK (dari anggota dengan nama sama / index 0)
|
||||
$rp_kk = [];
|
||||
if (!empty($anggota)) {
|
||||
$rp_kk = $anggota[0]['penyakit'];
|
||||
}
|
||||
$w['riwayat_penyakit'] = $rp_kk;
|
||||
|
||||
// Histori bantuan
|
||||
$stmt3 = $db->prepare(
|
||||
"SELECT id, tanggal, jenis, nominal, sumber_dana AS sumber, keterangan
|
||||
FROM histori_bantuan WHERE warga_id = ? ORDER BY tanggal DESC"
|
||||
);
|
||||
$stmt3->execute([$w['id']]);
|
||||
$w['histori_bantuan'] = $stmt3->fetchAll();
|
||||
}
|
||||
|
||||
jsonOk($wargaList);
|
||||
}
|
||||
|
||||
// ── POST: tambah warga ──────────────────────────────────────
|
||||
if ($method === 'POST') {
|
||||
requireEdit();
|
||||
$d = body();
|
||||
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat lokasi wajib diisi.');
|
||||
if (empty($d['kelurahan_id'])) jsonError('Kelurahan wajib dipilih.');
|
||||
|
||||
$db->beginTransaction();
|
||||
try {
|
||||
$stmt = $db->prepare(
|
||||
"INSERT INTO warga (nama, nik, kelurahan_id, lat, lng, kategori, jumlah_anggota,
|
||||
penghasilan, tgl_lahir, pendidikan, keterangan, pelapor, no_laporan)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'],
|
||||
$d['nik'] ?? null,
|
||||
$d['kelurahan_id'],
|
||||
$d['lat'],
|
||||
$d['lng'],
|
||||
$d['kategori'] ?? 'miskin',
|
||||
$d['jumlah_anggota'] ?? 1,
|
||||
$d['penghasilan'] ?? 0,
|
||||
!empty($d['tgl_lahir']) ? $d['tgl_lahir'] : null,
|
||||
$d['pendidikan'] ?? '',
|
||||
$d['keterangan'] ?? '',
|
||||
$d['pelapor'] ?? null,
|
||||
$d['no_laporan'] ?? null,
|
||||
]);
|
||||
$wargaId = $db->lastInsertId();
|
||||
|
||||
// 1. Simpan Kepala Keluarga sebagai anggota keluarga pertama
|
||||
$usiaKk = 0;
|
||||
if (!empty($d['tgl_lahir'])) {
|
||||
try {
|
||||
$birthDate = new DateTime($d['tgl_lahir']);
|
||||
$today = new DateTime();
|
||||
$usiaKk = $today->diff($birthDate)->y;
|
||||
} catch (Exception $e) {
|
||||
$usiaKk = 0;
|
||||
}
|
||||
}
|
||||
$stmtKk = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?, ?, ?, 'Kepala Keluarga')"
|
||||
);
|
||||
$stmtKk->execute([$wargaId, $d['nama'], $usiaKk]);
|
||||
$kkAnggotaId = $db->lastInsertId();
|
||||
|
||||
$kkPenyakit = $d['rp'] ?? $d['riwayat_penyakit'] ?? [];
|
||||
foreach ($kkPenyakit as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?, ?)")
|
||||
->execute([$kkAnggotaId, $py]);
|
||||
}
|
||||
|
||||
// 2. Simpan anggota keluarga lainnya + penyakit mereka
|
||||
foreach (($d['anggota'] ?? []) as $a) {
|
||||
if (empty($a['nama'])) continue;
|
||||
|
||||
// Hindari duplikasi jika KK dikirim lagi di list anggota
|
||||
if (strtolower(trim($a['nama'])) === strtolower(trim($d['nama'])) && ($a['hub'] ?? $a['hubungan'] ?? '') === 'Kepala Keluarga') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$stmtA = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?,?,?,?)"
|
||||
);
|
||||
$stmtA->execute([$wargaId, $a['nama'], $a['usia'] ?? 0, $a['hub'] ?? $a['hubungan'] ?? 'Anak']);
|
||||
$anggotaId = $db->lastInsertId();
|
||||
|
||||
foreach (($a['penyakit'] ?? $a['py'] ?? []) as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?,?)")
|
||||
->execute([$anggotaId, $py]);
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
jsonOk(['id' => $wargaId], 'Data warga berhasil ditambahkan');
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
jsonError('Gagal menyimpan: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
// ── PUT: update data warga ─────────────────────────────────
|
||||
if ($method === 'PUT') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$d = body();
|
||||
if (empty($d['nama'])) jsonError('Nama wajib diisi.');
|
||||
if (!isset($d['lat'], $d['lng'])) jsonError('Koordinat lokasi wajib diisi.');
|
||||
if (empty($d['kelurahan_id'])) jsonError('Kelurahan wajib dipilih.');
|
||||
|
||||
$db->beginTransaction();
|
||||
try {
|
||||
// 1. Update data kepala keluarga
|
||||
$stmt = $db->prepare(
|
||||
"UPDATE warga SET nama=?, nik=?, kelurahan_id=?, lat=?, lng=?,
|
||||
kategori=?, jumlah_anggota=?, penghasilan=?,
|
||||
tgl_lahir=?, pendidikan=?, keterangan=?
|
||||
WHERE id=?"
|
||||
);
|
||||
$stmt->execute([
|
||||
$d['nama'],
|
||||
$d['nik'] ?? null,
|
||||
$d['kelurahan_id'],
|
||||
$d['lat'],
|
||||
$d['lng'],
|
||||
$d['kategori'] ?? 'miskin',
|
||||
$d['jumlah_anggota'] ?? 1,
|
||||
$d['penghasilan'] ?? 0,
|
||||
!empty($d['tgl_lahir']) ? $d['tgl_lahir'] : null,
|
||||
$d['pendidikan'] ?? '',
|
||||
$d['keterangan'] ?? '',
|
||||
$id
|
||||
]);
|
||||
|
||||
// 2. Hapus anggota lama beserta riwayat penyakitnya
|
||||
$oldAnggota = $db->prepare("SELECT id FROM anggota_keluarga WHERE warga_id=?");
|
||||
$oldAnggota->execute([$id]);
|
||||
foreach ($oldAnggota->fetchAll() as $oa) {
|
||||
$db->prepare("DELETE FROM riwayat_penyakit WHERE anggota_id=?")->execute([$oa['id']]);
|
||||
}
|
||||
$db->prepare("DELETE FROM anggota_keluarga WHERE warga_id=?")->execute([$id]);
|
||||
|
||||
// 3. Simpan KK sebagai anggota keluarga pertama
|
||||
$usiaKk = 0;
|
||||
if (!empty($d['tgl_lahir'])) {
|
||||
try {
|
||||
$birthDate = new DateTime($d['tgl_lahir']);
|
||||
$today = new DateTime();
|
||||
$usiaKk = $today->diff($birthDate)->y;
|
||||
} catch (Exception $e) { $usiaKk = 0; }
|
||||
}
|
||||
$stmtKk = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?, ?, ?, 'Kepala Keluarga')"
|
||||
);
|
||||
$stmtKk->execute([$id, $d['nama'], $usiaKk]);
|
||||
$kkAnggotaId = $db->lastInsertId();
|
||||
|
||||
$kkPenyakit = $d['rp'] ?? $d['riwayat_penyakit'] ?? [];
|
||||
foreach ($kkPenyakit as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?, ?)")
|
||||
->execute([$kkAnggotaId, $py]);
|
||||
}
|
||||
|
||||
// 4. Simpan anggota keluarga lainnya
|
||||
foreach (($d['anggota'] ?? []) as $a) {
|
||||
if (empty($a['nama'])) continue;
|
||||
if (strtolower(trim($a['nama'])) === strtolower(trim($d['nama'])) &&
|
||||
($a['hub'] ?? $a['hubungan'] ?? '') === 'Kepala Keluarga') {
|
||||
continue;
|
||||
}
|
||||
$stmtA = $db->prepare(
|
||||
"INSERT INTO anggota_keluarga (warga_id, nama, usia, hubungan) VALUES (?,?,?,?)"
|
||||
);
|
||||
$stmtA->execute([$id, $a['nama'], $a['usia'] ?? 0, $a['hub'] ?? $a['hubungan'] ?? 'Anak']);
|
||||
$anggotaId = $db->lastInsertId();
|
||||
foreach (($a['penyakit'] ?? $a['py'] ?? []) as $py) {
|
||||
if (!$py) continue;
|
||||
$db->prepare("INSERT INTO riwayat_penyakit (anggota_id, penyakit) VALUES (?,?)")
|
||||
->execute([$anggotaId, $py]);
|
||||
}
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
jsonOk(null, 'Data warga berhasil diperbarui');
|
||||
} catch (Exception $e) {
|
||||
$db->rollBack();
|
||||
jsonError('Gagal memperbarui: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
// ── DELETE: hapus warga ────────────────────────────────────
|
||||
if ($method === 'DELETE') {
|
||||
requireEdit();
|
||||
$id = getParam('id');
|
||||
if (!$id) jsonError('ID wajib disertakan.');
|
||||
$db->prepare("UPDATE warga SET status='nonaktif' WHERE id=?")->execute([$id]);
|
||||
jsonOk(null, 'Data warga berhasil dihapus');
|
||||
}
|
||||
|
||||
jsonError('Method tidak valid', 405);
|
||||
Reference in New Issue
Block a user