$context */ public function apply(Ticket $ticket, array $context = []): Ticket { $sender = (string) ($context['sender'] ?? $ticket->owner?->email ?? ''); $mailbox = (string) ($context['mailbox'] ?? ''); AutomationRule::query() ->where('is_active', true) ->orderBy('sort_order') ->orderBy('id') ->get() ->each(function (AutomationRule $rule) use ($ticket, $sender, $mailbox): void { if (! $this->matches($rule, $ticket, $sender, $mailbox)) { return; } $updates = array_filter([ 'priority_id' => $rule->set_priority_id, 'category_id' => $rule->set_category_id, 'team_id' => $rule->set_team_id, 'project_id' => $rule->set_project_id, 'status_id' => $rule->set_status_id, 'agent_id' => $rule->set_agent_id, ], static fn ($value): bool => $value !== null); if ($updates !== []) { $ticket->forceFill($updates + ['last_activity_at' => now()])->save(); } }); return $ticket->fresh() ?? $ticket; } private function matches(AutomationRule $rule, Ticket $ticket, string $sender, string $mailbox): bool { if ($rule->match_sender && ! Str::contains(Str::lower($sender), Str::lower($rule->match_sender))) { return false; } if ($rule->match_subject && ! Str::contains(Str::lower($ticket->subject), Str::lower($rule->match_subject))) { return false; } if ($rule->match_mailbox && ! Str::contains(Str::lower($mailbox), Str::lower($rule->match_mailbox))) { return false; } if ($rule->match_category_id && (int) $ticket->category_id !== (int) $rule->match_category_id) { return false; } return true; } }