# Alder Books Reconciliation: ledger, trial balance, bank statement and payment-initiation documents

A complete month-end accounting pack for one small entity: the chart of accounts, the general ledger export that balances, the trial balance that ties to it, the bank statement in five different formats (CSV, camt.053, MT940, OFX and QIF), the reconciliation that matches them, the aged debtors and creditors, a payment initiation file and a legacy fixed-width feed with its column map and COBOL copybook.

All parties, amounts and identifiers are fictional. Fixed snapshot: 2026-09-08. Every record is derived from the shared operating model `accounting-reconciliation`, so identifiers join across this set and across the business-kit fixtures that use the same model.

## Reconciliation identities this set asserts

- Ledger debits equal ledger credits at 22464.00, and every document_id balances on its own.
- Trial balance debits equal credits at 13100.00.
- Trial balance account 1000 equals the bank statement closing balance, 10236.00, in all five statement formats.
- Trial balance account 1100 equals the aged debtors total, 800.00.
- All 24 statement lines match a cash ledger line with a 0.00 difference.
- The pain.001 control sum equals the sum of its instructed amounts and the aged creditors total, 2064.00.

## Files

| File | Format | Validity | What it is |
| --- | --- | --- | --- |
| `chart-of-accounts.csv` | csv | reference | Chart of accounts |
| `chart-of-accounts.json` | json | reference | Chart of accounts JSON |
| `general-ledger-export.csv` | csv | valid | General ledger export |
| `general-ledger-export.json` | json | valid | General ledger export JSON |
| `general-ledger-parentheses-negatives.csv` | csv | valid | General ledger with parenthesised credits and grouped thousands |
| `general-ledger-eu-dialect.csv` | csv | valid | General ledger in the European CSV dialect |
| `trial-balance.csv` | csv | valid | Trial balance that balances |
| `trial-balance.json` | json | valid | Trial balance JSON |
| `trial-balance-out-of-balance.csv` | csv | invalid | Trial balance out by 1250.00 |
| `journal-batch.csv` | csv | valid | Balanced manual journal batch |
| `journal-batch-unbalanced.csv` | csv | invalid | Journal batch with one entry out by 45.00 |
| `bank-statement.csv` | csv | valid | Bank statement CSV |
| `bank-statement-camt053.xml` | xml | valid | camt.053 bank statement |
| `bank-statement-camt053-entry-count-mismatch.xml` | xml | invalid | camt.053 whose entry count does not match its entries |
| `bank-statement-mt940.txt` | txt | valid | MT940 bank statement |
| `bank-statement-mt940-bad-closing-balance.txt` | txt | invalid | MT940 whose :62F: closing balance is out by 100.00 |
| `bank-statement.ofx` | ofx | valid | OFX 1.0.3 bank statement |
| `bank-statement.qif` | qif | valid | QIF bank statement |
| `bank-reconciliation.csv` | csv | valid | Bank reconciliation |
| `bank-reconciliation.json` | json | valid | Bank reconciliation JSON |
| `aged-debtors.csv` | csv | valid | Aged debtors report |
| `aged-creditors.csv` | csv | valid | Aged creditors summary |
| `budget-vs-actual.csv` | csv | valid | Budget versus actual |
| `supplier-payments-pain001.xml` | xml | valid | ISO 20022 pain.001 payment initiation |
| `saft-ledger-extract.xml` | xml | valid | SAF-T style ledger extract |
| `gl-feed-fixed-width.txt` | txt | valid | Fixed-width general ledger feed |
| `gl-feed-layout.json` | json | reference | Fixed-width GL feed column map |
| `gl-feed-fixed-width-short-record.txt` | txt | invalid | Fixed-width GL feed with one record a byte short |
| `gl-feed-copybook.txt` | txt | reference | COBOL copybook for the GL feed |
| `ledger-pack.xlsx` | xlsx | valid | Month-end ledger pack workbook |
| `month-end-close-pack.pdf` | pdf | valid | Month-end close pack PDF |
| `ledger-reconciliation.json` | json | reference | Ledger reconciliation assertions |

## Deliberate defects

These files are broken on purpose. Each one is a single named mutation of a correct file in the same directory, so a parser under test can be checked against both.

- **`trial-balance-out-of-balance.csv`** Debits 14350.00 exceed credits 13100.00 by exactly 1250.00. The single cause is account 5200, which reports 1923.00 where the general ledger supports 673.00; every other account agrees with general-ledger-export.csv.
- **`journal-batch-unbalanced.csv`** JB-2026-08-02 posts 64.50 of debit against 19.50 of credit, an imbalance of 45.00. JB-2026-08-01 and JB-2026-08-03 balance, so the batch totals differ by the same 45.00; an importer that only checks the batch total still rejects it, but one that posts line by line leaves the ledger permanently out of balance.
- **`bank-statement-camt053-entry-count-mismatch.xml`** NbOfNtries declares 24 but only 23 Ntry elements exist, and replaying them from the OPBD 5000.00 reaches 10442.00, which is 206.00 short of the declared CLBD 10236.00. A parser that trusts the header without counting reports a clean import.
- **`bank-statement-mt940-bad-closing-balance.txt`** Replaying the 24 :61: lines from the :60F: opening balance 5000,00 yields 10236,00, but :62F: declares 10336,00, a 100.00 overstatement that :64: repeats. A parser that reads :62F: as authoritative imports a bank balance the transactions do not support.
- **`gl-feed-fixed-width-short-record.txt`** Record 5 is 119 characters where the layout declares 120. A length check rejects it; a reader that slices without checking returns a currency of US for that record and correct values for all the others, which is exactly the class of truncation that survives into a posted ledger.

## Notes and limits

- The SAF-T extract uses the OECD SAF-T 2.0 element names and control totals but is not validated against the official XSD and is not a jurisdiction-specific submission file.
- MT940, OFX and QIF are written with CRLF line endings because that is what those formats carry in practice. Every other text file in this set is LF.
- OFX 1.0.3 is SGML, not XML: its tags are not closed. An XML parser is expected to fail on bank-statement.ofx, and that is the point of shipping it.
- QIF carries no opening balance and no currency, so a closing balance can only be derived from the transactions plus a balance the file does not contain.
- These are ledger fixtures. They are not accounting or tax advice.
