Ceremonies modelled as sessions: OOC01 (Opening) · OCC01 (Closing)
Event config
eventType = RACING_WEEKEND
code = F1-SGP-2026
1 weekend, 4 sub-sessions
Default currency USD
Downstream implications
One MatchDef, multiple SubGames: FP1 · Quali · Sprint · Race
Category scheme custom: Paddock Club · Gold Hospitality · Grandstand A/B/F · General Admission
Side effects
Notification event.created → role:ops_manager
Activates the event switcher dropdown — users can switch into it
Nothing allocated or purchased yet — event in DRAFT
super_adminevent_adminStatus: PLANNINGFreq: 1× per event
Why
Schedules are typically acquired 12+ months in advance. System accepts the whole season/tournament in one file, parses venues / categories / sessions, and creates MatchDef[] in bulk. Placeholder teams are preserved for later resolution.
Seat-proximity penalty in allocation scoring (so scattered allocation is discouraged)
Client portal can filter by Block / Row / Seat range
event_adminFreq: throughout tournament
Form preview · Enter match result
Enter result · M57 (Quarter Final)
Brazil
France
Brazil ⌄
France (auto)
Cascade
All matches with teams.home.placeholderRef == "Winner QF1" update to "Brazil"
Each resolution triggers a notification match.teams_resolved → clients holding tickets for that match
Client portals refresh automatically (the Game column updates)
If resolving M57 makes M61 fully resolvable, cascade continues
Scenarios
M01–M48 Group → resolve winners after all 48 group matches
M49–M56 R16 → resolve Round of 16 winners
M57–M60 QF → QF winners → M61/M62 SF
M61–M62 SF → SF winners → M64 Final, losers → M63 3rd
Final resolution: M64 home/away both resolved ~4 days before match
Less bracket-heavy — Olympics S.Desc in the sample has relatively few placeholders (16 rows mention "Qualifier"). Most sports have heats → semis → finals within days; placeholders resolve within the same week.
ops_managerFreq: rare
Form preview
New vendor
TicketVault
TKV
MARKETPLACE ⌄
MARKETPLACE · DIRECT · AGENCY
France
https://ticketvault.example.com
Clara Dufresne
clara@ticketvault.example
+33 1 234 5678
☑ Yes
Special: Matthias masking
Vendor emails in the _MATTHIAS_EMAILS allowlist (266 entries) trigger automatic anonymisation: Distribution writes Vendor = "Matthias" and keeps the real email in the Email column. Keep this rule when building the vendor model.
ops_managerFreq: rare
Form preview
New client
Meridian Travel
MRT
AGENCY ⌄
CORPORATE · AGENCY · INDIVIDUAL
500,000 USD
David Clarke
david@meridiantravel.ae
Dubai
UAE
Net 30 ⌄
☐ No
VIP drives excludeVip policy
One client · many matches
A client buys tickets across many matches in one tournament. The Sales form's line-item section supports mixed matches — see B14.
ops_manager
Form preview
New contract
2025-100129
Text format — preserves dashes
PURCHASE ⌄
TicketVault (vendor) ⌄
FIFA World Cup 2026 ⌄
01 Jan 2026
31 Jul 2026
5,000,000 USD
USD ⌄
ACTIVE ⌄
contract-2025-100129.pdf
sr_operatorops_manager
Per-event or global
eventId = null → global credential (fallback across events)
eventId = evtX → event-specific (wins over global)
If the sale is re-imported (qty unchanged, same SourceSaleID), rows with matching SalesLineKey are preserved — operator edits to guest details / dispatch status are not wiped.
sr_operatorops_manager
4-strategy generator
EXACT — smallest single set with count ≥ qty (min waste)
GREEDY_LARGEST — fill from largest sets (fewer chunks)
GREEDY_SMALLEST — fill from smallest (tighter fit)
ROTATED_DESC — up to 5 rotations of largest-first ordering (vendor diversity)
Dedup canonical signatures. Sort: closest-to-target → fewest chunks → largest total. Return top 6.
Client: First name · Last Name · Email · Phone · Notes
staffExternal platform
Staff opens vendor website
Logs in using stored email + password
Searches for listing by INV_NO
Enters Client Email → send ticket
Captures proof (screenshot / confirmation URL) → returns to TicketOps
staff
Form
Mark dispatched
SENT ⌄
Or PENDING / ACCEPTED / ISSUE
21 Apr 2026 14:32
https://viagogo.com/confirmation/abc123
Sent to john.smith@meridiantravel.ae
Sequence (user-confirmed)
FEW supplier detected via SUPPLIER_manualGroupMap_() + email-pattern fallback
For every _PURCHASE_UNITS row from that supplier → row in supplier sheet (inventory listing)
Supplier can verify their own purchases against our records before any sale happens
Canonical data flow
① Client fills guest details → ② Distribution receives → ③ Allocation pushes needed detail to Supplier — client data only arrives at supplier via allocation, never directly.