['required', 'string', 'max:255'], 'description' => ['nullable', 'string', 'max:5000'], 'location_id' => ['nullable', 'ulid', 'exists:locations,id'], 'customer_id' => ['nullable', 'ulid', 'exists:customers,id'], 'setlist_id' => ['nullable', 'ulid', 'exists:setlists,id'], 'event_date' => ['required', 'date', 'after_or_equal:today'], 'start_time' => ['required', 'date_format:H:i'], 'end_time' => ['nullable', 'date_format:H:i', 'after:start_time'], 'load_in_time' => ['nullable', 'date_format:H:i'], 'soundcheck_time' => ['nullable', 'date_format:H:i'], 'fee' => ['nullable', 'numeric', 'min:0', 'max:999999.99'], 'currency' => ['sometimes', 'string', 'size:3'], 'status' => ['sometimes', Rule::enum(EventStatus::class)], 'visibility' => ['sometimes', Rule::enum(EventVisibility::class)], 'rsvp_deadline' => ['nullable', 'date', 'before:event_date'], 'notes' => ['nullable', 'string', 'max:5000'], 'internal_notes' => ['nullable', 'string', 'max:5000'], 'is_public_setlist' => ['sometimes', 'boolean'], ]; } public function messages(): array { return [ 'event_date.after_or_equal' => 'The event date must be today or a future date.', 'end_time.after' => 'The end time must be after the start time.', 'rsvp_deadline.before' => 'The RSVP deadline must be before the event date.', ]; } }