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 (gh#513)
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-gh#513) 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 (gh#514)
The receipt parser was earlier under-counting MU quantity (CAFISSIMO 2 MU parsed as 1) — a column-deterministic reconcile fix in gh#514 corrects this. If you still see under-counts, file a bug report.
Cash-gating the city-tax photo (gh#512)
City-tax payments collected in cash carry a photo of the cash being counted. Pre-gh#512, any photo + the keyword "city tax" was treated as completing the cash-photo task — even a photo of the receipt itself.
After gh#512:
- 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 (gh#479).
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.
Implements: gh#513 (in-app receipt viewer), gh#514 (MU column reconcile), gh#512 (cash-gated city-tax photo auto-complete). Related: gh#515 (pack-size expansion), gh#479 (reprocess flow).