A Onda 3.1 é o motor de tempo do KOLOS: sem uma reserva consistente (Booking) não existe agenda, manutenção, day use nem competição.
O risco principal aqui é o clássico double booking (duas reservas para a mesma quadra no mesmo horário), incluindo cenários de concorrência.
Implementar a fundação de Booking com:
Booking (entidade) com court, created_by_user, timeslot, type, status.court_id.Campos mínimos:
id (UUID)court_id (UUID)created_by_user_id (int)type (enum/string):
BOOKINGMAINTENANCEstatus (enum/string):
CONFIRMEDCANCELLEDstarts_at (timestamp com timezone)ends_at (timestamp com timezone)Invariante: ends_at > starts_at.
Uma reserva conflita quando, para o mesmo court_id:
starts_at < existing_ends_at e ends_at > existing_starts_atO intervalo é tratado como [start, end) (inclusivo no início e exclusivo no fim), evitando conflito quando um booking termina exatamente no horário que outro começa.
Além da validação na Action, o PostgreSQL deve impedir overlap via exclusion constraint usando tstzrange.
EXCLUDE USING gist (court_id WITH =, tstzrange(starts_at, ends_at, '[)') WITH &&)Nota: em ambientes de teste (SQLite) a constraint não existe; a validação na Action continua garantindo a regra.
GET /booking (booking)
auth + role:playerBOOKING para quadras ativas.Nesta onda, a criação de MAINTENANCE será limitada a venue_owner/super_admin e dependerá de Policy (escopo por dono da arena).
Importante: staff ainda não possui vínculo/escopo de arena modelado (membership). Qualquer liberação sem esse vínculo seria incorreta.
bookings + constraint no Postgres.CreateBookingAction + CreateBookingData./booking para criar e listar reservas.sail bin pintsail bin phpstan analysesail artisan testDAY_USE, OPEN_MATCH, etc.staff por arena para escopo correto em maintenance.