CRM/backend/app/Policies/InvoicePolicy.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']);
}
}