- Shipped
- September 11, 2026 at 6:50 PM UTC
- Author
- Kamo
- Commit
- 072ca5f
The console's Organizations tab now splits into Active and Void sub-tabs. A voided organization is orgs.is_active = FALSE (set by SecurityService's void endpoint); the directory is the one place still listing one — on the Void tab, so an operator can find it to restore. - GET /api/billing/platform/orgs takes status=void; anything else, including no status, lists live orgs only. Every older caller — the commerce wizard's target-org search among them — asks with no status, so none of them can be shown an organization that no longer exists. - Rows carry voided, voidedAt, voidedByUserId and a hydrated voidedByName (one batched lookup, only when the page has voided rows). - Aggregates follow the tab, and add activeOrgs / voidedOrgs, which ignore the tab (both tabs need both numbers) while honouring every other filter. - Sub-org counts leave out voided children. - The nightly storage snapshot and the platform storage report skip voided orgs; history is kept and the writer's gap handling catches a restored org up. Verified the generated statements read-only against the live database: Active 40 rows / counts 40 + 0, Void 0 rows.