v3.5.5.041
Latest
29 May 2026
Bulk-import overhaul, variant-aware production, customer-confirmed delivery, and a 5× capacity boost
Receiving & Inventory
- One unified Bulk Import — a single CSV now lands a migration shipment, products, real per-box records, and optional skid placements in one upload. No more running Inventory then Storage as a two-step. Idempotent on re-runs.
- Bulk-imported boxes are auto-received on landing, so units appear as Available immediately instead of being stranded as "Expected".
- Bulk-imported skids now flow into Receiving → Put-Aways for manual placement verification, grouped by AWB — same model as live receiving.
- Brand filter on the box scanner now hides off-brand lines on a mixed box, with a clear "N other line(s) hidden — clear the filter to scan them" notice. Lines stay intact in the box until you switch filters.
Production & Stamps
- Variant-aware everywhere. Nicotine (mg) and volume (mL) now show as first-class columns on the Customer Requests inbox, the PO review screen, the Production Run allocation cards, the box-scan flavour picker, and the customer portal request form. No more guessing whether "Grape Ice" means 10mg or 20mg.
- The flavour picker now distinguishes "Variant mismatch" (same flavour, different nic/mL on the PO) from a genuine "Not on PO" — with a line explaining exactly which variant the customer ordered.
- Complete Skid → Add to existing or Create new. Operators with a small remainder can now top up an existing skid instead of wasting a slot. Damage / stamp accounting roll up correctly across the merge.
- Multi-select box transfer on the skid detail modal. Tick boxes, pick a destination + reason once, transfer the batch.
- Deleted skid numbers are reused — delete SK-XX-02 out of 1/2/3 and the next skid completes as 02, not 04.
- Box scan auto-pre-selects the last stamp region you used on this PO — production lines typically stamp one region at a time, this saves a click per box.
- Inline damage photo capture restored on the production scan form. Snap a photo while scanning instead of opening a separate modal for a common case.
- New Found Damaged column on the Verify PO screen, distinct from Damaged (during production) and Missing. Pre-existing damage no longer counts against the production line's variance.
Customer Portal
- Server-confirmed PO submission. The submit handler now waits for the server to confirm before showing success or generating the receipt PDF. No more "submitted!" toasts on writes that never reached the server.
- Customers can now specify a Requested Delivery Date and delivery details when submitting a PO. Surfaces on the admin Customer Requests inbox and the PO review screen so you no longer chase customers for delivery info.
- Production Orders page restructured into three sections — Shipments Awaiting PO · My Submitted Requests · Production History (a collapsible month-by-month accordion that combines completed requests + admin POs).
- Skid Breakdown export now embeds a full Damage Report with affected boxes, units by damage type, notes, and a photo gallery.
Compliance & Reporting
- Nova Scotia + custom stamp regions propagate everywhere — Stamp Orders, B600, customer portal request form — the moment you add them in Settings.
- Admin-defined product categories. Add "Nicotine Pouches", "Vape Juice", anything you need. Custom categories flow into every dropdown the moment they're saved; stampable / non-stampable flags carry through to inventory rollups.
- Total Litres calc fixed: case- and plural-insensitive category matching so "Disposable" and "Disposables" both count, and custom stampable categories are litre-bearing by default.
- Stamping Summary PDF column widths reworked so the flavour column no longer overlaps the stamp type.
- Customer-facing surfaces no longer leak admin / warehouse staff names — four leak points patched across PO updates, request history, timelines, and damage records.
Operations & Reliability
- 5× capacity boost. Large shipments — hundreds or thousands of boxes — now fit comfortably. Transparent gzip compression of large records in the storage layer raised the effective per-shipment ceiling from ~400 KB to several megabytes of raw data, with zero changes required in the app.
- Cold-boot resilience: a stuck write can no longer hang login. Permanently-failing writes are now parked to a dead-letter queue after a few retries, server-side size violations return a clear 413 (drop, don't retry), and the boot drain is hard-bounded so Auth always resolves.
- Queue persistence: writes made just before a refresh or tab close survive in
localStorageand replay on next load — no lost POs from a closed tab. - New 4 × 2 landscape option on the skid allocation label printer, alongside the existing portrait + square sizes.
Fixes
- Nav alert badges populate on first login instead of waiting for a manual refresh.
- Build Skid no longer needs a page reload after a fast double-action — saves now await durably before re-render.
- Brand truncation on the box-scan flavour dropdown — long brand names no longer clip the flavour.
- Reupload Documents on a re-parsed shipment no longer 500s on the blob path.
- "Shipment not found" when saving a damage report from production scan is replaced with a box-number recovery + clearer error including the shipmentId for support.
- iPad portrait UI: sidebar collapses to a drawer at <1024px and tables scroll cleanly inside their cards. AWB cards no longer disappear behind the sidebar.
