On this page
For storekeepers, store managers, chefs and bar managers. Inventory
(/inventory) shows one location at a time: what is on hand, reserved for
approved requisitions, available, the thresholds, the average cost and the
value. Click an ingredient for its page: every location, every batch, the
ledger and where did it go.
Locations
Nine kinds: Warehouse (business-wide, feeds the stores), Main store, Kitchen store, Bar store, Coffee store, Cold room, Freezer, Branch store and Custom. Each location decides how it issues stock:
| Setting | Meaning |
|---|---|
| FIFO | the oldest receipt goes out first (dry goods) |
| FEFO | the batch that expires first goes out first (cold room, freezer, dairy) |
| Track batches | every receipt is a batch with its cost, lot and expiry (off for loose bins) |
| Allow negative stock | issues may exceed what is on hand (otherwise refused with what is available) |
| Default store | where the branch’s sales consume stock when no department store matches |
Managers create locations, suppliers, units and conversions under
Inventory → Setup (/inventory/setup).
Units
kg, g, litre, ml, bottle, crate, carton, pack, piece, portion, tray and your own. A conversion says how they relate for one item or for everything: 1 crate = 24 bottles (Nile Special), 1 tray = 30 each (Eggs), 1 bottle = 500 ml (Mineral water). Enter stock in whatever unit the delivery came in; the ledger keeps both the entered quantity and the stock unit.
Operations
| Operation | Does | Needs |
|---|---|---|
| Receive | from a supplier: quantity, unit, unit cost, supplier, batch no. (auto if blank), lot, expiry | inventory.receive |
| Issue | out of the store to a department / cost centre (batches FIFO / FEFO, or pick one) | inventory.issue |
| Transfer | to another location in one step; batches keep their cost, lot and expiry | inventory.issue |
| Adjust | + found / − lost, at average cost; reason required | inventory.adjust |
| Waste · Damage · Expiry · Write-off | stock lost; reason required | inventory.adjust |
| Return (in) | back into the store (from the kitchen, a cancelled issue) | inventory.receive |
| Return to supplier | out, to the supplier | inventory.issue |
| Count | see Counts below | inventory.count to post |
Above the business limit (default 500,000 in value) waste, damage, expiry,
write-off and adjustments need a supervisor: anyone with
approvals.decide posts directly, otherwise the screen asks a supervisor
for employee number + PIN. The approver is written on the movement and in
the audit trail.
An issue that would go below what is available is refused: “Only 3 kg of Sugar available at Kitchen Store”. Reserved stock (approved requisitions) is not available to anyone else.
Batches & expiry
The item page lists open batches with what is left, when they expire and what they cost. Expired batches are flagged (the nightly sweep marks them); Write off posts the remainder as expiry. A count that finds less than the book stock empties the oldest batches first.
Thresholds & alerts
Per location and ingredient: minimum (warning), reorder level and
reorder quantity (a low-stock notification to everyone with
inventory.view in the branch, once a day), maximum. Set them from the
item page (inventory.manage).
The ledger
Every movement is a row you can read: when, kind, quantity, batch, cost, value, balance after, reason, who. Nothing is edited or deleted — a mistake is corrected by the opposite movement.
Counts (/inventory/counts)
Start a count at a location — full (every ingredient) or cycle
(the ingredients you pick). The sheet shows the expected quantity at the
moment the count started; enter what you find (Enter or Tab saves the
line). Submit hands it to the person who posts; Post
(inventory.count) compares each counted line with the stock right now
and writes the difference as a count movement — shortfalls and surpluses
appear on the ledger and in the variance report. One open count per
location; posted counts are final.
Offline
Stock screens need the server: they show what they last loaded and refuse operations while offline (an issue that “succeeded” on a dead connection would not have locked anything). Sales keep working offline; their consumption is deducted when the sale reaches the server.