From aed46ad5b96c08bbcddc9953029973c54bdfbeba Mon Sep 17 00:00:00 2001 From: Bhavan23 Date: Mon, 12 May 2025 12:44:18 +0530 Subject: [PATCH] fix: validate inter-company transaction address links --- .../doctype/sales_invoice/sales_invoice.py | 73 ++++++++++++++----- .../doctype/delivery_note/delivery_note.py | 73 ++++++++++++++----- 2 files changed, 112 insertions(+), 34 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 8eacada5e4a..d1d222732a9 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -2359,6 +2359,18 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): set_purchase_references(target) def update_details(source_doc, target_doc, source_parent): + def _validate_address_link(address, link_doctype, link_name): + return frappe.db.get_value( + "Dynamic Link", + { + "parent": address, + "parenttype": "Address", + "link_doctype": link_doctype, + "link_name": link_name, + }, + "parent", + ) + target_doc.inter_company_invoice_reference = source_doc.name if target_doc.doctype in ["Purchase Invoice", "Purchase Order"]: currency = frappe.db.get_value("Supplier", details.get("party"), "default_currency") @@ -2369,16 +2381,34 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): target_doc.buying_price_list = source_doc.selling_price_list # Invert Addresses - update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) - update_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 - ) + if source_doc.company_address and _validate_address_link( + source_doc.company_address, "Supplier", details.get("party") + ): + update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) + if source_doc.dispatch_address_name and _validate_address_link( + source_doc.dispatch_address_name, "Company", details.get("company") + ): + update_address( + target_doc, + "dispatch_address", + "dispatch_address_display", + source_doc.dispatch_address_name, + ) + if source_doc.shipping_address_name and _validate_address_link( + source_doc.shipping_address_name, "Company", details.get("company") + ): + update_address( + target_doc, + "shipping_address", + "shipping_address_display", + source_doc.shipping_address_name, + ) + if source_doc.customer_address and _validate_address_link( + source_doc.customer_address, "Company", details.get("company") + ): + update_address( + target_doc, "billing_address", "billing_address_display", source_doc.customer_address + ) if currency: target_doc.currency = currency @@ -2399,13 +2429,22 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): target_doc.customer = details.get("party") target_doc.selling_price_list = source_doc.buying_price_list - update_address( - target_doc, "company_address", "company_address_display", source_doc.supplier_address - ) - update_address( - target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address - ) - update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address) + if source_doc.supplier_address and _validate_address_link( + source_doc.supplier_address, "Company", details.get("company") + ): + update_address( + target_doc, "company_address", "company_address_display", source_doc.supplier_address + ) + if source_doc.shipping_address and _validate_address_link( + source_doc.shipping_address, "Customer", details.get("party") + ): + update_address( + target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address + ) + if source_doc.shipping_address and _validate_address_link( + source_doc.shipping_address, "Customer", details.get("party") + ): + update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address) if currency: target_doc.currency = currency diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 7f12edb099c..4ac31bb8d26 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -1147,6 +1147,18 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): frappe.throw(_("All items have already been received")) def update_details(source_doc, target_doc, source_parent): + def _validate_address_link(address, link_doctype, link_name): + return frappe.db.get_value( + "Dynamic Link", + { + "parent": address, + "parenttype": "Address", + "link_doctype": link_doctype, + "link_name": link_name, + }, + "parent", + ) + target_doc.inter_company_invoice_reference = source_doc.name if target_doc.doctype == "Purchase Receipt": target_doc.company = details.get("company") @@ -1156,16 +1168,34 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): target_doc.inter_company_reference = source_doc.name # Invert the address on target doc creation - update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) - update_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 - ) + if source_doc.company_address and _validate_address_link( + source_doc.company_address, "Supplier", details.get("party") + ): + update_address(target_doc, "supplier_address", "address_display", source_doc.company_address) + if source_doc.dispatch_address_name and _validate_address_link( + source_doc.dispatch_address_name, "Company", details.get("company") + ): + update_address( + target_doc, + "dispatch_address", + "dispatch_address_display", + source_doc.dispatch_address_name, + ) + if source_doc.shipping_address_name and _validate_address_link( + source_doc.shipping_address_name, "Company", details.get("company") + ): + update_address( + target_doc, + "shipping_address", + "shipping_address_display", + source_doc.shipping_address_name, + ) + if source_doc.customer_address and _validate_address_link( + source_doc.customer_address, "Company", details.get("company") + ): + update_address( + target_doc, "billing_address", "billing_address_display", source_doc.customer_address + ) update_taxes( target_doc, @@ -1185,13 +1215,22 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): target_doc.inter_company_reference = source_doc.name # Invert the address on target doc creation - update_address( - target_doc, "company_address", "company_address_display", source_doc.supplier_address - ) - update_address( - target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address - ) - update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address) + if source_doc.supplier_address and _validate_address_link( + source_doc.supplier_address, "Company", details.get("company") + ): + update_address( + target_doc, "company_address", "company_address_display", source_doc.supplier_address + ) + if source_doc.shipping_address and _validate_address_link( + source_doc.shipping_address, "Customer", details.get("party") + ): + update_address( + target_doc, "shipping_address_name", "shipping_address", source_doc.shipping_address + ) + if source_doc.shipping_address and _validate_address_link( + source_doc.shipping_address, "Customer", details.get("party") + ): + update_address(target_doc, "customer_address", "address_display", source_doc.shipping_address) update_taxes( target_doc,