*/ public function rules(): array { return [ 'time_slot_id' => ['required', 'ulid', Rule::exists('time_slots', 'id')->where(function ($query) { $event = $this->route('event'); $eventIds = [$event->id]; if ($event->isSubEvent() && $event->parent_event_id) { $eventIds[] = $event->parent_event_id; } $query->whereIn('event_id', $eventIds); })], 'location_id' => ['nullable', 'ulid', 'exists:locations,id'], 'title' => ['nullable', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'instructions' => ['nullable', 'string'], 'coordinator_notes' => ['nullable', 'string'], 'slots_total' => ['required', 'integer', 'min:1'], 'slots_open_for_claiming' => ['required', 'integer', 'min:0', 'lte:slots_total'], 'report_time' => ['nullable', 'date_format:H:i'], 'actual_start_time' => ['nullable', 'date_format:H:i'], 'actual_end_time' => ['nullable', 'date_format:H:i'], 'end_date' => ['nullable', 'date'], 'is_lead_role' => ['nullable', 'boolean'], 'allow_overlap' => ['nullable', 'boolean'], 'events_during_shift' => ['nullable', 'array'], 'status' => ['nullable', 'in:draft,open,full,in_progress,completed,cancelled'], ]; } }