← back to index

V0.5 — Bulk Delete + Deactivate on Cashiers + RegistersPROD

Narong's Telegram, 2026-05-29 evening (right after Item #3l ship): "mass remove the cashiers as well" + Karou's clarification + "we already have deactivate/activate so im assuming its same as archive — so we can just add delete." Extends V0.3's bulk-archive pattern to two more surfaces (Team>Cashiers + Configurations>Registers), with hard-delete enabled per-row + bulk when the row has 0 sales attributed AND no active session. Decisions locked WITHOUT Narong by Karou's Q1-Q4 answers.

Summary

Status
14/14 prod · 51/51 regression = 65/65 · shipped
Commit
nix-cafe d4b1edb
Files
7 modified + 1 new · ~1180 LOC · no migration
Eligibility
Cashier deletable iff salesCount === 0 && !inActiveSession (R8.4 active_session_token IS NULL). Register deletable iff salesCount === 0 && !hasOpenSession

What ships

14/14 prod checks

Pre-flight: clean any V0_5 pollution from prior runs
Seed 3 cashiers on lumiere: clean / in-active-session (active_session_token=uuid) / with-sales (throwaway order attributed via cashier_pin_id)
SSO login
/cafe/team Cashiers tab renders with checkbox column + per-row state: clean Delete enabled, sales+session Delete disabled with reason tooltip, "1 sale" badge under sales cashier name
Select all 3 + Bulk Delete → confirm dialog refuses with blocked surface: lists 2 ineligible (1 in_session, 1 has_sales "1 sale") + no Confirm button shown (Q2-C — must deselect first)
Click "Deselect ineligible" → dialog closes + selection narrows to 1 (clean only)
Bulk Delete (eligible-only) → confirm dialog with single-row breakdown → Confirm → success → DB verifies: clean GONE, sales + session STILL THERE (refused-correctly check)
Bulk Deactivate the 2 ineligible (always succeeds — no eligibility check) → DB confirms is_active=false on both
Seed 2 registers: clean + with-open-session
/cafe/pos/registers shows new registers with correct eligibility — clean Delete enabled, open-session Delete disabled
Bulk Delete clean register → confirm → DB verifies: clean GONE, open-session STILL THERE
Audit log: 3 expected actions written (cashiers.bulk_deleted + cashiers.bulk_deactivated + registers.bulk_deleted) within last 5 min for lumiere tenant
Cleanup test pollution (cashiers + sessions + order + remaining register)
No 5xx during the suite

Screenshots (click to enlarge)

Mid-Gate finds

Regression sweep — 51/51

14/14 + 51/51 = 65/65 prod tests green on the karouna-dev branch.
test-phase1-prod.mjs11/11
test-phase2-sso-outdoor-prod.mjs6/6
test-m1-prod.mjs10/10
test-r7-prod.mjs14/14
test-r8-prod.mjs4/4
test-phase2-cafe-multishop-prod.mjs6/6