Files
2026-06-10 19:23:50 +07:00

96 lines
4.4 KiB
PHP

<?php
// api/pelatihan.php — Manajemen Pelatihan & Riwayat
require_once __DIR__ . '/../config.php';
$user = requireLogin();
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
$db = getDB();
// ── RIWAYAT PELATIHAN PER PENDUDUK ──
if ($action === 'riwayat') {
$pid = (int)($_GET['penduduk_id'] ?? 0);
if (!$pid) jsonErr('penduduk_id wajib.');
$st = $db->prepare("SELECT rp.*, p.nama_pelatihan, p.penyelenggara, p.tanggal as tgl_pelatihan
FROM riwayat_pelatihan rp
JOIN pelatihan p ON p.id=rp.pelatihan_id
WHERE rp.penduduk_id=? ORDER BY rp.tanggal_ikut DESC");
$st->execute([$pid]);
jsonOk($st->fetchAll());
}
// ── DAFTARKAN PESERTA ──
if ($action === 'daftar' && $method === 'POST') {
requireRole(['superadmin', 'pengurus', 'relawan']);
$b = json_decode(file_get_contents('php://input'), true);
$pid = (int)($b['penduduk_id'] ?? 0);
$tid = (int)($b['pelatihan_id'] ?? 0);
if (!$pid || !$tid) jsonErr('penduduk_id dan pelatihan_id wajib.');
// validasi: cek umur >= 18 untuk pelatihan kerja
$p = $db->prepare("SELECT umur FROM penduduk WHERE id=?"); $p->execute([$pid]);
$row = $p->fetch();
if ($row && (int)$row['umur'] < 15) jsonErr('Peserta minimal berusia 15 tahun untuk mengikuti pelatihan.');
$db->prepare("INSERT INTO riwayat_pelatihan (penduduk_id, pelatihan_id, tanggal_ikut) VALUES (?,?,?)")
->execute([$pid, $tid, $b['tanggal_ikut'] ?? date('Y-m-d')]);
log_aksi($user['id'], 'CREATE', 'riwayat_pelatihan', (int)$db->lastInsertId(), "Daftar pelatihan pid:$pid tid:$tid");
jsonOk(null, 'Peserta berhasil didaftarkan ke pelatihan.');
}
// ── CRUD MASTER PELATIHAN ──
switch ($method) {
case 'GET':
if ($id) {
$st = $db->prepare("SELECT p.*, COUNT(rp.id) as jumlah_peserta FROM pelatihan p
LEFT JOIN riwayat_pelatihan rp ON rp.pelatihan_id=p.id WHERE p.id=? GROUP BY p.id");
$st->execute([$id]);
$row = $st->fetch();
if (!$row) jsonErr('Tidak ditemukan.', 404);
// peserta
$ps = $db->prepare("SELECT rp.id, rp.tanggal_ikut, pd.nama, pd.nik, pd.umur
FROM riwayat_pelatihan rp JOIN v_penduduk pd ON pd.id=rp.penduduk_id
WHERE rp.pelatihan_id=? ORDER BY rp.tanggal_ikut DESC");
$ps->execute([$id]);
$row['peserta'] = $ps->fetchAll();
jsonOk($row);
break;
}
$rows = $db->query("SELECT p.*, COUNT(rp.id) as jumlah_peserta
FROM pelatihan p LEFT JOIN riwayat_pelatihan rp ON rp.pelatihan_id=p.id
GROUP BY p.id ORDER BY p.tanggal DESC")->fetchAll();
jsonOk($rows);
break;
case 'POST':
requireRole(['superadmin', 'pengurus']);
$b = json_decode(file_get_contents('php://input'), true);
$nama = sanitize($b['nama_pelatihan'] ?? '');
if (!$nama) jsonErr('Nama pelatihan wajib diisi.');
$db->prepare("INSERT INTO pelatihan (nama_pelatihan, penyelenggara, tanggal, durasi_hari, deskripsi) VALUES (?,?,?,?,?)")
->execute([$nama, sanitize($b['penyelenggara'] ?? ''), $b['tanggal'] ?? null,
(int)($b['durasi_hari'] ?? 1), sanitize($b['deskripsi'] ?? '')]);
jsonOk(['id' => (int)$db->lastInsertId()], 'Pelatihan ditambahkan.');
break;
case 'PUT':
requireRole(['superadmin', 'pengurus']);
if (!$id) jsonErr('ID tidak valid.');
$b = json_decode(file_get_contents('php://input'), true);
$db->prepare("UPDATE pelatihan SET nama_pelatihan=?, penyelenggara=?, tanggal=?, durasi_hari=?, deskripsi=? WHERE id=?")
->execute([sanitize($b['nama_pelatihan'] ?? ''), sanitize($b['penyelenggara'] ?? ''),
$b['tanggal'] ?? null, (int)($b['durasi_hari'] ?? 1),
sanitize($b['deskripsi'] ?? ''), $id]);
jsonOk(null, 'Pelatihan diperbarui.');
break;
case 'DELETE':
requireRole(['superadmin']);
if (!$id) jsonErr('ID tidak valid.');
$db->prepare("DELETE FROM pelatihan WHERE id=?")->execute([$id]);
jsonOk(null, 'Pelatihan dihapus.');
break;
default: jsonErr('Method tidak didukung.', 405);
}