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.

Permissions

You need stock_on_hand.view (or to be a super administrator) to see this page. Nav group: Inventory, labelled "Stock on hand" in the sidebar.

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.

Screenshot placeholderThe Stock on Hand list: a Warehouse filter above the table, and columns Product code, Product, Location, Warehouse, Qty on hand, Qty reserved, Qty available — no row actions.

Columns

ColumnShows
product.codeLabelled Product code. Shown as a badge, searchable.
product.nameLabelled Product. Searchable.
location.location_nameLabelled Location — the specific stock location within a warehouse (e.g. its main stock or attached stock).
location.warehouse.nameLabelled Warehouse — the warehouse that location belongs to.
qty_on_handThe total quantity physically held at this location. Numeric, sortable.
qty_reservedThe portion of qty_on_hand already committed to confirmed sale orders — set aside so it cannot be double-promised to another customer.
qty_availableA 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 vs. reserved vs. available

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

FilterWhat it narrows
WarehouseA 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:

  1. 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_available and into qty_reserved here.

  2. 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_hand altogether once the stock actually leaves the building.

  3. 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