Skip to content

Pending Review queue

When the AI reads a delivery photo and is sure about every line, the receipt confirms itself and stock moves immediately. When it isn’t sure about something — a product name the venue hasn’t seen before, a pack that doesn’t match a known supplier product, a price that drifted far from history — the receipt doesn’t move stock. It lands in Pending Review with a one-line summary and waits for a human to finish the job.

This page is about that queue: what lives in it, what to do with each item, and why it exists as a separate step between scan and stock moves.

Why this page exists

Stock numbers feed three things at once — the dish costs that govern menu pricing, the reorder list that tells the chef what to buy tomorrow, the till deductions when a dish is sold. A wrong stock movement contaminates all three. So when the AI isn’t confident, the safe answer is to pause before stock moves, not to push through a guess.

The queue is also where the venue grows its supplier catalogue. The first time a supplier sends Mauro Bio Tomato 1 kg punnet, the system doesn’t know what that pack is. A human has to point at the right pantry row, confirm the pack, set the price. The next time that same product arrives, the AI recognises it and auto-confirms. The queue is the place where one minute of human attention turns a new product into a known one for the rest of the year.

The rule

The AI never moves stock on a line it isn’t sure about. Anything uncertain goes to Pending Review and waits. The operator opens it, fixes the unclear lines, confirms — and the same final step that the auto-confirm path uses moves stock from there.

How to use it

Open /admin/receiving. The row of tabs at the top includes Pending Review with a small count badge. Tap it. Each row in the list shows the supplier the AI thinks it saw, the invoice number, the line count, and when it was scanned. Tap Open on any row.

The triage dialog shows the photo on the left and an action panel on the right. What the panel offers depends on what the AI tried to do:

  • Low PO confidence (amber badge). The AI found a possible PO match but the score wasn’t high enough to auto-confirm. The suggested PO is at the top with its lines pre-filled. Each line has a tick (include / exclude), a quantity (pre-filled from the scan), and a unit price (pre-filled). Adjust anything the AI got wrong, untick lines that aren’t on this delivery, tap Receive against PO-… at the bottom right. If the suggested PO is the wrong one, scroll to the bottom panel Wrong PO — was a phone / ad-hoc order?, pick the real supplier from the dropdown, tap Reclassify to ad-hoc — the row flips to the ad-hoc flow.

  • Ad-hoc delivery (amber badge). No open PO matched, but the supplier is recognised. Typical case: a phone order the chef placed but never wrote up. The dialog shows the supplier (defaulted to the AI’s guess, editable), the currency, and the line table. For each line:

    • Description is what the AI read; you can edit it.
    • Inventory item is a search box — start typing to filter instead of scrolling. It only shows items that already belong to the supplier you picked (see the rule below). If it’s a one-off you don’t want to track, leave it unlinked.
    • Quantity / Unit / Unit price are all editable.

    Tick the lines you want to include, untick anything that’s noise (page totals, VAT lines), tap Confirm ad-hoc receipt. The system creates a synthetic PO behind the scenes, runs receiving against it, and updates stock for any line you linked to a pantry row.

    The rule: an item’s cost belongs to the supplier you actually buy it from. The item search only ever offers items already filed under the delivering supplier — so a clam from your seafood supplier can only ever be matched to that supplier’s clam, never accidentally to a different supplier’s row whose cost would then be overwritten.

    When the delivered item isn’t in your list yet — say your seafood supplier drops off peeled squid for the first time — it won’t be in the box, because you’ve never bought it from them before. Choose + Add “Squid” to at the top of the list. A small form opens right on the line: pick a category and a unit (kilograms, grams, litres, millilitres, or piece), then Create & link. The new item is created already filed under that supplier and linked to the line, so its quantity and price flow straight into stock when you confirm.

If the row is obviously junk — a duplicate scan that slipped through, a photo of the wrong document — tap Dismiss at the bottom. The photos stay on the scanned-receipt record (you can always find them again if needed) but the row leaves the queue.

What happens behind the scenes

The triage step is a wrapper around the same final confirmation that the manual receive flow uses. When you tap Receive against PO-… or Confirm ad-hoc receipt, the system walks the lines, finds the pantry row each line points at, adds the quantity to stock, stamps the unit price as the row’s new Last purchase price, and fires the recipe cascade. Every recipe that uses the received ingredients picks up the fresh cost; every menu item built on those recipes refreshes its food-cost percentage on the morning dashboard.

The only difference between the two confirm buttons is which PO the system credits the lines against:

  • Linked-to-PO confirm uses the existing PO you picked. The PO transitions to Received or Partially Received the same way it would after a manual receive.
  • Ad-hoc confirm synthesises a fresh PO marked as originating from a scan, so reports can tell planned from unplanned deliveries.

Either way, once the receipt is confirmed the row leaves the queue and stops appearing in Pending Review. The photos stay attached to the PO record for the audit trail.

If a new supplier product is created during ad-hoc triage — a new pack that the supplier sells which the venue hadn’t seen before — it’s added to the supplier’s catalogue with the pack size and the price you confirmed. The next time the same product arrives, the AI recognises it and the receipt auto-confirms without ever visiting this queue.

Worked example — Thursday’s mixed vegetables

It’s Thursday morning at your venue. The vegetable delivery comes in with six lines. Sara, the line cook, opens /admin/receiving on her phone, taps Scan-first, photographs the delivery note, taps Scan. The AI returns the six lines and matches the supplier — it’s the regular produce supplier the kitchen orders from twice a week.

Five of the six lines confirm automatically. Tomatoes, basil, potatoes, onions and garlic all match known supplier products at expected prices, so stock moves immediately for those.

The sixth line is different. The supplier wrote Mauro Bio Tomato 1 kg punnet — a small biodynamic line they piloted with the venue this week as a side offering, separate from the bulk tomatoes. The system has Tomato, fresh in the pantry, but no supplier product called “Mauro Bio Tomato 1 kg punnet” — that pack is new. The AI doesn’t move stock on it. The receipt lands in Pending Review with one line waiting.

Sara taps Pending Review, opens the receipt. The five auto-confirmed lines are at the top, greyed out, showing Already received. The sixth line is in the editable panel. She picks Tomato, fresh from the inventory dropdown — that’s the pantry row the punnets should add to. She confirms the pack details: 1 kg punnet, €4.50/kg, 4 punnets on this delivery. She taps Confirm ad-hoc receipt for the remaining line.

Stock for Tomato, fresh goes up by 4 kg. The Mauro Bio Tomato pack is added to the produce supplier’s catalogue with its size and price. The receipt leaves the queue. Next Thursday, when the same punnets arrive, the AI recognises the pack name and the line confirms itself — no triage step needed.

Total time on the triage screen: under a minute. The catalogue is one product richer for the next year of deliveries.