Admin enters 4-digit PIN at the Kiosk → should redirect to Dashboard (or Event Service if event is live)
Expected: Redirected to correct page; name shown in menu
Staff enters PIN → should redirect to POS (or Event Service if event is live)
Expected: POS opens; admin-only pages locked
Invalid PIN entered
Expected: Error shown; no redirect
Session timeout after inactivity (default 60 min)
Expected: Logged out; redirected to Kiosk PIN screen
Navigate to Event Service on a day with a scheduled event
Expected: Event title, date, and check-in counts shown
Navigate to Event Service on a day with NO event
Expected: "No Event Today" empty state with link to POS
Check in a member from "Not Checked In" list
Expected: Moved to "Checked In"; count updates; toast confirms
Check in a guest via the guest dialog
Expected: Guest name appears in checked-in list; guest pass deducted if applicable
Tap a checked-in person → navigate to Sales
Expected: Sales page opens with that person selected as buyer
Navigate from Event Service → Sales → Corrections → Raffle → back to Event Service
Expected: All links work; no broken navigation
Low-keg indicator shows in summary bar when a tap is under 15%
Expected: ⚠ Low keg badge visible
Open Sales page with no person selected
Expected: "Start a Sale" prompt with "Select Person" button
Select a member from the person picker
Expected: Member name, photo, and token balance shown
Add a beer from tap list to cart
Expected: Item appears in cart with 1-token cost
Add a bottle for sale to cart
Expected: Item appears with correct token cost from settings
Checkout with sufficient tokens
Expected: Toast confirms; balance decreases; cart clears; keg volume deducted
Attempt checkout with insufficient tokens
Expected: Red warning "Need X more tokens"; checkout button disabled
Comp items from cart
Expected: Comp dialog opens; inventory deducted; no tokens charged
Empty cart → "Next Person" and "Event Service" quick actions visible
Expected: Buttons shown and functional
Change person with items in cart
Expected: Confirmation dialog warns about discarding cart
Buy tokens inline (cash / e-transfer)
Expected: Tokens added; balance updates; Sale + Transaction created
Member enters PIN and logs in
Expected: Drink menu shown; auto check-in to event if one exists
Browse available beers and liquors
Expected: Taps with keg info shown; stock percentages visible
Select drink → confirm pour
Expected: Pour processes; success screen shows new balance; auto-logout timer starts
Select a liquor with insufficient volume for a pour
Expected: Error toast: "Not enough [name] remaining"
Select a beer tap with no KegInstance
Expected: Error toast: "Tap X has no KegInstance. Ask staff."
Member with 0 tokens tries to pour
Expected: Pour blocked (buy tokens prompt or disabled)
Screensaver activates after idle timeout
Expected: Screensaver shows; tap to return to PIN screen
Open Corrections page and view today's drink transactions
Expected: Transactions listed with member, drink, time, bartender
Correct a drink pour (wrong member)
Expected: Tokens refunded to original; charged to correct member; audit log created
Correct a drink pour (cancelled / not poured)
Expected: Tokens refunded; keg volume restored; audit logged
Refund a sale (full refund)
Expected: Tokens removed; sale deleted; audit logged
Refund a sale (partial refund)
Expected: Proportional tokens removed; sale amount adjusted
Remove a comped drink
Expected: Comp record deleted; audit logged; warning about inventory not restored
View correction history
Expected: History dialog shows all corrections with summary stats
Already-corrected transaction shown dimmed with "Corrected" badge
Expected: Visual distinction clear
Open Reports page
Expected: Dashboard tab loads with customizable widgets
Search for a report by name
Expected: Filtered list shown; reports match query
Favorite/unfavorite a report
Expected: Star toggles; favorites persist across sessions
Apply date filter (7d, 30d, 90d, custom)
Expected: All charts and tables update to filtered range
Export a report to CSV
Expected: CSV downloads with correct columns and data
Open Event Profitability report
Expected: Events listed with revenue, expenses, net profit; "Tokens" column labeled as estimated
Open Shift Summary report
Expected: Shifts listed with hours, revenue, pours; expandable detail cards
Open Inventory Exceptions report
Expected: Critical/warning exceptions listed; integrity banner if critical issues
Open report with no data in selected range
Expected: Empty state shown (no crash)
Open Enhanced Low Stock report
Expected: Items sorted by stock %; depletion estimates with (est.) label
Select low-stock items and click "Create PO Draft"
Expected: PO Draft dialog opens with selected items pre-populated
Select a vendor
Expected: Vendor dropdown populated; auto-selects if all items share a supplier
Vendor mismatch (item linked to different supplier)
Expected: Amber warning banner shown listing mismatches
No vendors in system
Expected: "No active vendors" message; Create button disabled
Edit quantities/costs and create draft
Expected: PO created with status "draft"; toast confirms with PO number
Member logs in with PIN
Expected: Home dashboard shows: balance, next event, on-tap, recent activity
Tap "Activity" in bottom nav
Expected: Activity & History tab shows check-ins and raffle wins
Tap "View All" on recent activity
Expected: Navigates to Activity tab (not a dead link)
Browse Drinks tab
Expected: On-tap beers and liquor shelf shown
Browse Events tab
Expected: Upcoming events shown; RSVP button functional
More → Messages, Directory, Cigars, News, Raffles
Expected: All sub-views load without errors
Send tokens to another member
Expected: Transfer dialog works; balances update
Member with no recent activity
Expected: Recent activity section hidden; Activity tab shows empty state
Bottom nav renders and is tappable on mobile
Expected: All 5 tabs accessible; active indicator visible
No event scheduled today → Event Service page
Expected: "No Event Today" with link to POS
No vendors exist → Low Stock PO Draft
Expected: Warning text; Create button disabled
Report with no data in selected date range
Expected: Empty state or "No data" message (no crash)
Nearly empty keg (< 5%)
Expected: Critical badge on low-stock report; near-empty warning on exception report
Negative keg volume (data integrity issue)
Expected: Critical exception flagged; integrity banner shown
Transaction with null created_date in portal activity
Expected: No crash; graceful empty string for date
Member with no event check-ins or raffle wins → Portal Activity
Expected: "No activity yet" empty state
Double-tap checkout button
Expected: Only one checkout processed (lock guard active)