Venue profile & resources
The whole operations configuration for Boulodrome Sjöstad sits in ONE ChainVenueProfile (one read, no joins) — seeded with defaults at onboarding and audit-logged on every change. Booking operations live in Reception, the floor plan in Floor plan.
BookableResource — GET/POST/PATCH/DELETE /chain/resources · unique code per (tenant, location)
| Code | Name | Type | Booking channels | Colour type | Duration & lead time | Floor-plan position | Status |
|---|---|---|---|---|---|---|---|
| C-01 | Court 1 · Center | court | online·phone·operator | standard | 60–120 min · lead 1 h | Main floor (120,80) | ✓ active |
| C-06 | Court 6 | court | online·phone·operator·drop_in | standard | 60–120 min · lead 0 h | Main floor (480,80) | ✓ active |
| T-04 | Table 4 | table | online·phone·operator·drop_in | standard | 90 min · lead 0 h | Main floor (120,320) | ✓ active |
| E-01 | Event space Terrace | event_space | phone·operator | event | 120–360 min · lead 48 h | Summer terrace (60,40) | ✓ active |
| U-02 | Boule set B (13 boules) | equipment | operator·drop_in | walk_in | 60 min · lead 0 h | — | ✓ active |
| P-01 | After-work package (court+table+menu) | package | online·phone | group | 120 min · lead 24 h | — | ✓ active |
| C-09 | Court 9 (the old gravel court) | court | — | standard | — | — | retired (soft-delete) |
Resource detail — Court 1 · Center (all fields in the model, F22.01.11)
Booking channels (toggles per resource, F22.01.03):
Existing Court documents backfilled via a migration script (F22.01.12).
No resources yet on the Summer terrace — .
Weekly schedule (WeeklyHours · HH:MM) + breaks
| Day | Opens | Closes | Breaks |
|---|---|---|---|
| Monday | 10:00 | 22:00 | — |
| Tuesday | 10:00 | 22:00 | — |
| Wednesday | 10:00 | 22:00 | — |
| Thursday | 10:00 | 23:00 | — |
| Friday | 10:00 | 00:00 | — |
| Saturday | 11:00 | 00:00 | 14:00–15:00 (court care) |
| Sunday | 11:00 | 20:00 | — |
Date overrides (closed / modified) — one per (tenant, place, date)
| 2026-07-04 | modified | 11:00–16:00 | DM Doublette — pre-booked only |
| 2026-07-24 | closed | — | Closed for Midsummer (holiday closure from the profile) |
| 2026-08-01 | modified | 10:00–18:00 | Staff party from 18 |
New override
Season override (from ChainVenueProfile, F22.03.08)
Resolution order for a day's effective hours (get_effective_opening_hours, F22.03.05): date override → season override → weekly schedule. Preview: GET /chain/opening-hours?from=2026-07-01&to=2026-07-07.
Sat 4 Jul → 11:00–16:00 (the "modified" override wins over season and week)
MaintenanceBlock — blocks the resource in the booking engine · GET expanded intervals / POST / DELETE
| Resource | Type | Schedule | Limit | Status | |
|---|---|---|---|---|---|
| Court 3 | One-off | 5 Jul 08:00 → 6 Jul 17:00 · "Surface repair cracks" | — | active | |
| All courts | Recurring | FREQ=WEEKLY · BYDAY=MO · 07:00–09:00 · "Court care" | UNTIL 2026-12-31 | active | |
| Courts 7–8 | Recurring | FREQ=MONTHLY · first Monday · "Deep cleaning" | COUNT 12 | active | |
| Table 2 | Recurring | FREQ=DAILY · 15:00–15:30 · "Table resetting" | cancelled_from 2026-08-01 | ending |
New block — one-off or recurring (RFC 5545 subset)
The block triggers handle_resource_unavailable in the waitlist (F22.15.10).
Expanded intervals next 7 days (get_blocked_intervals)
Mon 6 Jul 07:00–09:00Court care (WEEKLY/MO)
Sun 5 Jul 08:00 → Mon 6 Jul 17:00Surface repair (one-off)
Mon 6 Jul (all day, courts 7–8)Deep cleaning (MONTHLY #1)
⚠Error: the rule exceeds the 2-year horizon (F22.02.05) — shorten UNTIL or set COUNT.
ShiftTemplate — role quotas + time offsets; applied to a booking → expands to concrete shifts. The schedule & staff register live in Staff.
| Template | Role quotas | Time offset | Event-type filter | Status | |
|---|---|---|---|---|---|
| Corporate event | 1× host · 1× bartender · 1× kitchen | host −30 min · kitchen −60 min | event, group | active | |
| Tournament day | 2× guide · 1× manager · 1× server | guide −45 min | competition | active | |
| Weekday evening | 1× host · 1× server | ±0 | — | active | |
| Summer terrace (seasonal) | 2× server · 1× bartender | server −15 min | group | inactive |
Tip distribution (F22.13.05–06)
June: 8,412 kr in tips → 6 recipients · paid out 1 Jul ✓
Time clock & payroll export (F22.13.04/07)
⏱ 1 open clock-in was auto-closed 02:00 (cron job) — David Sjölund, Thu. Manager override: .
Monthly payroll summary — exported to:
The staff's own view (my shifts, shift swaps, geo clocking, tips) lives in the player app → My shifts.
ChainVenueProfile — GET/PUT /chain/venue-profile (admin only)
Payment methods (configurable without code changes):
Every mutation is audit-logged (F22.00.06).
Booking colour tokens — 8 types × solid/subtle/border × light/dark
standard
standard
member
member
group
group
event
event
walk_in
walk_in
drop_in
drop_in
maintenance
maintenance
competition
competition
Defined in booking-colors.mjs, exposed as CSS custom properties for www + web (F22.00.01–02). No hardcoded hex in booking components.
✅ WCAG AA audit (audit-booking-colors.mjs): 48/48 combinations ≥ 4.5:1 — runs in CI together with the premium criteria gate (audit-booking-premium-criteria.mjs).
Audit log — profile mutations
| today 09:14 | Malin Sjöstrand (site manager) | PUT /chain/venue-profile — cancellation_policy.cutoff_hours 12 → 24 |
| 28 Jun 16:02 | Malin Sjöstrand (site manager) | PUT /chain/venue-profile — payment_methods + swish |
| 12 Jun 11:47 | system | Default seeding at CHAIN onboarding (F22.00.07) |