Supplies

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:

  1. The file lands in storage.
  2. The LLM parser extracts line items, quantities, total.
  3. Each line is mapped to a supply (canonicalized product name).
  4. For pack lines, the pack-size lookup applies (see below).
  5. 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:

  1. Reverts the receipt's previous stock-adds (creates compensating rows).
  2. Re-parses with current mappings + current pack sizes.
  3. Re-applies the new stock-adds.
  4. 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).

Source: the FlatsBratislava operator manual.