Chain-Venue Booking Platform
203 funktioner · 19 delsystem
Commercial booking platform for chain-type venue tenants — boule bars, pétanque clubs with court rentals, restaurant venues. Enables court bookings, table reservations, staff shifts, corporate events, and tournaments through a unified operational interface.
Umbrella & Design System (PL-T184)
F22.00- F22.00.01 Levererad
Booking color token system (8 types × 3 variants × 2 modes)
✅ - F22.00.02 Levererad
CSS custom properties for www and web
✅ - F22.00.03 Levererad
ChainVenueProfile Beanie model
✅ - F22.00.04 Levererad
GET /chain/venue-profile (admin-only)
✅ - F22.00.05 Levererad
PUT /chain/venue-profile (admin-only)
✅ - F22.00.06 Levererad
Audit logging on all profile mutations
✅ - F22.00.07 Levererad
Default seeding on CHAIN tenant onboarding
✅ - F22.00.08 Levererad
WCAG AA audit tool (audit-booking-colors.mjs)
✅ - F22.00.09 Levererad
Booking premium-criteria CI gate (audit-booking-premium-criteria.mjs)
✅
BookableResource Model (PL-T185)
F22.01Polymorphic resource abstraction covering courts, tables, packages, equipment and event spaces.
Så fungerar det- F22.01.01 Levererad
BookableResource Beanie document with tenant/location scoping
✅ - F22.01.02 Levererad
Resource types: court, table, package, equipment, event_space
✅ - F22.01.03 Levererad
Booking channels: online, phone, operator, drop_in
✅ - F22.01.04 Levererad
Color-type system with per-type defaults and operator override
✅ - F22.01.05 Levererad
Duration and lead-time configuration per resource
✅ - F22.01.06 Levererad
Floorplan position storage (x/y/rotation/width/height)
✅ - F22.01.07 Levererad
Compound index (tenant_id, location_id, code) — unique per location
✅ - F22.01.08 Levererad
Soft-delete (retired status + is_deleted flag)
✅ - F22.01.09 Levererad
CRUD API: GET list, POST create, PATCH update, DELETE retire
✅ - F22.01.10 Levererad
Admin UI: resource list with type + status filter
✅ - F22.01.11 Levererad
Admin UI: resource detail form with booking channel toggles
✅ - F22.01.12 Levererad
Migration script: backfill existing Court documents
✅
Maintenance Blocks (PL-T185)
F22.02Time-based blocks that prevent booking of a specific resource. One-off and recurring (RFC 5545 RRULE subset).
Så fungerar det- F22.02.01 Levererad
MaintenanceBlock Beanie document
✅ - F22.02.02 Levererad
One-off block with start/end/reason
✅ - F22.02.03 Levererad
Recurring block with FREQ=DAILY/WEEKLY/MONTHLY
✅ - F22.02.04 Levererad
BYDAY filter for weekly recurrence
✅ - F22.02.05 Levererad
UNTIL and COUNT limits; max 2-year recurring horizon
✅ - F22.02.06 Levererad
cancelled_from field to cancel recurring series from a date
✅ - F22.02.07 Levererad
Block expansion service: get_blocked_intervals()
✅ - F22.02.08 Levererad
API: GET expanded intervals, POST create, DELETE block
✅ - F22.02.09 Levererad
Admin UI: maintenance blocks management page
✅
Opening Hours Stack (PL-T185 + PL-T184)
F22.03Layered override system. A single date's effective hours are resolved from most-specific to least-specific override.
Så fungerar det- F22.03.01 Levererad
WeeklyHours + DayHours model (HH:MM time strings)
✅ - F22.03.02 Levererad
OpeningHoursOverride document for single-date overrides
✅ - F22.03.03 Levererad
Override modes: closed and modified
✅ - F22.03.04 Levererad
Time breaks within a day (e.g. lunch break)
✅ - F22.03.05 Levererad
get_effective_opening_hours() service method
✅ - F22.03.06 Levererad
API: GET effective hours per date range, POST create override
✅ - F22.03.07 Levererad
Unique constraint: one override per (tenant, location, date)
✅ - F22.03.08 Levererad
Seasonal override via ChainVenueProfile
✅
Booking Engine (PL-T186)
F22.04- F22.04.01 Levererad
Create / update / cancel booking with conflict detection
✅ - F22.04.02 Levererad
Booking validation (opening hours, buffer, capacity)
✅ - F22.04.03 Levererad
No-show logic with grace period
✅ - F22.04.04 Levererad
Audit trail per status change
✅ - F22.04.05 Levererad
Idempotency keys on create
✅ - F22.04.06 Levererad
WaitListEntry FIFO queue with promotion-on-free
✅ - F22.04.07 Levererad
SSE broadcast on status change (chain.bookings.<tenant>.<location>)
✅ - F22.04.08 Levererad
Multi-resource atomic booking (single document, list[resource_ids])
✅ - F22.04.09 Levererad
Per-(tenant,location) asyncio lock for race-free conflict check
✅ - F22.04.10 Levererad
Conflict response with suggested_slots (±2h scan) and can_join_waitlist
✅ - F22.04.20 Levererad
Restricted facility booking (military/school/civic/private_corporate/religious) with permission-gated flow (PL-T217)
✅ - F22.04.21 Levererad
Approval-chain (host_admin → security_officer → optional government_clearance) with role-allow-lists och self-approval-skydd (PL-T217)
✅ - F22.04.22 Levererad
Access-log audit (checkin/checkout/access_denied) med dispatch till security_officers vid access_denied (PL-T217)
✅ - F22.04.23 Levererad
Host-operations-konfliktcheck mot iCal-calendar + restricted_facility_request_expiry_tick (24h-cutoff) (PL-T217)
✅ - F22.04.30 Levererad
Shared-facility-overlay — Booking.shared_facility_owner_tenant_id exponerar bokningen som read-only-spegel hos delägar-tenant via list_for_tenant_including_shared (PL-T224)
✅
Pricing & Payments (PL-T187)
F22.05- F22.05.01 Levererad
Peak / off-peak pricing rules (rule-based stack with peak_multiplier, gated by dynamic_pricing_enabled)
✅ - F22.05.02 Levererad
Member-tier discount (ChainPassport BRONZE/SILVER/GOLD via tier_discount rule)
✅ - F22.05.03 Levererad
Group discount (group_discount rule with min_party_size threshold)
✅ - F22.05.04 Levererad
Duration-bracket discount (duration_bracket rule) and promo-code (promo_code rule)
✅ - F22.05.05 Levererad
Deterministic preview via POST /chain/pricing-rules/preview returning a Quote with line breakdown
✅ - F22.05.06 Levererad
Gift cards: 16-char CSPRNG codes, (tenant_id, code) unique, atomic redemption with audit trail
✅ - F22.05.07 Levererad
Anonymous balance lookup endpoint (rate-limited at gateway) — exposes balance + status only
✅ - F22.05.08 Levererad
Deposit flow — paired deposit + pay_at_venue rows, balance settled at check-in
✅ - F22.05.09 Levererad
Online payment via Stripe PaymentIntent with metadata round-trip
✅ - F22.05.10 Levererad
Stripe webhook /webhooks/stripe/booking-payments — signature verification + StripeWebhookEvent idempotency on event_id
✅ - F22.05.11 Levererad
Refund flow against succeeded rows with parent_payment_id linkage and recompute → PARTIAL_REFUND/REFUNDED
✅ - F22.05.12 Levererad
BookingPayment.audit_trail records every transition (actor, action, metadata)
✅
F&B Menu & Meal Orders (PL-T188)
F22.06- F22.06.01 Levererad
MenuItem with multi-language name/description, EU-14 allergens, dietary flags, kitchen station, course
✅ - F22.06.02 Levererad
MenuPackage with bundle pricing (price < original_total) and min_party_size enforcement
✅ - F22.06.03 Levererad
MealOrder attached to Booking; subtotal/total rolls into Booking.total_amount
✅ - F22.06.04 Levererad
Kitchen printout — ESC/POS thermal-printer payload over raw TCP, PDF-by-email fallback, manual mode
✅ - F22.06.05 Levererad
Time-window availability (available_from / available_until HH:MM)
✅ - F22.06.06 Levererad
Allergen acknowledgement gate when customer has declared allergens
✅ - F22.06.07 Levererad
Status lifecycle (draft/ordered/preparing/ready/delivered/cancelled) with audit trail
✅ - F22.06.08 Levererad
Reprint with idempotent first-print timestamp + audit trail
✅ - F22.06.09 Levererad
SSE broadcast on chain.kitchen.{tenant}.{location} and chain.bookings.{tenant}.{location}
✅ - F22.06.10 Levererad
GET /chain/kitchen/queue filtered by status with per-tenant + per-location isolation
✅ - F22.06.11 Levererad
Multi-language menu listing via Accept-Language header
✅
Customer Booking Flow on Tenant CMS (PL-T189)
F22.07- F22.07.01 Levererad
Multi-step booking wizard, mobile-first
✅ - F22.07.02 Levererad
Multi-language flow (sv/en/fr/de/es + cookie override)
✅ - F22.07.03 Levererad
Upsell prompts at checkout (consumes menu packages)
✅ - F22.07.04 Levererad
Tenant-branded ThemeProvider via ChainWhiteLabelConfig
✅ - F22.07.05 Levererad
Service-worker stale-while-revalidate for tenant-config / resources / menu
✅ - F22.07.06 Levererad
Real-time slot conflict via SSE on bookings.stream
✅ - F22.07.07 Levererad
Idempotent booking submit with crypto.randomUUID key
✅ - F22.07.08 Levererad
Confirmation page with ICS export and share button
✅
Operator Booking Console (PL-T190)
F22.08Hot-key-driven receptions-konsol i admin för chain-venues — single-screen-flow för telefon-bokningar, drop-ins, walk-ins och check-in. Tablet-först (iPad bakom disken), SSE-live, command-palette med actions.
Så fungerar det- F22.08.01 Levererad
Phone booking flow (/operator/quick-book med <QuickBookForm>, deterministisk idempotency-key, 409-konflikt-picker med ⌘1/⌘2/⌘3, success-toast med valfri SMS-bekräftelse)
✅ - F22.08.02 Levererad
Drop-in / walk-in queue (/operator/walk-ins 3-panel: walk-in-kö, ring-tillbaka, väntelista; HTML5-drag till floorplan; assign-via-bottom-sheet utan drag)
✅ - F22.08.03 Levererad
⌘K hot-key driven via <OperatorCommandPalette> (action-set: ny bokning/incheckning/walk-in/väntelista/ring tillbaka/avboka, fuzzy-filter, badge-tags för walk-in-count + check-in-due)
✅ - F22.08.04 Levererad
Quick customer search via <CustomerSearch> (debounced fuzzy-sök över ChainPassport + senaste 90 dagars guest-details, dedup på phone/email, 0-träffar autofokuserar "Skapa ny"-CTA)
✅ - F22.08.05 Levererad
Operator landing (/operator/today) med dagens schema, status-fördelning, check-in-due ±30 min, walk-in-räknare och next-slots per resurs-typ — allt i ett aggregerat API-anrop
✅ - F22.08.06 Levererad
Check-in-vy (/operator/check-in) med ±30 min-fönster, namn/telefon-filter och ett-klick "Checka in" mot POST /chain/bookings/{id}/check-in
✅ - F22.08.07 Levererad
Operator-aggregat-API (GET /chain/operator/{location}/today + /customer-search + /next-slots) — en round-trip för landing, dedupad sök, slot-prober per resurs
✅ - F22.08.08 Levererad
SSE-live på chain.bookings.{tenant}.{location} med 400 ms debounced refetch av today-data + walk-ins
✅
Booking Calendar UI (PL-T191)
F22.09- F22.09.01 Levererad
Day / week / month grid with multi-resource swim-lanes
✅ - F22.09.02 Levererad
Drag-and-drop reschedule + resize
✅ - F22.09.03 Levererad
Color-coded booking-type chips (booking-colors.mjs tokens)
✅ - F22.09.04 Levererad
Real-time updates via SSE (/chain/bookings/stream)
✅ - F22.09.05 Levererad
Month-view utilization heatmap (8% – 50% green alpha)
✅ - F22.09.06 Levererad
Optimistic update + 409 revert with toast
✅ - F22.09.07 Levererad
Keyboard nav (← → t Esc)
✅ - F22.09.08 Levererad
URL-driven view/date/location/resource_type
✅ - F22.09.09 Levererad
BookingDetailDrawer — confirm / check-in / cancel inline
✅
Booking List UI (PL-T192)
F22.10- F22.10.01 Levererad
DataTable with sticky resizable columns
✅ - F22.10.02 Levererad
Sort / filter / search
✅ - F22.10.03 Levererad
Saved-views per user (PL-T172)
✅ - F22.10.04 Levererad
Bulk-edit (confirm / cancel / notify)
✅ - F22.10.05 Levererad
Export CSV / Excel / PDF
✅ — POST /chain/bookings/export with {format, filter, columns}, CSV/XLSX/PDF (PL-T211) - F22.10.06 Levererad
Mobile card-variant
✅ — DataTable mobileCardRenderer prop + <MobileBookingCard> on phone widths (PL-T211)
Floorplan Live-View (PL-T193)
F22.11- F22.11.01 Levererad
SVG layout for lanes & tables (FloorplanView with optional svg_template + background_image_url)
✅ - F22.11.02 Levererad
Real-time status (available / reserved / confirmed / in_use / maintenance / retired) with 30 min lookahead
✅ - F22.11.03 Levererad
Counter-screen display mode (/floorplan/display, dark theme, oversized counters, SSE + 5 s polling fallback)
✅ - F22.11.04 Levererad
Drag-to-assign for walk-ins (HTML5 drag-drop → POST /chain/floorplan/{location}/assign-walk-in with 409-handling)
✅ - F22.11.05 Levererad
Floorplan editor for admins (/chain/floorplan/editor, drag tray-to-canvas, inspector for x/y/w/h/rotation)
✅ - F22.11.06 Levererad
Multi-view support (e.g. main floor + summer terrace) with per-view positions on each resource
✅ - F22.11.07 Levererad
SSE stream chain.floorplan.{tenant}.{location} with debounced refetch
✅ - F22.11.08 Levererad
Walk-in queue (enqueue / cancel / list / assign) with TTL → expired
✅
Staff & Event Linking (PL-T194)
F22.12- F22.12.01 Levererad
StaffMember model (roles, skills, certifications, hourly rate)
✅ - F22.12.02 Levererad
Roles: guide, server, kitchen, bartender, manager, host
✅ - F22.12.03 Levererad
Free-form skills tagging (petanque_intro, dj, etc.)
✅ - F22.12.04 Levererad
Certifications with expiry (alcohol_license, first_aid)
✅ - F22.12.05 Levererad
Per-staff location assignments
✅ - F22.12.06 Levererad
Hourly rate + currency tracking
✅ - F22.12.07 Levererad
Active/inactive status
✅ - F22.12.08 Levererad
Duplicate-guard: one StaffMember per user per tenant
✅ - F22.12.09 Levererad
Shift model with start/end datetimes
✅ - F22.12.10 Levererad
Shift conflict detection (409 on overlap)
✅ - F22.12.11 Levererad
Cross-midnight shift support
✅ - F22.12.12 Levererad
Certification expiry validation (bartender → alcohol_license)
✅ - F22.12.13 Levererad
Location-access validation per shift
✅ - F22.12.14 Levererad
Shift status flow (scheduled → confirmed → in_progress → completed)
✅ - F22.12.15 Levererad
Soft-delete with active-shift warning on staff delete
✅ - F22.12.16 Levererad
Staff schedule view (GET /chain/staff/{id}/shifts)
✅ - F22.12.17 Levererad
SSE stream for real-time shift events
✅ - F22.12.18 Levererad
ShiftTemplate with role quotas + time offsets
✅ - F22.12.19 Levererad
Template apply → expand into concrete shifts
✅ - F22.12.20 Levererad
Applicable event-type filter on templates
✅ - F22.12.21 Levererad
Template active/inactive management
✅ - F22.12.22 Levererad
Link shift to booking (POST /chain/bookings/{id}/staff)
✅ - F22.12.23 Levererad
Unlink shift from booking
✅ - F22.12.24 Levererad
List booking staff (GET /chain/bookings/{id}/staff)
✅ - F22.12.25 Levererad
Apply template to booking (auto-link all created shifts)
✅ - F22.12.26 Levererad
Booking cancellation → unlink shifts with audit trail
✅ — BookingService.cancel calls unlink_shifts_for_booking() and records unlinked_shifts_count in booking audit (PL-T211) - F22.12.27 Levererad
Drag-drop on staff calendar (admin UI)
✅
Staff App + Time-Clock (PL-T195)
F22.13- F22.13.01 Levererad
My-shifts view (mobile-first)
✅ - F22.13.02 Levererad
Swap-shift request (accept/decline/cancel)
✅ - F22.13.03 Levererad
Punch-in/out with geo-fence
✅ - F22.13.04 Levererad
Auto-close cron + manager override of open entries
✅ - F22.13.05 Levererad
Tip-distribution rules (even / weighted_by_hours / role_percentage / individual_assigned)
✅ - F22.13.06 Levererad
Tip pay-out with idempotency on (tenant, location, period)
✅ - F22.13.07 Levererad
Monthly payroll summary export (CSV / Fortnox / Visma)
✅
Notifications Hub (PL-T196)
F22.14- F22.14.01 Levererad
Booking confirmation (mail + SMS + push)
✅ - F22.14.02 Levererad
Reminder (24 h + 2 h before)
✅ - F22.14.03 Levererad
Cancellation confirmation
✅ - F22.14.04 Levererad
No-show notification
✅ - F22.14.05 Levererad
Multi-language templates
✅ - F22.14.06 Levererad
Per-channel opt-out in customer portal
✅
Wait-List & Dynamic Re-Allocation (PL-T197)
F22.15- F22.15.01 Levererad
FIFO queue per resource type + time range (WaitListEntry.position)
✅ - F22.15.02 Levererad
Auto-promote on cancellation (WaitListService.promote_for_freed_slot)
✅ - F22.15.03 Levererad
SMS-alert with configurable response deadline (waitlist_promoted event)
✅ - F22.15.04 Levererad
Cron job for expired deadlines (waitlist-expiration-tick, every minute)
✅ - F22.15.05 Levererad
WaitListPromotion-dokument med statusmaskin pending → accepted/declined/expired/superseded
✅ - F22.15.06 Levererad
POST /chain/waitlist/promotions/{id}/accept med token-baserad guest-access
✅ - F22.15.07 Levererad
POST /chain/waitlist/promotions/{id}/decline med valfritt skäl
✅ - F22.15.08 Levererad
Position-recompute vid create/cancel/promote (FIFO inom bucket)
✅ - F22.15.09 Levererad
Snapshot av promotion_response_window_minutes per entry
✅ - F22.15.10 Levererad
handle_resource_unavailable — supersede + retur till WAITING vid maintenance
✅ - F22.15.11 Levererad
Race-säkert accept (concurrent → slot_unavailable 409 + auto-promote nästa)
✅ - F22.15.12 Levererad
Hourly waitlist-position-metrics-rollup för materialiserad estimated_wait_minutes
✅ - F22.15.13 Levererad
SSE-broadcast på chain.waitlist.{tenant}.{location} + chain.waitlist.entry.{id}
✅ - F22.15.14 Levererad
Default-templates (sv/en × SMS/email) seedas vid första profile-create
✅ - F22.15.15 Levererad
Tenant-killswitch via WaitListPolicy.enabled=False
✅ - F22.15.16 Levererad
Customer cancel mid-promotion → SUPERSEDED + nästa kandidat erbjuds
✅
Customer Portal & Loyalty (PL-T198)
F22.16- F22.16.01 Levererad
"My bookings" view on tenant CMS (/account/bookings, three lazy-loaded buckets)
✅ - F22.16.02 Levererad
Booking history (history + cancelled tabs, paginated 50 per page)
✅ - F22.16.03 Levererad
Repeat-book ("same as last time") (POST /me/bookings/{id}/repeat + sessionStorage prefill → /book/{lane\
table|event}) | ✅ - F22.16.04 Levererad
ChainPassport tier-progress badge (<LoyaltyTierBadge> med animerad progress-arc, regular/gold/platinum)
✅ - F22.16.05 Levererad
NPS feedback after visit (<NpsPromptModal> 0-10 + comment, auto-open när outstanding prompt finns)
✅ - F22.16.06 Levererad
Self-service rebook / cancel (<CancelBookingDialog> med quote-preview + reason, party-size modify)
✅ - F22.16.07 Levererad
Gift-card balance overview (/account/gift-cards, balance + expiry + redemption count)
✅ - F22.16.08 Levererad
Notification preferences (/account/preferences, email/SMS/push toggles + audit-trail)
✅
Analytics & Utilization (PL-T199)
F22.17- F22.17.01 Levererad
Per-resource revenue dashboard (GET /chain/analytics/revenue med group_by=resource_type + RevenueChart)
✅ - F22.17.02 Levererad
Occupancy rate per resource (GET /chain/analytics/utilization + AnalyticsUtilization-vy)
✅ - F22.17.03 Levererad
No-show rate trend (KPI på AnalyticsDashboard, AnalyticsMetrics.no_show_rate)
✅ - F22.17.04 Levererad
Peak-time heatmap (GET /chain/analytics/heatmap + UtilizationHeatmap-komponent, 7×24 ISO-vecka)
✅ - F22.17.05 Levererad
Conversion funnel (visit → booking) (GET /chain/analytics/conversion + ConversionFunnel-komponent)
✅ - F22.17.06 Levererad
Customer cohorts (repeat vs first-time) (GET /chain/analytics/customers + CustomerCohortChart)
✅ - F22.17.07 Levererad
PDF monthly report export (POST /chain/analytics/export med format=pdf/csv/xlsx, sync ≤ 92 dagar)
✅ - F22.17.08 Levererad
Pre-computed AnalyticsRollup (day/week/month) + idempotent upsert
✅ - F22.17.09 Levererad
BookingFunnelEvent + unique session-de-dupe + _aggregate_funnel
✅ - F22.17.10 Levererad
analytics_rollup_hourly / _daily / _monthly_close cron-jobb
✅ - F22.17.11 Levererad
Live-delta för dagens bucket (in-memory compute_rollup ovanpå hourly-rollup)
✅ - F22.17.12 Levererad
Capability-gating (chain.analytics.read + chain.analytics.export)
✅
POS + Upsell + QR-Checkin + Marketing (PL-T200)
F22.18## Related documentation
Så fungerar det- F22.18.01 Levererad
POS integration Square (transaction push + signed webhook)
✅ - F22.18.02 Levererad
POS integration Zettle/iZettle (transaction push + signed webhook)
✅ - F22.18.03 Levererad
POS integration Stripe Terminal (PaymentIntent + Stripe-Signature skew)
✅ - F22.18.04 Levererad
POS device health-check job (15 min ping + ops-alert)
✅ - F22.18.05 Levererad
Rule-based smart upsell prompts (color_type · party · weekday · season)
✅ - F22.18.06 Levererad
Smart upsell preview API + sessions-dismiss UI
✅ - F22.18.07 Levererad
Signed-JWT QR check-in tokens (HS256, per-tenant HKDF, kid-rotation)
✅ - F22.18.08 Levererad
Instant QR check-in via operator scan (offline-capable via JWKS-cache)
✅ - F22.18.09 Levererad
Marketing-automation: birthday offer (days_before_birthday)
✅ - F22.18.10 Levererad
Marketing-automation: win-back (inactivity_days · historical_min)
✅ - F22.18.11 Levererad
Marketing-automation: gift-card-promo (årlig push)
✅ - F22.18.12 Levererad
Marketing-automation: post-detractor recovery (NPS-trigger)
✅
Inga funktioner matchar dina filter.