Skip to content

CAP-ACC-REC-003Verify payouts using bank evidence

Markdown

CAP-ACC-REC-003

Verify payouts using bank evidence

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationInconsistent

KindCapabilityProduct areaAccountingModuleReconciliationRevision2

Read atservices-accounting f47cb263react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Bank agreement comes from verification evidence rather than entry origin.Verified accounting follows the posted bank day.Disagreement remains visible as a warning.
Surfaces
consoleapi
Intent sources
services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D6 (architecture §3.4 U1: bank verification only by evidence)services-accounting:docs/reconciliation/architecture.md#14.1 Three separate facts on a payout (approved through ACCT-M8-plan D10 §4)

Controls

16 controls apply, from the corpus control catalogue.

TC-IAM-001 TC-IAM-002 TC-IAM-004 TC-IAM-005 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-006 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-LOG-004 TC-PI-001 TC-PI-002 TC-PI-005

Permissions

KeyChecked atScope
accounting.payouts.verifyapitenant
accounting.payouts.verifyconsoletenant

Business Rules

10 rules, 10 to be proved before approval. A rule's product intent is derived from its origin: 10 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Verification requires bank evidence, a posted day, verified or mismatch outcome, the read version and a request key; the bank’s amount is optional.
validationapi, servicetest
services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#refuses a verification without its evidence with 400 naming the field; services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#refuses a principal without accounting.payouts.verify with 403; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#answers the stored payout for the same key and request
02must prove
Confirmed
Creation and correction leave bank verification unset; a verification supplies the status, verifier and verification time.
invariantservice, databasetest
services-accounting:modules/reconciliation/tests/integration/db/payouts.table.integration.spec.js#refuses a verified payout without who verified it and when; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#records the verification, the bank’s posted date becoming the accounting date, and keeps the statement as evidence; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the bank posted date once the bank verified the payout; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the reported deposit date while the bank evidence is a mismatch; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the processor funding date when nothing was reported; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps one evidence file when the statement is named again
03must prove
Confirmed
A verified payout uses the bank’s posted day for accounting, otherwise its reported day takes precedence over processor funding day, which can shift the payout’s period.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (plan approved 2026-10-22 10:40 ET; §2 scope); journey 0594
calculationservice, databasetest
services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the bank posted date once the bank verified the payout; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#records the verification, the bank’s posted date becoming the accounting date, and keeps the statement as evidence; services-accounting:modules/reconciliation/tests/integration/db/payouts.table.integration.spec.js#refuses a verified payout without who verified it and when; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the reported deposit date while the bank evidence is a mismatch; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the processor funding date when nothing was reported; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps one evidence file when the statement is named again
04must prove
Confirmed
A successful verification retains its bank evidence without duplicating an already attached statement.
policyservicetest
services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps one evidence file when the statement is named again; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#records the verification, the bank’s posted date becoming the accounting date, and keeps the statement as evidence; services-accounting:modules/reconciliation/tests/integration/db/payouts.table.integration.spec.js#refuses a verified payout without who verified it and when; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the bank posted date once the bank verified the payout; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the reported deposit date while the bank evidence is a mismatch; services-accounting:modules/reconciliation/tests/unit/rules/payout-rules.spec.js#is the processor funding date when nothing was reported
05must prove
Confirmed
Mismatch retains the reported accounting day and opens a single bank-mismatch warning, including the bank amount and difference when supplied; another open mismatch creates no second warning.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D6 (architecture §3.4 U10: exceptions come from detectors with dedupe keys)
policyservicetest
services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#says what the bank showed and by how much it differs, in the exception’s title and description (DEF-ACT-0593); services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps the reported date as the accounting date of a mismatch and raises a bank-mismatch exception; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#raises no second exception for a second mismatch while the first is open; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#refuses a bank amount that contradicts the outcome (DEF-ACT-0593); services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#resolves the open mismatch when the bank’s evidence later verifies the payout
06must prove
Confirmed
Subsequent agreement with the bank closes the open mismatch warning and records the resolution.
lifecycleservicetest
services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#resolves the open mismatch when the bank’s evidence later verifies the payout; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps the reported date as the accounting date of a mismatch and raises a bank-mismatch exception; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#says what the bank showed and by how much it differs, in the exception’s title and description (DEF-ACT-0593); services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#raises no second exception for a second mismatch while the first is open; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#refuses a bank amount that contradicts the outcome (DEF-ACT-0593)
07must prove
Confirmed
The stated bank amount must agree with the outcome: unequal amounts cannot be verified and equal amounts cannot be marked mismatch.
validationservicetest
services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#refuses a bank amount that contradicts the outcome (DEF-ACT-0593); services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#keeps the reported date as the accounting date of a mismatch and raises a bank-mismatch exception; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#says what the bank showed and by how much it differs, in the exception’s title and description (DEF-ACT-0593); services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#raises no second exception for a second mismatch while the first is open; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#resolves the open mismatch when the bank’s evidence later verifies the payout
08must prove
Confirmed
Verification is unavailable once a finalized reconciliation holds the payout.
origin: services-accounting:docs/milestones/plans/ACCT-M8-plan.md#D10 (§4: the architecture §6 invariants hold; INV-09)
invariantservicetest
09must prove
Confirmed
Only the verify permission allows bank verification, and an identical keyed retry returns the recorded result.
permissionapitest
services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#refuses a principal without accounting.payouts.verify with 403; services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#refuses a verification without its evidence with 400 naming the field; services-accounting:modules/reconciliation/tests/integration/services/persistence/payouts.integration.spec.js#answers the stored payout for the same key and request
10must prove
Confirmed
The console verification command omits evidence, posted day and outcome, so the live service rejects it without verifying the payout.
validationconsole, apiobserved

Scenarios

IdGivenWhenThenProvenance
01The reported day is September’s last day and the statement posts it on October’s first day.Verify bank agreement using the statement.The payout becomes verified and accounting moves to October.test
services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#answers the payout verified, its accounting date the bank’s posted date
02The statement shows unequal money.Record a mismatch and the bank amount.The warning describes the bank amount and its difference from the payout.test
services-accounting:modules/reconciliation/tests/e2e/payouts.e2e.spec.js#answers a mismatch and raises a bank-mismatch exception about the payout

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.