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