bankTransactionReconciliationWorkflow and the activities behind it: the one
place that decides what reconciliation a b2b.bank_transaction row is owed and
carries it out.
The dispatch spans four domains — withdrawals, deposits, virtual accounts and
bank internal transfers — and no existing service library can see all of them.
bank-transaction-services cannot reach withdrawal-services (that edge runs
the other way, and TypeScript project references cannot be circular), and
withdrawal-services and deposit-services are siblings with no edge between
them. This package sits above all four and is imported only by
temporal-worker and backoffice-api.
Every producer of a bank_transaction row, via
startBankTransactionReconciliationWorkflow in @cfxlabsinc/bank-transaction-services:
VictorWebhookEventConsumer (raw.source = "victor_webhook")persistVictorBankTransactions (raw.source = "victor_sync")The workflow id is keyed on the bank transaction, so the two racing is a no-op.
BankTransactionReconciliationOutcome — RECONCILED,
ALREADY_RECONCILED, or NOT_APPLICABLE with the reason recorded.methodData.method, a rail/quote-method mismatch, or a
retryable condition that never resolved.Nothing completes silently having reconciled nothing.