authorize('review', $submission); $data = $request->validate([ 'status' => ['required', Rule::in(array_keys(Submission::STATUSES))], 'notes' => ['nullable', 'string', 'max:1000'], // Wajib jika status = selesai: tarikh hardcopy dihantar ke Bahagian Kawalan Perancangan. 'hardcopy_sent_date' => ['nullable', 'required_if:status,selesai', 'date'], ], [], ['hardcopy_sent_date' => 'tarikh hardcopy dihantar ke Bahagian Kawalan Perancangan']); // Status 'pembetulan_perunding' mesti melalui panel permohonan pembetulan. if ($data['status'] === 'pembetulan_perunding' && ! $submission->correctionRequests()->where('status', 'terbuka')->exists()) { return back()->with('error', 'Sila tambah sekurang-kurangnya satu permohonan pembetulan (no muka surat, lokasi & penerangan) sebelum menetapkan status Pembetulan Perunding.'); } $extra = []; if ($data['status'] === 'selesai') { $extra['hardcopy_sent_date'] = $data['hardcopy_sent_date']; } $this->workflow->changeStatus($submission, $data['status'], auth()->user(), $data['notes'] ?? null, $extra); return back()->with('success', 'Status serahan dikemas kini.'); } public function assignOfficer(Request $request, Submission $submission) { $this->authorize('review', $submission); $data = $request->validate(['assigned_officer_id' => ['nullable', 'exists:users,id']]); $submission->update(['assigned_officer_id' => $data['assigned_officer_id'] ?? null]); activity('serahan')->performedOn($submission)->causedBy(auth()->user()) ->log('Pegawai bertanggungjawab dikemas kini'); return back()->with('success', 'Pegawai bertanggungjawab dikemas kini.'); } public function lock(Request $request, Submission $submission) { $this->authorize('lock', $submission); $data = $request->validate(['lock_reason' => ['nullable', 'string', 'max:500']]); $this->workflow->lock($submission, auth()->user(), $data['lock_reason'] ?? null); return back()->with('success', 'Serahan telah dikunci. Perunding tidak boleh mengubah sehingga dibuka semula.'); } public function unlock(Request $request, Submission $submission) { $this->authorize('lock', $submission); $data = $request->validate([ 'lock_reason' => ['required', 'string', 'max:500'], ], [], ['lock_reason' => 'sebab buka kunci']); $this->workflow->unlock($submission, auth()->user(), $data['lock_reason']); return back()->with('success', 'Serahan dibuka semula untuk pembetulan oleh perunding.'); } public function markHardcopy(Request $request, Submission $submission) { $this->authorize('markHardcopy', $submission); $data = $request->validate([ 'hardcopy_received' => ['required', 'boolean'], 'hardcopy_received_date' => ['nullable', 'required_if:hardcopy_received,1', 'date'], ], [], ['hardcopy_received_date' => 'tarikh terima salinan keras']); $submission->update([ 'hardcopy_received' => $request->boolean('hardcopy_received'), 'hardcopy_received_date' => $request->boolean('hardcopy_received') ? $data['hardcopy_received_date'] : null, ]); activity('serahan')->performedOn($submission)->causedBy(auth()->user()) ->log('Status penerimaan salinan keras dikemas kini'); return back()->with('success', 'Status salinan keras dikemas kini.'); } public function reviewNote(Request $request, Submission $submission) { $this->authorize('review', $submission); $data = $request->validate(['review_notes' => ['nullable', 'string', 'max:2000']]); $submission->update(['review_notes' => $data['review_notes'] ?? null]); return back()->with('success', 'Nota semakan disimpan.'); } /** Pegawai mengesahkan / catat nota bagi satu jawapan item. */ public function reviewAnswer(Request $request, SubmissionAnswer $answer) { $this->authorize('review', $answer->submission); $data = $request->validate([ 'validation_status' => ['required', 'in:belum_semak,sah,tidak_sah'], 'officer_note' => ['nullable', 'string', 'max:1000'], ]); $answer->update($data); return back()->with('success', 'Semakan item dikemas kini.'); } }