Court Booking & Occupancy
I korthet
Court Booking & Occupancy is the consumer-facing booking experience built for daily club operations: per-court calendars, recurring series, member versus guest pricing, deadline-enforced cancellation, no-show handling, QR check-in, and per-slot real-time availability. It turns the underlying booking engine into a self-service product that members and guests can use end-to-end without staff involvement, including bookable lighting and heating amenities.
Så fungerar det
Each court has its own bookable calendar with per-court time slots that can be filtered by date and court number. The public availability endpoint exposes the same data unauthenticated so that club websites and the player app can render an occupancy grid without forcing sign-in. Recurring weekly, biweekly, and monthly series are supported with conflict-aware expansion, and cancellations on a series propagate to all future instances unless the user opts to cancel only one.
Pricing is computed per court and per hour. Each court can carry its own tariff with a venue-level default fallback, and the booking engine auto-calculates the fee from the venue's pricing configuration — including peak versus off-peak windows. A booker_type flag distinguishes member from guest, applying the correct tariff so members get the negotiated club rate while guests are charged at the public price. Lighting and heating are bookable amenities: each court declares whether it has heating, and if the booker enables lighting or heating the engine validates the court actually supports it and adds the surcharge from the venue's amenity pricing.
Cancellation enforces a venue-defined deadline policy. Bookings cancelled before the deadline incur no fee, those cancelled late incur a percentage fee, and a force-cancel option lets staff override for legitimate cases. No-show registration is a separate POST /no-show action that charges the no-show fee from the cancellation policy; it cannot be applied if the booker has already checked in, preventing accidental penalties.
Check-in runs on QR codes. Each booking is issued a unique check_in_token, retrievable via GET /check-in-token and rendered as a QR code in the app or on the booking confirmation. POST /check-in validates the token, marks attendance, and unlocks the no-show protection.
Real-time availability is served from GET /public/venues/{id}/real-time-availability, which returns a per-court, per-slot grid with configurable slot duration. This single call powers booking screens, embedded widgets, and the public app's drop-in finder.
Centrala funktioner
- Per-court booking calendar with public availability endpoint
- Recurring series (weekly, biweekly, monthly) with cancel propagation
- Per-court hourly pricing with venue default fallback
- Member versus guest pricing via booker_type flag
- Cancellation deadline enforcement with late fees and force-cancel
- No-show registration with policy-driven fee, blocked after check-in
- QR-code check-in with per-booking check_in_token
- Real-time per-court, per-slot availability grid
- Bookable lighting and heating amenities with surcharge calculation
I praktiken
A member checks the club app on her phone after work, sees on the real-time grid that court 3 is free from 19:00, and books an hour with lighting enabled. The engine applies the member tariff plus the lighting surcharge and confirms instantly. Her confirmation email contains a QR code.
At the venue she scans the QR at the court terminal, which marks her checked in. A guest in her group cannot make it and tries to cancel ten minutes before the slot — past the two-hour deadline — so the late-cancel fee applies. After the session a different guest who never showed up is registered as a no-show, triggering the no-show fee from the venue's cancellation policy.
The whole interaction happens without staff involvement and is reflected on the calendar in real time.
Features i detta subsystem
9| ID | Status | Funktioner |
|---|---|---|
| F07.06.01 | Levererad | Per-court booking with calendar (per-court time slots, calendar view, date/court filtering, public availability endpoint) ✅ PL-F0706a |
| F07.06.02 | Levererad | Recurring bookings (weekly/biweekly/monthly series with conflict-aware expansion, cancel propagation) ✅ PL-F0706a |
| F07.06.03 | Levererad | Price per court and hour (court-specific pricing with default fallback, auto-calculation from venue config) ✅ PL-F0706a |
| F07.06.04 | Levererad | Member price vs guest price (booker_type: member\ guest, differentiated rates, auto-applied pricing) | ✅ PL-F0706a |
| F07.06.05 | Levererad | Cancellation with deadline (venue cancellation policy, deadline enforcement, late fees, force cancel option) ✅ PL-F0706a |
| F07.06.06 | Levererad | No-show registration with cost (POST /no-show, fee from cancellation policy no_show_fee_percent, blocks if checked in) ✅ PL-F0706b |
| F07.06.07 | Levererad | QR code for court check-in (check_in_token per booking, GET /check-in-token, POST /check-in with token validation) ✅ PL-F0706b |
| F07.06.08 | Levererad | Real-time availability (GET /public/venues/{id}/real-time-availability — per-court, per-slot grid with configurable duration) ✅ PL-F0706b |
| F07.06.09 | Levererad | Lighting and heating per court (bookable) (court.heating field, amenity surcharges in pricing, validation against court capabilities) ✅ PL-F0706b |
Intressenter som behöver detta subsystem
Förekommer i 1 intressentanalyser