*/ public function rules(): array { $event = $this->route('event'); $organisationId = $event instanceof Event ? $event->organisation_id : null; $eventIdInput = (string) $this->input('event_id', ''); return [ 'engagement_id' => [ 'required', 'string', 'max:30', Rule::exists('artist_engagements', 'id')->where('organisation_id', $organisationId), ], 'event_id' => [ 'required', 'string', 'max:30', Rule::exists('events', 'id')->where('organisation_id', $organisationId), ], 'stage_id' => [ 'nullable', 'string', 'max:30', Rule::exists('stages', 'id'), new StageActiveOnEvent($eventIdInput), ], 'start_at' => ['required', 'date_format:Y-m-d H:i:s', new WithinEventBounds($eventIdInput)], 'end_at' => ['required', 'date_format:Y-m-d H:i:s', 'after:start_at', new WithinEventBounds($eventIdInput)], 'lane' => ['nullable', 'integer', 'min:0', 'max:9'], 'notes' => ['nullable', 'string', 'max:1000'], ]; } public function withValidator(Validator $validator): void { $validator->after(function (Validator $validator): void { $engagementId = $this->input('engagement_id'); $eventId = $this->input('event_id'); if (! is_string($engagementId) || ! is_string($eventId)) { return; } $engagement = ArtistEngagement::query()->find($engagementId); if ($engagement === null) { return; } $event = Event::withoutGlobalScopes()->find($eventId); if ($event === null) { return; } // event_id must equal engagement.event_id (flat case) OR be a // sub-event of engagement.event_id (festival case). if ( $eventId !== $engagement->event_id && $event->parent_event_id !== $engagement->event_id ) { $validator->errors()->add( 'event_id', 'event_id moet gelijk zijn aan de engagement.event_id of een sub-event daarvan.', ); } }); } }