142 lines
6.1 KiB
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.');
|
|
}
|
|
}
|