diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index dbca7b5dd0e..5b91c709e13 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -144,8 +144,10 @@ "contact_mobile", "contact_email", "company_shipping_address_section", - "shipping_address", + "dispatch_address", + "dispatch_address_display", "column_break_126", + "shipping_address", "shipping_address_display", "company_billing_address_section", "billing_address", @@ -1548,7 +1550,7 @@ { "fieldname": "company_shipping_address_section", "fieldtype": "Section Break", - "label": "Company Shipping Address" + "label": "Shipping Address" }, { "fieldname": "column_break_126", @@ -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/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 0dde3c9037c..d7ff5038aa7 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2371,7 +2371,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/accounts/party.py b/erpnext/accounts/party.py index 4bbb2c110d7..57c56c9b2c4 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,34 +195,51 @@ def set_address_details( party_address=None, company_address=None, shipping_address=None, + dispatch_address=None, *, 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 - ) - # shipping address - 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_details.address_display = render_address( + party_details[party_billing_field], check_permissions=not ignore_permissions + ) + + # party_shipping + if party_type in ["Customer", "Lead"]: + party_shipping_field = "shipping_address_name" + party_shipping_display = "shipping_address" + default_shipping = shipping_address + + else: + # Supplier + party_shipping_field = "dispatch_address" + party_shipping_display = "dispatch_address_display" + default_shipping = dispatch_address + + party_details[party_shipping_field] = default_shipping or get_party_shipping_address( + party_type, party.name + ) + + 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_field, party_details[party_shipping_field]) + ) + + # company_address if company_address: party_details.company_address = company_address else: @@ -256,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.shipping_address_name, + 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 diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index cac6854b89e..c72fee664e5 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -109,8 +109,10 @@ "contact_mobile", "contact_email", "shipping_address_section", - "shipping_address", + "dispatch_address", + "dispatch_address_display", "column_break_99", + "shipping_address", "shipping_address_display", "company_billing_address_section", "billing_address", @@ -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/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..2b854d649d8 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -54,6 +54,12 @@ erpnext.buying = { return erpnext.queries.company_address_query(this.frm.doc) }); } + + if(this.frm.get_field('dispatch_address')) { + this.frm.set_query("dispatch_address", () => { + return erpnext.queries.address_query(this.frm.doc); + }); + } } setup_queries(doc, cdt, cdn) { @@ -295,6 +301,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); 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")) { 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/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 diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index dd095fd8df9..de4087c8610 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -112,8 +112,10 @@ "contact_mobile", "contact_email", "section_break_98", - "shipping_address", + "dispatch_address", + "dispatch_address_display", "column_break_100", + "shipping_address", "shipping_address_display", "billing_address_section", "billing_address", @@ -1198,7 +1200,7 @@ { "fieldname": "section_break_98", "fieldtype": "Section Break", - "label": "Company Shipping Address" + "label": "Shipping Address" }, { "fieldname": "billing_address_section", @@ -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