Click New Bill Received — see the right decision for the state.
Three live scenarios. Each New Bill Received button below actually triggers the AI parse simulation and opens the correct modal for the state it's in — clean bill, bill with items, or a PO that already has items. No per-row sparkle clutter: provenance sits once, underneath the set AI populated.
A freshly-created Bill with nothing on it. The New Bill Received button parses the supplier invoice and auto-fills every line item, because there's nothing to conflict with. Modal shows the extracted items for a quick sanity-check before confirmation.
| Type | Cost Code | Category | Inventory Code | Description | Qty | Unit Price |
|---|---|---|---|---|---|---|
| No line items on this Bill yet — drop a supplier invoice or click New Bill Received to populate. | ||||||
Same Bill page, different state — 3 items already entered by the tech. The New Bill Received button won't destructively overwrite. AI asks: merge the new items in, replace the existing ones, or just attach the file without parsing.
| Type | Cost Code | Category | Inventory Code | Description | Qty | Unit Price |
|---|---|---|---|---|---|---|
| Product | Select category | L&CCLCM25-M25 | Flex Conduit | 1.00 | 6.21 | |
| Product | Select category | L&CCLCM20-M20 | Flex Conduit | 1.00 | 4.33 | |
| Product | Select category | CLI264/3SMgry | Conduit Reducer | 2.00 | 2.76 |
Golden rule: drop a document on a PO and it's always a supplier quote — never an invoice, never a new Bill. The drop updates the PO itself (pricing, authorised items, outstanding quantities). If you want to create a Bill from a supplier invoice, click New Bill Received on the Supplier Bills card below — that's an explicit action with a confirmation modal. PO drops default-parse (no modal); supplier-match check runs only when you choose to Parse. Use + Add File to attach without parsing.
| # | Code | Description | Qty | Rcvd | Unit $ | Total |
|---|---|---|---|---|---|---|
| 1 | CLI264/3SMgry | Conduit Reducer Third-Third M25-M20 | 2 | 2 ✓ | $2.76 | $5.52 |
| 2 | L&CCLCM20-M20 | Flex Conduit Gland 20mm M20 | 4 | 4 ✓ | $4.33 | $17.32 |
| 3 | L&CCLCM25-M25 | Flex Conduit Gland 25mm M25 | 4 | 4 ✓ | $6.21 | $24.84 |
| 4 | MCB-16A | 16A MCB Circuit Breaker — Single Pole | 6 | 0 / 6 | $12.50 | $75.00 |
| 5 | CAB-2.5CU | 2.5mm² Copper Cable (per metre) | 50 m | 0 / 50 | $3.20 | $160.00 |
| 6 | ISO-25A | 25A Isolator Switch — IP66 | 2 | 0 / 2 | $45.00 | $90.00 |
| 7 | SOCK-DOUB | Double GPO Socket — White | 12 | 0 / 12 | $8.75 | $105.00 |
| 8 | JBOX-IP66 | IP66 Junction Box | 4 | 0 / 4 | $12.00 | $48.00 |
| Bill # | Supplier Inv # | Date | Status | Total (inc GST) | Billed vs PO | |
|---|---|---|---|---|---|---|
| BILL-2026-036 | — | 2026-04-23 | Draft | Not yet imported | ↗ Open | |
| BILL-2026-035 | — | 2026-04-23 | Approved | Not yet imported | ↗ Open | |
| BILL-2026-034 | — | 2026-04-23 | Draft | Not yet imported | ↗ Open |
Step C created the new Bill and linked it to the PO. This is where the user lands next — a side-by-side diff of the PO and the supplier invoice. AI does the line-item matching; the user confirms. Outstanding items (on the PO but not on this invoice) are flagged in red so they stay visible for the next supplier bill. Pattern borrowed from the real fi-supplier-po reconciliation view.
| # | Code | Description | Ord | Rcvd | Unit $ |
|---|---|---|---|---|---|
| 1 | CLI264/3SMgry | Conduit Reducer Third-Third M… | 2 | 2 ✓ | $2.76 |
| 2 | L&CCLCM20-M20 | Flex Conduit Gland Straight 2… | 1 | 1 ✓ | $4.33 |
| 3 | L&CCLCM25-M25 | Flex Conduit Gland Straight 2… | 1 | 1 ✓ | $6.21 |
| 4 | QSW-SVC | Repairs to Rear Bogie Cracks… | 1 | 0 / 1 | $585.00 |
| Not on this invoice — outstanding | |||||
| 5 | BF30-610618 | Die Crobed Filler 610x610X50… | -4 | -4 | $30.80 |
| Not on this invoice — outstanding | |||||
| # | Code | Description | Bill Qty | Price | GST | GST $ | Total | |
|---|---|---|---|---|---|---|---|---|
| 1 | CLI264/3SMgry | Conduit Reducer Third-Third M… | 2 | $2.76 | Ex GST | 0.55 | $5.51 | |
| 2 | L&CCLCM20-M20 | Flex Conduit Gland 20mm M20… | 1 | $4.33 | Ex GST | 0.43 | $4.33 | |
| 3 | L&CCLCM25-M25 | Flex Conduit Gland 25mm M25… | 1 | $6.21 | Ex GST | 0.62 | $6.21 |
Real-world case: the user drags multiple PDFs at once, or attaches files over time. Having 3 files on a Bill is a valid state — not an error. Alfred asks the user to pick one to parse into line items; the others stay attached for reference (or to parse later if the right items are in a different file). Each attachment has its own Extract Line Items trigger. Parsing a second file from the same supplier opens a Merge / Replace / Cancel modal (like Case B). Parsing a file from a different supplier opens a stricter warning — a Bill can only reconcile against one supplier, so merging isn't offered; only Replace or Cancel.
| Type | Cost Code | Category | Inventory Code | Description | Qty | Unit Price |
|---|---|---|---|---|---|---|
| No line items on this Bill yet — click Extract Line Items on any attachment below. | ||||||
A PO is created from a job's materials forecast, but no supplier quote has been accepted yet. Empty PO is a valid transient state. The drop-zone is the star; the Supplier Bills card is greyed out until authorised items exist. Drop a supplier quote to populate the authorised line items for the first time.
Mid-project reality: half the authorised items have been delivered and billed, half haven't. Alfred shows which items are fulfilled (green tick) and which are outstanding (red amber). A Partial chip in the header signals the PO isn't closed yet. Dropping a revised supplier quote here refreshes pricing / adds new line items — it never creates a Bill. Bills still come in through the New Bill Received button on the Supplier Bills card; each billed line ticks off the Rcvd column.
| # | Code | Description | Qty | Rcvd | Unit $ | Total |
|---|---|---|---|---|---|---|
| 1 | DRILL-18V | 18V Cordless Drill Driver — Brushless | 2 | 2 ✓ | $189.00 | $378.00 |
| 2 | BATT-18V-5AH | 18V 5Ah Battery Pack | 4 | 4 ✓ | $68.50 | $274.00 |
| 3 | CHRG-RAPID | Rapid Dual-Port Charger | 1 | 1 ✓ | $145.00 | $145.00 |
| 4 | DRILL-BIT-SET | Drill bit set HSS — 25pc | 1 | 1 ✓ | $89.20 | $89.20 |
| 5 | SAFETY-GLOV-L | Safety gloves — large — pair | 6 | 6 ✓ | $12.50 | $75.00 |
| 6 | GRINDER-4-5 | 4.5" Angle Grinder 900W | 2 | 0 / 2 | $115.00 | $230.00 |
| 7 | MASK-N95x50 | N95 dust masks — box of 50 | 2 | 0 / 2 | $78.60 | $157.20 |
| 8 | TAPE-MEAS-8M | Tape measure 8 m · magnetic tip | 4 | 0 / 4 | $24.75 | $99.00 |
Real-world case: AI parsed 3 items from the supplier invoice, and the tech added 2 more items manually (disposable consumables not itemised on the PDF — e.g. rags, loose screws). Provenance lives at the group level only — the banner below the table reads "AI parsed 3 items from <file> · 2 items added manually" and the totals panel shows the split. No per-row sparkle. No per-row Source chip. The banner + split-totals is enough — per-row markers are just glitter.
| Type | Cost Code | Category | Inventory Code | Description | Qty | Unit Price |
|---|---|---|---|---|---|---|
| Product | Select category | CU-22-COPPER | Copper pipe 22mm | 12 m | 7.00 | |
| Product | Select category | ELB-12X | Elbow joints | 12 | 3.00 | |
| Product | Select category | COMP-35KW | Compressor unit 3.5kW | 1 | 1042.00 | |
| Product | Select category | RAGS-10 | Shop rags — pack of 10 | 1 | 12.00 | |
| Product | Select category | SCR-M6-BX | M6 machine screws — box | 2 | 6.50 |
How the styling blends
The rule is simple: the existing app's brand stays on the app's own chrome; the AI brand only appears where AI is doing work. A user who's used the existing app for years feels nothing has changed on their familiar buttons and tabs — but the moment AI does something for them, the sparkle tells them why.
- Never recolour app chrome. App purple stays on buttons, tabs, and headers. Users' muscle memory is valuable — don't retrain it for no reason.
- Promote AI actions to the AI pill. The existing green action button becomes the AI pill because AI does the parse. The label stays the same — only the affordance changes.
- Provenance, not glitter. The sparkle goes once underneath a set AI populated — not on every row. "AI parsed these 4 items from invoice.pdf" is enough. Per-row sparkles just become noise.
- Drop zones are AI hinted, not AI owned. The dashed border stays app purple by default. It flips to AI purple only when a file is hovering — so the manual upload affordance is unchanged but the AI moment is clearly flagged.
- AI never destructively overwrites. If items exist, the modal asks what to do. Primary action is always the least destructive (Merge). Replace sits as secondary. Ghost actions are for "do nothing".
- Two-way links surface on both pages. A Bill shows its Referenced Purchase Orders. A PO shows its Linked Bills. The relationship is readable from either direction — and AI's role (auto-match confidence) is visible inline.