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,34 @@
<?php
namespace App\Policies;
use App\Models\ChecklistTemplate;
use App\Models\User;
class ChecklistTemplatePolicy
{
public function viewAny(User $user): bool
{
return $user->can('templat.urus');
}
public function view(User $user, ChecklistTemplate $template): bool
{
return $user->can('templat.urus');
}
public function create(User $user): bool
{
return $user->can('templat.urus');
}
public function update(User $user, ChecklistTemplate $template): bool
{
return $user->can('templat.urus');
}
public function delete(User $user, ChecklistTemplate $template): bool
{
return $user->can('templat.urus');
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Policies;
use App\Models\Consultant;
use App\Models\User;
class ConsultantPolicy
{
public function viewAny(User $user): bool
{
return $user->can('perunding.urus');
}
public function view(User $user, Consultant $consultant): bool
{
if ($user->can('perunding.urus')) {
return true;
}
// Perunding boleh lihat profil sendiri.
return $user->consultant && $user->consultant->id === $consultant->id;
}
public function create(User $user): bool
{
return $user->can('perunding.urus');
}
public function update(User $user, Consultant $consultant): bool
{
return $user->can('perunding.urus');
}
public function delete(User $user, Consultant $consultant): bool
{
return $user->can('perunding.urus');
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Policies;
use App\Models\DataCentre;
use App\Models\User;
class DataCentrePolicy
{
public function viewAny(User $user): bool
{
return $user->can('pusat_data.urus') || $user->can('serahan.urus_sendiri');
}
/** Perunding hanya boleh lihat pusat data yang sedang ditugaskan kepadanya. */
public function view(User $user, DataCentre $dataCentre): bool
{
if ($user->can('pusat_data.urus')) {
return true;
}
$consultantId = $user->consultant?->id;
return $consultantId !== null && (int) $dataCentre->current_consultant_id === (int) $consultantId;
}
public function create(User $user): bool
{
return $user->can('pusat_data.urus');
}
public function update(User $user, DataCentre $dataCentre): bool
{
return $user->can('pusat_data.urus');
}
public function delete(User $user, DataCentre $dataCentre): bool
{
return $user->can('pusat_data.urus');
}
public function assignConsultant(User $user, DataCentre $dataCentre): bool
{
return $user->can('tugasan.urus');
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Policies;
use App\Models\ReportingCycle;
use App\Models\User;
class ReportingCyclePolicy
{
public function viewAny(User $user): bool
{
return $user->can('kitaran.urus') || $user->can('serahan.urus_sendiri');
}
public function view(User $user, ReportingCycle $cycle): bool
{
return $user->can('kitaran.urus') || $user->can('serahan.urus_sendiri');
}
public function create(User $user): bool
{
return $user->can('kitaran.urus');
}
public function update(User $user, ReportingCycle $cycle): bool
{
return $user->can('kitaran.urus');
}
public function delete(User $user, ReportingCycle $cycle): bool
{
return $user->can('kitaran.urus');
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace App\Policies;
use App\Models\Submission;
use App\Models\User;
class SubmissionPolicy
{
/** Perunding hanya boleh lihat serahan miliknya; kakitangan JPP lihat semua. */
public function view(User $user, Submission $submission): bool
{
if ($user->can('serahan.lihat_semua')) {
return true;
}
return $this->ownsSubmission($user, $submission);
}
public function viewAny(User $user): bool
{
return $user->can('serahan.lihat_semua') || $user->can('serahan.urus_sendiri');
}
/** Hanya perunding boleh cipta serahan untuk pusat data yang ditugaskan. */
public function create(User $user): bool
{
return $user->can('serahan.urus_sendiri');
}
/** Perunding boleh kemaskini selagi miliknya, belum dikunci & belum selesai. */
public function update(User $user, Submission $submission): bool
{
if (! $user->can('serahan.urus_sendiri')) {
return false;
}
return $this->ownsSubmission($user, $submission) && $submission->isEditableByConsultant();
}
/** Pegawai JPP menyemak serahan. */
public function review(User $user, Submission $submission): bool
{
return $user->can('serahan.semak');
}
public function lock(User $user, Submission $submission): bool
{
return $user->can('serahan.kunci');
}
public function markHardcopy(User $user, Submission $submission): bool
{
return $user->can('serahan.hardcopy');
}
/** Perunding boleh jawab permohonan pembetulan untuk serahan miliknya. */
public function respondCorrection(User $user, Submission $submission): bool
{
return $user->can('serahan.urus_sendiri')
&& $this->ownsSubmission($user, $submission)
&& $submission->status === 'pembetulan_perunding';
}
public function comment(User $user, Submission $submission): bool
{
if (! $user->can('komen.cipta')) {
return false;
}
return $user->can('serahan.lihat_semua') || $this->ownsSubmission($user, $submission);
}
protected function ownsSubmission(User $user, Submission $submission): bool
{
$consultantId = $user->consultant?->id;
return $consultantId !== null && (int) $submission->consultant_id === (int) $consultantId;
}
}