163 lines
7.7 KiB
PHP
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");
|
|
} |