v1.9.12 · Released · April 17, 2026

Bulk Actions on Transactions + Correctness Fixes

Bulk delete and bulk categorize on the Transactions page (opt-in behind a feature flag). Two latent single-row bugs fixed in the same branch so bulk operations don't amplify them: tithe / emergency-fund reversal on income delete, and fragile fee-expense match on transfer delete. Thin-controller refactor on account balance adjustment.

Bulk Actions
  • Transactions page: select multiple rows via left-column checkboxes, then delete or recategorize them in one action. Up to 100 rows per batch.
  • Defense-in-depth filters: rows linked to tithe / emergency-fund allocations and transfers with fees are skipped and reported — delete those individually.
  • Atomic semantics: any failure inside a batch rolls back the entire set so account balances can't drift mid-delete.
  • Selection clears automatically when you change a filter or paginate — prevents stale-ID mistakes.
  • Hidden on small screens (`sm:` and below) — desktop-only for now.
Correctness Fixes
  • Deleting an income with tithe or emergency-fund settings now correctly reverses the linked Tithes / EF account balances and decrements the EF goal's current amount.
  • Deleting a transfer that had a bank fee now deletes exactly the matching fee expense row (previously a same-day / same-fee collision could delete the wrong row).
  • Manual balance adjustment UI now refreshes the account page after confirmation, matching the quick-action flow.
Improvements
  • Credit card rows in the Accounts table now show a utilization bar (percent used / available) when a credit limit is set.
  • Account balance adjustment refactored to a thin-controller shape — business logic moved into `AccountService.adjustBalance`.