From 09a3eb8509179e97761bc48a1a66520b41b9bba0 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 29 Jun 2026 22:42:47 +0530 Subject: [PATCH] fix(integrations): savepoint the Plaid bank-account update branch + rollback add_institution (Postgres) add_bank_accounts hardened only the INSERT branch with savepoint('plaid_bank_account'); the parallel else/UPDATE branch ran log_error+throw after a failed existing_account.save() with no rollback -> InFailedSqlTransaction on Postgres (masking the friendly throw). Mirror the insert branch with savepoint('plaid_update_account')+rollback. Also add_institution's except log_error after a failed bank.insert() now rolls back first. No-op on MariaDB. --- .../doctype/plaid_settings/plaid_settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py index a4113dfcab4..25d5a861a4b 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py @@ -69,6 +69,7 @@ def add_institution(token: str, response: str | dict): ) bank.insert() except Exception: + frappe.db.rollback() frappe.log_error("Plaid Link Error") else: bank = frappe.get_doc("Bank", response["institution"]["name"]) @@ -154,6 +155,7 @@ def add_bank_accounts(response: str | dict, bank: str | dict, company: str): ) else: + frappe.db.savepoint("plaid_update_account") try: existing_account = frappe.get_doc("Bank Account", existing_bank_account) existing_account.update( @@ -169,6 +171,7 @@ def add_bank_accounts(response: str | dict, bank: str | dict, company: str): existing_account.save() result.append(existing_bank_account) except Exception: + frappe.db.rollback(save_point="plaid_update_account") frappe.log_error("Plaid Link Error") frappe.throw( _("There was an error updating Bank Account {0} while linking with Plaid.").format(