first commit

This commit is contained in:
Saufi
2026-06-24 20:32:14 +08:00
commit 10fb30ad69
201 changed files with 21356 additions and 0 deletions

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