user() !== null; } /** * @return array|string> */ public function rules(): array { /** @var Project $project */ $project = $this->route('project'); return [ 'ticket_status_id' => [ 'required', 'integer', Rule::exists('ticket_statuses', 'id')->where('project_id', $project->id), ], ]; } /** * @return array */ public function after(): array { return [ function (Validator $validator): void { if ($validator->errors()->isNotEmpty()) { return; } /** @var Ticket $ticket */ $ticket = $this->route('ticket'); $validated = $validator->validated(); $ticketStatusId = (int) Arr::get($validated, 'ticket_status_id'); if ($ticket->ticket_status_id === $ticketStatusId) { return; } $ticket->loadMissing('ticketStatus'); $isAllowed = $ticket->ticketStatus?->allowedTargetStatuses() ->whereKey($ticketStatusId) ->exists() ?? false; if (! $isAllowed) { $validator->errors()->add( 'ticket_status_id', 'Choose a status this ticket is allowed to move to.', ); } }, ]; } }