About this mockup
A static visual of the Admin Web UI across every phase, starting from features/2026-10-17-counterfoil-admin-web-ui.md.
Nothing here talks to a server. Pick a screen on the left. Each screen is shown inside a browser frame at the URL it would
plausibly live at (URLs are illustrative; the tech spec decides routing).
Conventions used on every screen
- Plain pages and forms. Every screen is a full page load. The real
ui.jsdoes exactly three things: localize read-only times into the browser's zone, show or hide the drawing form's type-dependent fields, and write the browser's zone into the event-log search form. Nothing polls, and the CSP forbids any request after load. (This mockup's own script, which switches screens, is not part of the product.) - Navigation shows only the areas the signed-in user's roles allow. Most screens here are viewed as
Pat Admin, who holds both
SYSTEM_ADMINISTRATORandRAFFLE_ADMINISTRATOR, so both areas appear. - Every irreversible act and every two-person resolution takes a written note or reason, required by the API itself (since Phase 2).
- Read-only date-times are in the viewer's browser zone and always carry a zone abbreviation
(
PDT/PST). The viewer in these mockups is inAmerica/Los_Angeles. - Date-time inputs for raffle configuration are in the raffle's zone, and the input is labelled with it
(the purple
America/Los_Angelestag). Calendar dates (taxeffectiveFrom) have no zone at all. - Confirmations are full pages, not dialogs (Phase 1 decision D7): a destructive
POSTwithoutconfirm=yesrenders a confirmation page and writes nothing, with scripts on or off. Most are drawn here as a dialog over the page that leads to them, to save space; the Phase 2 void and refund screens show the real page. - Server errors render in one envelope: code, message, and for
RULE_VIOLATIONthe rule ID and citation. The form is shown again with the user's values kept, except passwords. - Money and rates are text fields submitted exactly as typed. No client-side arithmetic.
- No screen offers a user delete, a raffle lock/unlock, a draw-number mint, or
REFER_A_FRIEND.
What each phase's screens rest on
- Phases 1 and 2 P2: as built in 0.14.0. These screens were brought in line with the
shipped templates on 2026-11-01: navigation order, home tiles, the raffle list's pending counts, the locked raffle's Oversight panel, the presence radio pair,
identities as
Full Name <email>, and required notes on every resolution. Where the running UI and this page disagree, the running UI wins. - Phase 3 · Drawing preparation P3:
features/2026-11-01-counterfoil-admin-web-ui-phase-3.md(draft v1). PDF printing only; the Finance/Records Officer gets the printing screens. - Phase 4 · Drawing night P4 and Phase 5+ · other roles P5+: no PRD yet. These screens are drawn from the API as built (Appendix B) to support writing those PRDs. Treat their layout and wording as proposals, not decisions.
- Every Phase 3–5 screen keeps the Phase 1 rules: full page loads, server-enforced confirmations, a written reason on every irreversible act,
identities shown as
Full Name <email>, and nothing computed in the browser that the API owns. - Phase 2–5 screens are mostly viewed as single-role users (Jo Raffles, Lee Finance, Kim Counter, Alex Auditor), so their navigation shows one role's areas.
Sample data
- Licensee: Evergreen Community Foundation, Seattle, WA. Raffle: 2026 Dream House Raffle, license
ER-000123, 40,000 tickets, zoneAmerica/Los_Angeles. - Sales open
2026-08-01 00:00and close2026-11-30 00:00local, stored as2026-08-01T07:00:00Zand2026-11-30T08:00:00Z, which is the PRD's own worked example.
Login & session messages
Email and password only. One generic message for any wrong credential. The session-ended notice is what a user sees when their next action after idle or absolute expiry lands here; nothing was written and unsaved input is gone.
POST /api/v1/auth/loginCheck both and try again.
Too many failed sign-in attempts. Ask a System Administrator to unlock it.
Wait a few minutes before trying again.
Deliberate choices
- The locked and rate-limited messages name no account detail beyond what the user typed, and the generic message is identical whether the email exists or not.
- There is no "remember me", no password reset link and no second factor. Reset is a System Administrator action; MFA is Module 13.
Change password (forced on first login)
A user with mustChangePassword = true lands here after login and can reach nothing else until the change succeeds.
The navigation bar is absent. The same form, with navigation, is the voluntary change-password screen.
POST /api/v1/auth/password · error WEAK_PASSWORDYour password was set by an administrator. Choose a new one to proceed.
Password must be at least 8 characters.
Note
- After a server rejection every password field comes back empty, by rule. Only non-password fields keep their values.
Home (both administrator roles)
The landing page after login. Only the areas the user's roles allow appear, as tiles and in the navigation bar, in the same order. Pat Admin holds both roles, so all three groups show: System administration, Raffle administration and Oversight. A Raffle Administrator alone sees Raffles, Destruction approvals and Event log.
Home (role with no screens yet)
A Sales Operator, Finance/Records Officer or Auditor can sign in, change their password and sign out, and is told plainly that nothing else is available in this release. Superseded for the Finance/Records Officer by Phase 3 (Counterfoil printing), and for all three roles by their Phase 5+ home pages.
Welcome, Lee
This release of the web interface covers System Administrator and Raffle Administrator configuration tasks. Your work continues in the cfoil command-line client.
Your account
- lee.finance@evergreen.example
- Roles
- FINANCE_RECORDS_OFFICER
- Last sign-in
- 2026-10-16 09:41 PDT
Error display conventions
Every server rejection is shown the same way, from the API's shared envelope { error: { code, message, rule?, details? } }.
Authorization refusals by URL get a dedicated page rather than a form banner.
A user with this email already exists.
Local gambling-tax rate 0.0600 exceeds the statutory ceiling of 0.0500.
RCW 9.46.110(3)
This raffle's configuration locked when its first ticket was issued. Nothing was changed. The attempt was recorded.
You do not have access to this page
403 FORBIDDEN · Your roles do not include the one this area requires. Nothing was changed.
Back to homeUsers list
Filter by status and role. Columns match the user resource. Last login is in the viewer's zone. No delete anywhere.
GET /api/v1/users?status=&role=Users
| Full name | Roles | Status | Last login (your zone) | ||
|---|---|---|---|---|---|
| pat.admin@evergreen.example | Pat Admin | SYSTEM_ADMINISTRATOR RAFFLE_ADMINISTRATOR | ACTIVE | 2026-10-17 14:05 PDT | View |
| jo.raffles@evergreen.example | Jo Raffles | RAFFLE_ADMINISTRATOR | ACTIVE | 2026-10-17 08:52 PDT | View |
| sam.operator@evergreen.example | Sam Operator | SALES_OPERATOR | LOCKED | 2026-10-15 17:30 PDT | View |
| lee.finance@evergreen.example | Lee Finance | FINANCE_RECORDS_OFFICER | ACTIVE | 2026-10-16 09:41 PDT | View |
| kim.counter@evergreen.example | Kim Counter | SALES_OPERATOR | ACTIVE | never | View |
| wsgc.auditor@gamb.wa.example | Alex Auditor | AUDITOR | ACTIVE | 2026-09-30 11:02 PDT | View |
| dana.former@evergreen.example | Dana Former | SALES_OPERATOR | DISABLED | 2026-06-12 16:20 PDT | View |
| bootstrap.admin@evergreen.example | Bootstrap Administrator | SYSTEM_ADMINISTRATOR | DISABLED | 2026-07-13 10:00 PDT | View |
User detail & disable confirmation
Actions are offered according to state: Unlock only when LOCKED. Disable asks for explicit confirmation and says the record is retained.
Reset password sets a new password and forces a change at next login.
POST /users/{id}/unlock, …/reset-password, …/disable · errors NOT_LOCKED, NOT_FOUNDSam Operator LOCKED
Account
- ID
- 57
- sam.operator@evergreen.example
- Full name
- Sam Operator
- Roles
- SALES_OPERATOR
- Status
- LOCKED
- Must change password
- No
- Last login
- 2026-10-15 17:30 PDT
Attribution
- Created
- 2026-07-13 11:22 PDT by pat.admin@evergreen.example (42)
- Updated
- 2026-10-15 17:31 PDT by system
Users are never deleted. Disabling revokes every session and keeps the account for attribution across the records' retention life (R12).
Disable sam.operator@evergreen.example?
All of this user's sessions are revoked immediately and they can no longer sign in. The account is retained; it is not deleted.
Create user, shown after a server rejection
The same form serves create and edit (edit has no initial-password field). Here the server answered EMAIL_TAKEN: the form re-renders with every
entered value kept except the password.
POST /api/v1/users · errors EMAIL_TAKEN, NO_ROLES, UNKNOWN_ROLE, WEAK_PASSWORDA user with this email already exists.
Sales units
List filtered by ACTIVE/RETIRED, with the register form alongside. Only WORKSTATION is offered. Retire asks for confirmation.
POST /api/v1/sales-units, POST …/{id}/retire · error VALIDATION_ERROR (duplicate code)Sales units
| Code | Name | Type | Status | |
|---|---|---|---|---|
| WS-FRONT-1 | Front desk 1 | WORKSTATION | ACTIVE | |
| WS-FRONT-2 | Front desk 2 | WORKSTATION | ACTIVE | |
| WS-MAILROOM | Mail-order entry | WORKSTATION | ACTIVE |
Retire WS-FRONT-2?
The station can no longer submit orders. Orders it already recorded stay attributed to it. Retirement is not reversible from this screen.
Tax jurisdictions
Reference data. A rate change is an append, never an edit: Edit is offered only on rows whose effective date is still in the future. No delete.
effectiveFrom is a calendar date and gets no zone conversion.
POST /api/v1/tax-jurisdictions, PATCH …/{id} · error JURISDICTION_IN_EFFECTTax jurisdictions
| City | County | State | Rate | Effective from | Citation | Status | |
|---|---|---|---|---|---|---|---|
| — | — | WA | 0.0500 | 2026-01-01 | RCW 9.46.110(3) 5% ceiling | IN EFFECT | no actions |
| — | King | WA | 0.0500 | 2026-01-01 | King County Code ch. 4A.100 | IN EFFECT | no actions |
| Seattle | King | WA | 0.0500 | 2026-01-01 | SMC 5.52.030 | IN EFFECT | no actions |
| Bellevue | King | WA | 0.0450 | 2026-01-01 | BCC 4.10.020 | IN EFFECT | no actions |
| Bellevue | King | WA | 0.0500 | 2027-01-01 | BCC 4.10.020 (Ord. 6789) | FUTURE | |
| — | Spokane | WA | 0.0000 | 2026-01-01 | No county raffle tax | IN EFFECT | no actions |
Event chain verification
One button runs a verification. Small chains answer inline; long ones answer RUNNING and the user reloads later. The page never polls.
The latest result is the same screen.
POST /api/v1/events/verification, GET …/latestEvent chain
Latest verification run 7
- Status
- PASS
- Verified through seq
- 128
- Events checked
- 128
- Started
- 2026-10-17 14:12:00 PDT
- Finished
- 2026-10-17 14:12:00 PDT (412 ms)
- Trigger
- ON_DEMAND
To search the events themselves, use the Event log.
Run 8 started 2026-10-17 14:15:02 PDT. Reload this page later to see the result. This page does not refresh itself.
Verified through seq 96; 97 checked. An EVENT_CHAIN_BROKEN event was recorded. Preserve the database and notify the compliance lead.
The run ended without a verdict. Run it again; if it repeats, check the server log.
Destruction approvals
Destruction requests are per raffle, so the screen starts by choosing one. Approve and Reject each lead to a confirmation page that requires a note;
the API also requires an explicit decision, so nothing is approved by omission. Since Phase 2 both the System Administrator and the Raffle Administrator
reach this screen, and the requester is shown as Full Name <email> from the API, not looked up from the user list.
GET /raffles/{id}/destructions, POST …/{requestId}/approval · errors DESTRUCTION_APPROVAL_SELF, DESTRUCTION_NOT_PENDING, RETENTION_NOT_EXPIRED, ARCHIVE_REQUIREDDestruction approvals
| # | Record class | Reason | Requested by | Requested | State | Preview | |
|---|---|---|---|---|---|---|---|
| 12 | TICKET_STUB_DETAIL | Retention expired 2024-12-31; archive 2023-DH-A1 completed. | Lee Finance <lee.finance@evergreen.example> | 2026-10-16 09:50 PDT | PENDING | 1,980 purchaser names, 1,980 addresses, 1,602 phone numbers across 18,440 stubs | |
| 11 | RAFFLE_RECORDS | Retention expired 2027-06-30. | Lee Finance <lee.finance@evergreen.example> | 2026-10-02 15:11 PDT | REJECTED | — | rejected |
| 9 | COUNTERFOIL_PHYSICAL | Advisory: paper stubs shredded 2024-02-01. | Jo Raffles <jo.raffles@evergreen.example> | 2026-09-01 10:00 PDT | COMPLETED | certificate C-0009 | completed |
You requested this destruction and cannot also approve it.
No COMPLETED archive exists for this raffle. Records may not be destroyed until an archive is on file.
TICKET_STUB_DETAIL for this raffle must be retained until 2027-06-30. The refusal was recorded as a significant event.
Request #12 is no longer PENDING (it was approved by jo.raffles@evergreen.example at 2026-10-17 14:20 PDT).
note: must not be blank. Nothing was redacted; the request is still PENDING.
Raffles list
Filter by configuration status. Times are the viewer's zone, so the two sales instants on the 2026 raffle show as PDT and PST respectively. The last three columns (Phase 2) count pending void, refund and destruction requests when the page loads; a non-zero count links to its queue. A draft cannot have sold a ticket, so it shows a dash for voids and refunds. A count the server would not give is also a dash, never an error.
GET /api/v1/raffles?configStatus=Raffles
| Name | License | Sales open (your zone) | Sales close (your zone) | Tickets | Config | Voids | Refunds | Destructions |
|---|---|---|---|---|---|---|---|---|
| 2027 Dream House Raffle | not set | 2027-08-01 00:00 PDT | 2027-11-30 00:00 PST | 40,000 | DRAFT | — | — | 0 |
| 2026 Dream House Raffle | ER-000123 | 2026-08-01 00:00 PDT | 2026-11-30 00:00 PST | 40,000 | LOCKED | 3 | 2 | 0 |
| 2023 Dream House Raffle | ER-000098 | 2023-08-01 00:00 PDT | 2023-11-30 00:00 PST | 30,000 | LOCKED | 0 | 0 | 1 |
Create raffle
Every field of POST /api/v1/raffles including the tax block. The date-time inputs use the zone selected on this same form. The suggested rate comes
from the server's jurisdiction lookup and the form says whether the entered rate overrides it.
GET /tax-jurisdictions/suggestionSuggestion states the callout can show
- Overrides: "Suggested rate 0.0500 (COUNTY match). The entered rate 0.0450 overrides the suggestion; the raffle's tax block will record
overridden: true." - No match: "No jurisdiction entry matched Walla Walla / Walla Walla / WA. Enter the rate directly." This is a normal answer.
Raffle detail (DRAFT)
The hub page: core fields, tax block, organization-profile status, compliance checklist, pricing plans with the recorded per-ticket rate, drawings with their prizes.
Soft-removed children are hidden until Show removed is pressed (in the real UI it reloads the page with ?includeRemoved=true; no script). Reloading re-evaluates the checklist.
GET /raffles/{id}?includeRemoved=, GET …/compliance-checklist, GET /organization2027 Dream House Raffle DRAFT
Reason from the server: COUNTERFOIL_ORGANIZATION_FILE is not set. Consequence: no raffle can start selling. A receipt without a licensee name is not a lawful receipt (R9/R10). Configuring the profile is an operator action on the server; there is no screen for it.
Configuration
- License number
- not set
- Time zone
- America/Los_Angeles
- Sales open
- 2027-08-01 00:00 PDT (2027-08-01 00:00 in raffle zone)
- Sales close
- 2027-11-30 00:00 PST (2027-11-30 00:00 in raffle zone)
- Total tickets
- 40,000
- Created
- 2026-10-17 15:02 PDT by pat.admin@evergreen.example
- Updated
- 2026-10-17 15:40 PDT by jo.raffles@evergreen.example
Local gambling tax
- Jurisdiction
- Seattle, King County, WA
- Suggested rate
- 0.0500 CITY match · SMC 5.52.030
- Effective rate
- 0.0500
- Overridden
- No
- Worksheet
- Not finalized (rate remains editable)
Compliance checklist evaluated 2026-10-17 16:04:11 PDT on page load
NOT READY · 3 FAIL| Rule | Citation | Requirement | Status | Detail |
|---|---|---|---|---|
| R3 | WAC 230-11-014(2) | ≥1 pricing plan; every plan ≤ $250/ticket | PASS | |
| R4 | RCW 9.46.0323(3)(a) | Grand prize total ≤ $10M | PASS | |
| R5 | RCW 9.46.0323 | Grand drawing defined; every drawing's eligibility standards complete | FAIL | No GRAND drawing configured. |
| R10 | WAC 230-11-010/-360 | Disclosures complete: date/time/location, prize descriptions, presence flags | PASS | |
| R18 | WAC 230-11-085/-086 | Every bundle's discounted per-ticket rate computed and recorded | PASS | |
| LICENSE | RCW 9.46.0323 | WSGC license number recorded (required before first sale) | FAIL | license_number not set. |
| ORGANIZATION | WAC 230-11-010 | Licensee profile configured on the server | FAIL | COUNTERFOIL_ORGANIZATION_FILE is not set. |
The lock trigger is the first sale, not checklist success. Reload the page to re-evaluate.
Pricing plans
| Label | Tickets | Price | Per-ticket rate (recorded, R18) | Status | |
|---|---|---|---|---|---|
| Single ticket | 1 | 150.00 | 150.0000 | ACTIVE | Edit · Remove |
| 3-pack | 3 | 400.00 | 133.3333 | ACTIVE | Edit · Remove |
| 5-pack | 5 | 600.00 | 120.0000 | ACTIVE | Edit · Remove |
Drawings and prizes
Raffle detail (LOCKED)
Same page, read-only. No add, edit or remove control anywhere except Change tax rate. The banner says the configuration is locked and why. Phase 2 adds the Oversight panel: pending counts linking to each queue, the ticket inventory and the raffle's destruction requests.
409 CONFIGURATION_LOCKED on a stale form2026 Dream House Raffle LOCKED
The first ticket was issued at 2026-08-01 09:12 PDT, which locked this raffle's configuration permanently (R5). The raffle, its pricing plans, drawings and prizes can no longer be changed. Only the tax rate remains editable, until the worksheet is finalized.
Oversight pending, counted on page load P2
Configuration
- License number
- ER-000123
- Time zone
- America/Los_Angeles
- Sales open
- 2026-08-01 00:00 PDT
- Sales close
- 2026-11-30 00:00 PST
- Total tickets
- 40,000
- Locked
- 2026-08-01 09:12 PDT
Local gambling tax
- Jurisdiction
- Seattle, King County, WA
- Suggested rate
- 0.0500
- Effective rate
- 0.0500
- Overridden
- No
- Worksheet
- Not finalized (rate remains editable)
Compliance checklist evaluated 2026-10-17 16:05:40 PDT
ALL PASS| Rule | Citation | Requirement | Status |
|---|---|---|---|
| R3 | WAC 230-11-014(2) | ≥1 pricing plan; every plan ≤ $250/ticket | PASS |
| R4 | RCW 9.46.0323(3)(a) | Grand prize total ≤ $10M | PASS |
| R5 | RCW 9.46.0323 | Grand drawing defined; eligibility standards complete | PASS |
| R10 | WAC 230-11-010/-360 | Disclosures complete | PASS |
| R18 | WAC 230-11-085/-086 | Per-ticket rates recorded | PASS |
| LICENSE | RCW 9.46.0323 | License number recorded | PASS |
| ORGANIZATION | WAC 230-11-010 | Licensee profile configured | PASS |
Pricing plans
| Label | Tickets | Price | Per-ticket rate | Status |
|---|---|---|---|---|
| Single ticket | 1 | 150.00 | 150.0000 | ACTIVE |
| 3-pack | 3 | 400.00 | 133.3333 | ACTIVE |
| 5-pack | 5 | 600.00 | 120.0000 | ACTIVE |
Drawings and prizes
Grand Prize Drawing GRAND
Prizes active total $2,565,000.00 of $10,000,000.00 (R4)
| Description | Value type | Fixed value | Status |
|---|---|---|---|
| Dream House: 4 bed / 3 bath, Kirkland WA, fully furnished | FIXED | 2500000.00 | ACTIVE |
| 2026 electric SUV | FIXED | 65000.00 | ACTIVE |
Early Bird Drawing EARLY_BIRD
Prizes active total $25,000.00
| Description | Value type | Fixed value | Status |
|---|---|---|---|
| $25,000 cash | FIXED | 25000.00 | ACTIVE |
Multiple Ticket Bonus MULTIPLE_TICKET
Prizes active total $10,000.00
| Description | Value type | Fixed value | Status |
|---|---|---|---|
| $10,000 cash | FIXED | 10000.00 | ACTIVE |
Stale form after the lock
- If an administrator had a DRAFT edit form open when the first ticket sold, submitting it returns the form with
409 CONFIGURATION_LOCKED(see Error display conventions), changes nothing, and the server recordsCONFIGURATION_LOCKED_ATTEMPT. - Nothing on this page, or anywhere, offers lock, unlock or draw-number minting.
Pricing plan form, after an R3 violation
Label, ticket count and price. Price is a text field submitted as typed. The server derives and records the per-ticket rate, which the form shows read-only when editing.
POST /raffles/{id}/pricing-plans · RULE_VIOLATION R3, VALIDATION_ERROR (duplicate active ticketCount)Price 1300.00 for 5 tickets exceeds the maximum of 250.00 per ticket (1250.00 for this plan).
WAC 230-11-014(2)
Drawing form with type-dependent fields
Only GRAND, EARLY_BIRD and MULTIPLE_TICKET are offered. Change the type in the mockup to see the fields appear and disappear:
entry cutoff for the two non-grand types, minimum ticket count only for multiple-ticket. The form's date-times are in the raffle's zone.
POST /raffles/{id}/drawings · VALIDATION_ERROR (second GRAND, params vs type, cutoff outside sales window)Prize form (not shown separately)
- Description, value type (a single fixed
FIXEDoption), fixed value as typed. The server answersRULE_VIOLATION R4when the GRAND drawing's active total would exceed $10,000,000, shown in the standard envelope above the form.
Daylight-saving refusal
A local time that does not exist, or occurs twice, in the raffle's zone is refused on the field, nothing is saved and every other value is kept. The system never silently picks an occurrence.
Scheduled at: 02:30 on 2027-03-14 is not a valid time in America/Los_Angeles because it falls inside the daylight-saving change on that date. Choose a different time.
Entry cutoff: 01:30 on 2027-11-07 is ambiguous in America/Los_Angeles because it occurs twice during the daylight-saving change. Choose a different time.
Time zone change confirmation
Submitting a new timeZone on a draft raffle that already has date-times saves nothing until the user confirms here. Every affected field is listed with
its old and new local reading. The instants do not move. Only the zone is saved on confirm.
When this step is skipped
- A raffle with none of these date-times saves the new zone immediately with no confirmation.
Tax rate (editable in DRAFT and after lock)
The one post-lock parameter. Jurisdiction plus effective rate, until the worksheet is finalized. Shown after an R19 rejection.
PUT /raffles/{id}/tax-rate · RULE_VIOLATION R19, TAX_RATE_FINALIZEDLocal gambling-tax rate 0.0600 exceeds the statutory ceiling of 0.0500.
RCW 9.46.110(3)
The local gambling-tax worksheet for this raffle was finalized on 2027-01-15. The rate can no longer be changed.
Remove confirmations
Every remove is a soft removal and asks for explicit confirmation. Removing a drawing says that its prizes go with it. The removed row stays visible under "show removed".
DELETE endpoints are soft (status = REMOVED)Remove pricing plan "10-pack"?
The plan is marked REMOVED and hidden from the raffle. It is kept in the record and can be shown with "Show removed".
Remove drawing "Summer Sizzler"?
Its 1 prize is removed with it. The drawing and its prizes are marked REMOVED and hidden; nothing is deleted.
Remove prize "$500 gift card"?
The prize is marked REMOVED. The Grand drawing's active total is recomputed by the server on save.
Void requests & approval
A locked raffle's void queue, pending by default, reached from the raffle's Oversight panel or its pending count. Approve is never offered on your own request; Withdraw is, and closes it with the requester as the resolver. Each button leads to a confirmation page with a required note.
GET /raffles/{id}/void-requests, POST …/{requestId}/approve, …/reject (both require note) · VOID_APPROVAL_SELF, VOID_REQUEST_NOT_PENDINGVoid requests
| # | Draw number | Reason | Requested by | Requested | State | Resolution | |
|---|---|---|---|---|---|---|---|
| 21 | 2026-A-004417 | DATA_ENTRY_ERROR Keyed twice for the same mail order; ORD-8790 is the original. | Sam Operator <sam.operator@evergreen.example> | 2026-09-17 10:12 PDT | PENDING | ||
| 22 | 2026-A-009120 | PURCHASER_REQUEST Purchaser asked to cancel one ticket of a 3-pack. | Kim Counter <kim.counter@evergreen.example> | 2026-09-17 11:40 PDT | PENDING | ||
| 23 | 2026-A-012002 | WRONG_PRICING_PLAN Sold as single; buyer paid for the 5-pack. | Jo Raffles <jo.raffles@evergreen.example> | 2026-09-17 12:05 PDT | PENDING | You opened this request; a different person must approve. |
Void request 21 is not PENDING; another user resolved it first. Nothing changed.
note: must not be blank. The request is still PENDING.
Refund requests, approval & result
The confirmation reads the consequence fresh from the order: total, paid now, the requested amount and every ticket that will be voided. If the paid amount moved since the request was opened, a warning replaces the consequence (the server will refuse it). The result page is rebuilt from stored state, so a reload cannot resubmit. Purchaser details are not shown.
GET /raffles/{id}/refund-requests, GET …/orders/{orderId}, POST …/{reqId}/approval { note, paymentDate? }, …/rejection · REFUND_NOT_ELIGIBLE, VOID_APPROVAL_SELFRefund requests
| # | Order | Reason | Amount | Requested by | Requested | State | Resolution | |
|---|---|---|---|---|---|---|---|---|
| 7 | ORD-8790 | PURCHASER_REQUEST Purchaser moved out of state before the drawing. | $400.00 | Lee Finance <lee.finance@evergreen.example> | 2026-09-16 15:20 PDT | PENDING | ||
| 8 | ORD-8802 | DUPLICATE_ORDER Faxed and mailed the same form. | $150.00 | Lee Finance <lee.finance@evergreen.example> | 2026-09-17 09:02 PDT | PENDING |
A ticket on this order has a pending void request. Nothing moved.
Approved. $400.00 is recorded as returned, and the order is closed.
- Tickets voided
- 2026-A-008230, 2026-A-008231, 2026-A-008232
- Decided by
- Jo Raffles <jo.raffles@evergreen.example>
Ticket inventory & lookup
Read-only. The reconciling report per series and in total, shown as an alarm if it ever does not reconcile, then a lookup by draw number and the filtered ticket list.
Nothing here opens a void or changes a ticket: voids are requested through cfoil and decided in the void queue.
GET /raffles/{id}/ticket-inventory, GET …/tickets?status=&seriesCode=&voidPending=, GET …/tickets/{drawNumber} · NOT_FOUNDTicket inventory
By series
| Series | Prefix | Start | Total | Allocated | Unissued | Issued | Voided | Void pending |
|---|---|---|---|---|---|---|---|---|
| A | 2026-A- | 1 | 40,000 | 18,412 | 21,588 | 18,375 | 37 | 3 |
| Total | 40,000 | 18,412 | 21,588 | 18,375 | 37 | 3 |
| Draw number | Series | Status | Issued | Voided | |
|---|---|---|---|---|---|
| 2026-A-004417 | A | ISSUED | 2026-08-19 14:02 PDT | View | |
| 2026-A-009120 | A | ISSUED | 2026-08-30 10:47 PDT | View | |
| 2026-A-012002 | A | ISSUED | 2026-09-05 16:31 PDT | View |
No ticket with draw number 2026-A-090000 in this raffle.
- Draw number
- 2026-A-004417
- Series
- A
- Order
- ORD-8791
- Voided
- not void
A void keeps its draw number forever; it is never reissued.
Event log search
For the Raffle Administrator and the System Administrator. Bounds are entered in the browser's zone (written into a hidden field by ui.js), half-open, and refused on a daylight-saving gap or overlap.
With scripts off they are read as UTC and the page says so. Each result's actor and entity link to a narrowed search. Sign-in events withhold the actor's identity.
GET /api/v1/events?from=&to=&eventType=&actor=&entityType=&entityId=&sort=&size=Event log
| # | Type | Occurred | Actor | Entity | Summary | Hashes |
|---|---|---|---|---|---|---|
| 48213 | RECORD_VOID | 2026-09-17 14:31 PDT | Jo Raffles <jo.raffles@evergreen.example> | ticket_void_request 21 | Void approved: draw number 2026-A-004417 | 9c41…02ad prev 77e0…b913 |
| 48107 | RECORD_CREATE | 2026-09-17 10:12 PDT | Sam Operator <sam.operator@evergreen.example> | ticket_void_request 21 | Void requested: DATA_ENTRY_ERROR | 3be8…41c0 prev 0f19…d6e2 |
Note
- Event summaries above are illustrative; the real summaries are written by each module and keep their existing PII masking. A summary is always shown as text, never as markup.
Drawing preparation overview
Reached from a LOCKED raffle's page. One row per active drawing: its pool, its batches and the barrel check, all computed when the page loads.
Viewed as Jo Raffles, who holds only RAFFLE_ADMINISTRATOR, on the morning after the Early Bird cutoff.
GET /raffles/{id}/pools, GET …/counterfoil-batches, GET …/drawings/{drawingId}/counterfoil-verificationDrawing preparation LOCKED
Computed 2026-09-16 08:30 PDT when this page loaded. Reload to refresh.| Drawing | Entry cutoff | Pool | Pending payments | Members | Active batches | Barrel check | |
|---|---|---|---|---|---|---|---|
| Early Bird Drawing EARLY_BIRD scheduled 2026-09-18 19:00 PDT |
2026-09-15 23:59 PDT REACHED |
OPEN preview as of load |
3 | 8,912 preview | 1 · PRELIMINARY B-0001 · 8,904 stubs · not printed |
NOT READY pool not closed · batch not printed · 8 in pool, not printed |
Pool & close Barrel check |
| Multiple Ticket Bonus MULTIPLE_TICKET scheduled 2026-11-06 19:00 PST |
2026-10-31 23:59 PDT NOT YET |
OPEN | 11 | 3,147 preview | none | NOT READY no batch · pool not closed |
Pool |
| Grand Prize Drawing GRAND scheduled 2026-12-05 19:00 PST |
2026-11-30 00:00 PST (sales close) NOT YET |
OPEN | 14 | 21,406 preview | none | NOT READY no batch · pool not closed |
Pool |
No column here is computed in the browser. Pool counts, coverage and balance are the API's answers, shown as returned.
Deliberate choices
- A
DRAFTraffle has no link to this page: nothing can be prepared before a sale. - The step strip is only a guide. The page computes it from the same three answers as the table and enforces nothing; the server does.
- A
REFER_A_FRIENDdrawing would show the server'sFEATURE_NOT_AVAILABLEreason in place of its pool and offer no action.
Pool detail & irreversible closure
The open Early Bird pool, with the close confirmation over it. Three mail-in payments are still pending, so the acknowledgement is required and starts unticked. A note is required. Below: what the same page shows once the pool is closed.
GET …/drawings/{drawingId}/pool, POST …/pool/closure · POOL_PENDING_PAYMENTS, POOL_CUTOFF_NOT_REACHED, POOL_ALREADY_CLOSED, CARD_DATA_REJECTEDEarly Bird Drawing pool OPEN
Rule
- Rule
- EARLY_BIRD_V1
- Members
- Every paid, non-void ticket ordered on or before the entry cutoff. Winning removes nothing (R6).
- Entry cutoff
- 2026-09-15 23:59 PDT · reached
Preview as of 2026-09-16 08:31 PDT, this page load
- Members
- 8,912 tickets · 2,104 purchasers
- Pending payments
- 3 orders placed before the cutoff are not fully paid. They are out of the pool if you close now.
Members paged · draw number and standing only; the API's member list carries no purchaser name
Download CSV| # | Draw number | Standing |
|---|---|---|
| 1 | 2026-A-000001 | DRAWABLE |
| 2 | 2026-A-000002 | DRAWABLE |
| 3 | 2026-A-000004 | DRAWABLE |
4 orders placed before the cutoff are not fully paid. Acknowledge them to close. Nothing was written.
This drawing's pool was closed at 2026-09-16 08:33 PDT. Nothing was written.
Early Bird Drawing pool CLOSED
- Closed
- 2026-09-16 08:36 PDT by Jo Raffles <jo.raffles@evergreen.example>
- Note
- Mail for 15 Sept processed; remaining 3 cheques not received by 16 Sept 08:30.
- Pending acknowledged
- Yes, 3 orders
- Members
- 8,912 · 2,104 purchasers · 2026-A-000001 – 2026-A-018377
- Drawable now
- 8,910
- Member hash
- b41e09…7c2d
| Draw number | Reason |
|---|---|
| 2026-A-004417 | Ticket voided 2026-09-17 |
| 2026-A-011209 | Payment reversed (NSF) 2026-09-17 |
Generate a counterfoil batch
The mode list is narrowed by state: INITIAL only when the drawing has no active batch, SUPPLEMENT and REPLACEMENT only when it has one.
Every mode needs a reason, and the confirmation says what the mode will do.
POST …/drawings/{drawingId}/counterfoil-batches · COUNTERFOIL_POOL_EMPTY, RULE_VIOLATION, VALIDATION_ERROREvery eligible ticket for this drawing is already in an active batch. Nothing was written.
Barrel check (counterfoil verification)
Compares the union of active manifests with the pool now. A stub that is printed but no longer in the pool is an alarm: it is physically in the barrel and must be pulled. Tickets in the pool but not printed are outstanding work and point to a supplement.
GET …/drawings/{drawingId}/counterfoil-verificationBarrel check · Early Bird Drawing
Checked 2026-09-17 16:02 PDT on page loadBlockers
- Not every active batch has been fully printed and confirmed.
Printed, not in pool ALARM · 2
Each stub below is in the barrel but has lost its place in the pool. Pull it before the drawing. On drawing night you will attest each one by draw number.
| Draw number | Batch |
|---|---|
| 2026-A-004417 | B-0001 |
| 2026-A-011209 | B-0001 |
In pool, not printed 8
Generate supplement…Normal while a batch is outstanding. A supplement batch covers exactly these.
| Draw number |
|---|
| 2026-A-017990 |
| 2026-A-018004 |
| … 6 more |
No control on this page pulls, attests or removes a stub. Attestation happens when the drawing session opens (Phase 4).
Truncation
- On a grand-prize barrel either list can run to thousands. The API truncates at its configured cap; the page then says "showing the first 500 of a truncated list" and never implies the list is complete.
Batch detail & PDF print runs
Seen by the Finance/Records Officer, the second role that prints. Coverage comes from the API. Open a run on a PDF profile, download its PDF, print it at actual size, then confirm or abandon.
A run opened in cfoil on a thermal profile is listed, and the UI offers only Abandon on it.
…/counterfoil-batches/{batchId}, …/print-runs, …/stream, …/confirmation, …/abandonment, …/preview, …/manifestBatch B-0001 · Early Bird Drawing ACTIVE PRELIMINARY
Batch
- Stubs
- 8,904 · sequence 1–8,904 · 2026-A-000001 – 2026-A-018355
- Pool as of
- 2026-09-15 09:00 PDT (pool was still open)
- Generated
- 2026-09-15 09:00 PDT by Jo Raffles <jo.raffles@evergreen.example>
- Content hash
- 7f20aa…91c3
Print coverage from confirmed runs
Not fully printed. An abandoned run leaves its range uncovered so the gap stays visible.
Print runs
| Run | Range | Profile | Device | Status | Downloaded | Resolved | |
|---|---|---|---|---|---|---|---|
| 1 | 1–4,100 | PDF_LETTER | Office laser 2F | CONFIRMED | 09:14 PDT | 2026-09-15 09:58 PDT by Lee Finance <lee.finance@evergreen.example> · INTERACTIVE | |
| 2 | 4,101–8,904 | PDF_LETTER | Office laser 2F | ABANDONED | 10:02 PDT | 10:31 PDT by Lee Finance · "Toner streak from sheet 610; reprinting from 4,101" | |
| 3 | 4,101–8,904 | PDF_LETTER | Office laser 1F | OPEN | not yet | expires 2026-09-15 22:35 PDT | Download PDF |
| 4 | 1–40 | ESCPOS_80 | Front-desk thermal | OPEN | 11:05 PDT (cfoil) | expires 2026-09-15 23:05 PDT | thermal: confirm in cfoil |
Confirm run 3 printed cleanly?
Sequence 4,101–8,904 (2026-A-008233 – 2026-A-018355), 4,804 stubs. Confirm only if you watched every one come out legible and cut.
Abandon run 3?
Nothing in this run is recorded as printed. The range stays uncovered and you can open a resume run.
Run 3 is no longer open (expired 22:35 PDT). Nothing was written.
Open question in the Phase 3 PRD
- Row 4 shows the proposed default for a thermal run opened in
cfoil: Abandon is offered (it records nothing as printed), Confirm is not (only thecfoiloperator watched that paper).
Readiness & open the drawing session
The gate is previewed and enforced by the same server code, so this page and the act cannot disagree. Every barrel blocker is a hard stop. Only the R11 reserve check can be overridden, with a reason. Withdrawn stubs are attested one draw number at a time; there is no "select all".
GET …/drawings/{drawingId}/readiness, POST …/drawings/{drawingId}/sessions · WITHDRAWN_STUB_UNACKNOWLEDGED, RESERVE_OVERRIDE_REQUIRED, PRIZE_RECORD_REQUIRED, SESSION_ALREADY_OPENOpen the Early Bird Drawing
Readiness read 2026-09-18 18:42 PDTThe barrel not overridable
| Pool closed and not empty | PASS | 8,912 members · closed 2026-09-16 08:36 PDT |
| Every eligible member has a printed stub | PASS | B-0001 + B-0002, both fully confirmed |
| Prize records on file (R11) | PASS | 1 of 1 prize documented |
| Withdrawn stubs pulled | ATTEST BELOW | 2 printed stubs have lost standing |
2026-A-011209 has lost standing and is printed, but was not attested as pulled. No session was opened.
2026-A-004471 is not a withdrawn printed stub for this drawing. Check the number you typed.
"$25,000 cash" has no prize record, so it cannot be classified as cash or noncash. A Finance/Records Officer must file one. Not overridable.
Drawing console
The page the caller's assistant keeps open on drawing night. The scanner types into one field and presses Enter: a full page POST carrying exactly what the scanner produced (R2).
Every presentation, accepted or rejected, becomes a numbered row. The accepted stub is shown with the purchaser's details, the only place the product shows them at speed.
POST …/sessions/{sessionId}/draw-events (201 for accepted and rejected) · GET …/draw-events · rejection reasons MALFORMED, WRONG_RAFFLE, WRONG_DRAWING, NOT_IN_POOL, WITHDRAWN, ALREADY_DRAWNEarly Bird Drawing SESSION OPEN
Prizes
| $25,000 cash | UNAWARDED |
#3 · Accepted 2026-A-007731
SCAN · 19:14:06 PDT- Purchaser
- Maria Delgado
- City, state
- Tacoma, WA
- Phone
- +1 253 555 0187
- Stubs in this barrel
- 4
Shown on screen only. Never written to an event summary.
Sequence every presentation, in order; this is what the report prints
| # | Time | Method | Raw input | Draw number | Outcome |
|---|---|---|---|---|---|
| 1 | 19:12:40 PDT | SCAN | CF1:1:3:2026-A-002210 | 2026-A-002210 | REJECTED · WRONG_DRAWING |
| 2 | 19:13:22 PDT | KEYED | 2026-A-077310 | 2026-A-077310 | REJECTED · NOT_IN_POOL |
| 3 | 19:14:06 PDT | SCAN | CF1:1:2:2026-A-007731 | 2026-A-007731 | PENDING DECISION |
For the Phase 4 spec
- Rows 1 and 2 (a stub from the wrong drawing's barrel, then a mistyped number) are
201rows with their reasons, never error banners, because the row is the evidence. A stub that should have been pulled would readWITHDRAWNthe same way. - How the UI tells a scan from a keyed entry is open: the radio above is one option; a separate keyed field is another. The scanner must not be able to submit as
KEYEDsilently. - Post/redirect/get after every presentation, so a browser reload cannot present the same stub twice.
Record a winner (two people at one keyboard)
The witness types their own email and password into this form, in the same request. No session is created for them, and a wrong password counts toward their lockout like any sign-in. Every witness failure has one message, so nobody at the table learns which part was wrong.
POST …/draw-events/{eventId}/award { drawingPrizeId, notes, witness } · WITNESS_INVALID, PRIZE_ALREADY_AWARDED, ACCOUNT_LOCKED, RATE_LIMITEDThe witness could not be verified. Nothing was recorded. The witness's password field has been cleared.
Disqualify a drawn stub
Single-actor by design: the remedy is the next draw, which is the next line of the report. The stub is set aside, not returned to the barrel; presenting it again is rejected ALREADY_DRAWN.
POST …/draw-events/{eventId}/disqualification { reason, reasonText } · reasons NOT_PRESENT, INELIGIBLE_PURCHASER, DECLINED, OTHERClose the session & the drawing report
Closing generates the immutable Raffle Drawing Report in the same transaction (R17). There is no regenerate. The closing note is required and printed on the report. Abandoning instead is offered only while no winner exists.
POST …/sessions/{sessionId}/closure { closingNote }, …/abandonment, GET …/report?format=pdf|csv|json · SESSION_HAS_WINNERSAbandon this session?
For a session opened in error. It stays on record, and a new one can be opened.
A winner has been recorded in this session, so it cannot be abandoned. Close it instead.
Home (Sales Operator)
Replaces the "no other functions" message for this role. A Sales Operator keys orders taken in person, by mail, fax or phone, records cash taken at the table, issues receipts and opens void requests.
Welcome, Kim
Workstation WS-FRONT-1 · 2026 Dream House Raffle is selling until 2026-11-30 00:00 PSTNew order
Key an in-person, mail, fax or telephone order. Draw numbers are issued when you submit.
StartThere is no online sale anywhere in Counterfoil (R1). This screen records orders taken through the four legal channels.
Order entry
No price field anywhere: the operator picks plans and quantities and the server prices them. The quote on the right is the server's preview, refreshed by the Update quote button, never by script.
A hidden clientRequestId minted with the form makes a double submit return the original order instead of a second set of numbers.
POST …/orders/preview, POST …/orders · SALES_WINDOW_CLOSED, ATTESTATION_REQUIRED, RULE_VIOLATION P1, PURCHASER_MATCH_FOUND, INVENTORY_EXHAUSTEDNew order · 2026 Dream House Raffle
Workstation WS-FRONT-1Quote from the server; writes nothing
| Single ticket × 1 | 150.00 |
| 3-pack × 1 133.3333 / ticket (R18) | 400.00 |
| 4 tickets | 550.00 |
Duplicate-purchaser prompt
A prompt, not a block. Reusing the existing record is the usual answer and keeps the buyer's ticket count whole for the multiple-ticket drawing. Creating a new one is recorded as an acknowledged duplicate. Either choice resubmits the same order with the same request id.
409 PURCHASER_MATCH_FOUND with details.candidates · resubmit with purchaser.purchaserId or acknowledgeDuplicate: trueOrder placed: draw numbers, payment, receipt
The order is complete the moment it exists; there is no draft. From here the operator records the money that came with it, issues the receipt, and can request a void of any ticket with a reason (approved by someone else). No card number is ever accepted: only the last four digits, in their own field.
GET …/orders/{orderId}, POST …/payments, POST …/receipt?deliver=, POST …/tickets/{ticketId}/void-requests · PAYMENT_EXCEEDS_ORDER_TOTAL, CARD_DATA_REJECTEDORD-8841 COMPLETED UNPAID
MAIL · MAIL-2026-09-14-0118 · placed 2026-09-14 10:22 PDT by Kim CounterDraw numbers 4 tickets · 550.00
| Draw number | Plan | Status | |
|---|---|---|---|
| 2026-A-018350 | Single ticket | ISSUED | Request void… |
| 2026-A-018351 | 3-pack | ISSUED | Request void… |
| 2026-A-018352 | 3-pack | ISSUED | Request void… |
| 2026-A-018353 | 3-pack | ISSUED | Request void… |
Unpaid tickets are in no drawing pool until the order is fully paid.
Receipt
Not yet issued. A receipt is an immutable snapshot; a correction is a reissue, never an edit.
Home (Finance/Records Officer)
Lee's areas after Phase 5. Counterfoil printing arrives first, in Phase 3; the rest follow. Approvals Lee can give (voids, refunds) sit beside the requests Lee opens.
Welcome, Lee
Prize records & reserve
File prize evidence and bank balances before a drawing (R11). 1 prize missing a record
OpenCounterfoil printing
Print batches on sheet stock; confirm or abandon runs; manifests.
OpenArchives & retention
Export the encrypted archive, see retention dates, request a destruction.
OpenReconciliation & reversal
The report's basis applies to both sides, or its balancing identity means nothing. Gross receipts are recognized when an order becomes fully paid; partial money sits in the held bucket. A reversal is a new negative entry with a coded reason and a required note, never an edit.
GET …/reconciliation?from=&to=&basis=&format=, POST …/payments/{paymentId}/reversal · reasons DATA_ENTRY_ERROR, NSF_RETURNED_CHECK, DUPLICATE_RECORDING, PROCESSOR_CHARGEBACK, OTHERBy method
| Method | Payments | Reversals | Refunds | Net |
|---|---|---|---|---|
| CASH | 48,200.00 | 0.00 | -150.00 | 48,050.00 |
| CHECK | 212,950.00 | -550.00 | 0.00 | 212,400.00 |
| CREDIT_CARD_EXTERNAL | 96,400.00 | 0.00 | -400.00 | 96,000.00 |
| Total | 356,450.00 |
Balancing
- Gross receipts recognized
- 354,600.00
- Held (partially paid orders)
- 1,850.00
- Net ledger movement
- 356,450.00
Prize records & reserve balance
The two things a drawing session needs from Finance. A missing prize record blocks the session outright; a missing or stale balance makes the reserve check NOT_AVAILABLE, which the Raffle Administrator can only override with a reason.
GET …/prize-records/missing, POST …/prize-records, POST …/reserve-balances, GET …/drawings/{drawingId}/reserve-check · PRIZE_VALUE_MISMATCH, PRIZE_RECORD_LOCKEDPrize records & reserve · 2026 Dream House Raffle
Prizes
| Drawing | Prize | Value | Type | Evidence | Record | |
|---|---|---|---|---|---|---|
| Grand | Dream House, Kirkland WA | 2500000.00 | NONCASH | PURCHASE_CONTRACT · EH-2026-117 | ON FILE | Edit |
| Grand | 2026 electric SUV | 65000.00 | NONCASH | none (above threshold) | NEEDS DOCUMENT | Add document |
| Early Bird | $25,000 cash | 25000.00 | CASH | not required for cash | ON FILE FROZEN | |
| Multiple Ticket | $10,000 cash | 10000.00 | — | MISSING | File record | |
A record documents a prize but never restates it: its value must equal the configured value (R10). It freezes once a session opens on it.
Reserve check · drawings on 2026-11-06
Winners & fulfilment
Every winner arrives here as PENDING from the drawing session. Two terminal outcomes: delivered (AWARDED) or forfeited, which is the only thing that makes a redraw of that prize possible.
GET …/winners, POST …/winners/{id}/fulfilment, POST …/forfeiture, GET …/winner-register?format= · FULFILMENT_NOT_PENDINGWinners · 2026 Dream House Raffle
| Drawing | Prize | Draw number | Winner | Drawn | Status | |
|---|---|---|---|---|---|---|
| Early Bird | $25,000 cash | 2026-A-015002 | R. Nguyen, Olympia WA | 2026-09-18 19:26 PDT | PENDING |
Archives, retention & destruction requests
An archive passphrase is typed, used and forgotten: never stored, never shown again, unrecoverable. A destruction request needs expired retention and a completed archive, and someone else approves it (the Phase 1–2 approval screen).
POST …/archives, GET …/archives/{id}/content, GET …/retention, POST …/destructions · RETENTION_NOT_EXPIRED, ARCHIVE_REQUIREDRecords · 2023 Dream House Raffle
Retention
| Record class | Retain until | |
|---|---|---|
| TICKET_STUB_DETAIL | 2024-12-31 EXPIRED | Request destruction… |
| RAFFLE_RECORDS | 2027-06-30 | retained |
| Drawing reports, receipts, manifests, tax worksheets, event log | never destructible |
Home & record set (Auditor)
A WSGC auditor reads everything and changes nothing: no form on any Auditor page has a submit that writes. The record set composes figures from the modules that own them and states whether its ten identities hold.
GET …/record-set?format=, GET …/record-set/reconciliation, GET …/reports, GET /events · Auditor-cannot-mutate architecture testFigures
- Tickets issued / voided
- 24,118 / 37
- Gross receipts
- 3,212,450.00
- Prizes paid
- 25,000.00
- Net receipts
- 3,187,450.00
- Content hash
- e5c1…44a0
Identities 10 of 10 hold
| GROSS_RECEIPTS_BREAKOUT | HOLDS |
| NET_RECEIPTS | HOLDS |
| SERIES_INVENTORY | HOLDS |
| AMOUNT_PAID_CACHE_DRIFT | HOLDS |
| … 6 more | |
Also available
Report catalogue · drawing reports · counterfoil manifests · winner register · event log search · tax worksheet. All downloads, all read-only.