Skip to content

feature/Invoice-currency-lines · L-261107-0c6dcb - #23

Merged
lchoquel merged 3 commits into
devfrom
feature/Invoice-currency-lines
Nov 7, 2026
Merged

lchoquel merged 3 commits into
devfrom
feature/Invoice-currency-lines

Conversation

@lchoquel

@lchoquel lchoquel commented Nov 7, 2026 •

Copy link
Copy Markdown
Member

TL;DR

  • invoice_extraction now returns each invoice's currency, as an ISO 4217 code, and its purchase line by line, so a page built on its result can print "$9.96" and list what was bought.
  • A wrong currency is worse than a missing one, so the currency is read only from what the document shows for its own totals and lines, and left empty when nothing settles it.
  • vat_rates now always reads as percentages (20 for 20 %): a caller that computed with fractions must divide by 100, so the release that carries this is a minor.

Behaviour changes

  • Invoice had no currency → currency, the ISO 4217 code of the currency its totals and lines are expressed in. It is taken from a code given for those amounts, then from a symbol naming one currency only (€, ₹), then, for a shared symbol ($, £, ¥, kr), from where the document was issued. A converted amount or a card payment in another currency is never used, and the field stays empty when nothing settles it.
  • The purchase was one free-text description → line_items, a list of the new InvoiceLineItem (label required; quantity, unit_price and amount as printed). It holds every priced line in the order printed: fees, surcharges and discounts are included wherever they are printed, and the subtotal, tax, total, payment and per-category subtotal lines are never included.
  • description was a free description of the goods → a one-line summary of the purchase.
  • vat_rates was left to the model, 0.2 or 20 → percentages, 20 for 20 %.

Breaking changes

  • vat_rates keeps its type and changes its meaning for a caller who received fractions. A caller that moves its address from v0.2.0 and multiplies an amount by a rate must divide the rate by 100 first. The changelog marks it "(Breaking)", and the next release is v0.3.0.

Changes

  • methods/invoice_extraction/invoice_extraction.mthds:
    • the new InvoiceLineItem concept;
    • currency and line_items on Invoice;
    • the amounts' descriptions say they are in the invoice's currency;
    • vat_rates and description redefined;
    • the extract_invoice_data prompt gains a currency rule, a line-item rule and a one-line description rule. The model alias and the inputs are unchanged.
  • methods/invoice_extraction/README.md, the library's first package README: what the method takes and returns, every field, how the currency is determined, which lines are line items.
  • The root README.md's method table row and CHANGELOG.md's [Unreleased] section.

How it was verified

  • plxt fmt --check and plxt lint over the package, and pipelex validate bundle methods/invoice_extraction/ on Pipelex 0.95.1 and 0.97.0 with the README in the package directory.
  • Python types generated with pipelex codegen types … -t python-pydantic: InvoiceLineItem is its own model with label: str, line_items is list[InvoiceLineItem] | None, and currency is str | None.
  • Live runs on the hosted API, from the cookbook's assets at v0.18.0, repeated after each round of fixes:
    • the package's own sample, the JFK 5B Food Hall receipt, which prints no address: USD, and three lines (3.99, 4.89, and the 0.27 surcharge printed below the subtotal);
    • a Johnny Rockets receipt: USD, two lines, with its "Food" and "NA Bev" category subtotals left out;
    • a House of Blues card slip: USD from its printed code, no lines, and its suggested-tip table not read as lines.

Documentation

The package README, the concept's field descriptions (which reach codegen's docstrings and every form descriptor), the root README's method row, and the changelog.

Not done

  • A multi-page invoice still returns one Invoice per page, as the method always has. Grouping pages is a change to the output's multiplicity, left until a consumer needs it.
  • No live run covered a euro document or a shared symbol with nothing to settle it: no cookbook asset is one.
  • The consumers move separately: the cookbook's CSV batch recipe once v0.3.0 is tagged (L-261107-9ac36b), and mthds-form's invoice result fixture (L-261107-a285d0).

Closes L-261107-0c6dcb

🤖 Generated with Claude Code

https://claude.ai/code/session_019TF9N18ABj9hxXJX1vChAU


Summary by cubic

invoice_extraction now returns each invoice's currency as an ISO 4217 code and lists the purchase line by line, so a page built on its result can print "$9.96" and list what was bought.

Behavior changes

  • currency is read only from what the document shows for its own totals and lines, in this order: a code, then a one-currency symbol like € or ₹, then, for shared symbols like $, £ or kr, where the document was issued; it is left empty when nothing settles it, and a converted amount or card payment in another currency is never used.
  • line_items holds every priced line in printed order, fees and discounts included, as the new InvoiceLineItem; the subtotal, tax, total and payment lines are never included.
  • description becomes a one-line summary, and the package gains a README describing its output.

Breaking change

  • vat_rates now reads as percentages (20 for 20 %); a caller that computed with fractions must divide the rate by 100 first, and the next release is v0.3.0.

Written for commit 3f358aa. Summary will update on new commits.

View guided diff

lchoquel and others added 3 commits November 7, 2026 18:14
Each Invoice gains currency, an ISO 4217 code read from the document and left
empty when the document does not determine it, and line_items, a list of the
new InvoiceLineItem concept (label, quantity, unit_price, amount). description
becomes a one-line summary and vat_rates are stated as percentages. The
package gets a README describing its output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019TF9N18ABj9hxXJX1vChAU
…d the pound sign is a shared symbol

Line items are every priced line wherever it is printed, a fee or surcharge
in the totals block included, never a per-category subtotal. The pound sign
is shared by sterling and the Gibraltar, Falklands, Saint Helena, Egyptian,
Lebanese, Syrian and Sudanese pounds, so it is resolved by where the document
was issued; the rupee sign takes its place as a one-currency example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019TF9N18ABj9hxXJX1vChAU
…breaking

The currency rule took any currency code printed on the document first, so a
converted total or a card slip in the cardholder's currency could name the
currency of amounts expressed in another. The prompt, the field description and
the package README now read the currency only from what qualifies the
invoice's totals and lines, and leave it empty when those are themselves in
more than one currency.

The vat_rates change turns a fraction a caller may have received into a
percentage, which breaks a caller that computes with it, so the changelog marks
it breaking and says what such a caller must do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019TF9N18ABj9hxXJX1vChAU
@lchoquel
lchoquel merged commit 08367d9 into dev Nov 7, 2026
1 check passed
@lchoquel
lchoquel deleted the feature/Invoice-currency-lines branch November 7, 2026 17:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant