Receipt ingestion
Operator uploads a receipt (PDF / photo / scan). The platform parses it, expands packs into base units (per Pack Sizes), and adds to the right supply rows.
Upload
Operations → Supplies → + RECEIPT → file picker. Accepts PDF, JPG, PNG, HEIC.
After upload:
- The file lands in storage.
- The LLM parser extracts line items, quantities, total.
- Each line is mapped to a supply (canonicalized product name).
- For pack lines, the pack-size lookup applies (see below).
- Stock-adds are batched into one preview screen for operator confirmation.
Preview screen
Before any stock is mutated, the operator sees:
- The original receipt (rendered inline — see below)
- Per-line:
product → supply · packs × N · ⇒ M base units added - Flags:
[pack size unknown],[LLM low-confidence],[over-quantity warning] - A Confirm & apply button
Operator can edit any line before confirming. After confirm, stock is mutated + the receipt row is marked applied.
In-app receipt viewer
The receipt preview opens inside the V28 app — no target=_blank to a Chrome-jail tab the cleaner can't get back from.
The viewer supports:
- Pan + zoom on photos
- Page nav on PDFs
- Close → returns to the Supplies screen with state preserved
Earlier (pre- the receipt opened in a new browser tab with no close button — operator was forced to use browser-back or close-tab. The in-app viewer fixes that.
MU column reconciliation
The receipt parser was earlier under-counting MU quantity (CAFISSIMO 2 MU parsed as 1) — a column-deterministic reconcile fix in
Cash-gating the city-tax photo
City-tax payments collected in cash carry a photo of the cash being counted. Pre-
:
- The auto-complete checks the photo content (LLM vision pass) for actual cash visible.
- Phantom completions (e.g. a receipt photo accidentally satisfying the cash-photo gate) no longer happen.
Reprocessing a receipt
If a receipt was processed with bad data (wrong pack size, wrong product mapping, missing mapping that's now added), open the receipt row → Reprocess.
Reprocess:
- Reverts the receipt's previous stock-adds (creates compensating rows).
- Re-parses with current mappings + current pack sizes.
- Re-applies the new stock-adds.
- Logs the reprocess in the receipt's history.
Stock totals end at the right number.