From aae3dfacfbf6f3e3bb6117cc4eb7009f269aad28 Mon Sep 17 00:00:00 2001 From: Ali <010109ali@gmail.com> Date: Tue, 12 May 2026 10:31:40 +0000 Subject: [PATCH] fix: clear validation message when default groups/company aren't set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creating customers/suppliers/bank accounts from unmapped rows fell back to "All Customer Groups" / "All Territories" / "All Supplier Groups", which don't exist on localized sites, producing ERPNext's cryptic "Could not find Customer Group: All Customer Groups". Creation now validates upfront and returns a clear message ("Set a Default Customer Group on Kapital Bank Settings ...") before touching any records — also for Territory, Supplier Group, and Company/Bank when creating Bank Accounts from account/card mappings. Co-Authored-By: Claude Opus 4.7 (1M context) --- kapital_bank/bank_api.py | 47 +++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/kapital_bank/bank_api.py b/kapital_bank/bank_api.py index b0ad19f..625ee3a 100644 --- a/kapital_bank/bank_api.py +++ b/kapital_bank/bank_api.py @@ -658,6 +658,16 @@ def create_unmapped_customers(settings_name=None): if not unmapped: return {"success": True, "created_count": 0, "message": "No unmapped customers in table to create"} + # Validate config upfront — clearer than ERPNext's cryptic + # "Could not find Customer Group" thrown deep inside party creation. + for mapping, _kb_customer in unmapped: + group = mapping.customer_group or doc.default_customer_group + if not group or not frappe.db.exists("Customer Group", group): + return {"success": False, "message": "Set a Default Customer Group on Kapital Bank Settings (or a Customer Group on each customer mapping row) before creating customers."} + territory = mapping.territory or doc.default_territory + if not territory or not frappe.db.exists("Territory", territory): + return {"success": False, "message": "Set a Default Territory on Kapital Bank Settings (or a Territory on each customer mapping row) before creating customers."} + created = 0 for mapping, kb_customer in unmapped: try: @@ -668,16 +678,8 @@ def create_unmapped_customers(settings_name=None): party = frappe.new_doc("Customer") party.customer_name = customer_name party.customer_type = "Company" - - customer_group = mapping.customer_group or doc.default_customer_group - if not customer_group or not frappe.db.exists("Customer Group", customer_group): - customer_group = "All Customer Groups" - party.customer_group = customer_group - - territory = mapping.territory or doc.default_territory or "All Territories" - if not frappe.db.exists("Territory", territory): - territory = "All Territories" - party.territory = territory + party.customer_group = mapping.customer_group or doc.default_customer_group + party.territory = mapping.territory or doc.default_territory if kb_customer.tax_id: party.tax_id = kb_customer.tax_id @@ -733,6 +735,11 @@ def create_unmapped_suppliers(settings_name=None): if not unmapped: return {"success": True, "created_count": 0, "message": "No unmapped suppliers in table to create"} + for mapping, _kb_supplier in unmapped: + group = mapping.supplier_group or doc.default_supplier_group + if not group or not frappe.db.exists("Supplier Group", group): + return {"success": False, "message": "Set a Default Supplier Group on Kapital Bank Settings (or a Supplier Group on each supplier mapping row) before creating suppliers."} + created = 0 for mapping, kb_supplier in unmapped: try: @@ -743,11 +750,7 @@ def create_unmapped_suppliers(settings_name=None): party = frappe.new_doc("Supplier") party.supplier_name = supplier_name party.supplier_type = "Company" - - supplier_group = mapping.supplier_group or doc.default_supplier_group - if not supplier_group or not frappe.db.exists("Supplier Group", supplier_group): - supplier_group = "All Supplier Groups" - party.supplier_group = supplier_group + party.supplier_group = mapping.supplier_group or doc.default_supplier_group if kb_supplier.tax_id: party.tax_id = kb_supplier.tax_id @@ -859,6 +862,14 @@ def create_unmapped_accounts(settings_name=None): default_bank = doc.default_bank default_company = doc.default_company + # Bank Account requires both Company and Bank — surface a clear message + # instead of ERPNext's mandatory-field error mid-creation. + if any(not frappe.db.exists("Bank Account", {"bank_account_no": r.iban}) for r in unmapped): + if not default_company: + return {"success": False, "message": "Set a Default Company on Kapital Bank Settings before creating Bank Accounts."} + if not default_bank: + return {"success": False, "message": "Set a Default Bank on Kapital Bank Settings before creating Bank Accounts."} + created = 0 for row in unmapped: try: @@ -978,6 +989,12 @@ def create_unmapped_cards(settings_name=None): default_bank = doc.default_bank default_company = doc.default_company + if any(not frappe.db.exists("Bank Account", {"bank_account_no": r.account_number}) for r in unmapped): + if not default_company: + return {"success": False, "message": "Set a Default Company on Kapital Bank Settings before creating Bank Accounts."} + if not default_bank: + return {"success": False, "message": "Set a Default Bank on Kapital Bank Settings before creating Bank Accounts."} + created = 0 for row in unmapped: try: