66 خطوط
2.1 KiB
PHP
66 خطوط
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Policies;
|
|
|
|
use App\Models\Invoice;
|
|
use App\Models\User;
|
|
use App\Support\AccessControl;
|
|
|
|
class InvoicePolicy
|
|
{
|
|
public function viewAny(User $user): bool
|
|
{
|
|
return $user->can('view_invoices') || $user->hasAnyRole(['agent', 'supervisor']);
|
|
}
|
|
|
|
public function view(User $user, Invoice $invoice): bool
|
|
{
|
|
if ($user->can('approve_invoices') || $user->hasRole('supervisor')) {
|
|
return AccessControl::canAccessLead($user, $invoice->lead);
|
|
}
|
|
|
|
return $invoice->created_by === $user->id || $invoice->lead?->assigned_to === $user->id;
|
|
}
|
|
|
|
public function create(User $user): bool
|
|
{
|
|
return $user->can('create_invoices') || $user->hasAnyRole(['agent', 'supervisor']);
|
|
}
|
|
|
|
public function update(User $user, Invoice $invoice): bool
|
|
{
|
|
if ($invoice->created_by === $user->id && $invoice->status === 'rejected') {
|
|
return $this->view($user, $invoice);
|
|
}
|
|
|
|
return ($user->can('approve_invoices') || $user->hasRole('supervisor'))
|
|
&& AccessControl::canAccessLead($user, $invoice->lead)
|
|
&& in_array($invoice->status, ['draft', 'pending_approval'], true);
|
|
}
|
|
|
|
public function issue(User $user, Invoice $invoice): bool
|
|
{
|
|
return ($user->can('approve_invoices') || $user->hasRole('supervisor'))
|
|
&& AccessControl::canAccessLead($user, $invoice->lead)
|
|
&& in_array($invoice->status, ['pending_approval', 'approved'], true);
|
|
}
|
|
|
|
public function approve(User $user, Invoice $invoice): bool
|
|
{
|
|
return ($user->can('approve_invoices') || $user->hasRole('supervisor'))
|
|
&& AccessControl::canAccessLead($user, $invoice->lead)
|
|
&& $invoice->status === 'pending_approval';
|
|
}
|
|
|
|
public function void(User $user, Invoice $invoice): bool
|
|
{
|
|
return ($user->can('approve_invoices') || $user->hasRole('supervisor'))
|
|
&& $invoice->status === 'issued';
|
|
}
|
|
|
|
public function manageTemplates(User $user): bool
|
|
{
|
|
return $user->can('manage_invoice_templates') || $user->hasAnyRole(['admin', 'supervisor']);
|
|
}
|
|
}
|