feat: Typst-typeset statements in US accounting format
The printpdf statements padded columns with spaces in a proportional font (amounts didn't line up), had no company name, printed negatives as "-207.68", and put everything on one page (a long statement was silently cut off past ~70 lines). Now: - PDFs are typeset by Typst from one template, ledger-import/templates/statement.typ. The laid-out statement goes in as JSON data (sys.inputs), so account names are never parsed as markup. Fonts are bundled (typst-assets: Libertinus Serif), so output doesn't depend on the machine and is byte-for-byte deterministic. Statements paginate, with the company/title repeated on later pages and "Page n of m" plus "Prepared from journal through seq N" in the footer. - US accounting presentation, decided once in ledger-import::report and applied by both PDF and XLSX: tabular figures; "$" on each section's first amount and on every subtotal and total, pinned to the column's left edge; negatives in parentheses with the closing paren hanging (its width reserved on every row, so decimal points align); zero as a dash; a single rule above sums (none over an empty section) and a double rule under statement totals; amounts never bold, because bold figures are wider and would leave the decimal column. XLSX uses Excel's own Accounting formats for the same result. - Cash flow: "Net change in cash" is a subtotal; only "Cash at end of period" takes the double rule. - Core fix: cash_flow walked the chart in HashMap order, so the order of working-capital and financing lines could change between runs. Lines now follow account code. Test: five owners, twenty runs, always 3000/3001/3003/3005/3009; fails without the sort. New dependencies (ledger-import): typst, typst-layout, typst-pdf, typst-assets (fonts), typst-as-lib (World/font plumbing), serde_json (the template's data). Removed: printpdf. Release ledger-mcp grows by the bundled fonts. Tests: exact template data for a hand-built P&L (like a golden); same statement renders to identical bytes; 200 rows of Typst markup characters render literally and span several pages; currency-sign and rule placement; amount splitting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MtYEaR6M6Ybdhm6X98BWNu
This commit is contained in:
1 parent
b5af21bb0e
commit
03212265ce
10 files changed
+2856
-545
No files matched your search
@@ -178,3 +178,14 @@ interface is MCP, not a cloned GUI. The first storage + MCP slice is done
|
||||
report headers, `fiscal_year_start` for fiscal YTD (end derived), and
|
||||
`receipt_threshold` (it was silently ignored before). Reports carry
|
||||
"Prepared from journal through seq N".
|
||||
- 2026-10-11: PDFs are typeset with Typst (typst 0.15 via typst-as-lib,
|
||||
fonts bundled by typst-assets; printpdf removed). One template,
|
||||
`ledger-import/templates/statement.typ`, takes the laid-out statement as
|
||||
JSON data (labels are never markup). US accounting presentation in PDF
|
||||
and XLSX alike: tabular figures, "$" on each section's first amount and
|
||||
on totals, negatives in parentheses with the closing paren hanging so
|
||||
decimal points align, zero as a dash, single rule over sums, double rule
|
||||
under totals, amounts never bold (bold figures are wider). Pages flow
|
||||
with a repeated header and "Page n of m". Core's cash flow now orders
|
||||
lines by account code (it followed HashMap order, so line order could
|
||||
change between runs).
|
||||
Reference in new issue
Block a user