turn page · T contents · P save PDF
— THE OFFICIAL —
SNOOKER KING

User
Guide

A complete handbook for the
Snooker King operations platform
Rex Lusoriae
Edition 2026  ·  Volume I  ·  Snooker King Software
Snooker King SoftwareUser Guide
Of the publication

Snooker King Software

A modern, web-based operations platform engineered for snooker centres, billiard halls, and cue-sport academies — covering tables, members, battles, food & beverage, billing, and analytics, all from one console.


Published by
VYROX International · Snooker King Division
snookerking.com · vipsnooker.com · snookersoftware.com
Edition 2026  ·  First Printing
ii
ForewordSnooker King · User Guide
Foreword

A Word to the Reader


Running a snooker centre is an act of choreography — tables turning, members arriving, kitchens firing, scoreboards flickering, ledgers closing. This guide is the script.

The Snooker King platform was designed not to replace the rhythm of a busy room, but to amplify it. Every screen, every button, every report exists because a real operator, on a real night shift, asked for it. This guide walks you through the system as it actually behaves — from a member tapping a QR code at the door, to the moment the manager closes the till and reviews the day.

Read it linearly the first time. Keep it on a shelf for the second. The chapters move from the broadest concepts (architecture, roles, daily flow) toward the deepest mechanics (settings, audit logs, troubleshooting). Cross-references and a glossary close the volume.

How to use this guide Each chapter opens with a one-page summary, followed by step-by-step procedures, screen-by-screen walkthroughs, and "in practice" notes drawn from live deployments. Italic margin commentary marks tips; red rules mark warnings.

— The Snooker King Team
June 2026

iii
ContentsSnooker King · User Guide
Index

Table of Contents


I.Architecture & Tenancy5
II.Roles & Access Control7
III.The Operations Console9
IV.Clients, Orgs & Centres11
V.Tables, Sessions & Lighting13
VI.The Live TV Monitor15
VII.Live Cast Broadcast17
VIII.Members & Profiles18
IX.The Member Portal19
X.Battles & Tournaments21
XI.Bookings24
XII.F&B Menu & Combos25
XIII.F&B POS & Kitchen27
XIV.Inventory & Stock29
XV.Invoices & Tenders30
XVI.Split-Bill Workflow32
XVII.E-Invoice & LHDN33
XVIII.Deposits & Credit34
XIX.Stamp Card & Loyalty35
XX.Campaigns & Promotions36
XXI.Rental, Tickets, Countdown37
XXII.RFID Card Scan Mode38
XXIII.Reports & Analytics39
XXIV.System Logs & Audit41
XXV.Bug Reports & Support43
XXVI.Devices & Hardware44
XXVII.Theming & Branding45
XXVIII.Chat & Announcements46
XXIX.Mobile App & API47
XXX.Employees & Permissions48
XXXI.Troubleshooting & FAQ49
XXXII.Authentication & Security51
XXXIII.Public Order Page53
XXXIV.The Marketplace54
XXXV.Setup Wizard56
XXXVI.Notifications & Sound57
XXXVII.Reconciliation Tools59
XXXVIII.Legal & Consent60
XXXIX.Encryption, QR Tokens & Privacy61
XL.Cron & Background Automation63
XLI.Going Live: A Launch Checklist65
XLII.Daily Operations Cheat Sheet67
XLIII.Member Portal Deep-Dive69
XLIV.Mobile App & API Reference71
XLV.Multi-Centre & Chain Strategy73
XLVI.Privacy, Data Rights & Compliance75
XLVII.Integrations & Webhooks77
XLVIII.Performance, Scale & Reliability78
XLIX.Backup & Disaster Recovery79
L.Internationalization & Localization80
LI.Releases, Versioning & Roadmap81
LII.Glossary82
A.Appendix · Keyboard Shortcuts83
B.Appendix · Game Variants85
C.Appendix · Status Reference86
D.Appendix · Pricing Pipeline87
E.Appendix · Operator Recipes88
F.Appendix · State Machines90
G.Appendix · Feature Reference Index92

"A well-run room is the sum of small, well-kept records."

iv
Chapter IArchitecture & Tenancy
Chapter I  ·  Foundations

Architecture & Tenancy


Snooker King is a multi-tenant cloud platform for cue-sport venues. One installation can serve a single hall, a regional chain, or a national franchise — without code changes, from the same browser.

The platform is composed of four cooperating surfaces. Understanding them in this order will help every later chapter make sense.

1 · The Operations Console
A responsive web app used by admins, clients, organization managers, centre managers, operators, and cashiers. Hosts every back-office workflow.
2 · The Member Portal
A mobile-first, app-like experience for end-customers. Profile, bookings, battles, F&B ordering, social feed, QR member card.
3 · The Live TV Monitor
A wall-mounted display board. Real-time table status, prices, marquee promotions, branded footer, configurable per centre with multiple themes.
4 · The Mobile App
Native Flutter apps (iOS & Android) that wrap the member portal and add FCM push notifications, secure-storage-backed login, location-aware centre suggestions, and a receipt cache for offline reading.

Tenancy Hierarchy

Every record in the system belongs to a four-level hierarchy. Permissions, reports, and even the colour of the navigation bar depend on which level you are signed into.

LevelOwnsTypical user
Client (tenant)Brand, billing, organizationsThe franchise / company owner
OrganizationCentres, regional rules, membershipsRegional director
CentreTables, employees, F&B menu, prices, devicesBranch manager
Member / GuestBookings, wallet, history, battlesCustomer
In Practice A new franchise launches three centres. One client is created (the parent company), one organization sits below it (the brand group), and three centres sit below that. Members belong to a centre but are portable across the same organization for free tiers.
5
Chapter I — Architecture & TenancySnooker King · User Guide

Browsers, Devices & Connectivity

Snooker King is a browser-first application. There is no installer, no desktop client, and no required plugins.

SurfaceRecommendedMinimum
Operations ConsoleChrome / Edge 120+Safari 14+
Live TV MonitorChrome / Edge fullscreen, 1920×10801366×768
Member Portal (web)Latest mobile Safari / ChromeiOS 14, Android 9
Mobile AppiOS 15+, Android 10+iOS 13, Android 8

A Day in the Life

Here is the daily rhythm of a typical centre — every event in this list is a feature you will meet later in the guide.

1
Open shift. The manager logs in, the float is recorded, devices come online and report heartbeats.
2
First customer. Walks in, scans member QR (or taps RFID card), the operator assigns Table 5 and starts the meter; the table light turns on automatically.
3
F&B order. A waiter sends a kitchen order to Table 5 from the POS; the kitchen ticket prints automatically on the assigned thermal printer.
4
Battle. Two members start a tournament battle on Table 9; frame-by-frame scoring updates the leaderboard, and a public Cast URL streams the match.
5
Settlement. The customer requests the bill; the operator splits it three ways; one pays cash, two by e-wallet.
6
Day-end. The manager reviews revenues, voids, comps, and stamp-card redemptions; a thermal shift report is printed for the safe.
Tip Every action above is recorded in the System Logs module (Chapter XXIV). If a number on a report ever surprises you, the source-of-truth event is one filter away.
6
Chapter IIRoles & Access Control
Chapter II  ·  Identity

Roles & Access Control


Before you can do anything, the system must know who you are and which centre you speak for. Every screen, button, and report obeys your role.

The Six Roles

Snooker King ships with six functional roles, mapped onto five physical user types in the database. manager and operator share the employee table and are differentiated by the employee's role field; the other four are stored in their own tables (admins, clients, organizations, members). Permissions follow the role at every request — pages, modals, and even individual rows.

RoleScopeTypical capability
ADMINWhole platformAll clients, organizations, centres, audit
CLIENTOne clientOwn organizations, branding, billing, all reports
ORGANIZATIONOne organizationCentres in scope, pricing, cross-centre reports
MANAGEROne centreEmployees, shifts, voids, comps, devices
OPERATORLive shiftTables, F&B orders, take payments
MEMBEROwn dataProfile, bookings, battles, wallet, social
Security Passwords are never visible to support staff. If you have lost yours, use Forgot password; never share credentials — every action is logged against the signed-in user.
7
Chapter II — Roles & Access ControlSnooker King · User Guide

Signing In

1
Open the console URL in a modern browser.
2
Enter your registered email and password.
3
If a verification code is required, enter the six-digit code from your registered channel.
4
On first login, change the temporary password.

Page Access Matrix

The console exposes pages by role. Unlisted modules are hidden from the navigation entirely.

PageAdmCliOrgMgrOpMem
Dashboard
Operations
Revenues / Reports
Members
Memberships
Centres
Organizations
Employees · Campaigns
Clients · Admins

Context Switching & Sign-Out

Multi-centre managers can change scope from the header context switcher. Switching is audited (a row in System Logs ties subsequent actions to the new scope). Manual sign-out clears local storage immediately and revokes the active session.

Never leave a logged-in console unattended. Unauthorised voids and comps are the most common forensic finding when audit goes wrong.
8
Chapter IIIThe Operations Console
Chapter III  ·  Cockpit

The Operations Console


The Operations Console is the cockpit. Every other feature in the platform is launched from here, and every report ends here. We treat it as the single most-used surface in the entire product.

Anatomy of the Console

— Layout —

Single-page, modal-driven workspace

A persistent header bar, a sidebar of pages, and a centre stage that swaps between Operations, Revenues, Members, Centres, and other modules. Heavy actions open in modals so context never gets lost.

Sidebar Pages

Three sidebar links are always visible to anyone signed in (Operations, Deposits, Revenues); the rest light up by role. Order is fixed so muscle memory carries between centres.

  1. Dashboard — announcements feed and management.
  2. Admins · Clients · Employees · Organizations · Centers — tenancy and identity surfaces (top-down).
  3. Campaigns · Memberships — promotions, tier definitions, discount rules.
  4. Operations — the live table grid; most of a shift is spent here. Always visible.
  5. Deposits — wallet top-ups, ledger, refund / cash-out. Always visible.
  6. Revenues — financial reports, shift reconciliation, thermal slip, exports. Always visible.

Members and POS aren't separate sidebar tabs — the M shortcut (or the table action panel) opens member search; POS opens from the table tab itself, since every order is bound to a table or member.

Header Bar

9
Chapter III — The Operations ConsoleSnooker King · User Guide

The Dashboard Page

The Dashboard is a focused communication surface — its job is to surface the announcements that matter to the signed-in user, not to act as a number-board. Live operational numbers live on the Operations grid (the next page), and financial numbers live in Revenues.

If a manager wants live shift numbers, the Operations grid shows occupancy and pending-payment counts in real time, and the Revenues module shows tender breakdown and totals.

Search & Filtering

Each module has its own search field and filter chips. The Operations grid lets you filter by table type, status, zone, and assignment. The Members directory lets you search by name, phone, RFID card ID, or member number. Revenues lets you filter by date range, payment method, employee, and centre.

Modals — the Workhorse

Most actions open in a modal so the underlying live grid keeps updating. The most common modals you will meet:

Notifications & Alerts

The header bell shows live alerts: low stock, new bug report, membership renewal due, large discount applied, end-of-shift cash variance. Click to acknowledge; alerts persist until handled.

10
Chapter IVClients, Organizations & Centres
Chapter IV  ·  Tenancy

Clients, Organizations & Centres


Centres are the heartbeat of the system. Almost every other entity — tables, members, invoices, employees, F&B items — belongs to exactly one centre. Get the centre right and the rest follows.

Creating an Organization

1
Sign in as a CLIENT or higher.
2
Open Organizations → New.
3
Enter legal name, trading name, country, primary currency, and tax registration ID.
4
Pick a brand colour and upload a square logo (≥ 512×512 PNG with transparent background recommended).
5
Save. The organization is ready to host centres.

Creating a Centre

Each centre carries its own opening hours, table inventory, F&B menu, price lists, and employee roster. The Centre wizard does the heavy lifting in a guided flow:

Step 1 · Identity
Name, address, phone, time zone, default currency, and the Live TV Monitor brand strip footer text.
Step 2 · Tables
Number of tables, type (Snooker / Pool / English), zones, and base tariffs. Default Live Monitor config is seeded from a canonical template in one shot.
Step 3 · Hours
Opening / closing per weekday, peak hours, public-holiday overrides, and the last-call rule.
Step 4 · F&B
Choose to clone the menu from another centre, import CSV, or start blank.
Save time For a multi-centre rollout, configure your flagship centre fully, then use the wizard's clone option to create the next ones — only address and table count usually change.
11
Chapter IV — Clients, Organizations & CentresSnooker King · User Guide

The Centre Settings Tree

Every centre exposes a deep tree of settings. The full path from least-changed to most-changed:

Centre
├── Identity ........... name, address, contact, time zone
├── Branding ........... logo, colours, social links, monitor footer
├── Hours .............. weekly schedule, holidays, last call
├── Tariffs ............ table tiers, peak/off-peak, member discounts
├── F&B Menu ........... categories, items, modifiers, combos
├── Inventory .......... stock items, low-stock alert, movements log
├── Employees .......... roles, permissions, status
├── Devices ............ printers, monitors, RFID readers, lighting relays
├── Integrations ....... payment, e-invoice (LHDN), notifications
└── Compliance ......... tax, e-invoicing, age policy

Tariffs & Peak Hours

Tariffs are the most-edited setting after F&B. The model is intentionally simple — three layers, applied in order:

  1. Base rate per table type (Snooker, Pool, English).
  2. Time band modifier — peak (often 18:00–23:00) adds a percentage; happy hour subtracts.
  3. Member discount — applied last, after time band.

Rates can be overridden per table for special tables (championship, VIP). The effective rate column on the operations grid always shows the final number a customer will pay.

Watch out Changing a base rate mid-shift does not retro-bill running tables. The rate they started with is locked in until they finish. This is intentional and audited.

Cloning a Centre

For a multi-centre rollout the most useful shortcut is the clone action: configure the flagship completely, then clone-create new centres so almost everything carries over. Address and table count typically need to differ; everything else can be inherited at clone time and adjusted in place per centre afterward.

Other multi-centre operations — bulk menu sync, organization-wide tariff broadcast — are handled centre-by-centre today; do them with care during quiet hours and verify with the proforma screen on a representative invoice before publishing.

12
Chapter VTables, Sessions & Lighting
Chapter V  ·  The Floor

Tables, Sessions & Lighting


Tables are why the customer is here. This chapter covers the live operations grid, the session lifecycle, and the lighting integration that ties software to the physical room.

Operational States

Five canonical states live on center_tables.current_status: available, occupied, checkedout, inactive, and maintenance. The Operations grid renders more than five badges by layering two derived signals on top — pending (session finished, invoice not yet settled) and rental-active / rental-idle for tables in a rental window — plus a static fnb label for F&B-only tables. The stored column is the audit truth; the rendered badge is the operator's at-a-glance.

StateStored?MeaningTriggered by
availableyesIdle, ready for playDefault; restored after checkout or abandonment cleanup
occupiedyesActive session, meter running, light onOperator starts a session, F&B order opens, or split-bill recovers
pendingderivedGame ended, awaiting settlement (rendered, not stored)Session session_status is checked_out or pending_payment while the invoice is unpaid
checkedoutyesBrief post-payment state, customer leavingInvoice fully paid; cleared by next assignment
inactiveyesHidden / decommissioned (table not in use this shift)Manager hides the table
maintenanceyesOut of service for repairOperator marks unavailable, reason logged
fnbderived (flag)F&B-only table; static badge, no game timerTable flagged is_fnb in centre setup
rental-active / rental-idlederivedTable is in a rental window (active rental session) or idle inside oneRental booking opens / closes; remaining-time clock drives the badge

Starting & Stopping a Session

1
Click the table cell. The action panel slides in.
2
Click Start. The system records the start time, locks the tariff at that moment, turns the cell occupied, and energises the table light via the lighting relay.
3
If a member is present, scan their QR (or RFID card) or pick from search. The tier discount is applied automatically to the running total.
4
When play ends, click Stop. State becomes pending_payment; the final amount appears; choose Pay now or hand to a cashier.
5
After the invoice is paid, the cell turns checkedout briefly, then resets to available.
Time zone safety Session duration is computed at the database, not in the browser, to avoid time-zone skew between PHP and MySQL. Reports always show the correct elapsed minutes.
13
Chapter V — Tables, Sessions & LightingSnooker King · User Guide

Lighting Integration

Snooker King controls table lighting through Vyrox's MQTT relay gateway. The platform sends commands over an HTTPS bridge (vyrox.vip/mqtt_light/*) which fans them out to the ESP-based relays mounted above each table. The architecture is command-and-query, not push-heartbeat — operators always see real-time state because the console asks the gateway every few seconds, not because the relay phones home.

Maintenance & Out of Service

To take a table out of service, open the table action panel and switch its status to Maintenance (or Inactive if the table is being decommissioned for a longer period). The cell is hidden from the live operations grid and the public Live TV Monitor stops advertising it. Maintenance is a soft signal, not a hard lock — bookings already in the future on that table are not auto-cancelled, so a manager should review the day's bookings after marking a table down for repair.

Sessions & Multi-Member Play

A session can have one host member plus additional players. Each player is recorded against the session for leaderboard, history, and split-bill purposes. Players can be added or removed mid-session; the duration is shared but the bill can be split per person at checkout (Chapter XVI).

Countdown Packages

Some venues sell time as packages — for example "60 minutes for a flat fee". The countdown module attaches a remaining-time clock to a session; when it reaches zero, an upsell prompt appears at the operator station. Packages are configured per centre with their own pricing.

Sessions never silently overrun Even when a countdown package expires, the table is never auto-stopped. The operator is prompted; the customer keeps playing only by explicit decision.
14
Chapter VIThe Live TV Monitor
Chapter VI  ·  Public Display

The Live TV Monitor


Every centre has at least one wall-mounted display showing all tables, their state, prices, and rotating promotions. The Monitor is browser-based, fullscreen, and updates without refresh.

— Configuration —

One JSON config per centre, four ways to display it

The Live TV Monitor Editor in the Settings modal exposes a structured config covering theme preset, layout, header, summary stats, footer, and rotation. A Reset to default button restores the canonical seed for that centre.

Theme Presets

The monitor ships with four ready-made looks. Pick one per centre; pixel-level overrides are available where needed.

PresetBest for
Broadcast ProSports-bar feel; bold cards, large numerals, deep accents.
Apex LoungePremium club; muted palette, tall header, refined typography.
Glass ModernLight, airy, glass-morphism; suits boutique venues.
Departure BoardAirport-board energy; high-contrast monospaced rows for very busy halls.

Layout Styles

Density is selectable from compact, comfortable, or spacious.

15
Chapter VI — The Live TV MonitorSnooker King · User Guide

Sections of the Monitor

Quick-Add & Reset

When you create a new centre, the wizard seeds the Monitor config in one shot from a canonical template — never start from a blank screen. Reset to default restores the same template at any time. The footer brand strip is loaded from a global setting, so re-branding the company updates every venue's monitor at once.

Hardware Recommendations

Hall sizeDisplayPlayer
≤ 12 tablesSingle 55″ 1080pMini-PC or Chromecast in kiosk mode
12–30 tables65–75″ 4KMini-PC, Ethernet, fullscreen browser
30–60 tables2× 65″ tiledTwo browser instances on the same config
Power & sleep Disable display sleep, screen-savers, and OS auto-update reboots on monitor PCs. The single most common Monitor support ticket is a screen that simply went to sleep overnight.
16
Chapter VIILive Cast / Public Broadcast
Chapter VII  ·  Spectator

Live Cast / Public Broadcast


Big matches deserve an audience. Live Cast turns any battle on any table into a public, token-gated URL that anyone with the link can watch — frame scores, fouls, breaks, and a customisable overlay, all in real time.

How It Works

  1. The operator (or the host member from the portal) starts a battle on a table.
  2. A unique 16-character alphanumeric token is generated and stored on the battle row. Routes /live/?token=X, /live.php?token=X, and /debug/cast.php?token=X all resolve to the same Cast page; the token alone is the credential.
  3. The server validates the token against battles.broadcast_token with the additional gate broadcast_enabled = 1. A revoked or never-enabled match returns a friendly empty-state page rather than data.
  4. The Cast page shows player names, current frame, frame scores, last-pot information, and a brand overlay — no other tables, no payment data.
  5. Visibility is a toggle, not a timer: when the host disables the broadcast, the same token immediately stops resolving. There is no auto-expiry — to keep a result shareable after the match, leave the broadcast enabled; to lock it down, flip the switch off.

Broadcast Layouts

Three presentation styles ship with the platform:

LayoutVibe
Crucible ClassicTournament TV — dark chrome, big break number, scoreboard chyron.
Premier League TheatreHigh-energy event — accent stripes, animated transitions, sponsor strip.
Pressroom MinimalClean reporter-style — no decoration, only the facts; suits embedded streams.

Use Cases

Privacy Cast URLs expose only public match facts (names, scores, frame state). No payment data, no member contact info, and no other tables in the venue are shown.
17
Chapter VIIIMembers & Profiles
Chapter VIII  ·  The Customer

Members & Profiles


A member is more than a phone number. The member record is the spine of loyalty, billing, social play, and analytics. Every interaction in the room echoes back to it.

Membership Tiers

Tiers are not a hard-coded ladder — every organization defines its own set in the Memberships module, and tier names ("Silver", "Gold", "Champion", "Premier", whatever fits the brand) are free-text. Each memberships row carries a consistent shape that pricing and rewards bind against:

FieldPurpose
nameDisplay label shown to staff and members.
fee + validity_daysOne-off price + how long membership lasts before renewal. validity_days = 0 is a common setup for a perpetual / free tier.
base_credits / bonus_credits / reward_points / tokensFour issuable wallet currencies. Each has its own *_expiry_days column so a top-up bonus can expire faster than the deposit it came with.
service_charge_rate / sst_rateOptional tier-level overrides on the centre tax stack — usually used to comp service charge for top tiers.
is_defaultMarks the tier auto-applied to a new member when no explicit tier is chosen.
statusactive / inactive — retiring a tier never deletes existing members on it; they grandfather until renewal.

Discounts are configured on a separate per-tier table (the membership-discount module): a tier can carry a list of discount rules — by table type, by F&B category, by day-band — that apply automatically when the member is identified at session start or invoice creation.

The Member QR & RFID Card

Every member has a unique QR code in the portal and (optionally) a physical RFID card linked to the same account. Scanning either at the kiosk or on the operator app:

QR survives migrations Member QR tokens are derived in a way that keeps them valid even if the venue is migrated between domains. A printed card from years ago will still scan.

Face Recognition (optional check-in)

Where the venue has the appropriate consent and hardware, members can be identified at the door by face. The recognition pipeline is browser-side via WebRTC: a video element + canvas overlay, three sequential gates — detect (a face is present and large enough), liveness (anti-spoof signal: blink / micro-movement), and match (cosine similarity against the centre's enrolled face embeddings). Voice prompts are localised (English / 中文 / Bahasa Malaysia); on a confirmed match the operator station auto-fills the member into the next-table flow.

Sensitivity is tunable per centre on the Face Settings panel: face_match_threshold (0.05–0.75), face_duplicate_threshold, face_detection_confidence, face_min_face_size_pct, face_liveness_check, face_antispoof_check, and face_scan_timeout_sec. Embeddings live in the member_faces table and are scoped per organization. Recognition is opt-in and fully disable-able — flip face_mode to off and the door modal disappears entirely.

Privacy Face vectors are biometric data. Capture explicit consent at enrolment, delete on member withdrawal, and never share embeddings outside the platform. The Members module will refuse to issue an embedding for a profile that has not consented.
18
Chapter IXThe Member Portal
Chapter IX  ·  In Your Pocket

The Member Portal


The Member Portal is a full mobile-first experience. It is the surface most customers touch most often, and it is engineered for one-handed, mid-frame use.

The Nine Surfaces

The portal is intentionally swipe-driven. Across the bottom navigation, modal sheets, and inner pages, members reach nine main surfaces:

Home / Me
Avatar, tier, wallet balances, recent visits, leaderboard ribbon, quick links to QR card.
Nearby Centres
Geo-aware list of centres in the same organization, with Become-Member CTA.
Centre Detail
Photos, hours, prices, real-time table availability, Book Table, Host Game, F&B preview.
Bookings
Reserve a table for a date and time; deposit captured natively if required.
Games
Social games — open invites for casual play with friends or open challenges.
Battles & Tournaments
Register for events, watch live brackets, see your Glicko-2 rating evolve.
Marketplace
Browse the F&B menu of the centre you are in; order to your table.
Stamp Card
Loyalty stamps and points balance; redeem in F&B or at checkout.
Social
Friends, chat, photo posts, recognitions for milestones (showcards).
19
Chapter IX — The Member PortalSnooker King · User Guide

Becoming a Member

A guest is elevated to a free member in three taps. The flow is intentionally idempotent — running it twice is safe.

1
Open the portal, tap Become Member on the centre detail page.
2
Confirm phone via OTP. Profile is created and linked to the centre's organization.
3
QR card is generated and added to the in-app wallet immediately.
Across centres A free membership at one centre is portable across the same organization. Paid tiers are organization-wide unless explicitly scoped to a single centre.

Wallet, Top-Ups & Stored Credit

The wallet is the spine of the loyalty programme. Balances tracked on every account include:

Showcards & Recognition

Showcards are short animated full-screen recognitions — a member's first century break, a tier upgrade, a tournament win. They appear on the portal and on the Live TV Monitor for everyone in the room to see. Operators can trigger them manually from the member's profile.

Sound & Haptics

The portal has a sound system that plays subtle confirmation, success, and error tones, plus open/close cues for full-screen sheets. Members can mute the entire sound bus from settings.

Privacy Members can hide their profile from the leaderboard with one tap. Operators cannot read private chats; logs only record metadata (who chatted with whom, when), never message bodies.
20
Chapter XBattles & Tournaments
Chapter X  ·  Competition

Battles & Tournaments


A battle is a managed match between two members on a real table — best-of-frames, automatic scoring assist, and a rating that follows the player across centres. Tournaments are scheduled multi-battle ladders that the platform runs end-to-end.

Game Format Families

Snooker King's battle engine ships with a broad catalogue of cue-sport rule files, grouped into seven format families. Each family carries its own scoring rules and frame structure; many include short-form variants. The full per-format catalogue lives in Appendix B.

Anatomy of a Battle

Every battle moves through one of six recorded states on the battles.status column:

  1. pending_accept — the host has issued an invite (to a specific member or as an open challenge); waiting on the opponent to accept. Format and best-of frames are committed here.
  2. pending_confirm — opponent has accepted; the system is waiting on the host to confirm and the table to be allocated.
  3. in_progress — frames are live; the operator (or member, in self-score mode) enters frame results as they finish.
  4. completed — final frame entered or auto-finalised by the time-out cron. The system stamps the winner, posts to the leaderboard, and updates Glicko-2 ratings.
  5. cancelled — abandoned before a winner was declared. The pending invitee row is also marked cancelled so it doesn't linger in someone's invites list.
  6. disputed — either party has raised an integrity dispute mid- or post-match. The match is frozen until a manager resolves it from the operator console.
Time-zone safety Battle duration is computed at the database with TIMESTAMPDIFF on UTC timestamps to avoid PHP/MySQL TZ skew. Reports always show the correct elapsed time.
21
Chapter X — Battles & TournamentsSnooker King · User Guide

Glicko-2 Rating

Battles update each player's Glicko-2 rating — a successor to Elo that also tracks rating volatility and uncertainty. New players start with a high uncertainty that narrows as they play more matches; the result is fairer match-making and a more stable leaderboard.

Tournament Lifecycle

Tournaments move through four states:

  1. Draft — being configured, not yet visible to members.
  2. Registration — open for sign-ups; entry fee captured if applicable.
  3. In Progress — bracket is live; matches are released round by round.
  4. Completed / Cancelled — final state with archived results.

Hosting a Tournament

1
Open Battles → Tournaments → New.
2
Choose game format, max participants, entry fee, and prize structure.
3
Set registration window, start date, and table allocation policy.
4
Publish. Members see it in the portal Battles tab; the Monitor shows a countdown.
5
As registrations come in, view seeding live; on event day, click Run Round to release the next batch of matches to operators.

Frame-by-Frame Scoring

Operators record frames using a simple panel: enter break / clearance / fouls per player. The system handles tie-break rules and updates the leaderboard in real time. Frame results stream to any active Cast URL (Chapter VII) instantly.

22
Chapter X — Battles & TournamentsSnooker King · User Guide

Leaderboards

Every centre has a leaderboard panel that filters by game format and by time window. The score blends Glicko-2 rating with frames won and opponent strength.

Coaching & Notes

Each leaderboard row exposes a Coach Notes field, visible only to the member and their authorised coach. Use it to track drills, weakness areas, and plan for the next tournament.

Stakes & Compliance

Where house rules permit, battles can carry a stake. The organization-level setting controls whether stakes are off, credit-only, or cash. In jurisdictions where wagering is restricted, leave it on off or credit-only; the system will refuse cash stakes and show a notice.

Battle Layouts on the Big Screen

When the operator pushes a battle to the public Cast URL or to the Live TV Monitor, the same three layouts apply (Chapter VII). Choose Crucible Classic for finals, Premier League Theatre for sponsor-heavy events, and Pressroom Minimal for embedded streams or coaching review.

From spectator to player Members watching a Cast match can tap the centre badge in the overlay to jump to that centre's profile in the portal — a one-tap path from "I want to play this" to "I am here next Saturday".
23
Chapter XIBookings & Reservations
Chapter XI  ·  Forward Planning

Bookings & Reservations


Reservations live alongside the live grid. Customers book through the member portal or by calling staff who use the Bookings panel in the operations console.

Booking Flow

  1. Select date, start time, and duration; pick a specific table from the available list.
  2. Capture customer name, mobile, and any notes; confirmation lands in the operations grid as a future card on that table.
  3. The booking is written with status='confirmed'. The platform does not currently capture a monetary deposit at booking time — front-desk staff handle deposits as cash receipts against the member wallet if required.
  4. When the party arrives, the operator opens the booking and taps Check In; the booking moves to checked_in and is linked to the live game session.
  5. When the table closes, the booking is automatically marked completed by the same handler that closes the table.

No-Shows & Cancellations

A booking can be cancelled by the member from the portal or by an operator from the operations grid. Bookings that are still confirmed after their end-time pass are auto-flipped to no_show by a maintenance pass — the platform doesn't wait for someone to remember to do it manually. Cancellation policies — free-cancellation windows, deposit-forfeit rules, repeat-no-show consequences — are venue policy decisions today; enforce them as house rules at the front desk and capture the reason in the booking note. The platform tallies a member's lifetime no-show count from the booking history, which managers use to gate large-party reservations from chronic no-shows.

Walk-In vs Held Tables

When a table is booked but the booked party is late, the operator decides whether to hold the table or assign it to a walk-in. The platform's job is to record the decision and the resulting session against the right booking and member, so the audit trail is intact regardless of which way the call went.

Visibility on the Monitor Reserved tables can optionally appear on the Live TV Monitor with a "Reserved at 19:00" badge so walking customers see future availability at a glance.
24
Chapter XIIF&B Menu, Combos & Modifiers
Chapter XII  ·  The Kitchen

F&B Menu, Combos & Modifiers


F&B is often the difference between a profitable centre and a struggling one. Snooker King treats the kitchen as a first-class citizen — orders bind to tables, kitchen tickets print automatically, stock decreases live, and the menu is in your hands at all times.

Building a Menu

1
Create top-level categories (Drinks, Mains, Snacks). Each gets its own colour, icon, and — importantly — its destination printer. Printer routing is decided at category level, not per item, so reclassifying a single item between kitchen and bar is one drag-and-drop, not a per-line edit.
2
Add items: name, description, photo, price. The destination printer is inherited from the category.
3
Add modifiers (options, preferences, add-ons). Modifiers can be priced or free and are stored on each line as structured JSON in selected_options, selected_preferences, and selected_addons so reports stay aggregable.
4
Bundle items into combos with a discount, e.g. burger + drink at a flat saving.
5
Toggle item active / inactive as availability changes through the day.

Modifiers in Detail

Modifiers are stored as structured data on each order line, so the kitchen ticket reads cleanly and reports stay aggregable. Examples:

Combos

A combo is a curated bundle that appears as a single item on the menu but expands into its component lines on the kitchen ticket. The ticket shows the components so the cook line is never guessing; the receipt shows only the bundle line so the customer sees the value.

Multi-centre menu Maintain the menu centre-by-centre today. Take a flagship centre as the master, then duplicate items to sister centres and tweak per-branch overrides as needed. Always verify the proforma on one representative invoice after a price change.
25
Chapter XII — F&B Menu, Combos & ModifiersSnooker King · User Guide

Photos, Descriptions & Up-Sell

Every item carries a photo, short description, and an optional long description. These power the member-portal Marketplace and the operator POS picker. A clean photograph routinely lifts attach-rate by double-digit percentages.

Pricing Strategies

Item Availability

Each menu item carries an active / inactive flag in the menu editor. Toggling an item to inactive removes it from the operator POS and from any customer-facing menu surface (such as the QR-token public order page). When inventory is configured (Chapter XIV), low-stock items are surfaced for review so a manager can deactivate them before the cook line runs out — that step is operator-driven, not automatic.

Multi-Centre Menu Strategy

Two patterns work for most chains:

  1. Single master menu — push from the flagship to all centres; small price overrides per branch.
  2. Tiered menus — group centres by format (lounge, hall, academy) and maintain one menu per group.
Pictures over words Members on the portal pick with their eyes. A two-line description plus a clean photograph performs better than a paragraph and no image.
26
Chapter XIIIF&B POS, KOT & Kitchen Display
Chapter XIII  ·  Order to Plate

F&B POS, KOT & Kitchen Display


When the customer is hungry, every second matters. The POS is built so a moderately busy bar can take, modify, and send an order in well under a minute.

Taking an Order

1
Tap the table the customer is seated at (or scan their QR for take-away).
2
Tap the item; choose modifiers; enter quantity. Repeat.
3
Press Send to kitchen. The order moves from draft to submitted; kitchen items print on the kitchen printer; bar items print at the bar.
4
Order joins the customer's open tab on the table.

KOT — the Kitchen Order Ticket

Every submitted order produces a KOT formatted for thermal printers. Each ticket shows table, member name (if any), items, modifiers, quantity, special notes, and a sequence number. Re-prints are one tap away from the operator station.

Order & Item States

State is split across three rows for clean accounting — the order itself, each line item on the order, and the F&B session that groups orders for one table:

RowColumnValuesMeaning
fnb_ordersstatusdraftOperator is still building; nothing printed.
fnb_ordersstatussubmittedSent to kitchen; KOT printed; utc_submitted_at stamped.
fnb_order_itemspayment_statusunpaidDefault after submission; reduces table grand total.
fnb_order_itemspayment_statuspaidSettled by an invoice; invoice_id stamped.
fnb_order_itemspayment_statuscancelledVoided line; excluded from totals and unpaid counts.
fnb_sessionsstatusactive / completedEnd-of-meal — set when the table is checked out.

There is no platform-wide "completed" state on fnb_orders itself; once submitted, the order is read-only and "delivery" is the cook line's job — the platform does not track plate-on-table state.

27
Chapter XIII — F&B POS, KOT & Kitchen DisplaySnooker King · User Guide

Kitchen Output is Print-First

Snooker King does not run a screen-based KDS where cooks tap "in progress" and "ready". The kitchen workflow is print-first — every submission emits a fresh KOT to the kitchen printer (or bar printer for bar-routed categories) and the cook line works the printed tickets. Re-prints are one tap from the operator station; modifications after submit print a delta KOT so the cook can spot what changed without re-reading the whole ticket.

Voids, Comps & Refunds

Mistakes happen. Snooker King draws a strict distinction between three actions:

ActionUse whenAudit
VoidItem never delivered (cancelled order)Reason required; manager can review
CompItem delivered but given free (service recovery)Reason required; counts as marketing cost
RefundMoney returned to customer post-paymentManager approval required
Reconciliation Voided cash sales are a top forensic flag. Skim the Comp & Void report each morning — operators with abnormal void rates surface there immediately.

Take-Away & Member Pickup

An order without a table binds to a member instead. The KOT prints with the member's name and phone for pick-up; the customer can also track readiness in the portal Marketplace tab.

Payment from POS

The POS can take payment immediately or push the line into the table's running tab. If immediate, the same multi-tender splitter used for table sessions applies (Chapter XV).

28
Chapter XIVInventory & Stock Control
Chapter XIV  ·  Behind the Pass

Inventory & Stock Control


Inventory in Snooker King is deliberately simple — a flat stock-level tracker bolted onto the existing item catalog, not a full recipe-driven cost-of-goods engine. Most centres need a clean low-stock signal, not theoretical-vs-actual variance accounting; the platform delivers the former by default.

What the Module Actually Tracks

Three-Panel Editor

The Inventory tab uses a three-panel layout: Categories on the left, Items in the middle, Movements / Combo Detail on the right. Items can be drag-reordered and grouped by category. The view toggles between list and grid; sort presets include "lowest stock first" so the morning shift can scan the top of the list and place orders.

Daily Workflow

1
When deliveries arrive, open the inventory tab, select the item, and post an increase movement with the supplier note.
2
As items sell through the POS, the platform decrements the stock counter and writes a sale movement against the order.
3
If a physical count uncovers a shrinkage, post an adjustment movement with a reason — the difference is logged, not silently overwritten.
4
Items at or below their minimum-stock alert are surfaced in the operator console for triage; reordering itself stays a manual decision.
What the module does not do There is no recipe / bill-of-materials linking a sold menu item to a basket of underlying ingredients, no theoretical-vs-actual variance report, and no automatic supplier order generation. If your business depends on that level of cost control, treat Snooker King's inventory tab as a low-stock dashboard and keep your COGS analysis in your accounting system.
29
Chapter XVInvoices, Payments & Tenders
Chapter XV  ·  The Money

Invoices, Payments & Tenders


Every economic event in the centre — table time, F&B order, membership upgrade, comp, refund — flows into invoices. The invoice engine is the audit backbone of the platform.

Invoice Lifecycle

An invoice progresses through four payment_status values on its revenues row: Pending (lines can still be added or edited), Outstanding (issued but not fully paid; outstanding_amount > 0; settle only with a monetary tender, Appendix C), Paid (locked from edits without explicit re-open by an authorised employee), and Cancelled / Voided (retired before settlement with a reason in System Logs). The platform does not auto-flag "overdue" — the outstanding state is the only unpaid signal, read live. Historical invoices stay in revenues with their immutable number; nothing is archived elsewhere.

Supported Tenders

Settlement splits into monetary tenders (real money in/out) and internal-ledger tenders (member balances applied at creation). The two pools are kept separate so an outstanding-balance receipt can never be paid down with non-monetary credit:

MethodPoolSettlementNotes
CashMonetaryImmediateCounted in shift close, change calculated
CardMonetaryT+1 to T+3Provider-dependent; reference captured
E-walletMonetaryReal-timeQR or NFC; transaction reference captured
Bank transferMonetaryManual confirmationUTR / statement reference captured
Member wallet (deposit)InternalImmediateApplied at invoice creation; never on outstanding-balance settlement
Member credits / comp creditInternalImmediateApplied at invoice creation only
Loyalty pointsInternalImmediateBurn-rate per centre; creation-time only
Stamps / token redemptionInternalImmediateDiscount line at creation; not a settlement tender

Multi-tender across the four monetary pools is supported on a single invoice (part cash, part card, balance e-wallet, all in one settle). Internal-ledger tenders (wallet, points, stamps) apply while the invoice is still being built. Appendix C lists the formal allowed-tender set for outstanding-balance receipts.

30
Chapter XV — Invoices, Payments & TendersSnooker King · User Guide

Discounts & Promotions

Discounts apply at three levels, in order:

  1. Line-item — manual percentage or amount on a single line.
  2. Invoice-level — applied to the running subtotal (member tier, voucher, campaign).
  3. Promotion engine — rule-based (e.g., "Mondays after 22:00 — 20% off Pool tables").

Reading an Invoice

The printed and PDF invoice is structured for both customers and auditors:

Refunds

Refunds are gated by the operator's role and refund permission flag. The flow:

1
Find the invoice; click Refund; pick the lines and amount.
2
Capture the reason in the refund note. The action is recorded in System Logs against the signed-in user.
3
Refund posted. Cash refunds open the drawer with the right amount; card-tender reversal is initiated where the gateway integration supports it, otherwise the refund is recorded for manual processing on the gateway dashboard.

Idempotency

The payment layer is idempotent: if the network drops mid-payment and the operator retries, the system de-duplicates the second request and never double-charges. The operator can retry safely without calling support.

Pending vs paid A table left in pending_payment blocks the table cell from returning to available. Settling every child invoice in a split-bill is what releases the table — the cell flips automatically once the last child is paid.
31
Chapter XVISplit-Bill Workflow
Chapter XVI  ·  Many Hands

Split-Bill Workflow


Splits are common in social play. Snooker King supports split modes that match how groups actually settle their bills, and keeps the parent invoice and revenue counters perfectly in sync.

Split Modes

How a Split Settles

  1. Operator opens Split bill on the active invoice.
  2. System creates one child invoice per payer, each with its own outstanding balance.
  3. Each child accepts its own multi-tender payment.
  4. When every child is fully paid, the parent invoice flips to paid; outstanding badge clears.
Synchronisation rule The system updates the parent invoice's payment status and the live revenue counter simultaneously when a split is completed. Skipping either side caused a historical bug; the rule is now enforced platform-wide.

Refunds on Split Invoices

A refund applies to a single child invoice. The parent's totals recompute to keep the audit chain coherent.

Splits in the Portal

Member-initiated splits in the portal create QR codes that other members scan to claim their share. The operator station shows progress in real time.

32
Chapter XVIIE-Invoice & LHDN Compliance
Chapter XVII  ·  Tax

E-Invoice & LHDN Compliance


For Malaysian operators, Snooker King produces compliant e-invoices and submits them to LHDN's MyInvois system. For other jurisdictions, the same engine applies a two-stage tax stack — service charge first, then tax — and stamps both rates on every line.

LHDN Lifecycle

  1. Draft — created automatically alongside the sales invoice.
  2. Unvalidated — created locally, not yet submitted. The internal revenues.status column carries this value while the receipt is still editable.
  3. Submitted — sent to MyInvois; document UUID captured. The portal link becomes live the moment LHDN responds with a valid UUID, even before final validation.
  4. Valid — LHDN accepted the document. (MyInvois's literal status string is Valid, not "Validated" — the platform stores it verbatim so a status check against LHDN never drifts from the source of truth.)
  5. Invalid — LHDN rejected the document post-submission. The platform exposes the rejection error so it can be fixed and resubmitted.
  6. Cancelled — revoked by the issuer within the LHDN-permitted 72-hour cancellation window, with reason captured.

The check-status handler treats ['Valid', 'Invalid', 'Cancelled'] as terminal — once LHDN reports one of those, the platform stops polling MyInvois for that document.

What Is Captured & the Operator Workflow

Each submission persists the document UUID, submission timestamp, original MyInvois status string, item codes/quantities/unit prices/taxes per line, buyer details (name, NRIC validated to 12 continuous digits, address) where required, and any error messages from LHDN's response. For most operators e-invoicing is invisible — submission runs in the background and only two screens matter: the compliance dashboard (daily count of submitted, valid, failed) and the failed queue (Invalid invoices with the underlying error and a one-tap resubmit).

Tax stacking The Snooker King tax engine applies a two-stage stack per line: service charge first (computed on subtotal), then tax (computed on subtotal + service charge). Both rates are configurable per centre. There is no third layered tax in the current implementation; jurisdictions that need additional excise / sin-tax logic must apply it as a separate line item.
33
Chapter XVIIIDeposits & Member Credit
Chapter XVIII  ·  The Wallet

Deposits & Member Credit


Deposits and member credit are the platform's prepay layer. Members fund their wallet ahead of time and spend it across tables, F&B, and tournament entries.

How Deposits Work

  1. Member tops up their wallet via the portal or at the cashier (cash, card, e-wallet).
  2. The deposit posts to the member-credit ledger as a positive entry.
  3. Each spend posts a negative entry; the running balance is always exact.
  4. Refunds reverse a specific deposit row, never delete it — the audit chain is preserved.

The Member Wallet Fields

Each member's wallet, scoped per-organization on the member_organization_accounts row, holds four numbers:

Refund & Cash-Out

Base credit is refundable at any time, subject to the centre's policy and the operator's refund permission. Bonus credit is non-refundable by default. Every cash-out creates a permanent ledger entry; the original deposit row is preserved so the audit chain stays intact.

Wallet first When a member with sufficient wallet balance settles a bill, the wallet is offered as the default tender. The customer just taps confirm — no card, no QR, no friction.
34
Chapter XIXStamp Card & Loyalty
Chapter XIX  ·  Earn & Burn

Stamp Card & Loyalty


The stamp card is a dual-currency loyalty system: stamps for visits and milestones, points for spend. Members earn passively as they play; redemption is a single tap.

Stamps & Points

Stamps are a per-centre digital loyalty currency written to a single ledger (stamp_card_transactions); each row is auditable with source plus originating revenue_id / session_id / table_id / invoice_id. They are awarded when a qualifying event fires (session close, invoice settled, manual add). A per-period cap (centre columns stamp_period_mode, stamp_max_per_period, stamp_period_hours) limits earn within a rolling window — mode is day (centre TZ), hours (rolling N), or unset. Spend is on any catalog item with items.stamps_cost set; points work identically via items.points_cost. Practical difference: stamps are small integers (one per visit), points scale to spend amount so they fit higher-value redemptions; reports show stamp-cost and point-cost separately.

Redemption Flow

Redemption is staff-driven and identity-bound — there is no portal-generated redemption code that an operator types in:

1
Member presents their QR or RFID card; staff calls stamp_resolve_member_card to bind the order to that member.
2
Staff lists redeemable items (stamp_list_redeemable_items) filtered by mode = stamps / points / all.
3
The chosen item posts a redemption row through the standard order pipeline; the matching ledger entry decrements the stamp / point balance and stamps revenues.stamp_redemption_count / points_redemption_count on the receipt.
4
CSRF is enforced on every stamp_* mutating action, and the API short-circuits with a 403 if the redeeming member is not in scope of the operator's centre.
What stamps don't do The platform does not impose minimum-spend or minimum-duration thresholds on stamp earn — the caller (session-close hook, F&B settlement, manual add) decides whether the event qualifies. The centre-level per-period cap is the abuse control, not a transactional threshold.
35
Chapter XXCampaigns & Promotions
Chapter XX  ·  Demand Generation

Campaigns & Promotions


Campaigns are the lever a manager pulls when a Tuesday afternoon needs a lift. A campaign is a discount rule with a window, a scope, and a redemption record — and that is the unit of work the platform manages.

The Campaign Shape

Every campaign is a discount applied to qualifying invoices. The shape is consistent regardless of how the customer encounters it:

Common patterns built from this shape: a publishable coupon code (one or many uses), an automatic time-banded discount (no code needed), a member-tier discount, a single-use voucher issued by management to a specific member or list.

Stacking

Two campaigns plus a member-tier discount can compound in unintended ways. Always walk the resulting price through the proforma screen on a sample bill before publishing — every step of the pricing pipeline (Appendix D) is visible there, so the diverging point is obvious if the final number isn't what you expect.

36
Chapter XXIRental, Ticketing & Countdown
Chapter XXI  ·  Adjacencies

Rental, Ticketing & Countdown


Three smaller modules round out a typical centre's revenue streams: rental of equipment, ticketing for events, and countdown packages that bundle time into flat-fee promotions.

Equipment Rental

Cues, gloves, chalks, and accessories can be rented per session or per visit. The Rental module is built around four handler families:

Every rental_* POST is CSRF-validated and session-write-closed before processing, so rapid-fire scans at a busy counter never fight for the session lock.

Ticketing Mode (Rapid Table Activation)

"Ticketing" in this platform is not event ticketing — it's a centre-level toggle (centers.ticketing_mode) that switches the operator station into a kiosk flow optimised for fast table starts. With ticketing mode on, a member scans their QR or RFID card, the system resolves the card via resolve_table_by_qr, and a table is activated for them in one tap — bypassing the full operations grid for venues whose front-of-house works more like a turnstile than a host stand.

Countdown Packages

A countdown package is a flat fee for a fixed block of time. Each package row in countdown_packages carries name, duration_hours + duration_minutes, price, its own sst_rate and service_charge_rate, a status, and a table_selection_mode that decides whether the package is restricted to specific tables or available across the centre. When the package is sold and started, a session-level ledger row in countdown_session_packages tracks the remaining time and links to the parent game_sessions.id; once the time runs out the operator is prompted to sell another package, never auto-charged.

Cross-sell Many venues quietly bundle a soft-drink combo into a 60-minute package. The receipt shows great value to the customer; the kitchen sees the F&B line as a normal order; the centre sees a single line on the price sheet.
37
Chapter XXIIRFID Card Scan Mode
Chapter XXII  ·  One Tap

RFID Card Scan Mode


QR codes are universal but a physical card is faster. RFID Card Scan Mode lets a member tap a card on a reader at the door or counter and be identified instantly.

What It Does

Setting Up a Reader

1
Plug the reader into the operator station; the device is recognised in Centre → Devices.
2
Assign a friendly name (e.g. "Front desk reader") and a default action (assign to next active session, or open member profile).
3
Test by tapping a known member's card; the profile should pop up immediately.

Issuing Cards

Cards are linked to members from the member profile screen. A single member can carry multiple cards (e.g. a primary and a backup). Cards can be deactivated instantly if lost.

Card or QR — both work A member is never forced to choose. The QR in the portal and the physical RFID card resolve to the same account; pick whichever is faster at the moment.
38
Chapter XXIIIReports & Analytics
Chapter XXIII  ·  Insight

Reports & Analytics


Reports are not a byproduct of a Snooker King install — they are one of the reasons to install it. Three families of reports cover almost every question a manager will ask.

Financial Reports

ReportQuestion it answers
Daily Sales SummaryWhat did we sell today, by category and tender?
Shift Reconciliation (80mm)Did the cash drawer match the system at end of shift?
Tax ReportHow much SST/VAT do I owe, and which invoices contributed?
Comp & Void ReportWho is comping/voiding, how often, and why?
Refund RegisterAll refunds in a window, with reason and approver.
Outstanding BalancesOpen invoices, by age and centre.

Operations Reports

The platform does not currently ship a built-in occupancy heat-map, a maintenance-hours roll-up, or a recipe-driven stock-variance report. If those numbers matter to your business, derive them from the underlying data via export.

Member & Loyalty Reports

Acquisition-funnel and retention-cohort dashboards (e.g. "% of new members still active at 30 / 60 / 90 days") are a frequent ask but are not built into the platform today. The data needed to compute them is present in members and revenues — it just hasn't been packaged as a one-click report.

39
Chapter XXIII — Reports & AnalyticsSnooker King · User Guide

Thermal Shift Reports

The Revenue Report module produces a compact 80mm thermal-printer summary perfect for the safe envelope at end of shift: tender breakdown, voids, comps, refunds, and the cash variance against the float. Reprints are one tap.

Export

Reports can be exported as CSV directly from the operator console, or printed as 80 mm thermal slips through the Revenue Report module. Excel and PDF export, and recurring scheduled-email reports, are not currently part of the platform — pipe the CSV exports into your accounting system or BI tool when those formats are required.

Spotting Outliers

The platform's reports are designed to be read every day, not subscribed to passively. The most useful rituals:

Discipline beats dashboards A five-minute daily skim of the Revenues page outperforms most automated alert systems. The reports are designed for that habit.
40
Chapter XXIVSystem Logs & Audit Trail
Chapter XXIV  ·  Provenance

System Logs & Audit Trail


If reports tell you what happened, system logs tell you who, when, from where, and why. The audit trail is the platform's memory, designed for forensic clarity rather than developer convenience.

What Is Logged

Every consequential action — and many merely interesting ones — produces a log row. The viewer is role-scoped, so each user sees only what they are entitled to see.

The log_type column uses an open vocabulary, so new event categories can be added without schema migration. Common values seen in the running system today:

CategoryExamples (real log_type values)
Authenticationlogin_success, login_failure, logout
Sessionsheartbeat_session (operator session-presence ping)
Paymentspayment_success, payment_failure
Invoicesinvoice_deleted, transaction_slip_deleted
Deviceslight_control_failure (MQTT command timeout / failure)
System / DomainCustom strings emitted by individual modules — schema migrations, settings changes, F&B voids, member-tier transitions all add their own log_type as needed.

Anatomy of a Log Row

41
Chapter XXIV — System LogsSnooker King · User Guide

Searching the Log

The Log Viewer supports filters on every column. Common starting points:

Sensitive Key Stripping

Before any payload is persisted, the writer strips a deny-list of sensitive keys (passwords, card numbers, certain identifiers). This means you can log freely in development and the production audit will never leak credentials.

Forensic Investigations

When something looks wrong (missing cash, complaint, unauthorised refund), the standard playbook is:

1
Open System Logs, filter by the date and centre.
2
Narrow to actor and event type. Expand each row to see the JSON details.
3
Cross-reference with sessions and invoices to confirm the chain.
4
Export the result as a sealed PDF for HR or legal handoff.
Append-only Logs are append-only. Even system administrators cannot edit a log row. Any attempt at deletion is itself logged.
42
Chapter XXVBug Reports & Support
Chapter XXV  ·  Feedback Loop

Bug Reports & Support


Real software lives or dies by how quickly its operators can flag problems and how transparently those problems are resolved. The Bug Reports module is built around that loop.

Filing a Report

1
Click the bug icon in the header from any console screen.
2
Title the issue in one short sentence (e.g. "Void button greyed out on Table 5").
3
Describe what happened, what you expected, and the steps to reproduce.
4
Attach screenshots if possible. URL, browser, and recent console events are captured automatically.
5
Submit. The system administrator receives an email immediately; the reporter does not get a confirmation mail at submission — they receive one when the bug moves to Resolved.

Lifecycle of a Report

The status ENUM has exactly four values:

StatusMeaning
NewAwaiting triage; default filter for the support team. Filing a report immediately emails the admin.
In ProgressEngineer is actively investigating or fixing. (Renamed from the historical Fixing in 2026.)
Pending Human DecisionCannot be auto-resolved; needs a person (auth call, taste call, vague repro). Triggers an admin notification.
ResolvedFix deployed and verified; closed. Triggers a dual notification — admin and reporter, deduped if the reporter is the admin.

There is no "Won't Fix" status in the platform — out-of-scope tickets are kept on Pending Human Decision with the rationale in a thread comment, so the audit trail and the reasoning live together.

Comment thread Every report has a thread. Engineers post their audit, proposed fix, and verification. You can attach more screenshots and reply at any time. Comments can be edited or collapsed; status-change rows are immutable.
43
Chapter XXVIDevices & Hardware
Chapter XXVI  ·  Iron in the Walls

Devices & Hardware


A snooker centre is also a small fleet of devices — printers, displays, RFID readers, and lighting relays. Snooker King treats each as a first-class entity with a friendly name, a centre binding, and an explicit health story so problems are noticed in minutes rather than at end-of-shift.

Printers

Printers are configured per centre with two technical types: escpos (thermal, 58 / 80 mm, USB / Bluetooth / network) and windows (A4 driver-printer for invoices). Each carries a friendly name, a connectivity mode, an optional centre-default flag, and a status (active / inactive). Routing to specific printers is decided by menu category (Chapter XII), not by individual item.

The Print Queue Lifecycle

Every job — a kitchen ticket, a thermal receipt, a cash-up slip — passes through a self-healing per-centre queue rather than printing inline. A small browser-side poller running on each operator station fetches pending jobs scoped to its centre, marks them printing while the driver is engaged, and writes back printed or failed with the timestamp. Jobs hold their full payload (HTML for ESC/POS rendering, raw bytes for Windows drivers) so a stuck printer can be requeued from another station without losing the original document.

queued ──poller picks it up──▶ printing
printing ──driver returns OK──▶ printed
printing ──driver fails / times out──▶ failed
failed ──operator requeues──▶ queued (new attempt row)

Failed jobs are not auto-retried; an operator must resubmit from the print queue panel. This is a deliberate guard against double-printing. The queue stores its rows in the print_queue table; the table is auto-created by the API on first use, so a fresh deployment never blocks on a missing schema.

Live Monitors

Wall displays open the public Monitor URL with a centre-specific token; the URL itself is the credential, so revoke and reissue if a screen leaves the venue. The Monitor refreshes its data on a polling interval rather than a push channel, which keeps it dependable on hotel-style Wi-Fi.

RFID Readers

Most RFID readers behave as USB keyboard wedges — they "type" the scanned card number into a focused input field. The platform binds a quick-scan input on the operator console; whatever the reader emits gets resolved through stamp_resolve_member_card against the member_cards table (Chapter XXII).

Lighting Relays

Lighting relays drive the table lamps via Vyrox's MQTT gateway (Chapter V). The platform issues turn on / turn off commands on session start and end, and queries channel state on demand for the operator's relay badge — there is no relay-side heartbeat. Command failures (timeout, unreachable gateway) raise a light_control_failure log row with the table and channel for after-shift triage; a test-mode toggle lets a manager pulse a relay during commissioning without disturbing live tables.

Single source of truth Always configure devices through the console — never on the device firmware alone. Health signals are only meaningful when the platform owns the device's identity and tokens.
44
Chapter XXVIITheming & Branding
Chapter XXVII  ·  House Style

Theming & Branding


Theming is a deeper feature than most platforms expose. Snooker King ships with multiple curated themes for the operations console and the Live TV Monitor; each can be tuned to match a venue's house style.

Console Themes

The console ships with a family of themes inspired by cue-sport rooms. Examples:

Additional presets ship from time to time. Each user picks their own; managers can also pin a per-shift theme to shared terminals.

Live Monitor Themes

The Live TV Monitor has its own theme family separate from the console: Broadcast Pro, Apex Lounge, Glass Modern, and Departure Board (Chapter VI). They are intentionally bolder and louder than console themes, because they read across a room.

Branding

Branding is configured at the organization level and pushed down to centres:

45
Chapter XXVIIICentre Chat & Announcements
Chapter XXVIII  ·  Voice in the Room

Centre Chat & Announcements


Two lightweight communication tools sit alongside the operations console: a centre chat for in-venue conversations, and an announcements board for broadcasts.

Centre Chat

Centre chat is a real-time channel scoped to a single centre. Use it to coordinate operators, confirm a kitchen call, or pass a member request to a manager without leaving the console. Messages are stored in the platform database and are subject to the same role-based visibility as everything else.

Announcements

Announcements are broadcast messages — created at organization or client level — that appear in the operator console and (where configured) on the member portal Home tab. Use them for shift handover notes, scheduled maintenance, or campaign launches.

Member Social

The member-side equivalent is the Social tab in the portal. Members chat with friends inside social_chat_rooms (rooms can be 1:1, group, or attached to a social game), post photos, react to showcards, and see localised leaderboards. Operator-role accounts do not have read access to those threads — the message bodies are stored to power the conversation but the access-control layer keeps them out of staff dashboards. Honour that boundary in your house policy too: chat content belongs to the members, not to the venue.

One channel per purpose Keep operator chat for operations, announcements for organization-wide notices, and member social for customer culture. Mixing them blurs roles and clutters everyone.
46
Chapter XXIXMobile App & Mobile API
Chapter XXIX  ·  Pocket Console

Mobile App & Mobile API


The mobile app is the member portal hardened with native capabilities. It is the surface most customers touch most often, engineered for one-handed, mid-frame use.

Installing

Native Capabilities

CapabilityWhy native
FCM push notificationsReliable booking reminders, battle invites, payment alerts
Local notificationsIn-app reminder rendering when the app is foregrounded
Location & geocodingSuggests the nearest centre; never sent to third parties
Secure storageBearer token kept in the OS keychain
Receipt cachePast invoices remain readable without a connection
WebSocket chatLong-lived connection with auto-restart for member chat

The Mobile API

The native app talks to the platform through a dedicated, versioned mobile API (MOBILE_API_VERSION = "1.0.0"). Authentication is via Bearer token in the Authorization header; tokens are valid for 30 days from issue, after which the app re-authenticates silently. The mobile API endpoint is purpose-built for the Snooker King Flutter app — it is not a general-purpose public partner API today, so third-party integrations should be brokered through the platform team rather than coded against this surface directly. Login attempts are rate-limited and return HTTP 429 once a per-IP cap is hit.

Privacy & Permissions

47
Chapter XXXEmployees, Settings & Permissions
Chapter XXX  ·  Knobs & Dials

Employees, Settings & Permissions


Settings are organised by scope, not by feature. The closer the scope to the user, the more often the setting changes.

Scope Hierarchy

ScopeExamplesEdited by
PlatformSchema, deploy keys, SMTPSystem administrator
ClientLogo, billing, brandingClient owner
OrganizationMember tiers, points ratio, taxOrganization director
CentreTariffs, hours, devices, F&BManager
UserTheme, notificationsEach user

Adding an Employee

1
Open Employees → New.
2
Enter name, email, username, mobile, and initial password (the manager types it directly — there's no invite-and-self-enrol flow; hand credentials out-of-band).
3
Pick a role: manager or operator. Only admin / client / organization accounts may grant manager; employee-managers creating staff are restricted to operator by the platform itself.
4
Bind to a centre via center_id (comma-separated for multi-centre staff).
5
Toggle per-action flags as needed (can_edit_invoice_details, can_edit_invoice_payment_method, can_delete_invoice, can_create_member, can_edit_paid_invoice); revenue_date_limit caps how far back the employee can edit revenue rows.
Principle of least privilege Give operators the operator role, not the manager role "just in case", and leave the per-action flags off until a specific need arises. Voids, comps, paid-invoice edits, and member creation are the actions that most often need real role enforcement.

Backups & Restore

The platform takes nightly database backups, retained for a configurable window. Manual point-in-time restores are available on request from support. Granular restore (e.g. one invoice or one member) is not exposed in the UI, by design — that surface area would be a fraud vector.

48
Chapter XXXITroubleshooting & FAQ
Chapter XXXI  ·  When Things Go Sideways

Troubleshooting & FAQ


Most issues resolve in under five minutes. The decision tree below covers most cases reported by new operators.

First-Aid Checklist

  1. Is the internet up? Open any other website.
  2. Hard-refresh the page: Ctrl+Shift+R (Win) or Cmd+Shift+R (Mac).
  3. Try a different browser tab. If it works there, your tab is stale.
  4. Check the notification bell — most "the system is broken" reports turn out to be an unread alert.
  5. Sign out and sign back in. Half of remaining issues clear here.

Common Issues & Fixes

"My screen is frozen on the operations grid."

Real-time updates are pushed live. If the connection drops, the grid stops updating. Hard-refresh restores it; if it recurs, your network may be unstable.

"I clicked Settle but nothing happened."

Settle is disabled if the table has open kitchen tickets. Look for the small bell or chip on the cell — it indicates pending kitchen items. Mark those completed first.

"Discounts are not applying."

Check, in order: was the member scanned? Is their tier active? Is the discount in the active time band? Is there an organization-level override that excludes that item?

"The Live TV Monitor went blank."

The monitor browser sometimes loses focus during OS updates. Press F5 on the wall keyboard, or use Devices → Monitors → Refresh from the console to push a remote refresh. If the issue recurs, disable display sleep on the monitor PC.

"The light didn't turn on when I started a session."

Check the relay heartbeat in Devices → Lighting. A device showing error is offline; the table can still be played with a manual lamp switch while the relay is investigated.

49
Chapter XXXI — Troubleshooting & FAQSnooker King · User Guide

Frequently Asked Questions

Q. Can I run Snooker King without internet?

The platform is cloud-native. Short outages are tolerated by the operator app (orders queue locally), but settle and payment require connectivity. We recommend a backup mobile router for centres in unstable-internet areas.

Q. How many tables can one centre handle?

The Live TV Monitor renders cleanly up to about 60 tables on a 1080p display. The console grid scrolls indefinitely; some customers run well over a hundred tables on one centre.

Q. Can I migrate from another POS?

Yes. The platform accepts CSV imports for members, F&B menus, and historical sales. Custom migrations from common POS products are available via the support team.

Q. Is my data encrypted?

Yes — TLS in transit, AES-256 at rest. Sensitive identifiers (member phone, email) are encrypted at the column level with path-derived keys; QR cards remain valid across migrations between domains.

Q. Can I export everything?

Yes — CSV, Excel, JSON, or PDF. Full database exports are available on request. We believe in your right to leave with your data.

Q. What about offline kitchen printing?

Kitchen printers connect over the local network. If the cloud is down but the LAN is up, kitchen tickets continue to print using a local relay so the cooks are never stranded.

Where to Get Help

Help us help you A great bug report contains: exact URL, exact time, exact steps, screenshot, and the member/table/invoice number involved. With those five pieces, most issues are diagnosed in under ten minutes.
50
Chapter XXXIIAuthentication & Security
Chapter XXXII  ·  Locks & Keys

Authentication & Security


Snooker King's authentication layer is engineered for shared terminals, busy shifts, and the inevitable bad actor.

Five Distinct Login Surfaces

Each role logs in through its own form, and the system tracks user type in the session for the visit's lifetime: Admin login (platform administrators), Client login (tenant owners), Organization login (regional directors), Employee login (managers and operators), and Member login (customers, web portal).

Brute-Force Defences

The platform enforces rate limits on two independent axes — by source IP and by the targeted email — so neither a single noisy IP nor a botnet rotating IPs against one account can grind through:

ActionPer IPPer email / account
Sign-in attempt5 per 5 minPer-account lockout counter (auto-extends lockout window)
OTP request5 per 5 min3 per 10 min
OTP verification10 per 5 min5 wrong tries per 10 min — invalidates all outstanding OTPs for that email
Password-reset email3 per 15 min
Member registration3 per 10 min1 per 24 h per email

When a cap is hit the API responds with a wait-minutes message without leaking which axis tripped; successful sign-in resets the IP counter immediately. The form refuses double-clicks while a request is in flight (single-flight submit), every successful sign-in calls session_regenerate_id(true) to discard any planted session ID (session-fixation defence), and when an email exists in a different login surface the response steers the user to the right page without confirming the password (helpful but not leaky).

CSRF & Stale-Snapshot Recovery

Every form carries a CSRF token tied to the session. If the page sat open for hours and the token went stale, the platform refetches the login HTML, parses a fresh token from the meta tag, and retries the submission once before surfacing an error. Most operators never notice.

51
Chapter XXXII — Authentication & SecuritySnooker King · User Guide

Password & Reset Flow

  1. User clicks Forgot password on the login page.
  2. A 64-character random token is generated. The platform stores only its SHA-256 hash, never the raw token, so a database read alone can't replay the link.
  3. An email is dispatched containing the raw token in a one-time URL. The token is valid for one hour from issue, measured in UTC.
  4. The link verifies the token by hashing the supplied value and comparing — then accepts a new password, stored with password_hash() using PASSWORD_DEFAULT.
  5. On success the user is auto-signed-in with a fresh session ID; other devices already signed in to the account retain their sessions until natural expiry.

Username & Email Login

Most roles log in by email; employees can additionally log in by username. The lookup is case-insensitive (LOWER(username) = LOWER(?)), the row must be active and not soft-deleted. Choose usernames you would be happy to see on an audit row — they appear unmodified in System Logs against every action.

Multi-Centre Access & Sessions

An employee belongs to a centre via center_id; managers reaching multiple centres carry a separate allowed-centre list checked on each request. Each role keeps its own session variables (no identity bleed across roles). The session is closed and rewritten before rapid sub-calls (consecutive RFID scans) so file-lock contention can't slow operator taps. For shared operator stations, expect sign-out at the end of every shift — treat the operator account like a key, not a public terminal.

What Gets Audited at Login

Every attempt — success or failure — writes to System Logs (Chapter XXIV) with actor, timestamp, IP, user-agent, and outcome. A spike in login_failure entries from one IP is the first signal worth looking at.

Never share credentials Every audited action — voids, comps, refunds, deletions — is attributed to the signed-in account. Borrowing a colleague's login means borrowing their accountability.
52
Chapter XXXIIIThe Public Order Page
Chapter XXXIII  ·  QR-Token Ordering

The Public Order Page


Customers don't need to log in to order. A QR sticker on the table opens a public, token-gated ordering page that runs in any phone's browser.

How It Works

  1. Each table has a printed QR sticker linked to a unique token.
  2. The customer scans; their browser opens the public order page with that token.
  3. The token resolves to a centre and a table on the server side.
  4. The customer browses the F&B menu, builds a cart, and submits the order — no account required.
  5. The order lands in the operator station and the kitchen exactly as if a waiter had typed it.

Built-In Safeguards

The page deliberately does not implement a CSRF token (it has no logged-in session to bind one to) and does not rate-limit image fetches — both safeguards rely on the upstream token check and the no-referrer policy.

Optional Member Linking

Mid-flow, the customer can link the order to a member account by entering their phone number; an OTP is sent and verified, after which any tier discount or wallet credit applies. Linking is optional — a guest can still complete the order without it.

Why this matters Public ordering removes the busiest minute of every shift. A customer at a corner table never has to flag down a waiter, and the kitchen sees the order before the customer would have finished asking for it.
53
Chapter XXXIVThe Marketplace
Chapter XXXIV  ·  Member to Member

The Marketplace


Beyond the centre's own F&B menu, the Member Portal hosts a peer-to-peer marketplace where members buy and sell cue-sport gear directly from each other.

Two Sides, Three Views

Listing States

StateMeaning
ActiveVisible in Browse, accepting enquiries.
SoldMarked sold by the seller; archived but visible in their history.
ExpiredPast its visibility window; the seller can renew.
RemovedTaken down by the seller, or by moderation.

Filters & Search

54
Chapter XXXIV — The MarketplaceSnooker King · User Guide

Listing Detail View

Tapping a listing opens its detail page:

Creating a Listing

1
Tap Create Listing from the Marketplace tab.
2
Pick a category, condition, and price.
3
Upload up to several photos directly from the camera or gallery.
4
Write a title and description; add specifications (cue weight, tip size, etc.).
5
Publish. The listing goes Active immediately and is visible to other members.

Direct Messaging

Buyer-seller conversations live in the same chat infrastructure as the rest of the portal (Chapter XXVIII), so push notifications and unread badges work consistently. Operators do not see the contents of marketplace chats.

Off-platform transactions Settlement happens between members directly — the platform connects them but does not handle the money. Members are responsible for inspecting goods and arranging hand-over.
55
Chapter XXXVThe Setup Wizard
Chapter XXXV  ·  Day One

The Setup Wizard


Every fresh deployment runs through a guided wizard. By the time you exit it, you have a working organization, a centre, and a populated table grid — all without touching a settings page.

Four Steps

The progress strip at the top of the wizard reads Organization → Center → Table → Rate. Each step has its own form and persists its result before advancing.

  1. Organization — legal name, contact email, mobile, and time zone.
  2. Center — name, address, and how many tables to start with.
  3. Table — type (Snooker / Pool / English), zone, and the canonical Live Monitor seed.
  4. Rate — the default hourly rate that becomes the centre's starting tariff. After saving, the wizard finishes and drops you on the Operations page.

Skip Logic

If an existing organization, centre, or table set is detected, the corresponding step is skipped automatically. This means the wizard can re-run without any risk of duplicate data — useful if a setup is interrupted.

Direction & State

Each step records its created entity IDs, allowing forward and backward navigation without losing partial progress. If you exit and return tomorrow, the wizard resumes where you left it.

After the Wizard

You land on the Operations page with an empty grid of correctly-configured tables. From there:

Keep the wizard for new branches For a chain rolling out a second centre, run the wizard again — it will skip "create organization" and just create the new centre and tables. Faster than wiring it up by hand.
56
Chapter XXXVINotifications & Sound
Chapter XXXVI  ·  Signal not Noise

Notifications & Sound


A busy centre is full of audible cues. Snooker King's notification and sound system is opinionated about which alerts demand attention and which fade into the background.

Notification Channels

Per-User Mute

Each operator can independently mute two streams:

Mute state persists in the browser. If an operator working a quiet shift mutes everything, their preferences come back the next day on the same device.

Sound Effects in the Console

Console sounds are synthesised in the browser — no audio file downloads, no licensing complexity:

57
Chapter XXXVI — Notifications & SoundSnooker King · User Guide

The Member Portal Sound Bus

The member portal exposes a global memberSound object whose methods correspond to specific UX moments. Each method emits a synthesised tone matched to the moment's emotional weight:

MethodWhen it plays
memberSound.tabSwitch()Bottom-nav tab change
memberSound.pageOpen()Opening a full-screen sub-page
memberSound.pageClose()Closing or backing out of a full-screen sub-page
memberSound.tap()Generic button / card tap (capture-phase, throttled to 60 ms)
memberSound.success()Generic success — fires automatically via the notification helper
memberSound.error()Generic error — fires automatically via the notification helper
memberSound.qrSuccess()QR code scanned successfully
memberSound.packageSelect()Selecting a package or option from a list
memberSound.paymentSuccess()Payment / purchase completed (full fanfare)
memberSound.gameStarted()Game / session started
memberSound.battlePaired()Battle opponent paired (match-found fanfare)
memberSound.messageSent()Chat message sent
memberSound.messageReceived()Chat message received from another member

Persistent Mute

Members can mute the entire sound bus from their settings drawer. The preference is stored locally so the choice survives reloads.

Battle Audio

Battles run through a dedicated audio system organised around Match Vibe presets. Each preset bundles sound effects, voice (text-to-speech commentary), and visual animation into a named look, so the operator picks one option rather than balancing three sliders. Presets shipped with the platform include broadcast-style, minimal, and silent options.

Quiet rooms first For a launch event, pick a moderate Match Vibe as the default; members can switch up or down per match. The default shapes the room's character more than any signage.
58
Chapter XXXVIIReconciliation Tools
Chapter XXXVII  ·  Books in Order

Reconciliation Tools


Even with rigorous live calculations, rounding and concurrency can produce tiny ledger drifts over thousands of invoices. Snooker King ships four admin-only reconciliation utilities to put the books straight without touching customer-facing data.

The Four Tools

ToolFixesScope
Discount invariantRecomputes the displayed sum of discount lines so it equals discount + coupon − invoice-additional discount.One invoice, display column only.
Revenue items — IDCC scopeOne-shot historical pass that enforces the line-total invariant on a single named scope (the IDCC tenant), used as the proven blueprint before extending to other scopes.Single tenant, historical sweep.
Revenue items — cascadeMulti-row distribution of accumulated rounding deltas, largest-row-first, bounded by a per-row tolerance.One invoice, gap below threshold.
Revenue items — org-wideIdentifies all invoices in the organization with a violation; produces a baseline report before any apply.Whole organization.

Safety Properties

When to Use Each

Run on a quiet hour These tools are safe but heavy. Schedule them during off-peak windows so the apply phase doesn't compete with live shifts.
59
Chapter XXXVIIILegal & Consent
Chapter XXXVIII  ·  The Fine Print

Legal & Consent


Three legal pages ship with the platform — Terms of Service, Privacy Policy, and Cookie Disclaimer. They are versioned, consented to, and easy to amend without a release.

The Three Documents

Versioning & Consent

Every document carries a version. When a new version is published, members and operators are presented with the change on next sign-in and asked to consent. The consent (with timestamp and version) is recorded against the user. Old versions remain readable in the legal archive for as long as any consent of that version exists.

Configuration

Document content lives in configuration files separate from the application code. Updating a clause does not require a code release — only a re-publish of the relevant document with a new version number.

Where Members See It

Best practice Keep changes incremental and reason for the change in a short release note, so users see what actually changed rather than re-reading the whole policy.
60
Chapter XXXIXEncryption, QR Tokens & Privacy
Chapter XXXIX  ·  The Sentinel

Encryption, QR Tokens & Privacy


Behind every member QR card, every public Cast URL, every public order link, and every Live TV Monitor token sits the same small set of cryptographic primitives. They are the difference between a feature and a leak.

What Gets Encrypted

SurfaceWhat is encryptedWhy
Member QR cardMember identifier + organization + tierSurvives migrations between domains; cannot be forged client-side
Live TV Monitor URLCentre identifier + monitor profilePublic link must reveal nothing useful to an attacker copying it
Public Cast URLBattle identifier + valid windowSame — and the URL becomes inert outside the configured window
FNB QR ordering tokenCentre + table + ephemeral secretReused tokens, post-revocation requests, and brute-force token guessing must all fail
Sensitive member fieldsPhone, email (column-level)Encrypted at rest; the database dump alone leaks nothing without the path-derived key

Path-Derived Keys

Encryption keys are derived from a small set of immutable values held server-side, including the deployment path itself. The benefits are practical:

In practice A printed member card from three years ago, a printed live-monitor URL from last season's championship, and an F&B QR sticker on the back of every chair all keep working through deployments. Customers never see the cryptography; that is the entire point.
61
Chapter XXXIX — Encryption, QR Tokens & PrivacySnooker King · User Guide

Token Validation Pipeline

Every encrypted token follows the same five-step validation pipeline on the server:

  1. Decrypt with the path-derived key — malformed payloads fail at this step.
  2. Schema check — required fields, type, length.
  3. Window check — for time-bound tokens (Cast URL, FNB order), reject outside the valid window.
  4. Revocation check — for revocable tokens, reject if the issuing record is marked revoked.
  5. Rate limit — typical cap is 30 failures per minute per source IP, returning HTTP 429 thereafter.

Privacy Posture

Operator Hygiene

Never share secrets in tickets Pasting a QR token, a Cast URL, or a member's QR payload into a support ticket effectively gives the recipient that capability. Use the in-product bug-reporter instead — it omits secrets automatically.
62
Chapter XLCron, Schedules & Background Automation
Chapter XL  ·  Behind the Curtain

Cron, Schedules & Background Automation


Not everything happens because a button was pressed. A small fleet of background tasks keeps the audit trail tidy, releases stuck sessions, expires bookings, and pushes off-peak compliance work to quiet hours.

The Background Workers

The platform's confirmed scheduled task is the battle auto-timeout in debug/cron/. Other background-style behaviours are handled in-request (lazily, on first eligible request after the time window passes) rather than by a separate scheduler.

TaskWhat it doesHow it runs
Battle auto-timeoutCloses a battle whose single confirmation has been waiting in pending_confirm for more than 24 hours.Cron entry on the host (debug/cron/battle-auto-timeout.php)
Abandoned F&B cart cleanupReleases tables stranded on a guest cart that never converted to a session.In-request, via order/php/cleanup-abandoned-fnb.php on relevant routes
Schema migrationIdempotent schema-migrations.php runs on first request after a release.On deploy / first request
Opcache resetBearer-token guarded endpoint flushes opcache + APC after every deploy.Triggered by deploy scripts

Manual / Admin-Only Tasks

Reconciliation tools (Chapter XXXVII) and one-off maintenance scripts are not on a cron — they are invoked by an administrator with a bearer token. They are designed to run on a quiet hour, in dry-run first, and apply only after review.

Designed to be boring A successful background task should leave no trace except a row in System Logs. If you ever notice a cron job running, something has gone wrong; check the failed-queue tile on the dashboard first.
63
Chapter XL — Cron, Schedules & Background AutomationSnooker King · User Guide

Time Zone Discipline

All timestamps used by background workers are UTC. Display layers convert to local time at render. Two practical implications:

Idempotency & Safety

Reading the Cron Trail

Each worker writes a structured row to System Logs (Chapter XXIV) with log_type describing the worker and outcome reflecting the result. Filter the log by worker name to see every run; filter by outcome=failure to see incidents.

Watch for silent skips Background workers prefer to skip rather than fail. If a battle stays open for 36h without auto-closing, the worker may have skipped a malformed row. Check System Logs filtered to the worker's log_type when something looks stuck.
64
Chapter XLIGoing Live: A Launch Checklist
Chapter XLI  ·  D-Day

Going Live: A Launch Checklist


A new centre opens at 18:00 on a Friday. By 22:00 the room is full. The difference between a smooth launch and a stressful one is two days of methodical setup. Use this chapter as a printable run-sheet.

Two Weeks Before

  1. Run the Setup Wizard for the new centre (Chapter XXXV). Confirm organization, currency, time zone, and tax registration.
  2. Decide branding: logo, colours, monitor footer text. Push from the organization to ensure consistency.
  3. Provision physical hardware: kitchen printer, bar printer, RFID readers, lighting relays, monitor PCs, the wall display itself.
  4. Open accounts for staff with the right role; send invites; confirm each can log in and see only what they should.

One Week Before

  1. Build the F&B menu — categories, items with photos, modifiers, combos. Pilot a sample order end-to-end.
  2. Pair the printers; pulse each lighting relay in test mode; tap-test every RFID reader.
  3. Configure tariffs: base rate per table type, peak band, member-tier discounts, grace period.
  4. Stand up the Live TV Monitor on its production hardware and verify the footer brand strip, weather, and rotation panel.
  5. Configure tax: SST/VAT, e-invoice (if Malaysia), service charge, rounding rule.

Three Days Before

  1. Soft launch with friends and family. Run a complete cycle: walk-in → start session → F&B order → split-bill → settle → reprint.
  2. Run a battle with three frames; verify Cast URL, scoring panel, leaderboard update.
  3. Open a booking, check in, complete the session, observe the booking transition to completed.
  4. Sign off staff on Appendix A (keyboard shortcuts) — most useful on day-one.
65
Chapter XLI — Going Live: A Launch ChecklistSnooker King · User Guide

Opening Day

  1. Open shift; record the cash float; verify all printers and relays show green heartbeats.
  2. Bring the Live TV Monitor up; confirm the rotation panel shows opening-day promotions.
  3. Issue physical RFID cards to early members, link to their accounts, and demonstrate the QR card on the portal.
  4. Run the first paid session; pay attention to the proforma vs receipt totals so any tariff misconfiguration is caught immediately.
  5. Watch the Operations grid — colours and badges should match expectations against the documented states.

First Week

Day Thirty

Keep the checklist Stash this run-sheet behind the operator station for the next centre. Most of it will be the same; replacing the address and the table count is genuinely the bulk of a second-centre launch.
66
Chapter XLIIDaily Operations Cheat Sheet
Chapter XLII  ·  The Working Day

Daily Operations Cheat Sheet


A single page you can pin behind the till. Every recurring action a centre takes in a normal day, in the order it usually happens.

Morning Open

  1. Sign in; pick the centre if multi-centre.
  2. Open Operations; verify all tables are available.
  3. Check the header bell — clear yesterday's outstanding alerts.
  4. Open the cash drawer; record the float.
  5. Glance at Devices — every printer, monitor, RFID reader, and lighting relay should be green.

During Shift — Tables

  1. Customer arrives → tap the table → Start. If member, scan QR or RFID.
  2. Pause / resume from the same panel; the meter freezes accordingly.
  3. Stop session; the cell turns pending_payment; the operator panel offers Pay now.
  4. If the customer wants to split, open Split bill; pick mode (even, itemised, custom, hybrid).
  5. Settle the invoice; the cell flips to checkedout briefly, then available.

During Shift — F&B

  1. Tap table → POS → pick items, modifiers, quantities → Send to kitchen.
  2. Kitchen printer fires the KOT immediately; bar items go to the bar printer.
  3. If a customer scans the table QR sticker, their order arrives in the same kitchen queue without operator intervention.
  4. Mark cancelled items void; mark service-recovery items comp; refunds require the operator's refund permission and are logged.
67
Chapter XLII — Daily Operations Cheat SheetSnooker King · User Guide

During Shift — Members

  1. Walk-in member → scan QR or RFID → tier discount applied automatically on the next session.
  2. New customer → Become Member from the portal or the operator panel; OTP verifies; QR card issued instantly.
  3. Top-up at the cashier → cash, card, or e-wallet → wallet credit posts; receipt printed.
  4. Member redeems a stamp-card reward → enter or scan the redemption code at the POS; reward applies as a discount or comp line.

During Shift — Bookings

  1. Booking due → operator gets a soft prompt; tap Check In when the member arrives.
  2. Booking late → walk-in priority kicks in if the centre is configured to release; otherwise hold.
  3. Booking no-show → cron marks expired; deposit handling follows policy.

End of Shift

  1. Walk the floor — every table should be available or maintenance; nothing on pending_payment should be left.
  2. Print the thermal Shift Report; reconcile cash drawer to system.
  3. Hand the report and float into the safe; sign out the till.
  4. Sign out of the console; close the browser.

If Something Goes Wrong

  1. Read the alert — most "broken" reports are an unread alert.
  2. Hard refresh — Ctrl+Shift+R.
  3. Sign out / sign in.
  4. File a bug from the header — context, screenshot, and recent state are captured automatically.
  5. Continue serving customers — kitchen printers and operator POS are designed to keep running through most cloud interruptions.
Pin this page Print pages 67–68 and keep them at the operator station for the first month. After that, muscle memory replaces the printout.
68
Chapter XLIIIMember Portal Deep-Dive
Chapter XLIII  ·  In the Pocket

Member Portal Deep-Dive


Chapter IX introduced the Member Portal at a high level. This chapter goes lower — the surfaces a member actually swipes through, the small UX guarantees that make those surfaces feel like an app rather than a website, and the pieces that matter when something goes wrong.

The Two Generations

The portal runs as a single web surface but is internally two layered generations cooperating. v2 (legacy PWA core) owns bottom navigation, identity, wallet, the classic battle invite flow, sticky CTAs, and push/badge primitives; v3 (modern shell) owns the Me-page swipe state machine, centre-detail full-screen modals, distance/favourites filter chips, debounced search, and the showcard recognition layer. Both share auth, session, and database — users never see the seam, but knowing it exists explains why some screens feel newer.

Bottom Navigation & Tabs

The portal exposes five primary surfaces as a fixed bottom-nav tab bar driven by switchMemberTab(). Tabs are persistent; switching tabs preserves scroll, search, and selected filters per tab. Coupons, tournaments, announcements, and other vertical surfaces are reached through these five — not via additional bottom-nav tabs.

Tab keyLabelWhat lives there
nearbyCentresGeo-aware list of nearby centres; distance chips (sentinels: 0 = All, -1 = Favourites); Become-Member CTA on each card.
appsAppsApp-drawer overlay — coupons, tournaments, announcements, packages, bookings, battle replays, and other deep surfaces.
activitiesActivityRecent activity timeline — visits, payments, joins, redemptions, battles played.
socialSocialFriends, chat (social_chat_rooms), photo posts, recognitions, feed.
meMeAvatar, tier, wallet balances, QR card, achievements; horizontally swipable across stat cards.

The Me-Page Swipe State Machine

The Me page is horizontally swipable across multiple stat cards (visits, points, stamps, achievements). The state machine guarantees three things:

69
Chapter XLIII — Member Portal Deep-DiveSnooker King · User Guide

Centre Detail & Quick Actions

Tapping a centre card opens a full-screen detail page. The page is built around four Quick Action chips just below the photo carousel — each is a one-tap operator-free shortcut:

ChipEffect
PhoneOpens the system dialer pre-loaded with the centre's number.
WhatsAppOpens WhatsApp to the centre's published number with a default greeting.
DirectionHands off to the device's native maps app with the centre's coordinates.
ShareNative share sheet with the centre's portal link.

Below the chips: real-time table availability, today's prices, hours, photos, member-only offers, and any battles currently in progress on the floor.

The Become-Member Flow

A guest can become a member from the Centre Detail page in three taps. The flow is engineered to be idempotent — running it twice produces the same result, never two memberships:

1
Tap Become Member. The CTA appears wherever the member is not yet linked to that centre's organization.
2
If the user is signed in, the link is created instantly via linkMemberToOrganization(). If not signed in, an OTP capture runs first.
3
A v3 event (mpV3CenterDetailLoaded) propagates the new is_member state to v2's sticky CTA, so the join survives a reload.

Modals on Top of Modals

When a full-screen modal (Book Table, Host Game, Become Member) opens on top of the centre detail page, the portal captures the previous header / nav / body-overflow state on open and restores it exactly on close. This is the difference between a clean modal close and the bug where the page underneath leaks visible navigation.

Sounds, Haptics & Showcards

Sounds (Chapter XXXVI) are bound globally with capture-phase tap delegation, throttled to 60 ms. Showcards — celebratory full-screen recognitions for first-century-break, tier upgrade, championship win — render on top of everything, hold for 4 seconds, and broadcast a low-energy event so the Live TV Monitor can mirror them in the venue.

Member-side problem solving A member reporting "the join didn't stick" is almost always the v2/v3 state-propagation event. Reload the page; if the membership now appears, the original join did succeed and only the in-page CTA failed to update.
70
Chapter XLIVMobile App & API Reference
Chapter XLIV  ·  Pocket Console

Mobile App & API Reference


A reference table of the most-used mobile endpoints, the bearer-token model behind them, and the set of native services the Flutter app ships with today — FCM push, location, secure storage, receipt cache, and a WebSocket chat layer.

The Bearer Token

Issued on mobile login as 32-byte random hex stored on members.api_token; lifetime 30 days from issuance, expiry on api_token_expires_at (constant MOBILE_API_TOKEN_EXPIRY_DAYS); sent as Authorization: Bearer <token> on every request; logout sets api_token = NULL; expired tokens are rejected at validation; every login (success/failure) and logout is audited in System Logs.

Endpoint Pattern

The mobile API is a single PHP entry point — /debug/mobile-api/mobile-api.php — that dispatches by an action query parameter. Every call therefore looks like POST /mobile-api.php?action=<name> with the bearer token in the header. The headline actions, grouped by surface:

SurfaceActions
Authlogin, logout
Profileprofile, update_profile, dashboard, social_stats
Centrescenters, centers_nearby, switch_organization
Tablestables
Sessionssession_active, session_history, session_start, session_start_qr, session_end, session_add_player, session_remove_player
Open / social gamesgames_list, game_create, game_join, game_leave, game_cancel, game_history, my_hosted_games
Memberships & couponsmemberships, coupons
Wallet historytransactions
Chatchat_rooms, chat_messages, chat_send, chat_mark_read, chat_unread_count

Additional actions handle bookings, battles, marketplace, and loyalty. The full list lives in the dispatch switch at the top of mobile-api.php and grows release by release.

71
Chapter XLIV — Mobile App &amp; API ReferenceSnooker King · User Guide

Idempotency & Retries

The platform's most important write paths — invoice payment, split-bill checkout, table session start, and the client-portal API router — accept an optional client_request_uuid and deduplicate on it (typically against the row being mutated). When the mobile app drops a connection mid-payment and retries, the server returns the prior response instead of double-writing.

CORS & Origins

The mobile API returns the standard CORS headers (Access-Control-Allow-Origin: *, allowed methods GET, POST, OPTIONS, allowed headers Authorization, Content-Type). The bearer token, not the origin, is the security boundary.

Native Capabilities (Flutter App)

The Flutter mobile app ships with the following capabilities, each backed by a dedicated service in lib/services/:

Rate Limits & Abuse Protection

Auth surface The mobile API is bearer-token only — there is no session cookie. The token is the entire authentication boundary, which is why it lives in the OS keychain rather than in shared storage.
72
Chapter XLVMulti-Centre Operations &amp; Chain Strategy
Chapter XLV  ·  At Scale

Multi-Centre Operations &amp; Chain Strategy


A single centre operates differently from a chain of fifteen. This chapter is the playbook for the chain — what to centralise, what to delegate, and which features only earn their cost above a certain footprint.

Centralise vs Delegate

ConcernWhere it should live
Branding (logo, colours)Organization — push to centres
Membership tiers & perksOrganization
Tax registration & e-invoice profileOrganization
Tariffs (base rates)Organization with per-centre overrides
F&B menuOrganization with per-centre 86 / price overrides
Opening hours, address, phoneCentre
Devices (printers, lighting)Centre
Employees & shiftsCentre
Live Monitor footerOrganization (global brand strip) + centre overlay

Cloning a Centre

For a multi-centre rollout, set up the flagship completely, then use the wizard's clone pattern:

  1. Run the Setup Wizard for the new centre; the Organization step is auto-skipped.
  2. Pick the flagship as the source for tariffs, F&B menu, and Live Monitor config.
  3. Override only the address, table count, and any local quirks.
  4. Invite local staff; they inherit the role-based access defined at the organization level.

Cross-Centre Members

A free-tier membership at one centre is portable across the same organization without re-enrolling. Paid tiers are organization-wide unless explicitly scoped. Wallet balances are per-organization (not per-centre) so the member can spend their credit at any sister centre.

73
Chapter XLV — Multi-Centre Operations &amp; Chain StrategySnooker King · User Guide

Reporting Across Centres

Chain-Wide Campaigns

Campaigns can target an entire organization, a group of centres, or a single centre. The most common patterns:

Operational Roles in a Chain

RoleWhat this role typically does in a chain
Client ownerSets brand strategy, billing, multi-org rules.
Org directorOwns chain P&L; sets tariffs, menus, tiers.
Area manager (manager role across centres)Reviews per-centre KPIs, mentors centre managers, resolves cross-centre member escalations.
Centre managerOwns shift schedules, voids, comps, devices for one centre.
Operator / cashierLives in Operations during a shift; rarely needs anything else.
One-week rollout With a flagship already set up, an additional centre takes a fully-prepared team about a week to commission: hardware unbox & cabling, wizard clone, F&B photo refresh, soft launch, day-zero open. Most of that week is hardware, not software.
74
Chapter XLVIPrivacy, Data Rights &amp; Compliance
Chapter XLVI  ·  The Trust Layer

Privacy, Data Rights &amp; Compliance


Beyond Chapter XXXVIII (Legal & Consent), this chapter covers what members can ask for, what operators must respond with, and how the platform makes both practical.

Member Data Rights

The platform's policy commits to honouring the standard set of data rights. Where the member can self-serve, the path is in the portal; where it requires support involvement, the operator (or system administrator) handles the request and records the action in System Logs.

RightHow it is honoured
AccessThe member sees their profile, visit history, invoices, wallet, and marketplace listings throughout the portal. A consolidated export is fulfilled by support on request.
PortabilityWhere machine-readable export is requested, support produces a structured archive (CSV / JSON for the listed surfaces).
RectificationThe member can edit most profile fields directly; immutable fields (e.g. an issued invoice) are corrected by support with an audit trail.
ErasureA delete request anonymises the member profile, replaces identifiers on retained invoices with a placeholder for tax compliance, and revokes any active mobile tokens.
RestrictionMarketing categories can be muted from the portal notification settings; full processing pauses are handled by support.
ObjectionAuto-generated marketing or loyalty signals can be opted out at the request of the member.

What Operators Cannot See

What the Audit Log Will Show

Every consequential action — a void, a comp, a refund, a tier change, an exported data archive, a data-erasure request — produces a System Logs row (Chapter XXIV) tied to the actor. Members investigating "who edited my profile" get an answer in seconds.

75
Chapter XLVI — Privacy, Data Rights &amp; ComplianceSnooker King · User Guide

Retention Windows

Data classDefault retentionLegal driver
Authentication logs180 daysForensic / abuse
Invoices & tax documents7 yearsTax law
Member profileUntil erasure requestMember control
Marketing analytics2 years rollingReasonable use
Bug-report screenshots1 yearEngineering follow-up

Subprocessors & Where Data Lives

The platform discloses, in a public sub-processor list, every third-party service (email delivery, payment gateway, push notification, mapping). The list is versioned; material additions trigger a notice to clients before activation.

Data Export Patterns

Erasure That Survives Audit

An erasure request anonymises the member's profile but preserves invoice history with the personal name replaced by an "Erased Member" placeholder. Tax law requires the invoice itself; privacy law requires the member's identity to disappear. Both are honoured.

Erasure is one-way A confirmed erasure cannot be reversed. Always confirm with the member, and pause the process for 24 hours so accidental requests can be cancelled.
76
Chapter XLVIIIntegrations &amp; External Systems
Chapter XLVII  ·  Outward Bound

Integrations &amp; External Systems


Snooker King is the heart of a centre, not the entire universe. This chapter inventories the external systems the platform speaks to today — payment, tax, mail, push, chat, and native maps.

Payment & Tax

The settlement engine accepts five tender families on every invoice (Chapter XV): cash, card, e-wallet, bank transfer, and member credit / wallet. Each family is implemented as a routing path inside the payment module rather than a third-party SDK; gateway-specific references (auth code, UTR, e-wallet transaction ID) are captured with the payment row so reconciliation can match them later. For tax, LHDN MyInvois (Malaysia) moves invoices through unvalidated → Submitted → Valid (or Invalid), with terminal set {Valid, Invalid, Cancelled} (Chapter XVII; Appendix C). Other jurisdictions use the two-stage stack (service charge → tax) and periodic export. Multiple unvalidated invoices can be merged as a consolidated e-invoice for month-end runs.

Mail, Push & Chat

Transactional mail — password reset, OTP, booking confirmation, bug-report notifications, status changes — is sent via a server-side helper authenticated against an SMTP relay; the helper is the single funnel, so new features add a caller, never a new sender. Push runs through Firebase Cloud Messaging — the Flutter app registers its FCM token on login and unregisters on logout, with background and foreground handlers wired consistently across iOS and Android. Member chat traffic runs over a long-lived WebSocket connection that the mobile app pairs with an auto-restart service so transient disconnects recover without the user noticing.

Native Maps

From the Centre Detail page, Direction hands off to the device's native maps app (Apple Maps on iOS, Google Maps on Android, or the platform default) using the centre's coordinates. The platform never embeds a third-party map iframe, which keeps location queries off the network from any viewer.

What is not yet here A general-purpose outbound webhook system (publish-on-event to arbitrary URLs) is not part of the platform today. Custom integrations should consume the mobile API on a per-action basis with a dedicated key until a generic webhook surface ships.
77
Chapter XLVIIIPerformance, Scale &amp; Reliability
Chapter XLVIII  ·  Built to Last

Performance, Scale &amp; Reliability


The design choices that let one Snooker King install run a sleepy 8-table hall on a Tuesday afternoon and a packed 60-table championship night on a Saturday — without anyone changing a setting.

Sizing

Hall sizeConcurrent operatorsComfortably handled
Up to 12 tables1–3Single web instance, no special config
12–30 tables3–6Single instance, larger DB plan, dedicated print queue
30–60 tables6–12Higher-tier plan, two Live Monitor instances tiled, dedicated kitchen-print server
Over 60 tables12+Plan with support before launch; multi-monitor and zoned operator stations

Hot Paths & Reliability Patterns

The four hot paths each have their own optimisation: the Operations grid refreshes incrementally with polling so only changed cells re-render; the Live TV Monitor uses an independent polling cadence so it never blocks the console; battle scoring writes are tiny and the Cast URL polls a single condensed JSON; the POS print queue absorbs bursts so a stuck printer never blocks the next order. Reliability is built on five patterns: idempotency keys on every state-changing endpoint (duplicate retries never double-write), single-flight on form submits (no double-posts), exponential backoff on outbound deliveries and e-invoice submissions, append-only audit (investigations always have a record), and graceful degradation (kitchen print, RFID scan, lighting stay local-first so cloud outages don't strand the floor).

When you outgrow a tier Symptoms first appear as cell-refresh lag on a packed Saturday. Tell support at the first sustained week of those symptoms, not after a championship night that goes wrong.
78
Chapter XLIXBackup, Restore &amp; Disaster Recovery
Chapter XLIX  ·  When the Worst Happens

Backup, Restore &amp; Disaster Recovery


Backups should be invisible until they are the only thing that matters. This chapter is what you do before, during, and after a serious incident.

What Is Backed Up

LayerCadenceRetention
DatabaseNightly + intra-day deltas30 days rolling, monthlies kept 12 months
Uploaded media (member photos, F&B)On write + nightly30 days rolling
Config (per-centre, per-org)On changeIndefinite (versioned)
Audit logAppend-only; replicatedIndefinite

Restore Patterns

Operator Side of DR

Practice once Have support do a non-production restore drill once a year. The single best predictor of a successful restore is a previous successful restore.
79
Chapter LInternationalization, Currency &amp; Localization
Chapter L  ·  Many Tongues

Internationalization, Currency &amp; Localization


Snooker King runs in any country, every centre with its own currency, language, and tax model. Configuration is per-organization for things that follow the legal entity, per-centre for things that follow the venue.

Currency & Rounding

Currency code is set per organization (MYR, SGD, IDR, AUD, USD, etc.); the display symbol, precision, grouping, and decimal mark follow that code. Rounding is per-organization — round-to-nearest 0.05 is the common cash rule, some operators use 0.10 for low-friction change. Internal storage is canonical 2-decimal DECIMAL; per-minute billing uses 4 decimals internally and rounds at display.

Languages & Time Zones

Three languages ship in the portal sound bus and announcement TTS: English, Bahasa Malaysia, Mandarin; UI translation is config-driven, additional languages add without a release. Per-user preference falls back to centre default, then organization default; receipts and emails honour the recipient's language wherever known. Every centre carries its own IANA time zone, all timestamps stored UTC and converted at display. Date format is per-locale (DD/MM/YYYY for most of the world, YYYY-MM-DD where ISO is preferred); first day of the week is per-locale; reports honour the user's setting.

Tax & Compliance Differences

The tax engine applies a two-stage stack per line — service charge first (on subtotal), then tax (on subtotal + service charge). Both rates are per-centre and stamped on every line for audit. Where a single tax label covers the obligation (SST in Malaysia, VAT in the EU, GST in Australia / Singapore), set the tax stage; jurisdictions needing a third layer (US local sales + city tax, excise / sin tax) apply it as an explicit line item rather than expecting a third tier. Real-time submission integrations run where required (Malaysia LHDN); elsewhere periodic export covers the obligation.

Set it once Configure currency, language, time zone, and tax during the wizard. Changing them after months of trading touches every historical record's display layer.
80
Chapter LIReleases, Versioning &amp; Roadmap
Chapter LI  ·  Always Moving

Releases, Versioning &amp; Roadmap


Software that runs a business has to evolve carefully. Snooker King ships small, frequent, transparent changes — and gives operators the tools to know what changed and what to expect next.

Cadence & Reach

Bug fixes deploy continuously as they pass review; feature increments roll out weekly to a staging audience first; operator-visible release notes ship monthly with a summary email to managers; the quarterly roadmap names target windows for the next quarter. A change reaches you in four steps: engineering review & staging tests, soft-launch to a small cohort with telemetry watched, general release with an in-product release-note toast on next sign-in, and a feedback loop where any release-tagged bug short-circuits back to engineering.

Schema & Migration Safety

Schema migrations run on the first request after a release and are idempotent so they never double-apply. Backwards compatibility is default — operator screens never break mid-shift because of a release. Major data migrations go through the reconciliation tools (Chapter XXXVII), in dry-run first.

Reading the Release Notes

Each note is a Headline (one line, plain language), a Why (the operator-visible reason), an Action needed (almost always "none"; when not, listed clearly), and a Where to find more link into the relevant chapter of this guide.

Take the toast seriously The five seconds it takes to read a release-note toast on Monday morning reliably saves the half-hour you would otherwise spend wondering why a button moved on Friday night.
81
Chapter LIIGlossary
Chapter LII  ·  Reference

Glossary


The vocabulary of Snooker King, defined for quick reference.

Battle — managed match between two members, frame by frame, Glicko-2 rated.

Cast URL — token-gated public broadcast page for a battle (Ch VII).

Centre — a single physical venue with tables, employees, menu, prices.

Client — the top-level tenant, usually a brand or franchise owner.

Combo — a bundle of menu items sold as one line.

Comp — an item delivered free; recorded as a marketing cost.

Console — the web app used by employees and management.

Consolidated invoice — multiple invoices merged into one e-invoice submission.

Countdown package — flat-fee fixed-time table package.

Countup session — table session billed by the minute on an open meter.

F&B — food and beverage; kitchen and bar side of the business.

Frame — one game within a battle, ends on concede or all balls potted.

Glicko-2 — the rating system used to score battle players.

Grace period — short window at session start during which time isn't billed.

KOT — Kitchen Order Ticket; printed instruction to the cook line.

LHDN — Malaysia's tax authority; e-invoice compliance target.

Live TV Monitor — wall display showing tables, prices, promotions.

Marketplace — peer-to-peer listings tab in the Member Portal (Ch XXXIV).

Member Portal — the mobile-first customer-facing app.

MyInvois — the LHDN portal that stores validated e-invoices.

NFC card — physical card identifying a member by tap.

Operator — front-of-house employee with shift-level access.

Organization — a group of centres under one client.

Official Receipt (OR) — formally numbered receipt; pattern OR{YY}{org}{seq}.

QR card — the default member identification method.

RFID — radio-frequency card scanned by a reader for instant ID.

Showcard — animated full-screen recognition for member milestones.

Snapshot — frozen HTML of an invoice; prevents retroactive drift on reprint.

Stamp card — the dual-currency loyalty system: stamps and points.

Tariff — price-per-hour rule for a table type and time band.

Tender — method of payment (cash, card, e-wallet, transfer, credits).

Transaction slip — short-duration sale recorded without e-invoice submission.

Vibe preset — bundled sound, voice, and animation choices for battle audio.

Void — cancellation of an item that was never delivered.

82
Appendix AKeyboard Shortcuts
Appendix A  ·  Reference

Keyboard Shortcuts


Every shortcut the operations console responds to. Mastering even five of these will measurably speed up a busy shift.

Operations Page (no modal open)

KeyAction
Move highlight across the table grid
EnterOpen the highlighted table or POS
19Open table by position
EscClear highlight

Inside Modals (universal)

KeyAction
EscBlur focused input → close topmost modal → return to operations
EnterProcess / confirm / open POS (context-aware)
MFocus member search; pressing again removes member
UUndo remove member
Navigate member-search results
AToggle select-all checkboxes (where applicable)

POS & F&B

KeyAction
SFocus search field in POS
09Pick category or item by position
DRemove last cart item
CToggle coupon (apply / remove)
PPrint proforma (or normal blue print)
BPrint thermal (black button)
EEnd game / session
83
Appendix A — Keyboard ShortcutsSnooker King · User Guide

Split-Bill

KeyAction
RAdd a new round
IAdd an item to the active round
NFocus the newest round's note field

Start-New-Table Modal

KeyAction
09Pick countdown package by position
MFocus member search
EnterConfirm and start meter

Document Reader (this guide)

KeyAction
/ KPrevious page
/ JNext page
Home / EndJump to first / last page
TToggle table of contents
PSave as PDF
EscClose TOC
Print this page Many centres tape Appendix A above the operator station for the first month after a rollout. After that, muscle memory takes over.
84
Appendix BGame Format Variants
Appendix B  ·  Reference

Game Format Variants


Snooker King's battle engine supports a deep catalogue of cue-sport formats — each with its own rules, frame mechanics, and scoring panel.

Snooker Family

FormatNotes
Standard SnookerFifteen reds, six colours, full standard rules.
Six-Red SnookerSix reds, faster matches, popular for league play.
Ten-Red SnookerTen reds, intermediate length.
Power SnookerVariant ruleset with reduced reds and bonus mechanics.

Pool Family

FormatNotes
Eight-Ball (English)UK rules; smaller table; "two-shot carry" foul handling.
Eight-Ball (American)Bigger table; BCA-style rules.
Bank Pool (8-ball variant)Banks-only; advanced format.
Chinese Eight-BallChinese ruleset; spotted balls; popular in Asia.
Nine-BallStandard nine-ball; rotation play.
Ten-BallLike nine-ball but with ten balls; called-pocket.
Chinese Nine-BallRegional variant of nine-ball.

Carom & Specialty

FormatNotes
Three-Cushion BilliardsPocketless table; cushion contacts before scoring.
English BilliardsThree balls, points for cannons, hazards, pots.
Russian PyramidHeavy white balls, single red, specific pocket rules.
Straight PoolContinuous play to a target score.

Common Scoring Controls

Across formats the frame screen exposes consistent keyed buttons (data-verb): Foul (reason picker), Safety, Undo, Concede, Settings (Match Vibe). Format-specific actions — pots, cannons, breaks, frame completion — surface inline on the frame screen rather than as universal verbs.

85
Appendix CInvoice & Revenue Status Reference
Appendix C  ·  Reference

Invoice & Revenue Status Reference


A complete reference of every invoice and revenue status, what triggers it, and what is or isn't possible from there.

Status Vocabulary

StatusMeaningEditable?
UnvalidatedCreated locally; not yet submitted to the tax authority.Yes
SubmittedSent to LHDN MyInvois; awaiting acceptance.No
ValidAccepted by MyInvois; portal link is live. (LHDN's literal status string is Valid; the platform stores it verbatim.)Adjusted only
InvalidRejected by MyInvois post-submission for a fixable reason.Yes (resubmit after fix)
CancelledUser-revoked within the cancellation window.No
VoidedReversed for accounting; no refund.No
ReversedReversal entry posted; refund issued via original method.No
ConsolidatedMerged into a single consolidated e-invoice.No
AdjustedPost-validation edit; flagged with a pink marker.Limited
RejectedRejected by the tax authority.No
OutstandingPartial or zero payment; settle with a monetary tender to clear.Pay only
RefundedOne or more refund lines posted against a paid invoice; recorded in System Logs and visible on the invoice detail.No (the refund itself is a new ledger event)
Partial-paid (F&B)An fnb_orders row whose lines are part-paid, part-unpaid; orchestrated through the parent invoice settle flow.Lines only

Two columns hold these values on a revenues row: payment_status tracks whether the customer has paid (pending / outstanding / paid / cancelled), and myinvois_status tracks the LHDN compliance lane (unvalidatedSubmittedValid / Invalid / Cancelled). Reading them in isolation is fine; conflating them is the most common analyst mistake.

Invoice Types

Allowed Tenders for Outstanding Payment

Outstanding-balance settlement accepts only the four monetary tenders: Cash (overpay → change), Card (reference / authorisation code), E-wallet (QR or transaction reference), and Bank transfer (UTR / statement reference). Member credit, points, stamps, and tokens apply at original invoice creation, never on outstanding-balance settlement.

86
Appendix DDiscount, Tax & Pricing Pipeline
Appendix D  ·  Reference

Discount, Tax & Pricing Pipeline


When you change one number, knowing the order of operations protects you from surprises.

The Eight-Step Pipeline

  1. Subtotal — sum of game charges and POS line items.
  2. Manual discount — line-level or invoice-level percentage or amount entered by the operator.
  3. Coupon discount — voucher or promotion code redemption.
  4. Member discount — tier or campaign discount for the identified member.
  5. Service charge — applied to subtotal, before tax (configurable per centre).
  6. Tax (SST / VAT) — applied to subtotal plus service charge; granular per item or global.
  7. Rounding adjustment — to nearest 0.05 or per-organization rounding rule.
  8. Payable amount — what the customer owes after all of the above.

Member Discount Precedence

When a member is identified, the engine resolves which discount rule applies in a strict priority order, lowest-fallback first:

  1. Package-specific — for countdown sessions where a package is explicitly selected, a per-package override (if configured for the member's tier) wins.
  2. Table-specific — otherwise, a per-table override on the member's tier (filtered by category — countup vs countdown) is used.
  3. Common (centre-level) — if neither override applies, the centre-level membership discount on the tier applies.

Overrides are not stacked. A package-level rule fully replaces the table-level one, which fully replaces the centre-level one. Each rule may be percentage or fixed-amount, may carry a min/max-spend gate, and may be restricted to specific weekdays or time bands (overnight ranges supported — the platform handles the wrap-around).

Currency Rounding (per organization)

Rounding is configured at the organization level via rounding_precision (default 0.05 = nearest five cents) and currency_decimals (default 2). The implementation uses PHP's round() with mode half-to-even (banker's rounding) — meaning a midpoint amount snaps to the nearest even increment. For five-cent precision: 1.025 → 1.02, 1.075 → 1.08; for two-decimal cents: 0.125 → 0.12, 0.135 → 0.14. Reward points have their own helper that allows up to three decimals but respects the org's currency_decimals when smaller.

Edge Cases

Why the Order Matters

Putting a member discount before service charge produces a different total than putting it after. Snooker King fixes the order so a manager comparing two centres can rely on the numbers being computed the same way. If your venue's accounting requires a different order, raise it with support; it is a centre-level configuration, not a code change.

Verify with proforma Before publishing a new tariff or campaign, walk through a sample bill on the proforma screen — every step of the pipeline is visible. If the final number isn't what you expect, the proforma will show you exactly where it diverged.
87
Appendix EOperator Recipes
Appendix E  ·  Cookbook

Operator Recipes


Twenty short, named procedures for the situations that actually come up on a busy floor. Each one is a single paragraph; the full path is in the chapters above.

Tables & Sessions

1 · Start a session for a walk-in. Tap the table → Start. No member needed. The cell turns occupied; the lighting relay fires.

2 · Attach a member after the session has started. Open the table panel → Member → scan QR or type the phone number. Tier discount and stamp accrual apply from the next billing tick onward, not retroactively.

3 · Move a session to a different table. Open the source table panel → Transfer → pick the destination → confirm. The meter does not pause; lighting follows the move automatically.

4 · End a session early without billing. Manager-only. Open the table panel → Comp Session → enter reason. The session closes with a comp invoice; nothing is charged but everything is logged.

5 · Take a table out of service mid-shift. Open the table panel → Maintenance → pick reason and ETA. The Live TV Monitor hides its price; bookings to that table are blocked until you mark it available again.

F&B & POS

6 · Add an F&B order to a running table. Tap the table → POS → search items → modifiers → quantity → Send to kitchen. The KOT prints; lines join the table's open tab.

7 · 86 an item for the rest of the shift. Open Menu Editor → tap the item → Mark unavailable. It disappears from operator POS and the public order page simultaneously; reverse the toggle the next day.

8 · Reprint a kitchen ticket. Open the table tab → find the order line → Reprint KOT. The ticket reprints with a "REPRINT" header so the cook line knows it's not new.

9 · Void an order line. Tap the order line → Void → enter reason. The line stays visible (audit), totals recalculate, and the kitchen gets a "VOID" notice if the order was already submitted.

10 · Comp an item for service recovery. Tap the order line → Comp → enter reason. The line stays on the receipt at full price with a comp adjustment line — customer sees the value, books see the marketing cost.

88
Appendix E — Operator RecipesSnooker King · User Guide

Settlement & Money

11 · Pay an invoice with two tenders. Open the invoice → Settle → enter cash amount → tap Add tender → enter card amount. The system tracks each part separately on receipt and audit log.

12 · Split a bill four ways equally. Open the invoice → Split bill → mode Even → set 4 payers. Each child invoice shows its share; settle independently. Parent flips to paid only when all four clear.

13 · Split a bill itemised. Same path; pick Itemised. Hand the station to each member in turn (or open the portal split flow), each ticking the lines they consumed.

14 · Refund a paid invoice. Find the invoice → Refund → pick lines and amount → enter reason → confirm. Recorded in System Logs against your account. Card-tender reversal is initiated where the gateway supports it; cash refunds open the drawer.

15 · Apply a coupon at checkout. Open the invoice or split-bill → Coupon → type the code or scan the QR. Eligibility is verified server-side; if the member or time band doesn't qualify, the dialog explains why.

Members

16 · Issue an RFID card to a member. Open the member profile → Cards → tap a card on the configured reader → save. The card resolves to the same account as the QR; either works at the door.

17 · Top up a member wallet. Open the member profile → Top up → enter amount → pick tender → confirm. The deposit posts to the ledger as a positive entry; spend draws against it automatically.

18 · Issue comp credit (service recovery). Manager-only. Open the member profile → Comp credit → enter amount, expiry, and reason. The reason is recorded; the member sees the credit in their portal wallet immediately.

Bookings, Battles & Cast

19 · Check in a booking. Open Operations → Bookings → find the row → Check In. If the booking carried a countdown package, the session auto-starts on the assigned table.

20 · Push a battle to a Cast URL. Open the battle from the Operations grid → Cast → pick layout. The token-gated URL is generated; share with anyone who should watch. Frame updates flow live without any extra operator action.

Print this Recipes 1–20 fit on two A4 pages. Print Appendix E and tape it to the back of the operator monitor; it is the single most-thumbed page in the guide on a busy night.
89
Appendix FState Machines &amp; Lifecycles
Appendix F  ·  Reference

State Machines &amp; Lifecycles


A flat reference of every state machine the platform exposes, with valid transitions. Use this when you suspect a record has skipped a state.

Table (center_tables.current_status)

Five canonical states are stored; the Operations grid layers extra rendered badges (pending, fnb, rental-active, rental-idle) on top — see Chapter V.

available  ──start session──▶ occupied
occupied   ──session ends──▶  (rendered as pending while invoice unpaid)
*          ──invoice fully paid──▶ checkedout
checkedout ──reset / next assignment──▶ available
available  ──manager marks down──▶ maintenance
available  ──manager hides──▶ inactive
maintenance ──restore──▶ available

Game Session (game_sessions.session_status)

active     ──end button / closeout──▶ checked_out
checked_out ──invoice fully paid──▶ completed
active     ──admin force-end──▶ ended
*          ──manager comp / void──▶ completed (with comp marker)

Game sessions do not carry a paused state — pause semantics live on frame-by-frame turn tracking and on the table's own status, not on the session row. The session row stays active from start to closeout, then transitions through checked_out while waiting for payment, and finally to completed (or ended for force-closes by an administrator).

Invoice (revenues.payment_status)

pending      ──finalise──▶ outstanding
outstanding  ──pay rest──▶ paid
pending      ──pay full at once──▶ paid
*            ──cancel/void with reason──▶ cancelled / voided

There is no "overdue" or "refunded" status on the invoice itself; partial-payment is captured by outstanding_amount while payment_status stays outstanding until fully paid. Refunds are line-level adjustments that reduce outstanding_amount rather than a separate state.

Battle (battles.status)

pending_accept   ──opponent accepts──▶ pending_confirm
pending_confirm  ──host confirms + table allocated──▶ in_progress
in_progress      ──final frame entered──▶ completed
in_progress      ──cron 24h timeout──▶ completed
*                ──party cancels──▶ cancelled
*                ──integrity flag──▶ disputed
90
Appendix F — State Machines &amp; LifecyclesSnooker King · User Guide

Booking (bookings.status)

confirmed   ──party arrives──▶ checked_in
checked_in  ──table closes──▶ completed
confirmed   ──cancel──▶ cancelled
confirmed   ──end-time elapsed without check-in──▶ no_show

Bookings are written directly as confirmed — no "pending confirmation" step. no_show is automatic once utc_end_time passes without check-in.

F&B Order (fnb_orders + items + sessions)

fnb_orders.status:           draft ──Send to kitchen──▶ submitted (KOT printed)
fnb_order_items.payment_st:  unpaid ──invoice settles──▶ paid
                             unpaid ──void w/ reason──▶ cancelled
fnb_sessions.status:         active ──end-of-meal closeout──▶ completed

E-Invoice (revenues.myinvois_status)

unvalidated ──submit to MyInvois──▶ Submitted
Submitted   ──LHDN validates──▶ Valid
Submitted   ──LHDN rejects──▶ Invalid
Valid       ──cancel within 72h window──▶ Cancelled
Submitted   ──submission failure──▶ error

LHDN literal status strings stored verbatim. Terminal set {Valid, Invalid, Cancelled} — platform stops polling on terminal.

Bug Report & Member Tier / Wallet

bug_reports.status: New ──triage──▶ In Progress
                    In Progress ──cannot auto-resolve──▶ Pending Human Decision
                    In Progress ──fix deployed + verified──▶ Resolved
member tier:        upgrade/downgrade ──▶ tier (logged)
member wallet:      top-up ──▶ +ledger entry
                    spend  ──▶ -ledger entry
                    refund of specific deposit ──▶ reverse entry
If a state is missing Almost every "stuck record" report turns out to be a state that didn't transition because of a guard (e.g. unpaid kitchen ticket blocking checkout). Find the record in System Logs (Ch XXIV) — the last successful event tells you which guard fired.
91
Appendix GFeature Reference Index
Appendix G  ·  Reference

Feature Reference Index


Concise references for fifteen features and modules that earn a closer look once the basics are running. The italic note at the end of each entry points to the chapter where the feature is set up.

Compliance & Receipts

Official Receipts (OR). A formally numbered receipt is issued for paid invoices once required by tax law; the numbering pattern is OR{YY}{org}{seq} (year, organization, sequence). ORs reprint from the invoice detail panel; the sequence never changes, so the same OR number always refers to the same invoice. See Ch XV.

QR Validity & Rotation. Centre QR tokens (member cards, table F&B stickers, monitor URLs, cast URLs) carry a centre-level validity policy. Rotating a token invalidates old printed materials immediately; revoke from the device panel when a screen leaves the venue or stickers are reprinted. See Ch XXXIX.

Invoice Snapshots. Every issued invoice freezes its rendered HTML at issue time so a reprint months later still matches the original — discount rules can change without rewriting history. Snapshot bytes live in invoice_snapshots, produced lazily on first reprint where a snapshot is missing. See Ch XV, glossary.

E-Invoice (non-Malaysia). The two-stage tax stack (service charge → tax) and per-line stamping is portable; jurisdictions without a real-time API rely on periodic CSV export rather than the LHDN MyInvois integration. Add a third tax label as an explicit line item. See Ch XVII, L.

Operations Surfaces

Unified Payment Layer. Multi-tender splits, idempotency on retry (client_request_uuid), and gateway-reference capture all flow through a single payment module rather than per-tender SDKs — that's why a card+cash+e-wallet split appears on one receipt with one audit row. See Ch XV, App D.

Print Queue Status. Submitted KOTs and invoice prints land in a per-printer queue; jobs retry with exponential backoff and surface in operator notifications when a printer stays offline beyond two retries. The queue absorbs bursts so a stuck printer never blocks the next order. See Ch XIII, XXVI.

Ticketing Kiosk Mode. Per-centre toggle (centers.ticketing_mode) flips the operator station into a one-tap-per-scan flow optimised for kiosk-style entry. Members tap RFID or scan QR; the system resolves and activates the next available table without operator confirmation. See Ch XXI, XXII.

92
Appendix G — Feature Reference IndexSnooker King · User Guide

Operations Surfaces (continued)

RFID Scan Mode actions. Each reader can be configured per-centre with a default action (auto-assign-to-next-active-session, open-member-profile, or check-in-pending-booking). Cards link to members from the profile screen; a member may carry multiple cards (primary + backup) and any card is deactivable instantly if lost. See Ch XXII.

Table History module. Beyond the headline report, the module exposes per-session drill-down: opening time, duration, members present, F&B lines, settlements, voids, comps. Filterable by table, employee, member, date range; CSV-exportable. See Ch XXIII.

Configuration Surfaces

Live Monitor JSON config. The config object covers theme preset, layout (grid / list / spotlight), header height, summary-stat selection, footer marquee, and rotation panel. Field-level overrides are accepted; reset-to-default reseeds from the canonical template (Ch VI). See Ch VI.

Custom Notifications & Sounds. Each user mutes information and alerts independently from the avatar menu (state persists per browser). Custom sound effects per centre are configured in the Notifications panel; per-role routing decides whether an alert pushes to email, in-app, or both. See Ch XXXVI.

Keyboard Shortcuts (custom). Appendix A covers the shipped shortcuts; per-role rebinding lives in the user-settings drawer (managers can pin a shift theme + shortcut layout to a shared terminal). Disabled shortcuts don't fire on focused inputs even if the layout would otherwise capture them. See App A, Ch XXX.

Admin & Audit

System Logs custom types. The log_type column is open vocabulary — new modules add their own values without schema migration. The viewer is role-scoped (admin / client / org / manager / operator / member) and the writer strips a deny-list of sensitive keys before persistence. See Ch XXIV.

Social Moderation. The operator-side social console exposes flagged listings, reported chat threads, and a one-tap remove + reason for marketplace listings. Members never see operator-side comments; status-change rows are immutable and join the System Log audit trail. See Ch XXVIII, XXXIV.

Admin Utilities. Beyond the four reconciliation tools (Ch XXXVII), bearer-token-guarded admin endpoints handle bulk re-tokenisation, organisation-wide tariff broadcasts, schema validation, and one-shot data corrections. All run dry-run by default and write a System Log row on apply. See Ch XXXVII.

93
ColophonSnooker King · User Guide
FINIS

Thank You

For trusting your room, your members, and your livelihood to Snooker King. We will keep working to deserve it.


Colophon
Set in Cormorant Garamond & Inter, with code in JetBrains Mono.
Designed for A4 print & on-screen reading at 1.0 scale.
© 2026  ·  Snooker King  ·  All rights reserved
94