Files
WebGIS-Poverty-MAP/api/penduduk_miskin.php
T

282 lines
12 KiB
PHP

<?php
// ================================================================
// API: Penduduk Miskin
// Methods: GET, POST, PUT, DELETE
// ================================================================
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../includes/functions.php';
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204); exit;
}
$db = getDB();
$method = $_SERVER['REQUEST_METHOD'];
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
// Override method if it's a POST request with an ID, to support multipart/form-data in updates (PUT)
if ($method === 'POST' && $id !== null) {
$method = 'PUT';
}
// ── GET ────────────────────────────────────────────────────────
if ($method === 'GET') {
if ($id) {
// Detail lengkap termasuk anggota keluarga dan info ibadah
$stmt = $db->prepare("
SELECT pm.*,
ri.nama AS ibadah_nama, ri.jenis AS ibadah_jenis,
ri.kontak AS ibadah_kontak, ri.lat AS ibadah_lat, ri.lng AS ibadah_lng
FROM penduduk_miskin pm
LEFT JOIN rumah_ibadah ri ON pm.rumah_ibadah_id = ri.id
WHERE pm.id = ?
");
$stmt->execute([$id]);
$row = $stmt->fetch();
if (!$row) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404);
// Anggota keluarga
$stmtAk = $db->prepare("SELECT * FROM anggota_keluarga WHERE penduduk_id = ? ORDER BY id");
$stmtAk->execute([$id]);
$row['anggota'] = $stmtAk->fetchAll();
jsonResponse(['success' => true, 'data' => $row]);
}
// List dengan filter + search
$where = ['1=1'];
$params = [];
if (!empty($_GET['status'])) {
$where[] = 'pm.status_bantuan = ?';
$params[] = $_GET['status'];
}
if (!empty($_GET['kecamatan'])) {
$where[] = 'pm.kecamatan = ?';
$params[] = $_GET['kecamatan'];
}
if (!empty($_GET['kelurahan'])) {
$where[] = 'pm.kelurahan = ?';
$params[] = $_GET['kelurahan'];
}
if (!empty($_GET['ibadah_id'])) {
$where[] = 'pm.rumah_ibadah_id = ?';
$params[] = (int)$_GET['ibadah_id'];
}
if (!empty($_GET['search'])) {
$where[] = '(pm.kk_nama LIKE ? OR pm.alamat LIKE ? OR pm.nik LIKE ?)';
$q = '%' . $_GET['search'] . '%';
$params = array_merge($params, [$q, $q, $q]);
}
$sql = "SELECT pm.*,
ri.nama AS ibadah_nama,
ri.jenis AS ibadah_jenis
FROM penduduk_miskin pm
LEFT JOIN rumah_ibadah ri ON pm.rumah_ibadah_id = ri.id
WHERE " . implode(' AND ', $where) . "
ORDER BY pm.created_at DESC";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
jsonResponse(['success' => true, 'data' => $rows, 'total' => count($rows)]);
}
// ── POST ───────────────────────────────────────────────────────
if ($method === 'POST') {
$isMultipart = str_contains($_SERVER['CONTENT_TYPE'] ?? '', 'multipart/form-data');
$body = $isMultipart ? $_POST : (json_decode(file_get_contents('php://input'), true) ?? []);
$required = ['kk_nama', 'lat', 'lng'];
foreach ($required as $f) {
if (empty($body[$f])) jsonResponse(['success' => false, 'message' => "Field '$f' wajib diisi"], 422);
}
$lat = (float)$body['lat'];
$lng = (float)$body['lng'];
// Auto-cari rumah ibadah terdekat
$nearest = findNearestIbadah($lat, $lng);
$ibadahId = $nearest ? (int)$nearest['id'] : null;
$jarakIbadah = $nearest ? (float)$nearest['jarak'] : null;
// Handle upload bukti
$buktiFile = null;
if (!empty($_FILES['bukti_file']) && $_FILES['bukti_file']['error'] === UPLOAD_ERR_OK) {
$buktiFile = handleUpload($_FILES['bukti_file'], 'bukti');
}
$stmt = $db->prepare("
INSERT INTO penduduk_miskin
(kk_nama, nik, jumlah_anggota, alamat, kelurahan, kecamatan, lat, lng,
rumah_ibadah_id, jarak_ke_ibadah, status_bantuan, jenis_bantuan,
tanggal_bantuan, nominal_bantuan, bukti_file)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
");
$stmt->execute([
sanitize($body['kk_nama']),
sanitize($body['nik'] ?? ''),
(int)($body['jumlah_anggota'] ?? 1),
sanitize($body['alamat'] ?? ''),
sanitize($body['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? ''),
$lat, $lng,
$ibadahId,
$jarakIbadah,
$body['status_bantuan'] ?? 'belum',
sanitize($body['jenis_bantuan'] ?? ''),
!empty($body['tanggal_bantuan']) ? $body['tanggal_bantuan'] : null,
!empty($body['nominal_bantuan']) ? (float)str_replace(['.', ','], ['', '.'], $body['nominal_bantuan']) : null,
$buktiFile,
]);
$newId = $db->lastInsertId();
// Simpan anggota keluarga jika ada (anggota bisa berupa JSON string dari FormData)
$anggotaData = $body['anggota'] ?? null;
if (is_string($anggotaData)) $anggotaData = json_decode($anggotaData, true);
if (!empty($anggotaData) && is_array($anggotaData)) {
saveAnggota($db, $newId, $anggotaData);
}
// Fetch full data
$new = $db->query("
SELECT pm.*, ri.nama AS ibadah_nama, ri.jenis AS ibadah_jenis
FROM penduduk_miskin pm
LEFT JOIN rumah_ibadah ri ON pm.rumah_ibadah_id = ri.id
WHERE pm.id = $newId
")->fetch();
jsonResponse(['success' => true, 'message' => 'Data penduduk berhasil ditambahkan', 'data' => $new], 201);
}
// ── PUT ────────────────────────────────────────────────────────
if ($method === 'PUT') {
if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400);
// Cek apakah form-data (ada file / urlencoded) atau JSON
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
$isForm = str_contains($contentType, 'multipart/form-data') || str_contains($contentType, 'application/x-www-form-urlencoded');
$body = $isForm ? $_POST : (json_decode(file_get_contents('php://input'), true) ?? []);
$current = $db->prepare("SELECT * FROM penduduk_miskin WHERE id = ?");
$current->execute([$id]);
$existing = $current->fetch();
if (!$existing) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404);
$lat = (float)($body['lat'] ?? $existing['lat']);
$lng = (float)($body['lng'] ?? $existing['lng']);
// Re-assign ibadah terdekat jika koordinat berubah
$coordChanged = ($lat != (float)$existing['lat'] || $lng != (float)$existing['lng']);
if ($coordChanged || isset($body['force_reassign'])) {
$nearest = findNearestIbadah($lat, $lng);
$ibadahId = $nearest ? (int)$nearest['id'] : null;
$jarakIbadah = $nearest ? (float)$nearest['jarak'] : null;
} else {
$ibadahId = (int)($body['rumah_ibadah_id'] ?? $existing['rumah_ibadah_id']);
$jarakIbadah = (float)($existing['jarak_ke_ibadah'] ?? 0);
}
// Handle upload bukti baru
$buktiFile = $existing['bukti_file'];
if (!empty($_FILES['bukti_file']) && $_FILES['bukti_file']['error'] === UPLOAD_ERR_OK) {
$newFile = handleUpload($_FILES['bukti_file'], 'bukti');
if ($newFile) $buktiFile = $newFile;
}
$status_bantuan = $body['status_bantuan'] ?? $existing['status_bantuan'];
if ($status_bantuan === 'belum') {
$jenis_bantuan = null;
$tanggal_bantuan = null;
$nominal_bantuan = null;
} else {
$jenis_bantuan = isset($body['jenis_bantuan']) ? sanitize($body['jenis_bantuan']) : $existing['jenis_bantuan'];
$tanggal_bantuan = isset($body['tanggal_bantuan']) ? (!empty($body['tanggal_bantuan']) ? $body['tanggal_bantuan'] : null) : $existing['tanggal_bantuan'];
if (isset($body['nominal_bantuan'])) {
$nominal_bantuan = $body['nominal_bantuan'] !== '' ? (float)str_replace(['.', ','], ['', '.'], $body['nominal_bantuan']) : null;
} else {
$nominal_bantuan = $existing['nominal_bantuan'];
}
}
$stmt = $db->prepare("
UPDATE penduduk_miskin
SET kk_nama=?, nik=?, jumlah_anggota=?, alamat=?, kelurahan=?, kecamatan=?,
lat=?, lng=?, rumah_ibadah_id=?, jarak_ke_ibadah=?,
status_bantuan=?, jenis_bantuan=?, tanggal_bantuan=?, nominal_bantuan=?, bukti_file=?
WHERE id=?
");
$stmt->execute([
sanitize($body['kk_nama'] ?? $existing['kk_nama']),
sanitize($body['nik'] ?? $existing['nik'] ?? ''),
(int)($body['jumlah_anggota'] ?? $existing['jumlah_anggota']),
sanitize($body['alamat'] ?? $existing['alamat'] ?? ''),
sanitize($body['kelurahan'] ?? $existing['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? $existing['kecamatan'] ?? ''),
$lat, $lng,
$ibadahId, $jarakIbadah,
$status_bantuan,
$jenis_bantuan,
$tanggal_bantuan,
$nominal_bantuan,
$buktiFile,
$id,
]);
// Update anggota keluarga (anggota bisa berupa JSON string dari FormData)
if (isset($body['anggota'])) {
$anggotaDataPut = $body['anggota'];
if (is_string($anggotaDataPut)) $anggotaDataPut = json_decode($anggotaDataPut, true);
if (is_array($anggotaDataPut)) {
$db->prepare("DELETE FROM anggota_keluarga WHERE penduduk_id = ?")->execute([$id]);
saveAnggota($db, $id, $anggotaDataPut);
}
}
$updated = $db->query("
SELECT pm.*, ri.nama AS ibadah_nama, ri.jenis AS ibadah_jenis
FROM penduduk_miskin pm
LEFT JOIN rumah_ibadah ri ON pm.rumah_ibadah_id = ri.id
WHERE pm.id = $id
")->fetch();
jsonResponse(['success' => true, 'message' => 'Data berhasil diperbarui', 'data' => $updated]);
}
// ── DELETE ─────────────────────────────────────────────────────
if ($method === 'DELETE') {
if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400);
$stmt = $db->prepare("DELETE FROM penduduk_miskin WHERE id = ?");
$stmt->execute([$id]);
if ($stmt->rowCount() === 0) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404);
jsonResponse(['success' => true, 'message' => 'Data berhasil dihapus']);
}
// ── Helper ─────────────────────────────────────────────────────
function saveAnggota(PDO $db, int $pendudukId, array $list): void {
$stmt = $db->prepare("
INSERT INTO anggota_keluarga (penduduk_id, nama, hubungan, umur, pekerjaan, keterangan)
VALUES (?,?,?,?,?,?)
");
foreach ($list as $a) {
if (empty($a['nama'])) continue;
$stmt->execute([
$pendudukId,
sanitize($a['nama'] ?? ''),
sanitize($a['hubungan'] ?? ''),
!empty($a['umur']) ? (int)$a['umur'] : null,
sanitize($a['pekerjaan'] ?? ''),
sanitize($a['keterangan'] ?? ''),
]);
}
}
jsonResponse(['success' => false, 'message' => 'Method tidak didukung'], 405);