Stock on Hand Built
A read-only, location-by-location view of how much of every product you physically hold, how much of it is already promised to confirmed orders, and how much is genuinely free to sell.
Each row is one product at one stock location — a warehouse can have several locations (main stock, attached stock, loose stock, and so on; see Warehouses), and this list shows the balance at each of them separately rather than one total per warehouse.
Columns
| Column | Shows |
|---|---|
product.code | Labelled Product code. Shown as a badge, searchable. |
product.name | Labelled Product. Searchable. |
location.location_name | Labelled Location — the specific stock location within a warehouse (e.g. its main stock or attached stock). |
location.warehouse.name | Labelled Warehouse — the warehouse that location belongs to. |
qty_on_hand | The total quantity physically held at this location. Numeric, sortable. |
qty_reserved | The portion of qty_on_hand already committed to confirmed sale orders — set aside so it cannot be double-promised to another customer. |
qty_available | A computed column — not a stored database field — equal to qty_on_hand − qty_reserved. This is the quantity genuinely free to reserve against a new order right now. Because it is computed on the fly, it cannot be sorted or searched. |
On hand is what is physically on the shelf. Reserved is the slice of that already earmarked for orders that have been confirmed but not yet despatched — it is not free to give to anyone else. Available is what's left over: the number you should trust when deciding whether a new order can be fulfilled without a backorder.
Filters
| Filter | What it narrows |
|---|---|
| Warehouse | A drop-down listing every warehouse by name. Because StockOnHand rows don't carry a direct warehouse column, this filter works via each row's location relationship (whereHas('location', …)) — pick a warehouse to see only the locations that belong to it. |
There is no State filter here — stock on hand is a running balance, not a state machine. Default sort is by id; use the column header to sort by quantity instead.
How quantity moves from available into reserved
You cannot reserve or release stock from this screen — it is entirely read-only. Reservation happens automatically as a sale order progresses through its own lifecycle:
- A sale order's lines are confirmed
Once an order moves past its early draft stages, the system creates stock moves for its lines and reserves the matching quantity at the warehouse location assigned to fulfil it — moving that quantity out of
qty_availableand intoqty_reservedhere. - The order is packed and despatched
As its picking wave progresses (see Picking Waves), the reserved quantity is picked and shipped, eventually leaving
qty_on_handaltogether once the stock actually leaves the building. - A cancelled or suspended order releases its reservation
If an order or its stock moves are cancelled instead, the reserved quantity returns to
qty_available.
None of these transitions happen from a button on this page — see Sale Orders for the order-side actions the console does expose, and Schedulers for the background processing that keeps reservations in step with order state.
Related pages
- Products — what each product code and name refers to, its type and price.
- Closing Stock — the physical count workflow that corrects
qty_on_handwhen it drifts from reality. - Warehouses — the warehouses and stock locations this list's rows belong to.