Files
2026-06-10 18:54:25 +07:00

163 lines
7.7 KiB
PHP

<?php
// api/anggota_keluarga.php
header('Content-Type: application/json');
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; }
require_once '../config/db.php';
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
require_once 'middleware.php';
$currentUser = requireAuth(['admin', 'petugas', 'koordinator']);
if ($currentUser['role'] === 'koordinator') {
echo json_encode(['success' => true, 'data' => [], 'total' => 0]);
break;
}
$wargaId = (int)($_GET['rumah_warga_id'] ?? 0);
if (!$wargaId) { echo json_encode(['success' => false, 'message' => 'rumah_warga_id diperlukan']); break; }
$res = $conn->query("SELECT * FROM anggota_keluarga WHERE rumah_warga_id=$wargaId ORDER BY tanggal_lahir ASC");
$data = [];
$today = new DateTime();
while ($row = $res->fetch_assoc()) {
// Hitung usia
if ($row['tanggal_lahir']) {
$lahir = new DateTime($row['tanggal_lahir']);
$row['usia'] = (int)$today->diff($lahir)->y;
} else {
$row['usia'] = null;
}
$data[] = $row;
}
echo json_encode(['success' => true, 'data' => $data, 'total' => count($data)]);
break;
case 'POST':
$input = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$wargaId = (int)($input['rumah_warga_id'] ?? 0);
$nama = $conn->real_escape_string(trim($input['nama'] ?? ''));
$nik = $conn->real_escape_string($input['nik'] ?? '');
$tl = !empty($input['tanggal_lahir']) ? "'" . $conn->real_escape_string($input['tanggal_lahir']) . "'" : 'NULL';
$jk = $conn->real_escape_string($input['jenis_kelamin'] ?? 'laki_laki');
$pend = $conn->real_escape_string($input['pendidikan'] ?? 'sd');
$pek = $conn->real_escape_string($input['pekerjaan'] ?? '');
$stsBk = $conn->real_escape_string($input['status_bekerja'] ?? 'tidak_bekerja');
$kes = $conn->real_escape_string($input['kondisi_kesehatan'] ?? 'sehat');
$bisa = (int)($input['dapat_bekerja'] ?? 1);
if (!$wargaId || !$nama) { echo json_encode(['success' => false, 'message' => 'ID warga dan nama wajib diisi']); break; }
$sql = "INSERT INTO anggota_keluarga (rumah_warga_id,nama,nik,tanggal_lahir,jenis_kelamin,pendidikan,pekerjaan,status_bekerja,kondisi_kesehatan,dapat_bekerja)
VALUES ($wargaId,'$nama','$nik',$tl,'$jk','$pend','$pek','$stsBk','$kes',$bisa)";
if ($conn->query($sql)) {
// Re-hitung rekomendasi induk
rehitungRekomendasi($conn, $wargaId);
echo json_encode(['success' => true, 'message' => 'Anggota berhasil ditambahkan', 'id' => $conn->insert_id]);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]);
}
break;
case 'PUT':
$input = json_decode(file_get_contents('php://input'), true);
$id = (int)($input['id'] ?? 0);
$nama = $conn->real_escape_string(trim($input['nama'] ?? ''));
$nik = $conn->real_escape_string($input['nik'] ?? '');
$tl = !empty($input['tanggal_lahir']) ? "'" . $conn->real_escape_string($input['tanggal_lahir']) . "'" : 'NULL';
$jk = $conn->real_escape_string($input['jenis_kelamin'] ?? 'laki_laki');
$pend = $conn->real_escape_string($input['pendidikan'] ?? 'sd');
$pek = $conn->real_escape_string($input['pekerjaan'] ?? '');
$stsBk = $conn->real_escape_string($input['status_bekerja'] ?? 'tidak_bekerja');
$kes = $conn->real_escape_string($input['kondisi_kesehatan'] ?? 'sehat');
$bisa = (int)($input['dapat_bekerja'] ?? 1);
if (!$id) { echo json_encode(['success' => false, 'message' => 'ID tidak valid']); break; }
$sql = "UPDATE anggota_keluarga SET
nama='$nama', nik='$nik', tanggal_lahir=$tl, jenis_kelamin='$jk',
pendidikan='$pend', pekerjaan='$pek', status_bekerja='$stsBk',
kondisi_kesehatan='$kes', dapat_bekerja=$bisa
WHERE id=$id";
if ($conn->query($sql)) {
// Ambil warga_id lalu re-hitung rekomendasi
$r = $conn->query("SELECT rumah_warga_id FROM anggota_keluarga WHERE id=$id");
if ($row = $r->fetch_assoc()) rehitungRekomendasi($conn, (int)$row['rumah_warga_id']);
echo json_encode(['success' => true, 'message' => 'Anggota berhasil diperbarui']);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]);
}
break;
case 'DELETE':
$id = (int)($_GET['id'] ?? 0);
if (!$id) { $input = json_decode(file_get_contents('php://input'), true); $id = (int)($input['id'] ?? 0); }
// Ambil warga_id sebelum hapus
$r = $conn->query("SELECT rumah_warga_id FROM anggota_keluarga WHERE id=$id");
$wargaId = ($row = $r->fetch_assoc()) ? (int)$row['rumah_warga_id'] : 0;
if ($conn->query("DELETE FROM anggota_keluarga WHERE id=$id")) {
if ($wargaId) rehitungRekomendasi($conn, $wargaId);
echo json_encode(['success' => true, 'message' => 'Anggota berhasil dihapus']);
} else {
echo json_encode(['success' => false, 'message' => 'Gagal: ' . $conn->error]);
}
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
}
$conn->close();
// ── Helper: re-hitung & simpan rekomendasi ────────────────────────────────
function rehitungRekomendasi(mysqli $conn, int $wargaId): void
{
$res = $conn->query("SELECT penghasilan_bulanan, status_pekerjaan, is_rekomendasi_manual FROM rumah_warga WHERE id=$wargaId");
if (!($row = $res->fetch_assoc())) return;
if (isset($row['is_rekomendasi_manual']) && (int)$row['is_rekomendasi_manual'] === 1) return;
$penghasilan = (float)$row['penghasilan_bulanan'];
$stsPekerjaan = $row['status_pekerjaan'];
$today = new DateTime();
$resA = $conn->query("SELECT tanggal_lahir, status_bekerja, dapat_bekerja, kondisi_kesehatan FROM anggota_keluarga WHERE rumah_warga_id=$wargaId");
$anggota = [];
while ($a = $resA->fetch_assoc()) $anggota[] = $a;
$adaProduktif = false;
$adaProduktifBisaKerja = false;
$semuaProduktifTakBisa = true;
foreach ($anggota as $a) {
$usia = null;
if ($a['tanggal_lahir']) {
$lahir = new DateTime($a['tanggal_lahir']);
$usia = (int)$today->diff($lahir)->y;
}
if ($usia !== null && $usia >= 18 && $usia <= 55) {
$adaProduktif = true;
$bisaKerja = (int)$a['dapat_bekerja'] === 1 && in_array($a['kondisi_kesehatan'], ['sehat', 'sakit_ringan']);
if ($bisaKerja) $semuaProduktifTakBisa = false;
if ($bisaKerja && $a['status_bekerja'] !== 'bekerja') $adaProduktifBisaKerja = true;
}
}
$perluRutin = !$adaProduktif || ($adaProduktif && $semuaProduktifTakBisa) || $penghasilan < 500000 || $stsPekerjaan === 'tidak_bekerja';
$perluPelatihan = $adaProduktifBisaKerja;
$rek = 'tidak_ada';
if ($perluRutin && $perluPelatihan) $rek = 'keduanya';
elseif ($perluRutin) $rek = 'bantuan_rutin';
elseif ($perluPelatihan) $rek = 'bantuan_pelatihan';
$conn->query("UPDATE rumah_warga SET rekomendasi_bantuan='$rek' WHERE id=$wargaId");
}