bus-reports
bus-reports — generate trial balance, ledgers, statements, and close packages
bus reports reads workspace accounting data and turns it into review, close, audit, and filing outputs. It is the module you use when you want to see what the books say without changing the books.
For everyday work, most users start with trial-balance, general-ledger, day-book, profit-and-loss, and balance-sheet. For close and audit work, the most important commands are voucher-list, bank-transactions, materials-register, methods-description, and evidence-pack.
Common tasks
Generate a trial balance for month-end review:
bus reports trial-balance \
--as-of 2026-01-31 \
--format csv \
-o ./out/trial-balance-2026-01.csv
Export a printable day book and general ledger PDF for one period:
bus reports day-book \
--period 2026-01 \
--format pdf \
-o ./out/20260131-day-book.pdf
bus reports general-ledger \
--period 2026-01 \
--format pdf \
-o ./out/20260131-general-ledger.pdf
Create Finnish statutory PDFs for year-end:
bus reports profit-and-loss \
--period 2026 \
--layout-id fi-kpa-tuloslaskelma-kululaji \
--format pdf \
-o ./out/20261231-tuloslaskelma.pdf
bus reports balance-sheet \
--as-of 2026-12-31 \
--layout-id fi-kpa-tase \
--format pdf \
-o ./out/20261231-tase.pdf
By default, profit-and-loss and balance-sheet hide rows whose values are
zero in both shown periods. In hierarchical balance-sheet layouts, parent and
heading rows still stay visible when a child row below them carries a non-zero
current or comparative amount. Add --show-zero-rows when you want to inspect
the full statutory structure, including fully zero-valued rows. PDF follows
the same zero-row filtering instead of showing extra zero-only statutory rows.
When a visible numeric statement row is shown, missing current or comparative
amounts render as explicit 0.00 values instead of blank cells. Only
structural heading rows keep blank numeric cells.
If the journal contains money values with more than two decimals, bus-reports
fails during workspace load instead of rounding or silently normalizing them.
Human-facing PDF tables also default to borderless or minimal-line styling
instead of boxed per-cell borders, which keeps the PDFs searchable while
making text selection, highlighting, and annotation work more naturally in
viewers such as Apple Preview. The shared PDF renderer now embeds Unicode
fonts with /ToUnicode mappings so copied, selected, and extracted text stays
readable across common viewers and PDF extraction tools. Full and
*-accounts statement rows are now emitted through the shared statement text
path so Preview-style annotation and pdftotext-style extraction follow the
natural reading order. The accountant-facing review-table family
(general-ledger, day-book, voucher-list, and bank-transactions) now
uses one shared visible-only cell renderer with explicit gutters between
columns and no overlapping hidden duplicate row layer. The shared width
resolver budgets those gutters against visible cell width, so short fields
such as dates and compact identifiers do not wrap unnecessarily while a wider
description column on the same page still has reclaimable slack. That keeps
the visible layout readable without forcing text to start right at each cell
edge, which in turn helps neighboring columns stay separately selectable in
Preview-like viewers.
The same shared geometry contract now also keeps a small real vertical gap
between adjacent body rows, and the paginator uses that same row gap in its
page-fit math so body rows do not collapse into one continuous selectable
grid. The same shared table path now also keeps a small gap between the
repeated header row and the first body row instead of letting them touch.
That keeps
the printed table layout intact without the unstable page-by-page selection
behavior that Preview can show for overlapping text layers.
Repeated later-page statement headers now use that same full-row text path, so
tase-full.pdf, tase-accounts.pdf, and the matching tuloslaskelma variants
do not fall back to cell-style visible text on continuation pages. The same
shared text-based renderer now also covers visible PDF metadata, headers,
wrapped review rows, reconciliation tables, and materials-register rows
instead of older visible CellFormat or MultiCell text paths.
When you replay year-end close rows manually, use the Bus-native source-kind
surface from bus journal add, for example
--source-id FY2025 --source-kind closing-result. Reports
then recognize those rows as explicit close entries without depending on one
free-form source-id spelling, and profit-and-loss excludes them from normal
period activity while balance-sheet can still use them as explicit close
basis.
The same source-kind surface also matters for year-start correction memoranda.
If you record a carried-balance repair or prior-year correction on the first
day of the year, tag it with --source-kind opening-adjustment or
--source-kind prior-year-correction. bus-reports keeps that memorandum
visible in the journal and balance sheet, but both the visible
profit-and-loss activity scope and FR-REP-010 income-result reconciliation
exclude it from current-period operating-result movement. An unclassified
year-start memo does not get that exclusion and can still fail statutory
reconciliation on purpose.
If you need accountant-facing AI summaries under each visible statement
account, use the explicit AI layouts instead of changing the normal
*-accounts variants. The built-in ids are
fi-kpa-tase-full-ai-accounts, fi-pma-tase-full-ai-accounts,
fi-kpa-tuloslaskelma-full-ai-accounts, and
fi-pma-tuloslaskelma-full-ai-accounts. They keep the same statement and
account rows as the corresponding *-full-accounts layouts, but add one
extra AI-generated third level beneath each visible account row. Those AI
rows are recomputed on every run. If AI is unavailable, the explicit AI
layout fails with a clear error instead of silently falling back to the
non-AI layout.
While those AI runs are in progress, bus-reports writes concise stderr
progress/result lines such as INFO ai bus-reports profit-and-loss done 2/40
5% 4000 Office Supplies codex Stationery=20.00; Software=10.00 so you can
see that the AI branch is actively running and what it returned. AI account
analysis now runs up to 4 accounts in parallel by default, but the visible
rows are still rendered back in deterministic account order. In
evidence-pack, those lines should appear while the AI artifact is still
running, not only after it has finished. The same evidence-pack run should
reuse one AI result set for the matching PDF and CSV companions, so both
formats show the same AI rows.
Build a close package directory in one run:
bus reports evidence-pack \
--period 2026 \
--output-dir ./out/evidence-pack-2026 \
--format tsv
Produce the accounting materials register that many auditors and close checklists need:
bus reports materials-register \
--format pdf \
-o ./out/20261231-materials-register.pdf
Generate the workspace methods description (menetelmäkuvaus) that explains how bookkeeping data, evidence links, locking, and reports are handled:
bus reports methods-description \
--format pdf \
-o ./out/20261231-methods-description.pdf
Compare imported source totals with journal totals during migration or data validation:
bus reports journal-coverage --from 2026-01-01 --to 2026-03-31 --format json
bus reports parity --from 2026-01-01 --to 2026-03-31 --source-summary ./imports/source-summary.csv
bus reports journal-gap --from 2026-01-01 --to 2026-03-31 \
--source-summary ./imports/source-summary.csv \
--account-buckets ./imports/account-buckets.csv
Synopsis
bus reports trial-balance --as-of <YYYY-MM-DD> [--grouped] [--format <text|csv|markdown|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports account-balances --as-of <YYYY-MM-DD> [--format <text|csv|markdown|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports general-ledger --period <PERIOD_ID> [--account <code>] [--group-by <dim:KEY|source-voucher>] [--short-ids] [--show-source-voucher] [--show-external-source-ref] [--show-source-links] [--format <text|csv|markdown|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports day-book --period <PERIOD_ID> [--group-by <dim:KEY|source-voucher>] [--short-ids] [--show-source-voucher] [--show-external-source-ref] [--show-source-links] [--format <text|csv|markdown|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports ledger-log --period <PERIOD_ID> [options] [-C <dir>] [global flags]
bus reports account-ledger --account <code> --from <YYYY-MM-DD> --to <YYYY-MM-DD> [-C <dir>] [global flags]
bus reports profit-and-loss --period <PERIOD_ID> [--layout-id <id>|--layout <file>] [--comparatives <on|off>] [--comparative-workspace <dir>|--comparative-account-balances <file>] [--format <text|csv|markdown|json|kpa|pma|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports statement-explain --report <balance-sheet|profit-and-loss> (--as-of <YYYY-MM-DD> | --period <PERIOD_ID>) [--account <code>] [--layout-id <id>|--layout <file>] [--allow-implicit-current-year-result] [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports statement-validate --report <balance-sheet|profit-and-loss> (--as-of <YYYY-MM-DD> | --period <PERIOD_ID>) [--account <code>] [--layout-id <id>|--layout <file>] [--allow-implicit-current-year-result] [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports budget-vs-actual --period <PERIOD_ID> [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports cashflow --period <PERIOD_ID> [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports net-worth --as-of <YYYY-MM-DD> [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports account-movement --period <PERIOD_ID> [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports transfer-summary --period <PERIOD_ID> [--format <text|csv|markdown|json>] [-C <dir>] [-o <file>] [global flags]
bus reports balance-sheet --as-of <YYYY-MM-DD> [--layout-id <id>|--layout <file>] [--comparatives <on|off>] [--comparative-workspace <dir>|--comparative-account-balances <file>] [--allow-implicit-current-year-result] [--format <text|csv|markdown|json|kpa|pma|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports balance-sheet-specification --as-of <YYYY-MM-DD> [--layout-id <id>|--layout <file>] [--allow-implicit-current-year-result] [--format <text|csv|markdown|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports balance-sheet-reconciliation --as-of <YYYY-MM-DD> [--layout-id <id>|--layout <file>] [--allow-implicit-current-year-result] [--format <text|csv|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports voucher-list --period <PERIOD_ID> [--format <text|csv|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports bank-transactions --period <PERIOD_ID> [--account <code>] [--format <text|csv|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports materials-register [--format <text|csv|markdown|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports methods-description [--format <text|csv|markdown|json|pdf>] [-C <dir>] [-o <file>] [global flags]
bus reports evidence-pack (--period <PERIOD_ID> | --as-of <YYYY-MM-DD>) --output-dir <dir> [--comparative-workspace <dir>|--comparative-account-balances <file>] [--allow-implicit-current-year-result] [-C <dir>] [global flags]
bus reports journal-coverage [options] | parity [options] | journal-gap [options] | compliance-checklist [options] | filing-package [options] | annual-template [options] | annual-validate [options]
PERIOD_ID accepts the usual Bus shorthand identifiers such as 2024, 2024-01, and 2024Q1, and it also accepts any custom period_id defined in the workspace periods.csv, such as FY2024-2025.
Choose the right command
| If you need… | Start with… |
|---|---|
| A fast period or year-end balance summary |
trial-balance or account-balances
|
| Entry-by-entry accounting review |
day-book, general-ledger, ledger-log, or account-ledger
|
| Household/person review over budgets, cash movement, and net worth |
budget-vs-actual, cashflow, net-worth, account-movement, transfer-summary
|
| Official-looking year-end statements |
profit-and-loss and balance-sheet
|
| Internal close evidence behind the balance sheet |
balance-sheet-specification and balance-sheet-reconciliation
|
| A voucher list or bank review document |
voucher-list and bank-transactions
|
| A close folder with many standard artifacts | evidence-pack |
| A register of accounting materials and storage locations | materials-register |
| A bookkeeping methods description for audit/retention | methods-description |
| Migration or import-vs-journal diagnostics |
journal-coverage, parity, and journal-gap
|
| Filing or annual-close checklist outputs |
compliance-checklist, filing-package, annual-template, annual-validate
|
| A quick check that statutory groups and profiles look right |
profit-and-loss and balance-sheet
|
Everyday review reports
trial-balance and account-balances are the quickest health checks for a period-end or year-end review. When you want the same canonical hierarchy you already use elsewhere in Finnish reporting, add --grouped to trial-balance and the human-facing text, Markdown, or PDF output will show account-group rows with their subtotal balances above the posting accounts below them.
day-book shows entries in posting order and, in human-facing text, Markdown, and PDF output, now adds one summary line after each date with that day’s debit total, credit total, debit row count, credit row count, distinct transaction count, and cumulative end-of-day result. general-ledger groups entries by account and, in those same human-facing formats, renders one table section per account with the account code and account name shown before that section’s entry rows. It now also adds one summary line after each date inside an account section, with that day’s debit total, credit total, debit row count, credit row count, and the account’s ending saldo after the day, plus one monthly summary line after the last rendered day of each month in that same account section with the month’s debit total, credit total, debit row count, credit row count, and ending saldo after the month. Those same human-facing general-ledger views also include a counter_account / vastatili column so you can see the other account or accounts from the same transaction without leaving the current account section. In PDF, general-ledger now starts with a table of contents that lists those account sections and their page numbers, and those TOC rows are clickable internal PDF links to the matching account section. day-book uses the same shared PDF path and starts with a month-based table of contents for the rendered period, with the same clickable internal-link behavior. In general-ledger PDF, each visible counterpart-account label also links internally to the matching transaction row in that counterpart account section. If you prefer terminal-style browsing instead of table output, ledger-log is the review command to try next.
account-ledger is a narrower, date-range-focused tool for one account. It is useful when a single account needs explanation over a smaller time window.
In human-facing day-book and general-ledger outputs, Bus avoids printing
the same visible voucher number twice. If Tositenumero is already derived
from the same voucher value, the separate Voucher column is left blank. When
there is a genuinely distinct external document number and voucher id, both
stay visible.
Text, markdown, and PDF review outputs shorten Tx by default. The redundant
human-facing Entry or Vienti column is omitted when Tx and Rivi are
already visible, while machine-facing outputs such as CSV still retain the
stable entry_id field. If you also want the same shortened display value for
Tx in CSV, add --short-ids to day-book or general-ledger.
If a posting also carries imported source voucher notation from bus-journal,
add --show-source-voucher to day-book or general-ledger when you want
that human-facing review output to show the preserved source-facing voucher
label or context/number beside the description. If parity review needs the
same imported block structure as the source system, add --group-by
source-voucher to subtotal by the stored source voucher group token. If a
posting also carries one legacy or migration pointer, add
--show-external-source-ref when you want the deterministic
external_source_ref value shown as well. If one posting carries more than
one preserved source relation, add --show-source-links too. CSV and JSON
keep source_voucher, external_source_ref, and source_links even without
those human-facing flags only in grouped or machine-facing output paths.
Ungrouped CSV now mirrors the same visible review columns as PDF instead:
signed amounts, summary rows, counterpart-account display values, and the same
optional source-facing review columns when you enable them.
In those human-facing general-ledger and day-book views, the amount column
is signed: debit rows show a leading plus sign and credit rows a leading minus
sign. Dr and Cr are used instead of full debit and credit labels, and
day-book compacts the visible account column to <tilinumero> <tilin nimi> to
save width. Ungrouped CSV follows that same signed review presentation, while
grouped CSV and JSON keep the stable machine-facing split between side and
unsigned amount.
When multiple postings share the same date, those review outputs keep the same
append order as the journal instead of re-sorting same-day rows by internal
transaction IDs or stringified line numbers.
PDF day-book and general-ledger outputs also size columns from the actual
rendered content instead of using one fixed layout. The resolved columns are
stretched across the full printable page width, but short identifier and other
fixed-value columns stay compact so Description absorbs most of that extra
width. Bus also hides the Voucher column entirely when it would be blank on
every row. Wrapped PDF cells now share one logical row height so the table
stays visually aligned across columns, and page breaks are computed from those
final wrapped row heights so later pages do not inherit an overfull table.
The same page-local width policy also keeps visible document-number columns
compact in both day-book and general-ledger, and reserves enough date
width that bold summary dates stay on one line.
slice. In general-ledger PDF, account sections use whatever page space
remains as long as the section heading, repeated header, and at least part of
the current account table fit on that page. If the next row in the same
account no longer fits after that heading/header overhead, Bus moves that row
to a fresh page instead of forcing it into the remaining space. In day-book
PDF, that same
page-local width resolution also rebalances width away from Selite when the
current page would otherwise wrap the visible Account column unnecessarily.
Signed amount cells are kept on one rendered line instead of wrapping across
multiple lines. The page picker only evaluates as many candidate body rows as
can physically fit on the current page, so large real-year day-book and
evidence-pack PDF runs do not stall by rescanning the full remaining journal
slice on every page. The same human-facing PDF table family now also uses one
shared visible row-text path instead of per-cell visible text fragments, so
Apple Preview annotations and pdftotext/pdftohtml extraction behave the
same way in day-book, general-ledger, voucher-list, bank-transactions,
account-balances, balance-sheet-specification, materials-register, and
the statutory statement PDFs. For the ledger/day-book review family
specifically, the visible row layer stays on the real column grid rather than
on one space-padded visible line, so adjacent rows and continuation pages
stay visually aligned under the same headers even when values have mixed
widths. Each non-final visible review cell also carries a literal trailing
space when it contains text, so copied and extracted text keeps a clean
separator between adjacent columns even if the PDF viewer heuristically treats
the page as a table. The same shared style also keeps the light gray cell outlines/fills as
part of the real document appearance and reserves a separate gap between month
or account title boxes and the header row beneath them. In day-book and
general-ledger, those title boxes also include a compact top-right link back
to the opening table of contents.
voucher-list follows the same rule. The visible document_number comes from
the business-facing voucher number first, while any technical or imported
source_id stays available as a separate trace field instead of replacing the
human review number. In text, markdown, and PDF review outputs, the visible
transaction identifier is shortened in the same human-facing way as the other
review tables.
Finnish statutory reporting
For Finnish statement output, the most important decision is the layout. The common built-in layout IDs are:
fi-kpa-tasefi-pma-tasefi-kpa-tuloslaskelma-kululajifi-pma-tuloslaskelma-kululaji
If you want a built-in statutory layout, use --layout-id. If you maintain your own statement layout file, use --layout.
balance-sheet-specification is internal evidence output, not a PRH filing
document. Use it when you need a tase-erittely for review, audit, or close
documentation. Its PDF table now uses the same adaptive wrapped full-width
layout as the other accountant-facing review documents. The printable PDF also
follows the same metadata and signature-block convention as the other review
reports, and the trailing Allekirjoitukset block moves to a fresh page if it
would not fit safely at the bottom of the current page.
balance-sheet-reconciliation uses the same effective liability-side
classification as the rendered TASE, so a balanced statutory TASE should not
produce a false VASTATTAVAA mismatch in the reconciliation summary.
If a statutory PDF comes out with blank signature or company fields, set those defaults in bus-config and rerun the report.
If you are using BusDK for household or personal finance, set
busdk.accounting_entity.entity_kind to personal in
workspace configuration. That profile now
switches bus-reports to the household/person review family:
budget-vs-actual, cashflow, net-worth, account-movement,
transfer-summary, personal evidence-pack defaults, and internal
annual-template / filing-package / annual-validate outputs instead of
company-style public-filing defaults. Company-style PDF metadata warnings for
Y-tunnus and signature fields are also suppressed for those personal review
outputs. Personal/non-company evidence-pack now writes CSV companions beside
the same review documents that stay in scope. Sole-proprietor / tmi
workspaces still keep the non-public annual review manifests and checks, but
their evidence-pack now also includes the core tase and tuloslaskelma
artifacts plus the explicit compact/full/account-breakdown Finnish statutory
statement variants so the yearly package contains the expected financial
statements and deeper review PDF+CSV pairs without switching to a
public-filing annual package.
Statement placement and report profiles
For statutory reporting, start from account-groups.csv. That group tree is the canonical reporting hierarchy. Every posting account belongs to one group through accounts.csv:group_id, and short or full statement variants should differ only by which groups are visible in the selected report_profiles. In the built-in Finnish *-full layouts, bus-reports expands any visible deeper descendants from that canonical tree under the matching statutory parent rows, so lower-level TASE and tuloslaskelma branches remain visible without introducing a second report-only hierarchy.
In the Finnish *-full-accounts balance-sheet variants, that same shared tree also drives the account drill-down rows. If a visible TASE line, including an injected descendant group row, carries non-zero balance-sheet account contributions, the report appends deterministic per-account rows under that exact visible line instead of limiting breakdowns to a small built-in row subset. Synthetic current-year-result remapping still affects the Tilikauden voitto/tappio total, but ordinary revenue and expense accounts are not shown there as normal TASE account rows. In printable PDFs those account rows use one wrapped visible detail label such as <tilinumero> <tilin nimi>, so long account names stay fully visible instead of being clipped by separate fixed code and name columns.
For fi-kpa-* balance-sheet layouts, BusDK does that remapping by default
when the workspace has current-period profit-and-loss activity and no explicit
close postings on the canonical bs_current_year_result branch. That is the
normal electronic-accounting model: Tilikauden voitto/tappio is derived
directly from the live ledger rather than requiring a separate closing voucher.
When the workspace does contain explicit year-end result postings for replay,
migration parity, or imported historical evidence, prefer the Bus-native
journal source-id surface --source-id FY2025 --source-kind closing-result,
which stores the stable canonical key close-result:FY2025:1. Equivalent
separator aliases such as closing_result are accepted too, but they
normalize to the same semantic close meaning. --allow-implicit-current-year-result
is still accepted for compatibility, but it no longer changes the default
derived-result behavior.
The same canonical-tree rule applies to the Finnish fi-*-tuloslaskelma-full and fi-*-tuloslaskelma-full-accounts layouts. If the workspace group tree contains deeper visible descendants below a built-in statutory expense branch, those descendants stay visible as their own rows, they render with the same negative visible statement sign as the parent expense branch, and any direct account contributions stay under that exact visible descendant row in the *-accounts variants instead of collapsing back to a higher built-in parent row.
When you need to inspect that resolution directly, use statement-explain or
statement-validate. Those commands show the original account group, the
canonical group code path, the direct group report_profiles, the effective
canonical group used by the selected statement, the effective group code path
and profiles, the visible line chosen from the selected layout/profile, an
explicit resolution_chain, and the deterministic reason for the placement or
failure. For profit-and-loss they use the same activity scope as the rendered
statement, so opening rows and explicit closing-result basis rows stay out of
the explain/validate account list too.
For fi-kpa-* balance-sheet layouts, those commands also make the
current-year-result rule explicit. When no close-source basis exists they
return synthetic_current_year_result as the normal derived balance-sheet
placement path. When explicit close-source basis exists they return
explicit_current_year_result_basis instead, so operators can see that the
workspace is relying on replay/parity close evidence rather than the normal
derived result path.
In the internal *-accounts drill-down variants, structural heading rows stay visually structural: headings such as VASTAAVAA, VASTATTAVAA, Materiaalit ja palvelut, and Henkilöstökulut render with blank amount cells, while the numeric totals stay on the corresponding subtotal and result rows. In text, csv, markdown, and json account-drill-down outputs, section is reserved only for statement and visible group labels. Account rows therefore leave section blank, keep the account code only in Tilinumero / account_code, and keep the account name only in Tilin nimi / account_name instead of repeating either value in the first visible label cell. Printable PDFs keep the combined <tilinumero> <tilin nimi> account label because the PDF table does not split those into separate visible columns. The same subtotal contract now applies consistently to visible subgroups in both TASE and tuloslaskelma output: if a subgroup has rendered child groups or account rows beneath it, the subgroup label stays on its own row and the subtotal moves to its own later ... yhteensä row after those descendants. If no descendant rows are rendered, the subtotal may still be shown inline on the subgroup row. The AI *-ai-accounts variants extend that same tabular contract with a dedicated ai_description column after account_name; AI child rows and their trailing per-account total row leave section blank and use that dedicated AI-description cell instead of repeating the account name in section. When comparative figures are enabled and available, those AI child rows also fill the visible prior column from the same comparative source instead of leaving prior amounts only on the per-account subtotal row.
This also explains the special rows in Finnish statements. TASE is always one statement split into VASTAAVA and VASTATTAVAA, and the current-year result is a reporting result that must appear both as the final income-statement row and as a separate equity item in the balance sheet. The background model for those constraints lives in Finnish reporting hierarchy for TASE and tuloslaskelma.
Close and audit package commands
voucher-list creates a printable tositeluettelo. Its PDF output uses the
same wrapped full-width review-table path as the accountant-facing ledger
documents and keeps the visible transaction identifier short.
bank-transactions creates a grouped bank review document. This is useful when
you want a readable review artifact instead of raw bank-import rows. Its PDF
output uses the same shared wrapped review-table path as the other accountant
review documents, including per-account headings, page-safe repeated headers,
and a distinct closing-totals section. The visible Loppusaldo column now
shows the running balance after each bank row and also carries the ending
saldo onto the per-account YHTEENSÄ rows and the main overall summary row.
materials-register lists accounting datasets, schemas, storage paths, and linkage fields. In Finnish accounting practice this corresponds to the luettelo kirjanpidoista ja aineistoista.
methods-description is the companion artifact for the bookkeeping method itself. It describes entity context, reporting context, locking/correction model, evidence handling model, report surfaces, and dataset roles in one deterministic review document.
evidence-pack is the one-command close bundle. It writes a target directory
full of standard artifacts and also writes a manifest of what it created. The
package includes the main statements, ledgers, internal tase-erittelyt, and
explicit compact/full/account-breakdown statutory PDFs. For every report
artifact that already has a deterministic CSV renderer, evidence-pack also
writes a same-name .csv companion into the output directory so the package
contains both printable review documents and machine-readable exports derived
from the same statement/report rows. The default package still excludes
materials-register and methods-description. Dated default filenames use a
compact YYYYMMDD- prefix such as 20241231-tase.pdf, 20241231-tase.csv,
20241231-day-book.pdf, and 20241231-day-book.csv. You can trim the package
with --profile accountant|machine or explicit --include / --exclude
selectors, and you can rename generated artifacts deterministically with
repeated --filename-template SELECTOR=TEMPLATE rules. Selectors match *,
report, report:format, or the default filename; templates support
{report}, {format}, {period}, {as_of}, {from}, and {filename}.
When a filename template rewrites a PDF artifact, its CSV companion follows the
same resolved basename with .csv. Workspace configuration can provide the same defaults through
busdk.accounting_entity.reporting_context.fi.evidence_pack_profile and
evidence_pack_filename_templates, and command-line flags override those
defaults deterministically. If one artifact fails, evidence-pack still
attempts the remaining artifacts, writes the manifest of successful outputs,
and only then exits non-zero with an aggregated stderr summary. For
entity_kind=personal and other non-company profiles, the package stays on
the internal review path and writes CSV companions beside the same review/PDF
artifacts that remain in scope. Sole-proprietor / tmi workspaces
additionally keep the core tase and tuloslaskelma PDF+CSV pairs in that
same internal review package. When comparative data is present, the generated
statement PDFs are expected to show the same prior-period column as the CSV
companions, because both are derived from the same resolved statement rows.
When AI is available, evidence-pack also adds opportunistic AI companions
for the full Finnish *-accounts statements, such as
20241231-tase-ai-accounts.pdf/.csv and
20241231-tuloslaskelma-ai-accounts.pdf/.csv. If AI is unavailable, the
ordinary package still succeeds and simply omits those extra artifacts.
Comparative figures use the current workspace only when prior-year data really
exists there. That covers the uncommon multi-year workspace, but a normal Bus
workspace usually covers one fiscal year. Because of that, full-year
profit-and-loss no longer falls back to first-day opening balances:
opening balances can support balance-sheet comparatives, but they do not
contain prior-year tuloslaskelma detail. When the prior year is not already in
the current workspace, pass it explicitly with --comparative-workspace DIR
or --comparative-account-balances FILE. The snapshot file uses the
deterministic account-balances --format csv shape code,name,balance.
evidence-pack forwards the same explicit comparative source to each
generated balance-sheet and profit-and-loss artifact, including the generated
CSV companions, and annual-validate now checks for one of those real
comparative sources before it reports a pass.
The same forwarding model applies to --allow-implicit-current-year-result,
but the flag is kept only for compatibility. evidence-pack already uses the
default derived current-period result path for fi-kpa-* balance-sheet
artifacts when no explicit close postings exist.
When you intentionally opt into a derived fi-kpa current-year-result
fallback, evidence-pack forwards that choice to the generated
balance-sheet, balance-sheet specification, and balance-sheet reconciliation
artifacts. Without that explicit opt-in, those artifacts fail when the
workspace has no real close-source basis.
compliance-checklist, filing-package, annual-template, and annual-validate are the commands to reach for when you are assembling or checking an annual-close package rather than just printing one report. Company-form workspaces keep statutory public-filing package/template output, while non-company legal forms and entity_kind=personal workspaces switch to an internal annual review package centered on summaries, tax notes, and evidence indexes instead of PRH filing sections. The checklist now uses that same non-corporate model, so it no longer claims that a sole proprietor must generate company-style balance-sheet and profit-and-loss filing artifacts when the selected package flow is internal review only.
Migration and quality checks
journal-coverage compares journal activity by month and can include imported operational totals.
parity compares source-import totals with journal totals by dataset and period.
journal-gap goes one level deeper by using account buckets, which makes it easier to see whether a difference belongs to operations, financing, transfers, or unmapped activity.
If you need a pass/fail gate on these outputs, combine them with bus-validate.
Output formats and files
Machine-oriented formats are usually csv, json, or tsv. Human-oriented review outputs are usually text, markdown, or pdf.
profit-and-loss and balance-sheet additionally support kpa and pma
output. Review documents such as day-book, general-ledger,
balance-sheet-specification, voucher-list, bank-transactions,
balance-sheet-reconciliation, and materials-register support pdf. The
printable review PDFs use adaptive wrapped tables that stretch to the full
printable page width, and printable report variants leave an explicit gap
before Allekirjoitukset. Full statutory tase and tuloslaskelma PDFs keep
the same visible statement order across their plain and *-accounts variants,
so structural heading rows remain visible in every variant. In the
*-accounts PDFs, non-account statement rows use the full printable label
width instead of wasting separate account-code and account-name cells, and
missing comparative account cells stay blank instead of showing synthetic
0.00 values.
When you use -o, missing parent directories are created automatically before the file is written. Failed runs do not replace an existing successful output file. PDF metadata timestamps and visible Luotu lines are rendered in local time and include the timezone abbreviation plus numeric UTC offset, so one document never mixes UTC and local provenance timestamps.
These commands use Standard global flags. The most commonly used extras here are -C, -o, --format, and --locale. In human-facing outputs, --locale fi changes both decimal formatting and shared report labels such as headers and PDF titles. When --locale is omitted, BusDK first uses the workspace reporting profile language from busdk.accounting_entity.reporting_profile.fi_statutory.language when it is configured, and only then falls back to the shell locale. For the complete command matrix, run bus reports --help.
Using from .bus files
Inside a .bus file, write this module target without the bus prefix.
# same as: bus reports trial-balance --as-of 2026-01-31 --format csv
reports trial-balance --as-of 2026-01-31 --format csv
# same as: bus reports balance-sheet --as-of 2026-12-31 --layout-id fi-kpa-tase --format pdf
reports balance-sheet --as-of 2026-12-31 --layout-id fi-kpa-tase --format pdf
# same as: bus reports evidence-pack --period 2026 --output-dir ./out/reports --format tsv
reports evidence-pack --period 2026 --output-dir ./out/reports --format tsv