Upload files to "api"

This commit is contained in:
2026-06-02 03:13:49 +00:00
parent 9763625d13
commit d45bcee067
5 changed files with 511 additions and 0 deletions
+190
View File
@@ -0,0 +1,190 @@
<?php
require_once __DIR__ . '/_helpers.php';
api_require_login();
$method = $_SERVER['REQUEST_METHOD'];
$user = current_user();
$role = current_role();
function clean_allowed($value, array $allowed, string $default): string
{
$v = clean_string($value);
return in_array($v, $allowed, true) ? $v : $default;
}
function can_access_family(array $kel, array $user, string $role): bool
{
if (in_array($role, ['admin','dinas','relawan'], true)) return true;
if ($role === 'masyarakat') return (int)$kel['created_by'] === (int)$user['id'];
if ($role === 'rumah_ibadah') {
return (!empty($user['rumah_ibadah_id']) && (int)$kel['rumah_ibadah_id'] === (int)$user['rumah_ibadah_id']) || (int)$kel['created_by'] === (int)$user['id'] || $kel['status_bantuan'] === 'Blank Spot';
}
return false;
}
if ($method === 'GET') {
$where = '';
$params = [];
if ($role === 'masyarakat') {
$where = 'WHERE k.created_by = ?';
$params[] = $user['id'];
} elseif ($role === 'rumah_ibadah' && !empty($user['rumah_ibadah_id'])) {
$where = 'WHERE k.rumah_ibadah_id = ? OR k.status_bantuan = "Blank Spot" OR k.created_by = ?';
$params[] = (int)$user['rumah_ibadah_id'];
$params[] = $user['id'];
}
$sql = 'SELECT k.*, r.nama AS nama_rumah_ibadah, r.kategori AS kategori_rumah_ibadah,
r.lat AS ri_lat, r.lng AS ri_lng,
COALESCE(a.jumlah_anggota, 0) AS jumlah_anggota,
COALESCE(a.jumlah_mampu_bekerja, 0) AS jumlah_mampu_bekerja
FROM keluarga k
LEFT JOIN rumah_ibadah r ON r.id = k.rumah_ibadah_id
LEFT JOIN (
SELECT keluarga_id,
COUNT(*) AS jumlah_anggota,
SUM(CASE WHEN mampu_bekerja = "Ya" THEN 1 ELSE 0 END) AS jumlah_mampu_bekerja
FROM keluarga_anggota
GROUP BY keluarga_id
) a ON a.keluarga_id = k.id
' . $where . '
ORDER BY FIELD(k.kerentanan, "Miskin Ekstrem", "Sangat Miskin", "Miskin", "Rentan Miskin"), k.nama_kk ASC';
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
if ($rows) {
$ids = array_map(fn($r) => (int)$r['id'], $rows);
$placeholders = implode(',', array_fill(0, count($ids), '?'));
$anggotaStmt = $pdo->prepare('SELECT * FROM keluarga_anggota WHERE keluarga_id IN (' . $placeholders . ') ORDER BY FIELD(hubungan, "Kepala Keluarga", "Suami", "Istri", "Anak", "Orang Tua", "Mertua", "Famili Lain", "Lainnya"), tanggal_lahir ASC, nama ASC');
$anggotaStmt->execute($ids);
$anggotaByKeluarga = [];
foreach ($anggotaStmt->fetchAll() as $anggota) {
$anggotaByKeluarga[(int)$anggota['keluarga_id']][] = $anggota;
}
foreach ($rows as &$row) {
$row['anggota'] = $anggotaByKeluarga[(int)$row['id']] ?? [];
}
unset($row);
}
json_response(['success' => true, 'data' => $rows]);
}
if ($method === 'POST') {
$data = get_json_input();
required_fields($data, ['nama_kk','alamat','kerentanan','kebutuhan','lat','lng']);
$statusVerifikasi = clean_string($data['status_verifikasi'] ?? 'Menunggu Verifikasi');
if ($role === 'masyarakat' || !role_in(['admin','dinas','relawan'])) {
$statusVerifikasi = 'Menunggu Verifikasi';
}
$allowedStatus = ['Menunggu Verifikasi','Valid','Tidak Valid','Perlu Survei Ulang'];
if (!in_array($statusVerifikasi, $allowedStatus, true)) {
$statusVerifikasi = 'Menunggu Verifikasi';
}
$anggota = is_array($data['anggota'] ?? null) ? $data['anggota'] : [];
$anggota = array_values(array_filter($anggota, fn($a) => is_array($a) && trim((string)($a['nama'] ?? '')) !== ''));
if (count($anggota) === 0) {
json_response(['success' => false, 'message' => 'Minimal satu anggota keluarga harus diisi.'], 422);
}
$statusBantuan = $statusVerifikasi === 'Tidak Valid' ? 'Tidak Valid' : 'Menunggu Verifikasi';
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare('INSERT INTO keluarga
(nama_kk, alamat, no_kk, nik, kerentanan, kebutuhan, status_verifikasi, status_bantuan, catatan, lat, lng, created_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
$stmt->execute([
clean_string($data['nama_kk']),
clean_string($data['alamat']),
clean_string($data['no_kk'] ?? ''),
clean_string($data['nik'] ?? ''),
clean_string($data['kerentanan']),
clean_string($data['kebutuhan']),
$statusVerifikasi,
$statusBantuan,
clean_string($data['catatan'] ?? ''),
clean_float($data['lat']),
clean_float($data['lng']),
$user['id']
]);
$keluargaId = (int)$pdo->lastInsertId();
$anggotaStmt = $pdo->prepare('INSERT INTO keluarga_anggota
(keluarga_id, nik, nama, hubungan, jenis_kelamin, tempat_lahir, tanggal_lahir, agama, pendidikan, pekerjaan, status_perkawinan, penghasilan, mampu_bekerja, keahlian, status_pemberdayaan, catatan)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
$allowedHubungan = ['Kepala Keluarga','Istri','Suami','Anak','Orang Tua','Mertua','Famili Lain','Lainnya'];
$allowedGender = ['Laki-laki','Perempuan'];
$allowedWork = ['Ya','Tidak'];
foreach ($anggota as $a) {
$tanggal = clean_string($a['tanggal_lahir'] ?? '');
$anggotaStmt->execute([
$keluargaId,
clean_string($a['nik'] ?? ''),
clean_string($a['nama'] ?? ''),
clean_allowed($a['hubungan'] ?? '', $allowedHubungan, 'Lainnya'),
clean_allowed($a['jenis_kelamin'] ?? '', $allowedGender, 'Laki-laki'),
clean_string($a['tempat_lahir'] ?? ''),
$tanggal !== '' ? $tanggal : null,
clean_string($a['agama'] ?? ''),
clean_string($a['pendidikan'] ?? ''),
clean_string($a['pekerjaan'] ?? ''),
clean_string($a['status_perkawinan'] ?? ''),
clean_float($a['penghasilan'] ?? 0),
clean_allowed($a['mampu_bekerja'] ?? 'Tidak', $allowedWork, 'Tidak'),
clean_string($a['keahlian'] ?? ''),
clean_allowed($a['mampu_bekerja'] ?? 'Tidak', $allowedWork, 'Tidak') === 'Ya' ? 'Layak Diberdayakan' : 'Belum Dinilai',
clean_string($a['catatan'] ?? '')
]);
}
$pdo->commit();
json_response(['success' => true, 'message' => 'Data keluarga dan anggota KK berhasil disimpan.', 'id' => $keluargaId], 201);
} catch (Throwable $e) {
$pdo->rollBack();
json_response(['success' => false, 'message' => 'Data gagal disimpan: ' . $e->getMessage()], 500);
}
}
if ($method === 'PUT') {
api_require_role(['admin','dinas','relawan']);
$data = get_json_input();
required_fields($data, ['id']);
$id = clean_int($data['id']);
$allowedStatus = ['Menunggu Verifikasi','Valid','Tidak Valid','Perlu Survei Ulang'];
$statusVerifikasi = clean_string($data['status_verifikasi'] ?? 'Menunggu Verifikasi');
if (!in_array($statusVerifikasi, $allowedStatus, true)) {
json_response(['success' => false, 'message' => 'Status verifikasi tidak valid.'], 422);
}
$statusBantuan = $statusVerifikasi === 'Tidak Valid' ? 'Tidak Valid' : 'Menunggu Verifikasi';
$stmt = $pdo->prepare('UPDATE keluarga SET
status_verifikasi = ?, status_bantuan = ?, rumah_ibadah_id = NULL, catatan = CONCAT(COALESCE(catatan, ""), ?)
WHERE id = ?');
$catatanTambahan = clean_string($data['catatan'] ?? '');
$catatanTambahan = $catatanTambahan ? "\n[Verifikasi] " . $catatanTambahan : '';
$stmt->execute([$statusVerifikasi, $statusBantuan, $catatanTambahan, $id]);
json_response(['success' => true, 'message' => 'Status verifikasi berhasil diperbarui. Jalankan analisis ulang untuk memperbarui status bantuan.']);
}
if ($method === 'DELETE') {
api_require_role(['admin','dinas']);
$id = clean_int($_GET['id'] ?? 0);
if ($id <= 0) json_response(['success' => false, 'message' => 'ID tidak valid.'], 422);
$stmt = $pdo->prepare('DELETE FROM keluarga WHERE id = ?');
$stmt->execute([$id]);
json_response(['success' => true, 'message' => 'Data keluarga berhasil dihapus.']);
}
json_response(['success' => false, 'message' => 'Method tidak didukung.'], 405);