whisper-money/app/Services/Banking
Víctor Falcón 271b659260 fix(banking): give every account its turn when the bank refuses one of them
`EnableBankingSyncer::sync` wrapped the transaction call but only caught
`InaccessibleBankAccountException` and `WrongTransactionsPeriodException`. A
`TransientBankingProviderException` — what EnableBanking's HTTP 400
`{"error":"ASPSP_ERROR"}` becomes, i.e. "the bank's connector failed" — propagated
out and abandoned the loop, so every account behind the failing one was skipped
along with its balance, cycle after cycle.

Verified in production on a CaixaBank connection with three accounts: account 1
kept importing transactions until 2026-07-18 (618 rows, 231 balance days), while
accounts 2 and 3 sat at zero transactions with their balances frozen at
2026-06-12 — the date of the last complete run. Five weeks of it. That user has
since deleted their account, so this ships as a latent fix rather than a rescue;
84 of the 260 live EnableBanking connections have two or more accounts.

Deliberately conservative about everything else. The failure is still raised once
every account has had its turn, so the connection keeps its Error state, its
retries and its unset `last_synced_at` exactly as before. Recording a partial run
as a success would have shown an Active badge and a fresh timestamp over an
account that had stopped updating, and nothing in the product distinguishes a
stale account from a fresh one — a quieter dead end than the one being fixed. It
would also have stamped `bank_transactions_email_cutoff_at` and consumed the
connection-level first sync, permanently losing the failing account's derived
balance history and reporting its eventual backfill as "new transactions today".

A provider that never answered is rethrown immediately instead: `statusCode` is
null only on the `ConnectionException` path, and carrying on there would spend the
client's timeout per account against the job's 120s — a 26-account connection
already takes 62s when everything works.
2026-08-13 10:13:56 +02:00
..
Formatters fix(banking): strip the ISO 20022 remittance tag from transaction descriptions (#744) 2026-08-09 18:11:05 +02:00
Sync fix(banking): give every account its turn when the bank refuses one of them 2026-08-13 10:13:56 +02:00
BalanceSyncService.php feat(transactions): allow manual transactions on bank-connected accounts (#747) 2026-08-10 05:32:40 +02:00
BinanceBalanceSyncService.php fix(binance): value past days from Binance's own snapshot total (#763) 2026-08-11 11:04:06 +00:00
BinanceClient.php fix(static-analysis): clear phpstan-baseline by fixing all suppressed errors (#183) 2026-03-02 12:22:30 +00:00
BitpandaBalanceSyncService.php fix(banking): stop crypto holdings quoted only in USD from vanishing from the balance (#759) 2026-08-11 02:56:03 +00:00
BitpandaClient.php fix(static-analysis): clear phpstan-baseline by fixing all suppressed errors (#183) 2026-03-02 12:22:30 +00:00
CoinbaseBalanceSyncService.php fix(coinbase): stop one unlisted stablecoin from unpricing the whole portfolio (#761) 2026-08-11 08:24:14 +00:00
CoinbaseClient.php Backfill Coinbase monthly history (#395) 2026-05-14 10:52:46 +01:00
CredentialField.php feat(banking): add Interactive Brokers sync via Flex Web Service (#581) 2026-06-23 11:39:24 +02:00
EnableBankingProvider.php fix(banking): stop unclassified bank responses from silently killing a connection (#742) 2026-08-09 17:26:34 +02:00
IndexaCapitalBalanceSyncService.php feat: store invested_amount in user currency instead of account currency (#262) 2026-04-06 12:48:13 +02:00
IndexaCapitalClient.php fix(banking): treat Indexa Capital performance 404 as empty data (#386) 2026-05-13 09:34:28 +01:00
InteractiveBrokersBalanceSyncService.php feat(banking): add Interactive Brokers sync via Flex Web Service (#581) 2026-06-23 11:39:24 +02:00
InteractiveBrokersClient.php feat(banking): add Interactive Brokers sync via Flex Web Service (#581) 2026-06-23 11:39:24 +02:00
TransactionCounterpartyExtractor.php feat(transactions): add counterparty fields (#440) 2026-05-27 16:20:55 +02:00
TransactionDescriptionFormatter.php fix(banking): strip the ISO 20022 remittance tag from transaction descriptions (#744) 2026-08-09 18:11:05 +02:00
TransactionFingerprint.php fix(banking): stop duplicating EnableBanking transactions with positional entry_reference (#669) 2026-07-12 16:25:13 +00:00
TransactionSyncService.php feat(spaces): phase 0 — multi-tenant Space foundation (no behaviour change) (#650) 2026-07-09 14:26:07 +02:00
WiseBalanceSyncService.php feat: add Wise open banking integration with balance sync (#525) 2026-06-16 13:23:25 +00:00
WiseClient.php fix(wise): send the pagination cursor under the name Wise reads (#788) 2026-08-12 11:30:37 +00:00
WiseTransactionSyncService.php fix(wise): send the pagination cursor under the name Wise reads (#788) 2026-08-12 11:30:37 +00:00