From 54b5205221fe5447b01938abda5fc25b90892994 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Wed, 9 Apr 2025 19:19:47 +0530 Subject: [PATCH 1/9] feat: add dispatch address fields to purchase doctypes --- .../purchase_invoice/purchase_invoice.json | 22 +++++++++++++++++-- .../purchase_invoice/purchase_invoice.py | 2 ++ .../purchase_order/purchase_order.json | 22 +++++++++++++++++-- .../doctype/purchase_order/purchase_order.py | 2 ++ .../purchase_receipt/purchase_receipt.json | 22 +++++++++++++++++-- .../purchase_receipt/purchase_receipt.py | 2 ++ 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index dbca7b5dd0e..2a1f83e829f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -145,8 +145,10 @@ "contact_email", "company_shipping_address_section", "shipping_address", - "column_break_126", "shipping_address_display", + "column_break_126", + "dispatch_address", + "dispatch_address_display", "company_billing_address_section", "billing_address", "column_break_130", @@ -1635,13 +1637,28 @@ "fieldtype": "Data", "label": "Sender", "options": "Email" + }, + { + "fieldname": "dispatch_address_display", + "fieldtype": "Text Editor", + "label": "Dispatch Address", + "print_hide": 1, + "read_only": 1 + }, + { + "fieldname": "dispatch_address", + "fieldtype": "Link", + "label": "Select Dispatch Address ", + "options": "Address", + "print_hide": 1 } ], + "grid_page_length": 50, "icon": "fa fa-file-text", "idx": 204, "is_submittable": 1, "links": [], - "modified": "2025-01-14 11:39:04.564610", + "modified": "2025-04-09 16:49:22.175081", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -1696,6 +1713,7 @@ "write": 1 } ], + "row_format": "Dynamic", "search_fields": "posting_date, supplier, bill_no, base_grand_total, outstanding_amount", "sender_field": "sender", "show_name_in_global_search": 1, diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index a0955e67169..bcb85148cdb 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -117,6 +117,8 @@ class PurchaseInvoice(BuyingController): currency: DF.Link | None disable_rounded_total: DF.Check discount_amount: DF.Currency + dispatch_address: DF.Link | None + dispatch_address_display: DF.TextEditor | None due_date: DF.Date | None from_date: DF.Date | None grand_total: DF.Currency diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index cac6854b89e..1cd47b28ceb 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -110,8 +110,10 @@ "contact_email", "shipping_address_section", "shipping_address", - "column_break_99", "shipping_address_display", + "column_break_99", + "dispatch_address", + "dispatch_address_display", "company_billing_address_section", "billing_address", "column_break_103", @@ -1282,13 +1284,28 @@ "oldfieldtype": "Select", "options": "Not Initiated\nInitiated\nPartially Paid\nFully Paid", "print_hide": 1 + }, + { + "fieldname": "dispatch_address", + "fieldtype": "Link", + "label": "Dispatch Address", + "options": "Address", + "print_hide": 1 + }, + { + "fieldname": "dispatch_address_display", + "fieldtype": "Text Editor", + "label": "Dispatch Address Details", + "print_hide": 1, + "read_only": 1 } ], + "grid_page_length": 50, "icon": "fa fa-file-text", "idx": 105, "is_submittable": 1, "links": [], - "modified": "2024-03-27 13:10:24.518785", + "modified": "2025-04-09 16:54:08.836106", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", @@ -1335,6 +1352,7 @@ "write": 1 } ], + "row_format": "Dynamic", "search_fields": "status, transaction_date, supplier, grand_total", "show_name_in_global_search": 1, "sort_field": "creation", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 001a20e90e6..011e7103529 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -92,6 +92,8 @@ class PurchaseOrder(BuyingController): customer_name: DF.Data | None disable_rounded_total: DF.Check discount_amount: DF.Currency + dispatch_address: DF.Link | None + dispatch_address_display: DF.TextEditor | None from_date: DF.Date | None grand_total: DF.Currency group_same_items: DF.Check diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index dd095fd8df9..8ae9ef58d3d 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -113,8 +113,10 @@ "contact_email", "section_break_98", "shipping_address", - "column_break_100", "shipping_address_display", + "column_break_100", + "dispatch_address", + "dispatch_address_display", "billing_address_section", "billing_address", "column_break_104", @@ -1267,13 +1269,28 @@ "no_copy": 1, "print_hide": 1, "read_only": 1 + }, + { + "fieldname": "dispatch_address", + "fieldtype": "Link", + "label": "Dispatch Address Template", + "options": "Address", + "print_hide": 1 + }, + { + "fieldname": "dispatch_address_display", + "fieldtype": "Text Editor", + "label": "Dispatch Address", + "print_hide": 1, + "read_only": 1 } ], + "grid_page_length": 50, "icon": "fa fa-truck", "idx": 261, "is_submittable": 1, "links": [], - "modified": "2024-11-13 16:55:14.129055", + "modified": "2025-04-09 16:52:19.323878", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", @@ -1334,6 +1351,7 @@ "write": 1 } ], + "row_format": "Dynamic", "search_fields": "status, posting_date, supplier", "show_name_in_global_search": 1, "sort_field": "creation", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 25e31758cde..3f892bfb8b6 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -70,6 +70,8 @@ class PurchaseReceipt(BuyingController): currency: DF.Link disable_rounded_total: DF.Check discount_amount: DF.Currency + dispatch_address: DF.Link | None + dispatch_address_display: DF.TextEditor | None grand_total: DF.Currency group_same_items: DF.Check ignore_pricing_rule: DF.Check From 53d0b7be232a8af935dfbbee545cd86e9d5a290a Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Mon, 14 Apr 2025 16:41:31 +0530 Subject: [PATCH 2/9] feat: add dispatch address support in party details and controllers --- erpnext/accounts/party.py | 38 ++++++++++++++++++++++++ erpnext/controllers/buying_controller.py | 2 ++ erpnext/public/js/controllers/buying.js | 12 ++++++++ erpnext/public/js/utils/party.js | 4 +++ 4 files changed, 56 insertions(+) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 4bbb2c110d7..167efee5128 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -71,6 +71,7 @@ def get_party_details( party_address=None, company_address=None, shipping_address=None, + dispatch_address=None, pos_profile=None, ): if not party: @@ -92,6 +93,7 @@ def get_party_details( party_address, company_address, shipping_address, + dispatch_address, pos_profile, ) @@ -111,6 +113,7 @@ def _get_party_details( party_address=None, company_address=None, shipping_address=None, + dispatch_address=None, pos_profile=None, ): party_details = frappe._dict( @@ -134,6 +137,7 @@ def _get_party_details( party_address, company_address, shipping_address, + dispatch_address, ignore_permissions=ignore_permissions, ) set_contact_details(party_details, party, party_type) @@ -191,6 +195,7 @@ def set_address_details( party_address=None, company_address=None, shipping_address=None, + dispatch_address=None, *, ignore_permissions=False, ): @@ -219,6 +224,21 @@ def set_address_details( get_fetch_values(doctype, "shipping_address_name", party_details.shipping_address_name) ) + # dispatch address + elif party_type == "Supplier": + party_details.dispatch_address = dispatch_address or get_party_shipping_address( + party_type, party.name + ) + + party_details.dispatch_address_display = render_address( + party_details["dispatch_address"], check_permissions=not ignore_permissions + ) + + if doctype: + party_details.update( + get_fetch_values(doctype, "dispatch_address", party_details.dispatch_address) + ) + if company_address: party_details.company_address = company_address else: @@ -256,6 +276,24 @@ def set_address_details( **get_fetch_values(doctype, "shipping_address", party_details.billing_address), ) + if doctype != "Supplier Quotation": + if dispatch_address: + party_details.update( + dispatch_address=dispatch_address, + dispatch_address_display=render_address( + dispatch_address, check_permissions=not ignore_permissions + ), + **get_fetch_values(doctype, "dispatch_address", dispatch_address), + ) + + # dispatch address - if not already set + if not party_details.dispatch_address: + party_details.update( + dispatch_address=party_details.supplier_address, + dispatch_address_display=party_details.address_display, + **get_fetch_values(doctype, "dispatch_address", party_details.supplier_address), + ) + party_address, shipping_address = ( party_details.get(billing_address_field), party_details.shipping_address_name, diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 7f4723d6a24..6d75d8ff07c 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -141,6 +141,7 @@ class BuyingController(SubcontractingController): company=self.company, party_address=self.get("supplier_address"), shipping_address=self.get("shipping_address"), + dispatch_address=self.get("dispatch_address"), company_address=self.get("billing_address"), fetch_payment_terms_template=not self.get("ignore_default_payment_terms_template"), ignore_permissions=self.flags.ignore_permissions, @@ -242,6 +243,7 @@ class BuyingController(SubcontractingController): address_dict = { "supplier_address": "address_display", "shipping_address": "shipping_address_display", + "dispatch_address": "dispatch_address_display", "billing_address": "billing_address_display", } diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index cbc59867e46..e0ed9f2b91e 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -54,6 +54,18 @@ erpnext.buying = { return erpnext.queries.company_address_query(this.frm.doc) }); } + + if(this.frm.get_field('dispatch_address')) { + this.frm.set_query("dispatch_address", () => { + if(this.frm.doc.supplier) { + return { + query: 'frappe.contacts.doctype.address.address.address_query', + filters: { link_doctype: 'Supplier', link_name: this.frm.doc.supplier } + }; + } else + return erpnext.queries.dispatch_address_query(this.frm.doc) + }); + } } setup_queries(doc, cdt, cdn) { diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index a85423b8340..958defa32c7 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -71,6 +71,10 @@ erpnext.utils.get_party_details = function (frm, method, args, callback) { if (!args.shipping_address && frm.doc.shipping_address) { args.shipping_address = frm.doc.shipping_address; } + + if (!args.dispatch_address && frm.doc.dispatch_address) { + args.dispatch_address = frm.doc.dispatch_address; + } } if (frappe.meta.get_docfield(frm.doc.doctype, "taxes")) { From 9a859e54b62d914a574b6e0005c8daebc1f21a86 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Mon, 14 Apr 2025 18:06:44 +0530 Subject: [PATCH 3/9] fix: enhance dispatch address query logic and add supplier address query --- erpnext/public/js/controllers/buying.js | 12 +++++------- erpnext/public/js/queries.js | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index e0ed9f2b91e..a39a4ddf13a 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -57,13 +57,11 @@ erpnext.buying = { if(this.frm.get_field('dispatch_address')) { this.frm.set_query("dispatch_address", () => { - if(this.frm.doc.supplier) { - return { - query: 'frappe.contacts.doctype.address.address.address_query', - filters: { link_doctype: 'Supplier', link_name: this.frm.doc.supplier } - }; - } else - return erpnext.queries.dispatch_address_query(this.frm.doc) + if(this.frm.doc.is_return){ + return erpnext.queries.company_address_query(this.frm.doc); + } + + return erpnext.queries.supplier_address_query(this.frm.doc); }); } } diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index 63651ec8759..cfc602acf00 100644 --- a/erpnext/public/js/queries.js +++ b/erpnext/public/js/queries.js @@ -112,6 +112,23 @@ $.extend(erpnext.queries, { }; }, + supplier_address_query: function (doc) { + if (!doc.supplier) { + cur_frm.scroll_to_field("supplier"); + frappe.show_alert({ + message: __("Please set {0} first.", [ + __(frappe.meta.get_label(doc.doctype, "supplier", doc.name)), + ]), + indicator: "orange", + }); + } + + return { + query: "frappe.contacts.doctype.address.address.address_query", + filters: { link_doctype: "Supplier", link_name: doc.supplier }, + }; + }, + dispatch_address_query: function (doc) { var filters = { link_doctype: "Company", link_name: doc.company || "" }; var is_drop_ship = doc.items.some((item) => item.delivered_by_supplier); From c4bd3123fb8e6822d267469ffe652e13381d2741 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Mon, 14 Apr 2025 18:48:32 +0530 Subject: [PATCH 4/9] fix: remove use of cur_frm --- erpnext/public/js/controllers/buying.js | 2 +- erpnext/public/js/queries.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index a39a4ddf13a..630c6609c7b 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -61,7 +61,7 @@ erpnext.buying = { return erpnext.queries.company_address_query(this.frm.doc); } - return erpnext.queries.supplier_address_query(this.frm.doc); + return erpnext.queries.supplier_address_query(this.frm); }); } } diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index cfc602acf00..801a78dad6a 100644 --- a/erpnext/public/js/queries.js +++ b/erpnext/public/js/queries.js @@ -112,12 +112,12 @@ $.extend(erpnext.queries, { }; }, - supplier_address_query: function (doc) { - if (!doc.supplier) { - cur_frm.scroll_to_field("supplier"); + supplier_address_query: function (frm) { + if (!frm.doc.supplier) { + frm.scroll_to_field("supplier"); frappe.show_alert({ message: __("Please set {0} first.", [ - __(frappe.meta.get_label(doc.doctype, "supplier", doc.name)), + __(frappe.meta.get_label(frm.doc.doctype, "supplier", frm.doc.name)), ]), indicator: "orange", }); @@ -125,7 +125,7 @@ $.extend(erpnext.queries, { return { query: "frappe.contacts.doctype.address.address.address_query", - filters: { link_doctype: "Supplier", link_name: doc.supplier }, + filters: { link_doctype: "Supplier", link_name: frm.doc.supplier }, }; }, From d12998e524469f2e49c9660a3043dca0188352f0 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Thu, 17 Apr 2025 16:32:59 +0530 Subject: [PATCH 5/9] feat: add display dispatch address when dispatch address is selected --- erpnext/public/js/controllers/buying.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index 630c6609c7b..c14a0d0cdc2 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -305,6 +305,12 @@ erpnext.buying = { "shipping_address_display", true); } + dispatch_address(){ + var me = this; + erpnext.utils.get_address_display(this.frm, "dispatch_address", + "dispatch_address_display", true); + } + billing_address() { erpnext.utils.get_address_display(this.frm, "billing_address", "billing_address_display", true); From 999ffe86a7ef3ca3227290817d5ee6d57ffb8819 Mon Sep 17 00:00:00 2001 From: Karm Soni Date: Fri, 18 Apr 2025 13:24:47 +0530 Subject: [PATCH 6/9] fix: correct query for dispatch_address; remove unnecessary code; increase reusability; --- erpnext/accounts/party.py | 69 ++++++++++--------------- erpnext/public/js/controllers/buying.js | 6 +-- erpnext/public/js/queries.js | 17 ------ 3 files changed, 27 insertions(+), 65 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 167efee5128..f665dad9a85 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -202,43 +202,44 @@ def set_address_details( billing_address_field = ( "customer_address" if party_type in ["Lead", "Prospect"] else party_type.lower() + "_address" ) + party_details[billing_address_field] = party_address or get_default_address(party_type, party.name) if doctype: party_details.update( get_fetch_values(doctype, billing_address_field, party_details[billing_address_field]) ) + # address display party_details.address_display = render_address( party_details[billing_address_field], check_permissions=not ignore_permissions ) - # shipping address + + # Initialize shipping address fields based on party type if party_type in ["Customer", "Lead"]: - party_details.shipping_address_name = shipping_address or get_party_shipping_address( - party_type, party.name - ) - party_details.shipping_address = render_address( - party_details["shipping_address_name"], check_permissions=not ignore_permissions - ) - if doctype: - party_details.update( - get_fetch_values(doctype, "shipping_address_name", party_details.shipping_address_name) + party_shipping_address_field = "shipping_address_name" + party_shipping_address_display_field = "shipping_address" + is_party_type_supplier = False + + else: # Default to Supplier + party_shipping_address_field = "dispatch_address" + party_shipping_address_display_field = "dispatch_address_display" + is_party_type_supplier = True + + party_details[party_shipping_address_field] = ( + dispatch_address if is_party_type_supplier else shipping_address + ) or get_party_shipping_address(party_type, party.name) + + party_details[party_shipping_address_display_field] = render_address( + party_details[party_shipping_address_field], check_permissions=not ignore_permissions + ) + + if doctype: + party_details.update( + get_fetch_values( + doctype, party_shipping_address_field, party_details[party_shipping_address_field] ) - - # dispatch address - elif party_type == "Supplier": - party_details.dispatch_address = dispatch_address or get_party_shipping_address( - party_type, party.name ) - party_details.dispatch_address_display = render_address( - party_details["dispatch_address"], check_permissions=not ignore_permissions - ) - - if doctype: - party_details.update( - get_fetch_values(doctype, "dispatch_address", party_details.dispatch_address) - ) - if company_address: party_details.company_address = company_address else: @@ -276,27 +277,9 @@ def set_address_details( **get_fetch_values(doctype, "shipping_address", party_details.billing_address), ) - if doctype != "Supplier Quotation": - if dispatch_address: - party_details.update( - dispatch_address=dispatch_address, - dispatch_address_display=render_address( - dispatch_address, check_permissions=not ignore_permissions - ), - **get_fetch_values(doctype, "dispatch_address", dispatch_address), - ) - - # dispatch address - if not already set - if not party_details.dispatch_address: - party_details.update( - dispatch_address=party_details.supplier_address, - dispatch_address_display=party_details.address_display, - **get_fetch_values(doctype, "dispatch_address", party_details.supplier_address), - ) - party_address, shipping_address = ( party_details.get(billing_address_field), - party_details.shipping_address_name, + party_details.get(party_shipping_address_field), ) party_details["tax_category"] = get_address_tax_category( diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index c14a0d0cdc2..2b854d649d8 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -57,11 +57,7 @@ erpnext.buying = { if(this.frm.get_field('dispatch_address')) { this.frm.set_query("dispatch_address", () => { - if(this.frm.doc.is_return){ - return erpnext.queries.company_address_query(this.frm.doc); - } - - return erpnext.queries.supplier_address_query(this.frm); + return erpnext.queries.address_query(this.frm.doc); }); } } diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index 801a78dad6a..63651ec8759 100644 --- a/erpnext/public/js/queries.js +++ b/erpnext/public/js/queries.js @@ -112,23 +112,6 @@ $.extend(erpnext.queries, { }; }, - supplier_address_query: function (frm) { - if (!frm.doc.supplier) { - frm.scroll_to_field("supplier"); - frappe.show_alert({ - message: __("Please set {0} first.", [ - __(frappe.meta.get_label(frm.doc.doctype, "supplier", frm.doc.name)), - ]), - indicator: "orange", - }); - } - - return { - query: "frappe.contacts.doctype.address.address.address_query", - filters: { link_doctype: "Supplier", link_name: frm.doc.supplier }, - }; - }, - dispatch_address_query: function (doc) { var filters = { link_doctype: "Company", link_name: doc.company || "" }; var is_drop_ship = doc.items.some((item) => item.delivered_by_supplier); From 8ccd7a3e61e72a711d9cbdaa5e89dddaa6a42e05 Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Mon, 21 Apr 2025 13:44:20 +0530 Subject: [PATCH 7/9] refactor: address field position --- .../doctype/purchase_invoice/purchase_invoice.json | 8 ++++---- erpnext/buying/doctype/purchase_order/purchase_order.json | 6 +++--- erpnext/public/scss/erpnext.scss | 1 + .../stock/doctype/purchase_receipt/purchase_receipt.json | 8 ++++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 2a1f83e829f..5b91c709e13 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -144,11 +144,11 @@ "contact_mobile", "contact_email", "company_shipping_address_section", - "shipping_address", - "shipping_address_display", - "column_break_126", "dispatch_address", "dispatch_address_display", + "column_break_126", + "shipping_address", + "shipping_address_display", "company_billing_address_section", "billing_address", "column_break_130", @@ -1550,7 +1550,7 @@ { "fieldname": "company_shipping_address_section", "fieldtype": "Section Break", - "label": "Company Shipping Address" + "label": "Shipping Address" }, { "fieldname": "column_break_126", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 1cd47b28ceb..c72fee664e5 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -109,11 +109,11 @@ "contact_mobile", "contact_email", "shipping_address_section", - "shipping_address", - "shipping_address_display", - "column_break_99", "dispatch_address", "dispatch_address_display", + "column_break_99", + "shipping_address", + "shipping_address_display", "company_billing_address_section", "billing_address", "column_break_103", diff --git a/erpnext/public/scss/erpnext.scss b/erpnext/public/scss/erpnext.scss index ed77f362c34..b0b589fa962 100644 --- a/erpnext/public/scss/erpnext.scss +++ b/erpnext/public/scss/erpnext.scss @@ -610,6 +610,7 @@ body[data-route="pos"] { .frappe-control[data-fieldname="address_display"] .ql-editor, .frappe-control[data-fieldname="shipping_address_display"] .ql-editor, .frappe-control[data-fieldname="shipping_address"] .ql-editor, +.frappe-control[data-fieldname="dispatch_address_display"] .ql-editor, .frappe-control[data-fieldname="dispatch_address"] .ql-editor, .frappe-control[data-fieldname="source_address_display"] .ql-editor, .frappe-control[data-fieldname="target_address_display"] .ql-editor, diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 8ae9ef58d3d..de4087c8610 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -112,11 +112,11 @@ "contact_mobile", "contact_email", "section_break_98", - "shipping_address", - "shipping_address_display", - "column_break_100", "dispatch_address", "dispatch_address_display", + "column_break_100", + "shipping_address", + "shipping_address_display", "billing_address_section", "billing_address", "column_break_104", @@ -1200,7 +1200,7 @@ { "fieldname": "section_break_98", "fieldtype": "Section Break", - "label": "Company Shipping Address" + "label": "Shipping Address" }, { "fieldname": "billing_address_section", From fb3b7d8c34a08af742bc83a71847a13d5f61dbcf Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Mon, 21 Apr 2025 13:46:59 +0530 Subject: [PATCH 8/9] refactor: set address details for transactions --- erpnext/accounts/party.py | 54 +++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index f665dad9a85..57c56c9b2c4 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -199,47 +199,47 @@ def set_address_details( *, ignore_permissions=False, ): - billing_address_field = ( + # party_billing + party_billing_field = ( "customer_address" if party_type in ["Lead", "Prospect"] else party_type.lower() + "_address" ) - party_details[billing_address_field] = party_address or get_default_address(party_type, party.name) + party_details[party_billing_field] = party_address or get_default_address(party_type, party.name) if doctype: party_details.update( - get_fetch_values(doctype, billing_address_field, party_details[billing_address_field]) + get_fetch_values(doctype, party_billing_field, party_details[party_billing_field]) ) - # address display party_details.address_display = render_address( - party_details[billing_address_field], check_permissions=not ignore_permissions + party_details[party_billing_field], check_permissions=not ignore_permissions ) - # Initialize shipping address fields based on party type + # party_shipping if party_type in ["Customer", "Lead"]: - party_shipping_address_field = "shipping_address_name" - party_shipping_address_display_field = "shipping_address" - is_party_type_supplier = False + party_shipping_field = "shipping_address_name" + party_shipping_display = "shipping_address" + default_shipping = shipping_address - else: # Default to Supplier - party_shipping_address_field = "dispatch_address" - party_shipping_address_display_field = "dispatch_address_display" - is_party_type_supplier = True + else: + # Supplier + party_shipping_field = "dispatch_address" + party_shipping_display = "dispatch_address_display" + default_shipping = dispatch_address - party_details[party_shipping_address_field] = ( - dispatch_address if is_party_type_supplier else shipping_address - ) or get_party_shipping_address(party_type, party.name) + party_details[party_shipping_field] = default_shipping or get_party_shipping_address( + party_type, party.name + ) - party_details[party_shipping_address_display_field] = render_address( - party_details[party_shipping_address_field], check_permissions=not ignore_permissions + party_details[party_shipping_display] = render_address( + party_details[party_shipping_field], check_permissions=not ignore_permissions ) if doctype: party_details.update( - get_fetch_values( - doctype, party_shipping_address_field, party_details[party_shipping_address_field] - ) + get_fetch_values(doctype, party_shipping_field, party_details[party_shipping_field]) ) + # company_address if company_address: party_details.company_address = company_address else: @@ -277,22 +277,20 @@ def set_address_details( **get_fetch_values(doctype, "shipping_address", party_details.billing_address), ) - party_address, shipping_address = ( - party_details.get(billing_address_field), - party_details.get(party_shipping_address_field), + party_billing, party_shipping = ( + party_details.get(party_billing_field), + party_details.get(party_shipping_field), ) party_details["tax_category"] = get_address_tax_category( - party.get("tax_category"), - party_address, - shipping_address if party_type != "Supplier" else party_address, + party.get("tax_category"), party_billing, party_shipping ) if doctype in TRANSACTION_TYPES: with temporary_flag("company", company): get_regional_address_details(party_details, doctype, company) - return party_address, shipping_address + return party_billing, party_shipping @erpnext.allow_regional From ceaba4220bb61eef7f35d54072c8c79049288806 Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Mon, 21 Apr 2025 13:49:14 +0530 Subject: [PATCH 9/9] fix: map dispatch address correctly for inter company transactions --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 5 ++++- erpnext/stock/doctype/delivery_note/delivery_note.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index df4577bdc7f..839a88d8e1b 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2295,7 +2295,10 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): # Invert Addresses update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) update_address( - target_doc, "shipping_address", "shipping_address_display", source_doc.customer_address + target_doc, "dispatch_address", "dispatch_address_display", source_doc.dispatch_address_name + ) + update_address( + target_doc, "shipping_address", "shipping_address_display", source_doc.shipping_address_name ) update_address( target_doc, "billing_address", "billing_address_display", source_doc.customer_address diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 3f86fb11acf..7f12edb099c 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -1158,7 +1158,10 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): # Invert the address on target doc creation update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) update_address( - target_doc, "shipping_address", "shipping_address_display", source_doc.customer_address + target_doc, "dispatch_address", "dispatch_address_display", source_doc.dispatch_address_name + ) + update_address( + target_doc, "shipping_address", "shipping_address_display", source_doc.shipping_address_name ) update_address( target_doc, "billing_address", "billing_address_display", source_doc.customer_address