first commit
This commit is contained in:
122
app/Http/Controllers/SubmissionReviewController.php
Normal file
122
app/Http/Controllers/SubmissionReviewController.php
Normal file
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Submission;
|
||||
use App\Models\SubmissionAnswer;
|
||||
use App\Services\SubmissionWorkflowService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class SubmissionReviewController extends Controller
|
||||
{
|
||||
public function __construct(protected SubmissionWorkflowService $workflow) {}
|
||||
|
||||
/** Tukar status serahan. Status 'selesai' & 'pembetulan_perunding' ada syarat tambahan. */
|
||||
public function updateStatus(Request $request, Submission $submission)
|
||||
{
|
||||
$this->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.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user