P3: the cash flow statement by ASC 230 (defect 1, D-35, D-42)
check / check (push) Canceled after 0s

Direct method with the operating reconciliation and noncash schedules; it
foots by construction (Lean and Kani). Every non-cash account belongs to
one section; reversals net; a member or lender paying for the company is
cash borrowed and spent (D-42, constructive receipt and disbursement);
property a member contributes stays noncash. The bookspec seed: one loader
checks every example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
This commit is contained in:
swaitsandClaude Opus 5.5 committed 2026-10-21 09:35:32 -06:00
1 parent 2c29d48ab9
commit eb4329bb2a
64 files changed
+12128 -1567

No files matched your search

+181
View File
@@ -0,0 +1,181 @@
# bookspec: examples (seed)
bookspec is the formal accounting specification planned in
`plan/served.md` (P13, D-34): every rule stated normatively, sourced to its
authority, with a symbolic form and concrete examples, independent of any
engine. Its own repository comes later. Until then this directory holds its
first examples: P3's regression tests, each written here as it is built, so
the spec starts from cases a real engine got wrong.
Every example is checked against wanderbooks on every `cargo test`
(`crates/ledger-core/tests/bookspec.rs`, and for the formats appendix
`crates/ledger-package/tests/package.rs`): an example the engine disagrees
with fails the build, so the examples can't rot. An expected value is worked
by hand from the cited source, never copied from an engine's output.
## The shape of an example
One TOML file per example in `examples/`, named for its `id`.
```toml
id = "cash-flow.reversed-property-contribution" # stable; never reused
title = "A property contribution reversed the same day"
rule = "One normative sentence: what MUST (or MUST NOT) hold."
status = "AUTHORITY" # AUTHORITY | CONVENTION | CHOICE
sources = ["ASC 230-10-45-24", "ASC 230-10-50-3"] # exact citations
tags = ["accrual", "book", "us"] # applicability
[setup]
currency = "USD" # ISO 4217
fiscal_year_start = "01-01" # MM-DD
basis = "accrual" # accrual | cash
rounding = "half-even" # half-even | half-away-from-zero |
# largest-remainder: how a figure is
# rounded to the currency's minor unit,
# where a rule rounds (none here)
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset" # asset | liability | equity | revenue | expense
[[events]] # in order; event N is entry #N
date = "2026-01-10"
description = "Property contributed"
lines = [
{ account = "1500", side = "debit", amount = "2340.00" },
{ account = "3000", side = "credit", amount = "2340.00" },
]
[[events]]
date = "2026-01-10"
description = "Reverse entry 1"
reverses = 1 # the event (1-based) this one reverses:
# its lines, sides flipped; no `lines` here
[[expect]]
query = "cash_flow" # what is asked of the books (see below)
from = "2026-01-01" # inclusive
to = "2026-12-31" # inclusive (a query as of a day: as_of)
[expect.values] # every value an exact decimal string
operating = "0.00"
```
Events count from 1, as entries do: the first `[[events]]` is event 1
(entry #1), and `reverses = N` reverses the Nth event, one before it;
`reverses = 0` names no event and is refused. An event is an entry
(`lines`), a reversal (`reverses`) or a close (`close`, below), exactly
one of them, and posts entry #N. A key the shape doesn't have is refused
too, never ignored.
`rounding` names the rule the example's figures are rounded by where one
rounds: `half-even` or `half-away-from-zero` to the currency's minor unit,
or `largest-remainder` for an amount split among parts (each part rounded
down, the units left over to the largest remainders, ties to the part
listed first; rules.md B-13). An example that closes to the members
declares `largest-remainder`, the rule a members close splits by.
Required everywhere: the top-level keys, `[setup]` with its four keys and
its accounts, the events, and at least one `[[expect]]` with values: a
figure query's are exact decimal strings (`"2340.00"`, `"-12.50"`; never a
float), a format query's are text (below). Amounts on lines are positive;
the side gives the direction.
### Optional keys, for the rules that need them
- `appendix = "formats"` (top level): the example shows an interchange
format, not an accounting rule (P13's appendix of formats; the IIF
file today). It loads like any other; only it may ask a format query.
- `parent` on an account: its parent account's code. A parent is declared
before its subaccounts.
- `cash_accounts`, `financing_accounts`, `investing_accounts`: arrays of
account codes, the statement of cash flows' account roles (ASC
230-10-45-10 to 45-15). The cash and financing accounts are also what a
payee is paid from, for `vendor_1099_paid` (a payment card is neither:
its charges go on Form 1099-K; rules.md B-19), and the cash accounts
are an IIF file's bank accounts (B-34).
- `[[setup.fixed_assets]]` `{ cost_account, accumulated_account,
expense_account }`: accounts that hold property and equipment (their
cost and accumulated depreciation are investing; ASC 230-10-45-12(c),
45-13(c)).
- `[[setup.members]]` `{ name, capital_account, share? }`: the members of
a multi-member LLC. `share` is the member's share of income, an exact
decimal fraction (`"0.5"`, `"0.3333"`); every member has one or none
does, and the shares sum to 1. A close to the members and
`members_equity` need them.
- `[[setup.payees]]` `{ name, form }`: a payee marked for an information
return, `form` `"1099-NEC"` or `"1099-MISC"`; each name once.
- `payee` on an event: the payee (by name, one of `setup.payees`) the
entry paid. Not on a reversal, which takes its original's, nor on a
close.
- `close = { start, to, rounding? }` as an event: closes the period from
`start` through the event's `date` (rules.md B-11, B-13), `to`
`"members"` (split by share, in the order listed) or
`"retained_earnings"`. A close to the members splits cumulatively, each
close giving each member their split of everything the members' closes
have closed less what earlier closes gave them; `rounding = "per-close"`
splits that close's net on its own instead (books from an engine that
rounded each close by itself). A close must have something to close: it
posts entry #N like any other event.
- `after = N` on an expectation: asked of the books after event N, not
after the last (1 to the number of events; not on a format query).
### Queries and their values
A query over a period takes `from` and `to`; a query as of a day takes
`as_of`; the other is refused. A query no crate answers is refused, never
skipped.
| query | dates | values | checked by |
|---|---|---|---|
| `cash_flow` | `from`, `to` | figures (below) | `ledger-core` `tests/bookspec.rs` |
| `trial_balance` | `as_of` | each account's balance by code, debits less credits (a credit balance negative), every account listed | `ledger-core` `tests/bookspec.rs` |
| `profit_and_loss` | `from`, `to` | each revenue and expense account's activity by code, on its normal side, closing entries left out, every one listed; `net_income`, revenue less expenses | `ledger-core` `tests/bookspec.rs` |
| `entry` | `entry = N`, no dates | entry N's lines, `"<code>.debit"` and `"<code>.credit"` each the sum of that account's lines on that side, every line of the entry named | `ledger-core` `tests/bookspec.rs` |
| `balances` | `as_of` | each account named by code, its balance on its normal side (a member's capital after a loss is negative); the example names the accounts it shows | `ledger-core` `tests/bookspec.rs` |
| `members_equity` | `from`, `to` | the statement of changes in members' equity (rules.md B-13): `"<member>.beginning"`, `.contributions`, `.net_income`, `.distributions`, `.other`, `.ending`; the example names the figures it shows | `ledger-core` `tests/bookspec.rs` |
| `vendor_1099_paid` | `from` (January 1 of `to`'s year), `to` | each payee's payments by name, out of the cash and financing accounts (`cash_accounts` required), every payee listed | `ledger-core` `tests/bookspec.rs` |
| `iif_lines` | `as_of` | formats appendix: the file's lines in order, each its fields joined by tabs, without the CR LF that ends each | `ledger-package` `the_bookspec_iif_example_matches_the_engine` |
| `iif_changes` | `as_of` | formats appendix: each text the file writes differently from the books, in file order, as `[what, books' text, file's text]` (the example's header gives `what`) | `ledger-package` `the_bookspec_iif_example_matches_the_engine` |
A figure query is a table (`[expect.values]`, or `values = { ... }`); a
format query is an array (`values = [ ... ]`).
`cash_flow` (rules.md B-14): the statement of cash flows for `[from, to]`.
| key | the value |
|---|---|
| `operating`, `investing`, `financing` | each section's net cash, + in |
| `net_change`, `cash_beginning`, `cash_ending` | the cash accounts' change and balances |
| `difference` | sections less the change in cash: always `"0.00"` |
| `net_income` | revenue less expenses, closing entries excluded |
| `<section>.<N>` | entry N's cash in that section (`financing.4`) |
| `<section>.<N>.on_behalf` | of it, what a member or a lender paid or received for the company, no cash account moving (constructive receipt and disbursement) |
| `<section>.count` | how many entries the section lists |
| `noncash.<N>` | entry N's noncash investing and financing disclosure |
| `noncash.count` | how many entries are disclosed |
| `reconciliation.depreciation` | depreciation added back |
| `reconciliation.investing_gain_loss` | gains and losses whose cash is investing, taken out |
| `reconciliation.noncash_through.<code>` | operating movements no cash settled, through that account |
| `reconciliation.other_noncash` | other operating movements no cash settled |
| `reconciliation.balance_change.<code>` | minus the change in an operating asset or liability |
An entry named in a `<section>.<N>` (or `.on_behalf`) or `noncash.<N>`
key must be the only such entries when `<section>.count` or
`noncash.count` is given too; a
reconciliation key not given must be zero or absent.
Every example, in any appendix, is loaded by
`crates/ledger-core/tests/bookspec.rs` (`every_bookspec_example_holds`):
its shape (a key the shape doesn't have is refused), its setup, and every
event posted. Each query is then checked by the crate that answers it (the
table above), so the shape never rots either.
## Licence and sources
The examples state rules in their own words with the paragraph cited
(FASB's Codification is copyrighted: cited, never copied; see
`docs/spec/sources/fasb-asc.md`). The examples are MIT OR Apache-2.0, as
the rest of this repository, until bookspec moves to its own repository
(planned: the spec under CC BY 4.0).
@@ -6,13 +6,13 @@
# rules.md B-19, B-33; regression test `the_1099_worksheet_stops_at_as_of`
# (ledger-package tests/package.rs).
#
# Setup beyond the accounts: `cash_accounts` are the accounts payments
# are made from; each `[[setup.payees]]` is a payee marked for a form;
# an event's `payee` tags the payment to them. Expected values:
# vendor_1099_paid gives each marked payee's payments counted from `from`
# through `to` (both in one calendar year). The 2026 threshold is $2,000
# (B-19), so the payee is not yet reportable as of June 30 (1400.00) and
# is for the year (3050.00).
# Setup beyond the accounts (bookspec/README.md): `cash_accounts` are the
# accounts payments are made from; each `[[setup.payees]]` is a payee
# marked for a form; an event's `payee` tags the payment to them. Event N
# is entry N. Expected values: vendor_1099_paid gives each marked payee's
# payments counted from `from`, January 1, through `to`, every payee
# listed. The 2026 threshold is $2,000 (B-19), so the payee is not yet
# reportable as of June 30 (1400.00) and is for the year (3050.00).
id = "1099-worksheet-through-as-of"
title = "A 1099 worksheet as of a day counts the year's payments through that day"
@@ -29,7 +29,7 @@ tags = ["1099", "as-of", "calendar-year", "information-return", "period-boundary
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half_away_from_zero"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
[[setup.accounts]]
@@ -56,7 +56,7 @@ type = "expense"
name = "Contractor A"
form = "1099-NEC"
# 0: the year before.
# Entry 1: the year before.
[[events]]
date = "2025-12-31"
description = "Contract work, December"
@@ -66,7 +66,7 @@ lines = [
{ account = "1000", side = "credit", amount = "100.00" },
]
# 1
# Entry 2.
[[events]]
date = "2026-01-02"
description = "Owner contribution"
@@ -75,7 +75,7 @@ lines = [
{ account = "3000", side = "credit", amount = "10000.00" },
]
# 2
# Entry 3.
[[events]]
date = "2026-03-15"
description = "Contract work, March"
@@ -85,7 +85,7 @@ lines = [
{ account = "1000", side = "credit", amount = "900.00" },
]
# 3: by card, so reported on Form 1099-K, never counted here.
# Entry 4: by card, so reported on Form 1099-K, never counted here.
[[events]]
date = "2026-06-10"
description = "Contract work, June, by card"
@@ -95,7 +95,7 @@ lines = [
{ account = "2200", side = "credit", amount = "300.00" },
]
# 4: made on the day itself, so counted.
# Entry 5: made on the day itself, so counted.
[[events]]
date = "2026-06-30"
description = "Contract work, June"
@@ -105,7 +105,7 @@ lines = [
{ account = "1000", side = "credit", amount = "500.00" },
]
# 5: the day after.
# Entry 6: the day after.
[[events]]
date = "2026-07-01"
description = "Contract work, July"
@@ -115,7 +115,7 @@ lines = [
{ account = "1000", side = "credit", amount = "700.00" },
]
# 6
# Entry 7.
[[events]]
date = "2026-11-20"
description = "Contract work, November"
@@ -6,10 +6,11 @@
# `every_file_in_an_as_of_package_stops_at_as_of` and
# `as_of_package_iif_stops_at_as_of` (ledger-package tests/package.rs).
#
# Expected values: trial_balance gives each account's balance, debit
# positive and credit negative, every account listed; profit_and_loss
# gives each revenue and expense account's activity for the period as a
# positive amount, and net_income (revenue less expenses).
# Expected values (bookspec/README.md): trial_balance gives each
# account's balance as of the day, debit positive and credit negative,
# every account listed; profit_and_loss gives each revenue and expense
# account's activity for the period on its normal side, every one
# listed, and net_income (revenue less expenses).
id = "as-of-package-stops-at-as-of"
title = "A report as of a day leaves out what is dated after it"
@@ -25,7 +26,7 @@ tags = ["as-of", "trial-balance", "profit-and-loss", "reversal", "period-boundar
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half_away_from_zero"
rounding = "half-away-from-zero"
[[setup.accounts]]
code = "1000"
@@ -47,7 +48,7 @@ code = "6000"
name = "Rent"
type = "expense"
# 0
# Entry 1.
[[events]]
date = "2026-01-02"
description = "Owner contribution"
@@ -56,7 +57,7 @@ lines = [
{ account = "3000", side = "credit", amount = "10000.00" },
]
# 1
# Entry 2.
[[events]]
date = "2026-02-01"
description = "Sale"
@@ -65,7 +66,7 @@ lines = [
{ account = "4000", side = "credit", amount = "4000.00" },
]
# 2: dated the day itself, so in.
# Entry 3: dated the day itself, so in.
[[events]]
date = "2026-06-30"
description = "June rent"
@@ -74,7 +75,7 @@ lines = [
{ account = "1000", side = "credit", amount = "1200.00" },
]
# 3: the day after, so out of anything as of 2026-06-30.
# Entry 4: the day after, so out of anything as of 2026-06-30.
[[events]]
date = "2026-07-01"
description = "July rent"
@@ -83,20 +84,15 @@ lines = [
{ account = "1000", side = "credit", amount = "1200.00" },
]
# 4: a reversal dated after the day leaves its original in.
# Entry 5: a reversal dated after the day leaves its original in.
[[events]]
date = "2026-07-15"
description = "Reversal of the February sale"
reverses = 1
lines = [
{ account = "4000", side = "debit", amount = "4000.00" },
{ account = "1000", side = "credit", amount = "4000.00" },
]
reverses = 2
[[expect]]
query = "trial_balance"
from = "2026-01-01"
to = "2026-06-30"
as_of = "2026-06-30"
values = { "1000" = "12800.00", "3000" = "-10000.00", "4000" = "-4000.00", "6000" = "1200.00" }
[[expect]]
@@ -108,8 +104,7 @@ values = { "4000" = "4000.00", "6000" = "1200.00", net_income = "2800.00" }
# The same books a month later: the July rent and the reversal are in.
[[expect]]
query = "trial_balance"
from = "2026-01-01"
to = "2026-07-31"
as_of = "2026-07-31"
values = { "1000" = "7600.00", "3000" = "-10000.00", "4000" = "0.00", "6000" = "2400.00" }
[[expect]]
@@ -0,0 +1,94 @@
id = "cash-flow.debt-to-equity"
title = "An expense a member paid personally, then the member's advance converted to capital"
rule = "An expense a member pays for the company on credit to the member MUST be shown as cash borrowed from the member and spent, on its date; converting that debt to equity MUST be disclosed as a noncash financing activity, not reported as a cash flow, though both its accounts are financing."
# CHOICE: entry 1. ASC 230 doesn't address a payment a third party makes
# on the entity's behalf; the firm guides present it by substance as a
# constructive receipt and disbursement (a financing inflow and an
# operating outflow), and the owner chose that (wanderbooks D-42, revising
# D-35's noncash presentation). Entry 2's disclosure is 50-4's own example.
status = "CHOICE"
sources = [
"ASC 230-10-45-14(b)",
"ASC 230-10-45-17(b)",
"ASC 230-10-50-3",
"ASC 230-10-50-4",
"PwC Viewpoint, Financial statement presentation 6.9.3.1 (ASC 230 does not address cash a third party receives or pays on the entity's behalf; include it as though through the entity's accounts)",
"Deloitte Roadmap, Statement of cash flows 7.2 (constructive receipt and disbursement)",
"BDO Blueprint, Statement of cash flows under ASC 230 (December 2025) 3.4",
"wanderbooks D-42 (owner, 2026-10-20: a member or lender paying for the company is cash borrowed and spent)",
]
tags = ["accrual", "book", "us", "cash-flow", "noncash", "constructive", "partnership"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
financing_accounts = ["2100"]
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset"
[[setup.accounts]]
code = "2100"
name = "Due to members"
type = "liability"
[[setup.accounts]]
code = "3000"
name = "Capital — Member A"
type = "equity"
[[setup.accounts]]
code = "6000"
name = "Supplies"
type = "expense"
[[setup.members]]
name = "Member A"
capital_account = "3000"
[[events]]
date = "2026-02-03"
description = "Supplies, paid by Member A personally"
lines = [
{ account = "6000", side = "debit", amount = "500.00" },
{ account = "2100", side = "credit", amount = "500.00" },
]
[[events]]
date = "2026-02-10"
description = "Member A's advance converted to capital"
lines = [
{ account = "2100", side = "debit", amount = "500.00" },
{ account = "3000", side = "credit", amount = "500.00" },
]
# By hand: no company cash moved. Entry 1 is borrowed from the member
# (financing +500.00, 45-14(b)) and spent (operating -500.00, class (d),
# 45-17(b)) on 2026-02-03, all of it on the company's behalf; net income
# -500.00 needs no reconciling item. Entry 2 converts debt to equity, 50-4's
# first example: disclosed 500.00, though both its accounts are financing.
[[expect]]
query = "cash_flow"
from = "2026-02-01"
to = "2026-02-28"
[expect.values]
operating = "-500.00"
investing = "0.00"
financing = "500.00"
net_change = "0.00"
difference = "0.00"
net_income = "-500.00"
"operating.1" = "-500.00"
"operating.1.on_behalf" = "-500.00"
"operating.count" = "1"
"financing.1" = "500.00"
"financing.1.on_behalf" = "500.00"
"financing.count" = "1"
"noncash.2" = "500.00"
"noncash.count" = "1"
@@ -0,0 +1,187 @@
id = "cash-flow.paid-on-the-companys-behalf"
title = "A member and a lender pay for the company directly; the member is repaid"
rule = "When a member or a lender pays a company expense or purchase directly, with no cash account moving, the statement of cash flows MUST show a financing inflow (borrowed from the member or lender, or contributed when the member's capital is credited for an expense) and the operating or investing outflow, both on that payment's date; repaying the member or lender MUST be a financing outflow; such a payment and its reversal MUST net out together."
# CHOICE: ASC 230 does not address cash a third party pays on the entity's
# behalf. The firm guides present it by substance as a constructive
# receipt and disbursement (PwC 6.9.3.1; Deloitte 7.2, Example 7-2, a
# lender paying an insurer; BDO 3.4, Example 3-5, a bank paying the
# supplier of equipment, and a parent paying a subsidiary's expenses),
# and the owner chose that (wanderbooks D-42). KPMG also accepts a noncash
# presentation for equipment a lender pays for.
status = "CHOICE"
sources = [
"ASC 230-10-45-13(c)",
"ASC 230-10-45-14(a)",
"ASC 230-10-45-14(b)",
"ASC 230-10-45-15(b)",
"ASC 230-10-45-17(b)",
"PwC Viewpoint, Financial statement presentation 6.9.3.1 (cash a third party receives or pays on the entity's behalf is included as though through the entity's accounts)",
"Deloitte Roadmap, Statement of cash flows 7.2 (constructive receipt and disbursement; Example 7-2)",
"BDO Blueprint, Statement of cash flows under ASC 230 (December 2025) 3.4 and Example 3-5",
"EY Financial reporting developments, Statement of cash flows (July 2026) 4.6.2 and 5.3.1",
"wanderbooks D-42 (owner, 2026-10-20: a member or lender paying for the company is cash borrowed and spent)",
]
tags = ["accrual", "book", "us", "cash-flow", "constructive", "partnership"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
financing_accounts = ["2100", "2500"]
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset"
[[setup.accounts]]
code = "1500"
name = "Equipment"
type = "asset"
[[setup.accounts]]
code = "1510"
name = "Accumulated depreciation"
type = "asset"
[[setup.accounts]]
code = "2100"
name = "Due to members"
type = "liability"
[[setup.accounts]]
code = "2500"
name = "Bank loan"
type = "liability"
[[setup.accounts]]
code = "3000"
name = "Capital — Member A"
type = "equity"
[[setup.accounts]]
code = "6000"
name = "Supplies"
type = "expense"
[[setup.accounts]]
code = "6100"
name = "Depreciation"
type = "expense"
[[setup.fixed_assets]]
cost_account = "1500"
accumulated_account = "1510"
expense_account = "6100"
[[setup.members]]
name = "Member A"
capital_account = "3000"
[[events]]
date = "2026-03-02"
description = "Member A contributes cash"
lines = [
{ account = "1000", side = "debit", amount = "1000.00" },
{ account = "3000", side = "credit", amount = "1000.00" },
]
[[events]]
date = "2026-03-05"
description = "Supplies, paid by Member A personally (owed back)"
lines = [
{ account = "6000", side = "debit", amount = "120.00" },
{ account = "2100", side = "credit", amount = "120.00" },
]
[[events]]
date = "2026-03-09"
description = "Equipment, paid to the seller by the bank (a loan)"
lines = [
{ account = "1500", side = "debit", amount = "2400.00" },
{ account = "2500", side = "credit", amount = "2400.00" },
]
[[events]]
date = "2026-03-12"
description = "Supplies, paid by Member A personally (contributed)"
lines = [
{ account = "6000", side = "debit", amount = "45.00" },
{ account = "3000", side = "credit", amount = "45.00" },
]
[[events]]
date = "2026-03-15"
description = "Supplies, paid by Member A personally (posted in error)"
lines = [
{ account = "6000", side = "debit", amount = "30.00" },
{ account = "2100", side = "credit", amount = "30.00" },
]
[[events]]
date = "2026-03-16"
description = "Reverse entry 5"
reverses = 5
[[events]]
date = "2026-03-20"
description = "Reimburse Member A"
lines = [
{ account = "2100", side = "debit", amount = "120.00" },
{ account = "1000", side = "credit", amount = "120.00" },
]
[[events]]
date = "2026-03-28"
description = "Loan payment"
lines = [
{ account = "2500", side = "debit", amount = "200.00" },
{ account = "1000", side = "credit", amount = "200.00" },
]
# By hand, March. Operating: entry 2, -120.00, and entry 4, -45.00 (cash
# paid to suppliers, 45-17(b), by the member for the company): -165.00;
# entries 5 and 6 net out. Investing: entry 3, -2,400.00 (equipment,
# 45-13(c), paid by the bank). Financing: entry 1 +1,000.00 and entry 4
# +45.00 (contributions, 45-14(a)), entry 2 +120.00 and entry 3 +2,400.00
# (borrowing, 45-14(b)), entry 7 -120.00 and entry 8 -200.00 (repayments,
# 45-15(b)): +3,245.00. Sum -165.00 - 2,400.00 + 3,245.00 = +680.00, the
# change in cash (1,000.00 - 120.00 - 200.00). Net income -165.00 equals
# operating: no reconciling item. Nothing is disclosed: no part of any
# entry went unsettled.
[[expect]]
query = "cash_flow"
from = "2026-03-01"
to = "2026-03-31"
[expect.values]
operating = "-165.00"
investing = "-2400.00"
financing = "3245.00"
net_change = "680.00"
cash_beginning = "0.00"
cash_ending = "680.00"
difference = "0.00"
net_income = "-165.00"
"operating.2" = "-120.00"
"operating.2.on_behalf" = "-120.00"
"operating.4" = "-45.00"
"operating.count" = "2"
"investing.3" = "-2400.00"
"investing.3.on_behalf" = "-2400.00"
"investing.count" = "1"
"financing.1" = "1000.00"
"financing.1.on_behalf" = "0.00"
"financing.2" = "120.00"
"financing.2.on_behalf" = "120.00"
"financing.3" = "2400.00"
"financing.3.on_behalf" = "2400.00"
"financing.4" = "45.00"
"financing.4.on_behalf" = "45.00"
"financing.7" = "-120.00"
"financing.7.on_behalf" = "0.00"
"financing.8" = "-200.00"
"financing.count" = "6"
"noncash.count" = "0"
@@ -0,0 +1,90 @@
id = "cash-flow.part-cash-purchase"
title = "Equipment bought part for cash, part on the seller's note"
rule = "Of a transaction that is part cash and part noncash, only the cash portion MUST be reported in the statement of cash flows; the rest MUST be disclosed as a noncash investing and financing activity."
status = "AUTHORITY"
sources = ["ASC 230-10-50-5", "ASC 230-10-50-3", "ASC 230-10-50-4", "ASC 230-10-45-13(c)", "EY Financial reporting developments, Statement of cash flows (July 2026) 5.3.1 (seller-financed purchases are noncash to the extent of the seller's financing)"]
tags = ["accrual", "book", "us", "cash-flow", "noncash"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
# The note is the seller's own credit, not a lender's: it is not listed as
# financing (a lender that paid the seller would be: the purchase would
# then be borrowed and invested, cash-flow.paid-on-the-companys-behalf).
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset"
[[setup.accounts]]
code = "1520"
name = "Vehicles"
type = "asset"
[[setup.accounts]]
code = "1530"
name = "Accumulated depreciation, vehicles"
type = "asset"
[[setup.accounts]]
code = "2500"
name = "Note payable to the seller"
type = "liability"
[[setup.accounts]]
code = "3000"
name = "Capital"
type = "equity"
[[setup.accounts]]
code = "6100"
name = "Depreciation"
type = "expense"
[[setup.fixed_assets]]
cost_account = "1520"
accumulated_account = "1530"
expense_account = "6100"
[[events]]
date = "2026-01-02"
description = "Opening contribution"
lines = [
{ account = "1000", side = "debit", amount = "10000.00" },
{ account = "3000", side = "credit", amount = "10000.00" },
]
[[events]]
date = "2026-02-08"
description = "Vehicle: 300 down, 700 on the seller's note"
lines = [
{ account = "1520", side = "debit", amount = "1000.00" },
{ account = "1000", side = "credit", amount = "300.00" },
{ account = "2500", side = "credit", amount = "700.00" },
]
# By hand: 300 left the bank for the vehicle (investing, 45-13(c)); the
# 700 the seller financed moved no cash, to anyone, and is disclosed (50-4:
# acquiring an asset by assuming a directly related liability). Cash
# 10,000.00 to 9,700.00 in February.
[[expect]]
query = "cash_flow"
from = "2026-02-01"
to = "2026-02-28"
[expect.values]
operating = "0.00"
investing = "-300.00"
financing = "0.00"
net_change = "-300.00"
cash_beginning = "10000.00"
cash_ending = "9700.00"
difference = "0.00"
"investing.2" = "-300.00"
"investing.count" = "1"
"noncash.2" = "700.00"
"noncash.count" = "1"
@@ -0,0 +1,90 @@
id = "cash-flow.reversal-of-a-reversal"
title = "A contribution, its reversal and the reversal's reversal"
rule = "Reversals MUST pair along the chain from its root: an entry and its reversal both in the period drop out together, and a reversal of a reversal whose partner is already paired MUST be reported, as its root would be."
status = "AUTHORITY"
sources = [
"ASC 230-10-45-14(a)",
"ASC 230-10-45-24",
"Pacioli, Summa (1494), ch. 31 (the correcting entry)",
]
tags = ["accrual", "book", "us", "cash-flow", "reversal"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset"
[[setup.accounts]]
code = "3001"
name = "Capital — Member B"
type = "equity"
[[setup.members]]
name = "Member B"
capital_account = "3001"
[[events]]
date = "2026-01-20"
description = "Opening contribution"
lines = [
{ account = "1000", side = "debit", amount = "1000.00" },
{ account = "3001", side = "credit", amount = "1000.00" },
]
[[events]]
date = "2026-02-02"
description = "Contribution — Member B"
lines = [
{ account = "1000", side = "debit", amount = "300.00" },
{ account = "3001", side = "credit", amount = "300.00" },
]
[[events]]
date = "2026-02-03"
description = "Reverse entry 2"
reverses = 2
[[events]]
date = "2026-02-04"
description = "Reverse entry 3: the contribution stands"
reverses = 3
# By hand, February: entries 2 and 3 pair (the root and its reversal);
# entry 4 reinstates the contribution and is reported: financing +300.00,
# the change in cash.
[[expect]]
query = "cash_flow"
from = "2026-02-01"
to = "2026-02-28"
[expect.values]
financing = "300.00"
net_change = "300.00"
cash_beginning = "1000.00"
cash_ending = "1300.00"
difference = "0.00"
"financing.4" = "300.00"
"financing.count" = "1"
"noncash.count" = "0"
# From February 3 the root is before the period: entries 3 and 4 pair, and
# nothing is reported (no cash moved net, 1,300.00 to 1,300.00).
[[expect]]
query = "cash_flow"
from = "2026-02-03"
to = "2026-02-28"
[expect.values]
financing = "0.00"
net_change = "0.00"
cash_beginning = "1300.00"
cash_ending = "1300.00"
difference = "0.00"
"financing.count" = "0"
@@ -0,0 +1,84 @@
id = "cash-flow.reversed-property-contribution"
title = "A property contribution reversed the same day leaves the statement of cash flows empty"
rule = "An entry and its reversal both in the period MUST contribute nothing to any section or disclosure, and the sections MUST sum to the change in cash."
status = "AUTHORITY"
sources = [
"ASC 230-10-45-1",
"ASC 230-10-45-24",
"ASC 230-10-50-3",
"Pacioli, Summa (1494), ch. 31 (the correcting entry)",
]
tags = ["accrual", "book", "us", "cash-flow", "reversal", "regression:p3-defect-1"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
[[setup.accounts]]
code = "1000"
name = "Cash"
type = "asset"
[[setup.accounts]]
code = "1500"
name = "Equipment"
type = "asset"
[[setup.accounts]]
code = "1510"
name = "Accumulated depreciation"
type = "asset"
[[setup.accounts]]
code = "6100"
name = "Depreciation"
type = "expense"
[[setup.accounts]]
code = "3000"
name = "Capital"
type = "equity"
[[setup.fixed_assets]]
cost_account = "1500"
accumulated_account = "1510"
expense_account = "6100"
[[events]]
date = "2026-01-10"
description = "Property contributed"
lines = [
{ account = "1500", side = "debit", amount = "2340.00" },
{ account = "3000", side = "credit", amount = "2340.00" },
]
[[events]]
date = "2026-01-10"
description = "Reverse entry 1"
reverses = 1
# By hand: no cash moved (sections 0.00, change in cash 0.00), and the
# entry and its reversal cancel, so nothing is disclosed either. Before the
# fix (wanderbooks P3, defect 1) investing showed -2,340.00 against a
# change of 0.00: the reversal's credit to equipment fell in no section.
[[expect]]
query = "cash_flow"
from = "2026-01-01"
to = "2026-12-31"
[expect.values]
operating = "0.00"
investing = "0.00"
financing = "0.00"
net_change = "0.00"
cash_beginning = "0.00"
cash_ending = "0.00"
difference = "0.00"
net_income = "0.00"
"operating.count" = "0"
"investing.count" = "0"
"financing.count" = "0"
"noncash.count" = "0"
@@ -0,0 +1,443 @@
id = "cash-flow.two-member-llc-first-year"
title = "A two-member LLC's first weeks: contributions, member-paid expenses, property contributed, corrections"
rule = "The statement of cash flows MUST report cash receipts and payments, by section, with each reversal netted against its original in the period; expenses members paid personally on credit to them MUST be shown as cash borrowed from the members and spent, on each payment's date; property the members contributed MUST be disclosed as a noncash activity; the sections MUST sum to the change in cash."
# CHOICE: the member-paid expenses. ASC 230 doesn't address a payment made
# on the entity's behalf; the firm guides present it by substance as a
# constructive receipt and disbursement (a financing inflow and an
# operating outflow), and the owner chose that (D-42, revising D-35's
# noncash presentation). The rest is the Codification's.
status = "CHOICE"
sources = [
"ASC 230-10-10-1",
"ASC 230-10-45-14(a)",
"ASC 230-10-45-14(b)",
"ASC 230-10-45-15(b)",
"ASC 230-10-45-17(b)",
"ASC 230-10-45-24",
"ASC 230-10-45-28",
"ASC 230-10-45-30",
"ASC 230-10-50-3",
"ASC 230-10-50-4",
"PwC Viewpoint, Financial statement presentation 6.9.3.1 (cash a third party receives or pays on the entity's behalf is included as though through the entity's accounts)",
"Deloitte Roadmap, Statement of cash flows 7.2 (constructive receipt and disbursement)",
"BDO Blueprint, Statement of cash flows under ASC 230 (December 2025) 3.4 (a parent paying a subsidiary's expenses)",
"wanderbooks D-42 (owner, 2026-10-20: a member or lender paying for the company is cash borrowed and spent)",
]
tags = ["accrual", "book", "us", "cash-flow", "partnership", "constructive", "regression:p3-defect-1"]
# A two-member LLC's first weeks, in the shape of the books P3 defect 1
# was found in: the same 23 entries in the same order, on the same
# accounts and roles (two contributions in cash, expenses the members paid
# personally through Due to Members and two reimbursements, a domain
# expensed then corrected to a prepaid, two card charges, four devices the
# members owned contributed, two of them first entered wrongly and
# reversed), with every amount and date this example's own. Before the fix
# the statement didn't foot: the reversals' credits to equipment (#13,
# #18) belonged to no section, and the contributed devices read as
# purchases.
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
cash_accounts = ["1000"]
financing_accounts = ["2100"]
[[setup.accounts]]
code = "1000"
name = "Checking"
type = "asset"
[[setup.accounts]]
code = "1300"
name = "Prepaid Expenses"
type = "asset"
[[setup.accounts]]
code = "1500"
name = "Equipment"
type = "asset"
[[setup.accounts]]
code = "1510"
name = "Accumulated Depreciation"
type = "asset"
[[setup.accounts]]
code = "2050"
name = "Business Card"
type = "liability"
[[setup.accounts]]
code = "2100"
name = "Due to Members"
type = "liability"
[[setup.accounts]]
code = "3000"
name = "Capital — Member A"
type = "equity"
[[setup.accounts]]
code = "3001"
name = "Capital — Member B"
type = "equity"
[[setup.accounts]]
code = "6000"
name = "Organizational Costs"
type = "expense"
[[setup.accounts]]
code = "6050"
name = "Domain & Hosting"
type = "expense"
[[setup.accounts]]
code = "6200"
name = "Developer Fees"
type = "expense"
[[setup.accounts]]
code = "6300"
name = "Software & Subscriptions"
type = "expense"
[[setup.accounts]]
code = "6400"
name = "Memberships & Licenses"
type = "expense"
[[setup.accounts]]
code = "6500"
name = "Depreciation Expense"
type = "expense"
[[setup.fixed_assets]]
cost_account = "1500"
accumulated_account = "1510"
expense_account = "6500"
[[setup.members]]
name = "Member A"
capital_account = "3000"
[[setup.members]]
name = "Member B"
capital_account = "3001"
# Entry 1.
[[events]]
date = "2026-03-02"
description = "Formation filing fee, paid by the members"
lines = [
{ account = "6000", side = "debit", amount = "85.00" },
{ account = "2100", side = "credit", amount = "85.00" },
]
# Entry 2.
[[events]]
date = "2026-03-03"
description = "Domain, 1 year, paid by the members"
lines = [
{ account = "6050", side = "debit", amount = "12.97" },
{ account = "2100", side = "credit", amount = "12.97" },
]
# Entry 3.
[[events]]
date = "2026-03-05"
description = "Developer registration, paid by the members"
lines = [
{ account = "6200", side = "debit", amount = "99.00" },
{ account = "2100", side = "credit", amount = "99.00" },
]
# Entry 4.
[[events]]
date = "2026-03-09"
description = "Contribution — Member A"
lines = [
{ account = "1000", side = "debit", amount = "1200.00" },
{ account = "3000", side = "credit", amount = "1200.00" },
]
# Entry 5.
[[events]]
date = "2026-03-10"
description = "Contribution — Member B"
lines = [
{ account = "1000", side = "debit", amount = "800.00" },
{ account = "3001", side = "credit", amount = "800.00" },
]
# Entry 6.
[[events]]
date = "2026-03-11"
description = "Subscription top-up, paid by the members"
lines = [
{ account = "6300", side = "debit", amount = "7.49" },
{ account = "2100", side = "credit", amount = "7.49" },
]
# Entry 7.
[[events]]
date = "2026-03-16"
description = "Developer membership, paid by the members"
lines = [
{ account = "6400", side = "debit", amount = "129.00" },
{ account = "2100", side = "credit", amount = "129.00" },
]
# Entry 8.
[[events]]
date = "2026-03-23"
description = "Reimburse members"
lines = [
{ account = "2100", side = "debit", amount = "333.46" },
{ account = "1000", side = "credit", amount = "333.46" },
]
# Entry 9.
[[events]]
date = "2026-03-20"
description = "Domain, 2 years, paid by the members"
lines = [
{ account = "6050", side = "debit", amount = "46.38" },
{ account = "2100", side = "credit", amount = "46.38" },
]
# Entry 10.
[[events]]
date = "2026-03-25"
description = "API credits on the card"
lines = [
{ account = "6300", side = "debit", amount = "14.20" },
{ account = "2050", side = "credit", amount = "14.20" },
]
# Entry 11.
[[events]]
date = "2026-03-26"
description = "Reimburse members"
lines = [
{ account = "2100", side = "debit", amount = "46.38" },
{ account = "1000", side = "credit", amount = "46.38" },
]
# Entry 12.
[[events]]
date = "2026-03-27"
description = "Laptop contributed by Member A"
lines = [
{ account = "1500", side = "debit", amount = "1480.00" },
{ account = "3000", side = "credit", amount = "1480.00" },
]
# Entry 13.
[[events]]
date = "2026-03-27"
description = "Reverse entry 12: contributed jointly"
reverses = 12
# Entry 14.
[[events]]
date = "2026-03-27"
description = "Laptop contributed jointly"
lines = [
{ account = "1500", side = "debit", amount = "1480.00" },
{ account = "3000", side = "credit", amount = "740.00" },
{ account = "3001", side = "credit", amount = "740.00" },
]
# Entry 15.
[[events]]
date = "2026-03-27"
description = "Laptop contributed jointly"
lines = [
{ account = "1500", side = "debit", amount = "1190.00" },
{ account = "3000", side = "credit", amount = "595.00" },
{ account = "3001", side = "credit", amount = "595.00" },
]
# Entry 16.
[[events]]
date = "2026-03-27"
description = "Desktop contributed jointly"
lines = [
{ account = "1500", side = "debit", amount = "2210.00" },
{ account = "3000", side = "credit", amount = "1105.00" },
{ account = "3001", side = "credit", amount = "1105.00" },
]
# Entry 17.
[[events]]
date = "2026-03-27"
description = "Tablet contributed jointly"
lines = [
{ account = "1500", side = "debit", amount = "630.00" },
{ account = "3000", side = "credit", amount = "315.00" },
{ account = "3001", side = "credit", amount = "315.00" },
]
# Entry 18.
[[events]]
date = "2026-03-27"
description = "Reverse entry 15: the service plan is separate"
reverses = 15
# Entry 19.
[[events]]
date = "2026-03-27"
description = "Laptop and its service plan contributed jointly"
lines = [
{ account = "1500", side = "debit", amount = "1151.00" },
{ account = "1300", side = "debit", amount = "39.00" },
{ account = "3000", side = "credit", amount = "595.00" },
{ account = "3001", side = "credit", amount = "595.00" },
]
# Entry 20.
[[events]]
date = "2026-03-20"
description = "Domain, 2 years, paid by the members, prepaid"
lines = [
{ account = "1300", side = "debit", amount = "46.38" },
{ account = "2100", side = "credit", amount = "46.38" },
]
# Entry 21.
[[events]]
date = "2026-03-12"
description = "Subscription, paid by the members"
lines = [
{ account = "6300", side = "debit", amount = "216.40" },
{ account = "2100", side = "credit", amount = "216.40" },
]
# Entry 22.
[[events]]
date = "2026-03-20"
description = "Reverse entry 9: prepaid, not expensed"
reverses = 9
# Entry 23.
[[events]]
date = "2026-03-30"
description = "API credits on the card"
lines = [
{ account = "6300", side = "debit", amount = "42.75" },
{ account = "2050", side = "credit", amount = "42.75" },
]
# By hand, the year to 2026-03-31 (rules.md B-14; D-42 for what the
# members paid). Cash is 1000; 2100 (Due to Members) is financing.
# - Operating: the members paid #1 85.00, #2 12.97, #3 99.00, #6 7.49,
# #21 216.40, #7 129.00 and #20 46.38 (the prepaid domain) for the
# company through 2100, each borrowed (financing, 45-14(b)) and spent
# (operating, 45-17(b)) on its date: 85.00 + 12.97 + 99.00 + 7.49 +
# 216.40 + 129.00 + 46.38 = 596.24, so operating -596.24, all cash paid
# to suppliers. #9 and its reversal #22 net out (rule 6). The card's #10
# and #23 moved no cash and 2050 is not financing: no line.
# - Investing 0.00: every device was property the members owned (50-4),
# disclosed below; #12/#13 and #15/#18 net out.
# - Financing: #4 +1,200.00 and #5 +800.00 (contributions, 45-14(a));
# +596.24 borrowed from the members (the seven above); the
# reimbursements #8 -333.46 (#1, #2, #3, #6 and #7: 85.00 + 12.97 +
# 99.00 + 7.49 + 129.00) and #11 -46.38 (#20), 45-15(b): 1,200.00 +
# 800.00 + 596.24 - 333.46 - 46.38 = +2,216.40.
# - Sum: -596.24 + 0.00 + 2,216.40 = +1,620.16, the change in cash (in
# 1,200.00 + 800.00, out 333.46 + 46.38; 0.00 to 1,620.16); difference
# 0.00.
# - Reconciliation (45-28 to 45-30): net income is minus the expenses,
# 85.00 + 12.97 + 99.00 + 7.49 + 129.00 + 46.38 - 46.38 + 14.20 + 216.40
# + 42.75 = 606.81, so -606.81; other noncash +39.00 (#19's service
# plan, contributed with the laptop); increase in 1300, 39.00 + 46.38,
# so -85.38; increase in 2050, 14.20 + 42.75, so +56.95. Total -606.81 +
# 39.00 - 85.38 + 56.95 = -596.24, the operating section.
# - Disclosed (50-3, 50-4), the property contributed: #14 1,480.00, #16
# 2,210.00, #17 630.00, #19 1,190.00 (1,151.00 equipment and 39.00 a
# prepaid service plan), 5,510.00 in all; #12/#13 and #15/#18 drop out.
[[expect]]
query = "cash_flow"
from = "2026-01-01"
to = "2026-03-31"
[expect.values]
operating = "-596.24"
investing = "0.00"
financing = "2216.40"
net_change = "1620.16"
cash_beginning = "0.00"
cash_ending = "1620.16"
difference = "0.00"
net_income = "-606.81"
"operating.1" = "-85.00"
"operating.2" = "-12.97"
"operating.3" = "-99.00"
"operating.6" = "-7.49"
"operating.7" = "-129.00"
"operating.20" = "-46.38"
"operating.21" = "-216.40"
"operating.count" = "7"
"investing.count" = "0"
"financing.1" = "85.00"
"financing.1.on_behalf" = "85.00"
"financing.2" = "12.97"
"financing.3" = "99.00"
"financing.4" = "1200.00"
"financing.4.on_behalf" = "0.00"
"financing.5" = "800.00"
"financing.6" = "7.49"
"financing.7" = "129.00"
"financing.8" = "-333.46"
"financing.11" = "-46.38"
"financing.20" = "46.38"
"financing.20.on_behalf" = "46.38"
"financing.21" = "216.40"
"financing.count" = "11"
"reconciliation.other_noncash" = "39.00"
"reconciliation.balance_change.1300" = "-85.38"
"reconciliation.balance_change.2050" = "56.95"
"noncash.14" = "1480.00"
"noncash.16" = "2210.00"
"noncash.17" = "630.00"
"noncash.19" = "1190.00"
"noncash.count" = "4"
# The same books to 2026-03-18: #1 to #7 and #21 are dated by then (#9,
# #20 and #22 on 03-20, the rest later). The members paid #1, #2, #3, #6,
# #7 and #21 for the company, 85.00 + 12.97 + 99.00 + 7.49 + 129.00 +
# 216.40 = 549.86: operating -549.86; financing #4 +1,200.00, #5 +800.00
# and the 549.86 borrowed, +2,549.86; the change in cash 2,000.00
# (-549.86 + 2,549.86); net income -549.86 with no reconciling item (no
# operating balance has moved yet); nothing disclosed.
[[expect]]
query = "cash_flow"
from = "2026-01-01"
to = "2026-03-18"
[expect.values]
operating = "-549.86"
investing = "0.00"
financing = "2549.86"
net_change = "2000.00"
difference = "0.00"
net_income = "-549.86"
"operating.1" = "-85.00"
"operating.2" = "-12.97"
"operating.3" = "-99.00"
"operating.6" = "-7.49"
"operating.7" = "-129.00"
"operating.21" = "-216.40"
"operating.count" = "6"
"financing.1" = "85.00"
"financing.2" = "12.97"
"financing.3" = "99.00"
"financing.4" = "1200.00"
"financing.5" = "800.00"
"financing.6" = "7.49"
"financing.7" = "129.00"
"financing.21" = "216.40"
"financing.count" = "8"
"noncash.count" = "0"
@@ -18,16 +18,15 @@
# Setup beyond the accounts: `cash_accounts` are the bank accounts (BANK);
# an account's QuickBooks type otherwise follows its type (asset OCASSET,
# liability OCLIAB, equity EQUITY, revenue INC, expense EXP); an account's
# `parent` is its parent's code. Each event is a posted entry, its id one
# more than its index. Expected values: iif_lines gives the file's lines
# in order, each a string of fields joined by tabs ("\t"), every line
# ending CR LF in the file; iif_changes gives each text written
# differently from the books, in file order (the accounts as declared:
# by code, each after its parent; then the entries), as [what, books'
# text, file's text], where what is "name <code>", "number" (left out of
# ACCNUM when the file's text is empty), "top level <code>" (written
# apart from its parent, the books' text: the parent's code) or
# "memo <entry id>".
# `parent` is its parent's code. Event N is entry N (bookspec/README.md).
# Expected values: iif_lines gives the file's lines in order, each a
# string of fields joined by tabs ("\t"), every line ending CR LF in the
# file; iif_changes gives each text written differently from the books,
# in file order (the accounts as declared: by code, each after its
# parent; then the entries), as [what, books' text, file's text], where
# what is "name <code>", "number" (left out of ACCNUM when the file's
# text is empty), "top level <code>" (written apart from its parent, the
# books' text: the parent's code) or "memo <entry id>".
id = "iif-quickbooks-journal-file"
appendix = "formats"
@@ -48,7 +47,7 @@ tags = ["iif", "quickbooks", "as-of", "format", "transliteration"]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half_away_from_zero"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
[[setup.accounts]]
@@ -96,7 +95,7 @@ code = "6100"
name = "Professional services and consulting fees"
type = "expense"
# 0: entry 1.
# Entry 1.
[[events]]
date = "2026-01-02"
description = "Owner contribution"
@@ -105,7 +104,7 @@ lines = [
{ account = "3000", side = "credit", amount = "5000.00" },
]
# 1: entry 2. An em dash and double quotes.
# Entry 2. An em dash and double quotes.
[[events]]
date = "2026-01-15"
description = "Lunch — \"team\""
@@ -114,7 +113,7 @@ lines = [
{ account = "1000", side = "credit", amount = "42.50" },
]
# 2: entry 3. An account named past 31 characters.
# Entry 3. An account named past 31 characters.
[[events]]
date = "2026-01-20"
description = "Consulting"
@@ -123,7 +122,7 @@ lines = [
{ account = "1000", side = "credit", amount = "300.00" },
]
# 3: entry 4, dated the day itself: in.
# Entry 4, dated the day itself: in.
[[events]]
date = "2026-02-01"
description = "Sale"
@@ -132,7 +131,7 @@ lines = [
{ account = "4000", side = "credit", amount = "1000.00" },
]
# 4: entry 5, the day after: out.
# Entry 5, the day after: out.
[[events]]
date = "2026-02-02"
description = "Second sale"