diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py index 51bc540937f..36c2f8c7fc8 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py @@ -113,6 +113,8 @@ def add_bank_accounts(response: str | dict, bank: str | dict, company: str): if not existing_bank_account: try: + # savepoint so a failed insert doesn't poison the transaction on postgres + frappe.db.savepoint("plaid_bank_account") gl_account = frappe.get_doc( { "doctype": "Account", @@ -142,12 +144,14 @@ def add_bank_accounts(response: str | dict, bank: str | dict, company: str): result.append(new_account.name) except frappe.UniqueValidationError: + frappe.db.rollback(save_point="plaid_bank_account") # preserve transaction in postgres frappe.msgprint( _("Bank account {0} already exists and could not be created again").format( account["name"] ) ) except Exception: + frappe.db.rollback(save_point="plaid_bank_account") # preserve transaction in postgres frappe.log_error("Plaid Link Error") frappe.throw( _("There was an error creating Bank Account while linking with Plaid."), diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py index 806db071963..1d1edeaf949 100644 --- a/erpnext/setup/setup_wizard/operations/install_fixtures.py +++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py @@ -567,6 +567,7 @@ def create_bank_account(args, demo=False): } ) try: + frappe.db.savepoint("create_bank_account") doc = bank_account.insert() if args.get("set_default"): @@ -583,6 +584,7 @@ def create_bank_account(args, demo=False): except RootNotEditable: frappe.throw(frappe._("Bank account cannot be named as {0}").format(args.get("bank_account"))) except frappe.DuplicateEntryError: + frappe.db.rollback(save_point="create_bank_account") # preserve transaction in postgres # bank account same as a CoA entry pass