From f8294f17543283faf248ba878732d607a60f3f34 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 17:05:58 +0530 Subject: [PATCH] feat(Company): allow setting default sales contact, fetch into sales transaction (backport #50159) (#50599) Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Co-authored-by: Diptanil Saha --- erpnext/controllers/selling_controller.py | 8 ++++++++ erpnext/public/js/utils/sales_common.js | 22 ++++++++++++++++++++++ erpnext/setup/doctype/company/company.js | 7 +++++++ erpnext/setup/doctype/company/company.json | 9 ++++++++- erpnext/setup/doctype/company/company.py | 1 + 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index ff8dec4db70..d74ea55450a 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -95,6 +95,7 @@ class SellingController(StockController): # set contact and address details for customer, if they are not mentioned self.set_missing_lead_customer_details(for_validate=for_validate) self.set_price_list_and_item_details(for_validate=for_validate) + self.set_company_contact_person() def set_missing_lead_customer_details(self, for_validate=False): customer, lead = None, None @@ -150,6 +151,13 @@ class SellingController(StockController): self.set_price_list_currency("Selling") self.set_missing_item_details(for_validate=for_validate) + def set_company_contact_person(self): + """Set the Company's Default Sales Contact as Company Contact Person.""" + if self.company and self.meta.has_field("company_contact_person") and not self.company_contact_person: + self.company_contact_person = frappe.get_cached_value( + "Company", self.company, "default_sales_contact" + ) + def remove_shipping_charge(self): if self.shipping_rule: shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule) diff --git a/erpnext/public/js/utils/sales_common.js b/erpnext/public/js/utils/sales_common.js index bf4ef8666cd..7e2271dc38f 100644 --- a/erpnext/public/js/utils/sales_common.js +++ b/erpnext/public/js/utils/sales_common.js @@ -115,6 +115,10 @@ erpnext.sales_common = { company() { super.company(); this.set_default_company_address(); + if (!this.is_onload) { + // we don't want to override the mapped contact from prevdoc + this.set_default_company_contact_person(); + } } set_default_company_address() { @@ -139,6 +143,24 @@ erpnext.sales_common = { } } + set_default_company_contact_person() { + if (!frappe.meta.has_field(this.frm.doc.doctype, "company_contact_person")) { + return; + } + + if (this.frm.doc.company) { + frappe.db + .get_value("Company", this.frm.doc.company, "default_sales_contact") + .then((r) => { + if (r.message?.default_sales_contact) { + this.frm.set_value("company_contact_person", r.message.default_sales_contact); + } else { + this.frm.set_value("company_contact_person", ""); + } + }); + } + } + customer() { var me = this; erpnext.utils.get_party_details(this.frm, null, null, function () { diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index f736769b915..032ec707330 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -37,6 +37,13 @@ frappe.ui.form.on("Company", { return { filters: { selling: 1 } }; }); + frm.set_query("default_sales_contact", function (doc) { + return { + query: "frappe.contacts.doctype.contact.contact.contact_query", + filters: { link_doctype: "Company", link_name: doc.name }, + }; + }); + frm.set_query("default_buying_terms", function () { return { filters: { buying: 1 } }; }); diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 8c4f85ff19f..fc6533a1e89 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -103,6 +103,7 @@ "total_monthly_sales", "column_break_goals", "default_selling_terms", + "default_sales_contact", "default_warehouse_for_sales_return", "credit_limit", "transactions_annual_history", @@ -851,6 +852,12 @@ "fieldtype": "Select", "label": "Reconciliation Takes Effect On", "options": "Advance Payment Date\nOldest Of Invoice Or Advance\nReconciliation Date" + }, + { + "fieldname": "default_sales_contact", + "fieldtype": "Link", + "label": "Default Sales Contact", + "options": "Contact" } ], "icon": "fa fa-building", @@ -858,7 +865,7 @@ "image_field": "company_logo", "is_tree": 1, "links": [], - "modified": "2025-08-25 18:34:03.602046", + "modified": "2025-11-16 16:51:27.624096", "modified_by": "Administrator", "module": "Setup", "name": "Company", diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index f9978099ed5..50fe87ef654 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -66,6 +66,7 @@ class Company(NestedSet): default_payable_account: DF.Link | None default_provisional_account: DF.Link | None default_receivable_account: DF.Link | None + default_sales_contact: DF.Link | None default_selling_terms: DF.Link | None default_warehouse_for_sales_return: DF.Link | None depreciation_cost_center: DF.Link | None