Inventory
Stock by warehouse, zone, and bin on an append-only movement ledger. Transfers, picking, cycle counts, adjustments, and quarantine — every move keeps its reason and its author.
- Append-only stock-movement ledger
- Stock balance by warehouse and bin
- Transfers, picking, cycle counts
- A reason code on every adjustment line
Every change to stock is a row appended to one ledger. Nothing is updated in place and nothing is deleted, so the balance you see is the sum of movements you can read — not a number someone edited.
What is in it
- Stock balance down to warehouse, zone, and bin
- Transfers between locations, and picking lists that feed delivery
- Cycle counts by zone, bin, or product category, with variance approval
- Adjustments that require a reason code on every line
- Quarantine zones that no sale can allocate from
Only the Inventory module may write a stock movement. Sales, Procurement, and the packs all go through it, which is why the ledger and the on-hand figure never disagree.
How Inventory fits the rest of the system
Bounded
The module owns its tables and its service interface. Other modules reach in only through services and async events — never SQL.
Test-vector verified
Every domain rule has two implementations — Dart and Java — and a single shared test vector. CI fails on any divergence.
Audit-logged
Every command writes an entry to the append-only audit log with a chain hash. The daily verifier proves the log has not been tampered with.