123 lines
4.9 KiB
PHP
123 lines
4.9 KiB
PHP
<?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.');
|
|
}
|
|
}
|