| |
| """Read-only D3 ledger verification: balanced journals + projections match derived balances. |
| |
| Exit code 0 when the ledger is healthy, 1 otherwise. Never mutates the database. |
| |
| Example: |
| python scripts/d3_verify_ledger.py --db-path /tmp/amanpay-d2/amanpay.db --tenant event \ |
| --allow-unknown-fs --json |
| """ |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import sys |
|
|
| from amanpay.finance.cli import add_common_args, build_runtime_for_cli, emit, resolve_tenant_id |
| from amanpay.finance.verification import verify_ledger |
|
|
|
|
| def main(argv=None) -> int: |
| p = argparse.ArgumentParser(description="Verify the D3 ledger (read-only).") |
| add_common_args(p, tenant_required=False) |
| args = p.parse_args(argv) |
|
|
| rt = build_runtime_for_cli(args.db_path, allow_unknown_fs=args.allow_unknown_fs) |
| tid = resolve_tenant_id(rt, args.tenant) if args.tenant else None |
| result = verify_ledger(rt.store, tid) |
| emit({"ok": result["ok"], "all_balanced": result["control_totals"]["all_balanced"], |
| "projections_ok": result["projections"]["ok"], |
| "last_journal_seq": result["control_totals"]["last_journal_seq"], |
| "counts": result["control_totals"]["counts"]}, as_json=args.json) |
| rt.close() |
| return 0 if result["ok"] else 1 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|