Inventory
Purpose and who uses it
Restaurant MgrAccountantHotel ManagerOne list of everything the hotel keeps in store, with the suppliers who restock it.
Inventory tracks every consumable the hotel holds, kitchen ingredients, bar stock, linen, cleaning supplies, spare parts, stationery, grouped by department and category. Each item carries a quantity on hand, a unit and a reorder level. When the quantity falls to the reorder level the item turns amber; at zero it turns red, and the people who restock get a notification.
Inventory sits under the Payments permission module, so the Restaurant Manager, Accountant and managers work here; a Receptionist can look but not order. Kitchen sales reach stock automatically: when a POS ticket closes, the ingredients linked to each menu item are deducted.
Screen anatomy
Two tabs, Stock and Suppliers, with department cards, KPI tiles and a filterable table.
- 1TabsStock (the item table) and Suppliers (the directory). Below the page head, above the department cards.
- 7Department cardsAll departments plus one card per department with its item count. A red or amber badge on a card is the number of items needing attention. Click a card to filter.
- 2KPI tiles and category chipsItems tracked · Low stock · Out of stock · Perishable / tracked expiry · Pending POs. Clicking Low stock or Out of stock filters the table. Chips below switch category.
- 3Filter bar“Search item, category, supplier…” and a Stock level dropdown (Any stock level / In stock / Low stock / Out of stock). Clear resets all three.
- 4Item rowsItem (with “Expires …” when an expiry date is set), Department, Category, Supplier, In stock, Reorder at, a Level bar, and the Status badge.
- 5ReorderPer-row button (Edit access) that opens the purchase-order dialog with just that item ticked.
- 8Purchase orderPrimary action. Opens the dialog with every low or empty item pre-ticked.
Two extra cards appear when they have something to say: an amber banner , “N items need attention across all departments”: with a Reorder all button, and a Pending purchase orders card listing orders that are still on order, each with a Receive stock button. Selecting the Kitchen department also shows how many perishable ingredients have tracked expiry dates.
Creating a purchase order
Restaurant MgrAccountantTick the items, pick a supplier and delivery store, and the order is on its way with a PO- code.
- 1Open the dialogClick Purchase order in the page head (all low/empty items ticked), Reorder all on the amber banner, Reorder on one row, or Order N on a supplier.
- 2Tick the items to reorderThe “New purchase order, Restock items below their reorder level” dialog lists only items that are low or out of stock, each with its department tag and current quantity. Untick anything you do not want yet. If nothing is short you see “No items need reordering”.
- 3Choose Supplier and Deliver toSupplier defaults to Auto (from items), the first ticked item’s supplier is used. Deliver to offers Main Store, Kitchen Store or Bar Store. Expected date is optional.
- 4Click Create order (N)The order is created straight into On order with a PO-… code; the toast reads “PO-12 created (3 items)”. It appears in Pending purchase orders and on the supplier’s drawer.
Receiving stock
Restaurant MgrAccountantOne click books every outstanding quantity on the order into stock and records the movement.
- 1Find the orderStock tab → Pending purchase orders card, or Suppliers tab → open the supplier → Recent purchase orders.
- 2Click Receive stock (or Receive in the drawer)Every line that still has quantity outstanding is received in full. Each item’s quantity on hand goes up and a stock movement with reason receive and the PO code is written.
- 3The order becomes ReceivedToast: “PO-12 received into stock”. The KPI tiles, department badges and status badges refresh immediately.
Suppliers tab
A directory of suppliers with profiles, the items each one can deliver (with SKU, cost and lead time), stock health and recent orders.
The Suppliers tab opens with four tiles, Suppliers (active ones; the tile notes how many are inactive), Need an order (suppliers with at least one low or empty item), Open purchase orders and Items they cover: department chips, a Show inactive chip, the Add supplier button (Payments Edit), and a filter bar (“Search supplier, contact, category, item…” plus an Attention dropdown: Any status / Needs an order / Open purchase order / Inactive).
- Table columns: Supplier (with the contact name or “2 open POs” underneath), Category badge, Contact (phone and email are tap-to-call / mail-to links), Departments, Items (the number of connections), Stock (“3 out”, “2 low”, In stock, or a dash when the supplier is not primary for anything), Last order (or Never), and an Order N button when something is short.
- Inactive suppliers are hidden by default. Turn on Show inactive (or pick Inactive in the Attention dropdown) to list them; they carry an Inactive badge and no Order button.
- Supplier drawer: click a row. The header shows the name with an Active / Inactive badge and the category; the sub-line lists its departments (or “No stock items linked”). Inside: Contact, Phone, Email, Website, Payment terms and Lead time cards, Address and Notes when set, Linked items / Preferred / Need reorder counters, Recent purchase orders (up to eight, newest first, each with a status badge and a Receive button while open) and the Connections table. The footer offers Close and Order N items.
- Connections: one row per item the supplier can deliver, with the supplier's SKU, the last quoted unit cost, the lead time in days, the item's stock and status, and a Preferred badge where this supplier is the item's primary source. An item can be connected to several suppliers but has at most one preferred.
- 1Add supplierClick Add supplier above the filter bar. Name is required (2 to 80 characters); Category, Contact name, Phone, Email, Website, Address, Payment terms (type or pick a preset such as Net 30), Lead time in days (0 to 365) and Notes are optional. Save supplier creates it and opens its drawer.
- 2Edit the profileOpen the supplier and click Edit. The same form updates any field; clearing a field removes the value.
- 3Manage itemsIn the drawer, click Manage items. Every stock item is listed by department with a search box; tick an item to connect it and fill in Supplier SKU, Unit cost (whole currency units) and Lead time (days). Tick Preferred supplier to make this supplier the item’s primary source, which is what Order N and Auto (from items) use on purchase orders. Unticking an item removes the connection. The footer counts “14 items linked, 9 preferred”; Save connections replaces the supplier’s list.
- 4Deactivate or reactivateDeactivate (with a confirmation) hides the supplier from the directory and from the Supplier dropdown on new purchase orders. Its profile, connections and order history are kept, and Reactivate restores it.
Stock status, movements and expiry
Status is derived from quantity and reorder level every time the list loads, it is never stored.
- In stock → Low stock (qty ≤ reorder level)
- Low stock → Out of stock (qty reaches 0)
- Out of stock → In stock (receive PO)
- Low stock → In stock (receive PO)
- In stock: quantity above the reorder level. Low stock: at or below it. Out of stock: zero. The Level bar shows quantity against roughly one-and-a-half times the reorder level.
- Movements are written for every change:
receive(from a PO, referenced by its code),consume(a closed POS ticket) andadjust. The adjust movement is exposed by the API (PATCH/inventory/items/:id/adjust, Payments Edit) but there is no adjust button on this screen yet. There is no movement history screen either. - Low-stock notifications fire the moment a movement takes an item from above its reorder level to at or below it: “Tomatoes low stock, 4 kg remaining (reorder at 5)” or “Tomatoes out of stock, Reorder level reached. Create purchase order.” in the Operations category, linking to this page.
- POS recipes: each menu item may list the stock items and quantities it uses. When a ticket closes, those quantities are deducted (never below zero). If there is not enough on hand the sale still goes through and a “Stock short: …” notification asks the kitchen to count and adjust. Recipes are set per menu item through the menu API; there is no recipe editor screen in this version.
- Expiry: an item with an expiry date shows “Expires 2026-09-30” under its name, and the Perishable / tracked expiry tile counts items that carry a date. Nothing is auto-removed on expiry; the date is a reminder for the kitchen.
Purchase-order fields
What the New purchase order dialog asks for and what the server fills in.
| Field | Type | Notes |
|---|---|---|
| Items to reorder * | checkboxes | Only items currently Low stock or Out of stock. At least one, otherwise the toast “Select at least one item”. |
| Supplier | select | Auto (from items) uses the first ticked item’s supplier; or pick any supplier. Mixed-supplier orders show “Mixed suppliers” in the pending list when no supplier is set. |
| Deliver to | select | Main Store (default), Kitchen Store or Bar Store. Free text up to 120 characters on the API. |
| Expected date | date | Optional. Shown as “due 12 Sep 2026” on the supplier drawer. |
| Code | generated | PO-… from the hotel’s PO sequence (Settings → Numbering). |
| Lines | generated | One per ticked item; quantity = max(reorder level − on hand, reorder level). Quantity received starts at 0. |
| Field | Type | Notes |
|---|---|---|
| Name * | text | 2 to 80 characters, unique per hotel. A duplicate is refused with “A supplier with that name already exists”. |
| Category | select | Food & produce, Meat, fish & dairy, Beverages & bar, Housekeeping & amenities, Linen & textiles, Maintenance & parts, Office & stationery, Packaging & disposables, Services or Other. Shown as a badge in the table. |
| Contact name, Phone, Email, Website, Address | text | Optional. Email must be a valid address. Phone and email become tap-to-call / mail-to links; the website opens in a new tab. |
| Payment terms | text | Optional, up to 60 characters. Presets: Cash on delivery, Prepaid, Net 7, Net 14, Net 30, Net 60, Monthly account. |
| Lead time (days) | number | Optional, 0 to 365. The supplier’s typical days from order to delivery; a connection can carry its own lead time per item. |
| Notes | text | Optional, up to 1000 characters. Delivery days, minimum order, who to ask for. |
| Active | flag | Set by Deactivate / Reactivate in the drawer. Inactive suppliers are hidden by default and not offered on new purchase orders. |
| Field | Type | Notes |
|---|---|---|
| Item * | checkbox | Any stock item; each item at most once per supplier. |
| Supplier SKU | text | Optional, up to 60 characters. The supplier’s own code for the item. |
| Unit cost | number | Optional whole currency units (no decimals). The date it last changed is stored with the connection. |
| Lead time (days) | number | Optional, 0 to 365, per item. |
| Preferred supplier | checkbox | Makes this supplier the item’s primary source (its Supplier on the Stock tab) and un-prefers the item’s other suppliers. |
| Field | Type | Notes |
|---|---|---|
| Name, unit | Unique per hotel. Units are free text (kg, L, pcs…). | |
| Department, category | Department cards and category chips come from these. Categories are managed in Settings → Ops config. | |
| Supplier | Optional; the primary (preferred) supplier. Set from Manage items on the Suppliers tab. | |
| Qty, reorder level | decimal | Two decimals. Status is derived from these two numbers. |
| Expiry date | date | Optional. |
Permissions
Inventory follows the Payments module: View to look, Edit to order and receive.
| Role | Payments |
|---|---|
| Super Admin | Full |
| Hotel Manager | Full |
| Receptionist | View |
| Accountant | Full |
| Housekeeping Mgr | None |
| Maintenance | None |
| Restaurant Mgr | Edit |
| HR Manager | View |
| Security | None |
- View: summary, item list, suppliers and purchase orders.
- Edit: Purchase order, Reorder, Reorder all, Order N, Receive stock / Receive, and stock adjustments via the API. Menu-item recipes also need Payments Edit.
- Full: nothing extra on this screen.
Tips
Filters combine, department cards remember nothing, and the numbers are live.
Errors you may see
Every message the inventory API returns, and what to do about it.
One or more stock items not foundCannot receive PO in status receivedNothing left to receive on this POAdjustment would make quantity negativePurchase order not foundStock item not foundThe same stock item is listed twiceUnknown stock itemValidation failedSupplier not foundA supplier with that name already exists- Reorder level
- The quantity at which an item is flagged Low stock and included in Reorder all.
- PO
- Purchase order, a list of items and quantities requested from a supplier, coded PO-…
- Stock movement
- One dated change to an item’s quantity with a reason: receive, consume or adjust.
- Recipe
- The stock items and quantities a menu item consumes when its ticket closes.
- Connection
- A supplier-to-item link with the supplier’s SKU, last quoted unit cost and lead time.
- Preferred supplier
- The one connection per item that makes that supplier the item’s primary source on purchase orders.