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.'); } }