From 5cfd7ec32aecd1a4df8b378599b425c177c1cf7c Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Sun, 30 Nov 2025 18:30:47 +0530 Subject: [PATCH] refactor: generalize popup for multiple doctypes --- erpnext/controllers/accounts_controller.py | 51 +++++++++++++++------- erpnext/public/js/print.js | 26 +++++++---- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 48e2adef651..fb809473962 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4175,7 +4175,10 @@ def get_missing_company_details(doctype, docname): from frappe.contacts.doctype.address.address import get_address_display_list company = frappe.db.get_value(doctype, docname, "company") - company_address = frappe.db.get_value(doctype, docname, "company_address") + if doctype == "Purchase Order": + company_address = frappe.db.get_value(doctype, docname, "billing_address") + else: + company_address = frappe.db.get_value(doctype, docname, "company_address") company_details = frappe.get_value( "Company", company, ["company_logo", "website", "phone_no", "email"], as_dict=True @@ -4195,7 +4198,7 @@ def get_missing_company_details(doctype, docname): ) return - if not company_address and not frappe.has_permission("Sales Invoice", "write", throw=False): + if not company_address and not frappe.has_permission(doctype, "write", throw=False): frappe.msgprint( _( "Company Address is missing. You don't have permission to update it. Please contact your System Manager." @@ -4224,7 +4227,7 @@ def get_missing_company_details(doctype, docname): @frappe.whitelist() -def update_company_master_and_address(name, company, details): +def update_company_master_and_address(current_doctype, name, company, details): from frappe.utils import validate_email_address if isinstance(details, str): @@ -4259,18 +4262,36 @@ def update_company_master_and_address(name, company, details): address_doc.insert() company_address = address_doc.name - if company_address: - company_address_display = frappe.db.get_value("Sales Invoice", name, "company_address_display") - if not company_address_display or details.get("address_line1"): - from frappe.query_builder import DocType + update_doc_company_address(current_doctype, name, company_address, details) - SalesInvoice = DocType("Sales Invoice") - ( - frappe.qb.update(SalesInvoice) - .set(SalesInvoice.company_address, company_address) - .set(SalesInvoice.company_address_display, get_address_display(company_address)) - .where(SalesInvoice.name == name) - ).run() +def update_doc_company_address(current_doctype, docname, company_address, details): + if not company_address: + return - return True + address_field_map = { + "Purchase Order": ("billing_address", "billing_address_display"), + "Sales Invoice": ("company_address", "company_address_display"), + "Delivery Note": ("company_address", "company_address_display"), + "POS Invoice": ("company_address", "company_address_display"), + } + + address_field, display_field = address_field_map.get( + current_doctype, ("company_address", "company_address_display") + ) + + current_display = frappe.db.get_value(current_doctype, docname, display_field) + + if current_display and not details.get("address_line1"): + return + + from frappe.query_builder import DocType + + DocType = DocType(current_doctype) + + ( + frappe.qb.update(DocType) + .set(getattr(DocType, address_field), company_address) + .set(getattr(DocType, display_field), get_address_display(company_address)) + .where(DocType.name == docname) + ).run() diff --git a/erpnext/public/js/print.js b/erpnext/public/js/print.js index 4afd34e16dd..105a580aed6 100644 --- a/erpnext/public/js/print.js +++ b/erpnext/public/js/print.js @@ -1,5 +1,14 @@ -const doctype_list = ["Sales Invoice"]; -const allowed_print_formats = ["Sales Invoice Standard", "Sales Invoice with Item Image"]; +const doctype_list = ["Sales Invoice", "Delivery Note", "Purchase Order", "POS Invoice"]; +const allowed_print_formats = [ + "Sales Invoice Standard", + "Sales Invoice with Item Image", + "Delivery Note Standard", + "Delivery Note with Item Image", + "Purchase Order Standard", + "Purchase Order with Item Image", + "POS Invoice Standard", + "POS Invoice with Item Image", +]; const allowed_letterheads = ["Company Letterhead", "Company Letterhead - Grey"]; handle_route_event(); @@ -25,25 +34,25 @@ function should_fetch_company_details() { return allowed_print_formats.includes(print_format) || allowed_letterheads.includes(letterhead); } -function fetch_company_details(doctype, docname) { +function fetch_company_details(current_doctype, current_docname) { frappe.call({ method: "erpnext.controllers.accounts_controller.get_missing_company_details", - args: { doctype, docname }, + args: { doctype: current_doctype, docname: current_docname }, callback: function (r) { if (r && r.message) { - open_company_details_dialog(r.message); + open_company_details_dialog(r.message, current_doctype); } }, }); } -function open_company_details_dialog(data) { +function open_company_details_dialog(data, current_doctype) { const dialog = new frappe.ui.Dialog({ title: __("Enter Company Details"), fields: build_dialog_fields(data), primary_action_label: __("Save"), primary_action(values) { - save_company_details(dialog, data, values); + save_company_details(dialog, data, values, current_doctype); }, }); @@ -117,13 +126,14 @@ function make_field(label, fieldname, fieldtype, existing_value, required_if_emp }; } -function save_company_details(dialog, data, values) { +function save_company_details(dialog, data, values, current_doctype) { frappe.call({ method: "erpnext.controllers.accounts_controller.update_company_master_and_address", args: { name: data.name, company: data.company, details: values, + current_doctype: current_doctype, }, callback() { dialog.hide();