MIF_E31231754/app/Http/Controllers/Admin/PeriodeSeleksiController.php

142 lines
6.1 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\PeriodeSeleksi;
use Illuminate\Http\Request;
class PeriodeSeleksiController extends Controller
{
public function index()
{
$periode = PeriodeSeleksi::latest()->paginate(10);
return view('admin.periode.index', compact('periode'));
}
public function create()
{
return view('admin.periode.create');
}
public function store(Request $request)
{
$request->validate([
'nama' => 'required|string|max:100|unique:periode_seleksi,nama',
'tanggal_mulai' => 'required|date',
'tanggal_selesai' => [
'required',
'date',
'after_or_equal:tanggal_mulai',
function ($attribute, $value, $fail) {
if (strtotime($value) < strtotime(date('Y-m-d'))) {
$fail('Tanggal selesai tidak boleh di masa lalu (sebelum hari ini).');
}
},
],
'kuota_penerima' => 'required|integer|min:1',
'status' => 'required|in:aktif,selesai,arsip', // ✅ UBAH INI
], [
'nama.required' => 'Nama periode harus diisi',
'nama.unique' => 'Nama periode sudah digunakan atau sudah terdaftar.',
'tanggal_mulai.required' => 'Tanggal mulai harus diisi',
'tanggal_selesai.required' => 'Tanggal selesai harus diisi',
'tanggal_selesai.after_or_equal' => 'Tanggal selesai harus setelah atau sama dengan tanggal mulai',
'kuota_penerima.required' => 'Kuota penerima harus diisi',
'kuota_penerima.min' => 'Kuota penerima minimal 1',
'status.required' => 'Status harus dipilih',
'status.in' => 'Status tidak valid. Pilih: aktif, selesai, atau arsip',
]);
// Validasi Strict Block (Opsi 2): Cegah lebih dari 1 periode aktif
if ($request->status === 'aktif') {
$adaAktif = PeriodeSeleksi::where('status', 'aktif')->exists();
if ($adaAktif) {
return back()->with('error', 'Gagal: Masih ada periode yang berstatus Aktif. Harap selesaikan periode sebelumnya terlebih dahulu agar data tidak bentrok.')->withInput();
}
}
// Auto-generate nama jika kosong
if (empty($request->nama)) {
$bulanIndo = ['Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'];
$tgl = \Carbon\Carbon::parse($request->tanggal_mulai);
$request->merge(['nama' => 'BLT-DD ' . $bulanIndo[$tgl->month - 1] . ' ' . $tgl->year]);
}
PeriodeSeleksi::create($request->all());
return redirect()->route('admin.periode.index')
->with('success', 'Periode seleksi berhasil ditambahkan.');
}
public function show(PeriodeSeleksi $periode)
{
$jumlahDinilai = $periode->penilaian()->count();
$jumlahPenerima = $periode->hasilSaw()->where('status', 'penerima')->count();
return view('admin.periode.show', compact('periode', 'jumlahDinilai', 'jumlahPenerima'));
}
public function edit(PeriodeSeleksi $periode)
{
if ($periode->status === 'selesai') {
return redirect()->route('admin.periode.index')
->with('error', 'Aksi Ditolak: Periode yang sudah selesai tidak dapat diubah karena datanya sudah bersifat final.');
}
return view('admin.periode.edit', compact('periode'));
}
public function update(Request $request, PeriodeSeleksi $periode)
{
if ($periode->status === 'selesai') {
return redirect()->route('admin.periode.index')
->with('error', 'Aksi Ditolak: Periode yang sudah selesai tidak dapat diperbarui.');
}
$request->validate([
'nama' => 'required|string|max:100|unique:periode_seleksi,nama,' . $periode->id,
'tanggal_mulai' => 'required|date',
'tanggal_selesai' => 'required|date|after_or_equal:tanggal_mulai',
'kuota_penerima' => 'required|integer|min:1',
'status' => 'required|in:aktif,selesai,arsip', // ✅ UBAH INI
], [
'nama.required' => 'Nama periode harus diisi',
'nama.unique' => 'Nama periode sudah digunakan atau sudah terdaftar.',
'tanggal_mulai.required' => 'Tanggal mulai harus diisi',
'tanggal_selesai.required' => 'Tanggal selesai harus diisi',
'tanggal_selesai.after_or_equal' => 'Tanggal selesai harus setelah atau sama dengan tanggal mulai',
'kuota_penerima.required' => 'Kuota penerima harus diisi',
'kuota_penerima.min' => 'Kuota penerima minimal 1',
'status.required' => 'Status harus dipilih',
'status.in' => 'Status tidak valid. Pilih: aktif, selesai, atau arsip',
]);
// Validasi Strict Block (Opsi 2): Cegah lebih dari 1 periode aktif
if ($request->status === 'aktif' && $periode->status !== 'aktif') {
$adaAktif = PeriodeSeleksi::where('status', 'aktif')->where('id', '!=', $periode->id)->exists();
if ($adaAktif) {
return back()->with('error', 'Gagal: Masih ada periode lain yang berstatus Aktif. Harap selesaikan periode tersebut terlebih dahulu.')->withInput();
}
}
// Auto-generate nama jika kosong
if (empty($request->nama)) {
$bulanIndo = ['Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'];
$tgl = \Carbon\Carbon::parse($request->tanggal_mulai);
$request->merge(['nama' => 'BLT-DD ' . $bulanIndo[$tgl->month - 1] . ' ' . $tgl->year]);
}
$periode->update($request->all());
return redirect()->route('admin.periode.index')
->with('success', 'Periode seleksi berhasil diperbarui.');
}
public function destroy(PeriodeSeleksi $periode)
{
$periode->delete();
return redirect()->route('admin.periode.index')
->with('success', 'Periode seleksi berhasil dihapus.');
}
}