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

@@ -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"