v1.16.0: admin platform
"Admin platform" release. The web admin grows three ways. A Vendors page adds CRUD over the canonical vendors table, which shipped without an admin path. A consolidation pass restyles the chrome, folds the warehouse-layout pages under a single Data tab strip, retires the admin Picking/Packing/Shipping mirrors in favor of the handheld scanner flow, widens the SO/PO detail popups, and adds an Item History view to the audit log. A purchase-order management surface makes line items editable, adds an ARCHIVED status and a status dropdown, exports a PO to CSV, and brings receiving onto the web with an inline per-line receive control. Migration 065 prunes the retired page keys.
Mobile. Zero mobile/ diffs on this release. The v1.14.0 mobile build (versionCode 8) remains current; no new APK for v1.16.0.
Added
- Vendors admin (#373): list / get / create / update / delete over the canonical
vendorstable, gated by a newvendorspage permission, with a Vendors page, sidebar entry, and Users-grid row.is_activedefaults to true on create; soft-archive viais_active=falseis the supported retire path. No migration -- the table already existed; theitems.vendor_idlinkage stays deferred. - Warehouse-data consolidation (#376): Warehouses / Bins / Zones / Preferred Bins fold under a single Data page with a tab strip; the old top-level paths redirect, and per-tab visibility honors the existing page permissions.
- Wide detail modals (#376): a Modal
sizeprop drives a wide variant; the SO/PO detail popups gain a 2-column header grid, titled sections, and a shared.lines-table. - Audit Item History (#376): the Audit Log opens on an Item History tab -- a SKU/item-name typeahead drives a per-item lifecycle view via a new
?item_idfilter matching both directITEMevents and rows whosedetailscarry theitem_id. The full feed stays under its own tab. - PO line editing + status lifecycle (#375): the PO Edit modal gains a status dropdown (replacing Close/Reopen), per-line editable quantities, per-line removal, and an Add Line row with a debounced SKU typeahead, live preview, and inline errors. Header fields lock while CLOSED/ARCHIVED; validation errors surface field-level detail in a sticky banner. Backend adds
POST/PATCH/DELETEline endpoints and PUT status transitions (ARCHIVED-from-CLOSED gate), each writing one audit row. - PO CSV export (#375): the PO detail popup exports SKU, Item Name, Ordered, Received, and Variance to
po_<number>_<date>.csv. - Inline web receiving (#375): the Receiving detail modal gains a per-line receive control (qty + bin, defaulting to the first Staging bin) posting to the existing
/receiving/receiveendpoint, refetching the PO on success. Hidden when the PO status is not OPEN/PARTIAL.
Changed
- Picking productivity metric (#376): the dashboard picking card now counts distinct orders picked (
COUNT(DISTINCT entity_id) WHERE entity_type='SO') instead of summed units. Card label flips from "units" to "orders". - Admin chrome legibility (#376): contrast, sizing, and font tweaks on the sidebar and topbar.
Removed
- Admin Picking / Packing / Shipping mirror pages (#376): retired. The floor workflow lives on the handheld scanners; the admin mirrors duplicated supervisor state without adding a control surface.
Migrations
- 065 (#376) -- prunes the retired
picking/packing/shippingpage keys fromuser_page_permissions.
See CHANGELOG.md for the full notes.