← All updates
Feature

Unit of Measure support — quantities in your preferred unit

Stock quantities are no longer locked to cartons. Whal now tracks every pallet in its product's base unit (typically bottles) and lets you view quantities in whichever unit makes sense for your workflow.

Display unit switcher

A new dropdown on the Stock, Outbound, Client Detail, and Portal Stock pages lets you flip between Bottle, Carton, Pallet, Drum, Keg, or Auto. Your choice is saved as a preference and applies everywhere until you change it. When a sub-label is useful (e.g. "50 carton (600 bottle)") you'll see both.

Per-product UOM setup

Products can now have a set of units with conversion factors — configured once, used everywhere. If a product doesn't have UOMs configured yet, Whal falls back to the legacy carton display so nothing breaks.

Unit picker on inbound, adjustments, and transfers

The stock initialisation walkthrough, adjustment form, and transfer form now include a unit picker next to the quantity field. The unit you choose is recorded on the movement for the audit trail.

Accurate excise calculations

Excise duty (LAL) is now computed from the base-unit quantity, removing an earlier assumption that all quantities were cartons. Bond-to-bond and duty-paid dispatches both benefit from the correction.

Warehouse map and portal

The slot detail panel on the warehouse map, the client portal stock view, and the cycle-count scope table all render through the new unit-aware display. The slot panel also now scrolls with the page on desktop so it stays visible while you browse tall rack layouts.

Backfill for existing data

A new script (scripts/backfill-base-qty.mjs) can populate base-unit quantities on pallets and movements created before this update. Run it with --dry-run first to preview, then for real. The reconciliation script (scripts/reconcile-ledger.mjs) now checks both the legacy and base-unit ledger columns.