What is held, where, and how it got there.
The rule the whole thing rests on
There is no "quantity on hand" box anywhere. Stock is the sum of the movements: opening + received − issued ± transfers. A stored balance and a list of movements are two numbers for one fact, and they part company the first time somebody edits one of them — after which nobody can say which is right.
So when the shelf disagrees with the books, the answer is not to correct the number. It is to record a stock take: the counted quantity, the date, and whoever counted. What is written on the ledger is the difference it made, so the books still explain, line by line, how the stock got to where it is. A count that agrees is recorded too — knowing that somebody looked is worth something.
Stores
A store is where material sits. Most belong to a site; the main store or yard belongs to none, because material usually arrives centrally and is sent out from there. A new project gets a store of its own automatically.
The catalogue (Stock → Materials)
Everything that can be held: code, name, specification, category and unit. The unit lives here and nowhere else — choosing the material on a movement sheet chooses the unit with it. Once quantities have been recorded in a unit it cannot be changed; retire the item and add a new one instead.
Loading it from a spreadsheet. Upload an .xlsx and the columns are matched by their headings, in any order: Material or Description (needed), plus Code, Specification, Category, Unit, Opening stock, Reorder level, Store and Remarks. You see what it read before anything is written. Opening quantities go in as movements, not as a typed balance; tick these are counted quantities and they go in as a stock take instead.
Transfers between sites
A transfer is two lines with one reference. It leaves the sending store at once and reaches the receiving store when somebody there confirms it arrived. While it is on the lorry it belongs to neither store — which is why two sites can no longer both count the same steel and both decide they have enough. Transfers recorded on a movement report behave exactly the same way.
Running out, and below zero
Set a reorder level per material, or per material per store, and anything under it appears in Running out — on the stock page, on the site's board and on the All sites page.
A balance below zero gets its own warning. A store cannot hold less than nothing, so a negative figure is not a quantity: it is a delivery nobody wrote down. Record the missed receipt, or count the shelf and let the stock take put it right.