diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f60fe003b0d..ee5b4f03a68 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -308,6 +308,31 @@ class AccountsController(TransactionBase): self.set_default_letter_head() self.validate_company_in_accounting_dimension() self.validate_party_address_and_contact() + self.validate_company_linked_addresses() + + def validate_company_linked_addresses(self): + address_fields = [] + if self.doctype in ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): + address_fields = ["dispatch_address_name", "company_address"] + elif self.doctype in ("Purchase Order", "Purchase Receipt", "Purchase Invoice", "Supplier Quotation"): + address_fields = ["billing_address", "shipping_address"] + + for field in address_fields: + address = self.get(field) + if address and not frappe.db.exists( + "Dynamic Link", + { + "parent": address, + "parenttype": "Address", + "link_doctype": "Company", + "link_name": self.company, + }, + ): + frappe.throw( + _("{0} does not belong to the {1}.").format( + _(self.meta.get_label(field)), bold(self.company) + ) + ) def set_default_letter_head(self): if hasattr(self, "letter_head") and not self.letter_head: diff --git a/erpnext/controllers/tests/test_accounts_controller.py b/erpnext/controllers/tests/test_accounts_controller.py index 899ec45c169..dde95899b7f 100644 --- a/erpnext/controllers/tests/test_accounts_controller.py +++ b/erpnext/controllers/tests/test_accounts_controller.py @@ -16,7 +16,10 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_pay from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.party import get_party_account -from erpnext.buying.doctype.purchase_order.test_purchase_order import prepare_data_for_internal_transfer +from erpnext.buying.doctype.purchase_order.test_purchase_order import ( + create_purchase_order, + prepare_data_for_internal_transfer, +) from erpnext.projects.doctype.project.test_project import make_project from erpnext.stock.doctype.item.test_item import create_item @@ -2428,3 +2431,34 @@ class TestAccountsController(FrappeTestCase): # Second return should only get remaining discount (100 - 60 = 40) self.assertEqual(return_si_2.discount_amount, -40) + + def test_company_linked_address(self): + from erpnext.crm.doctype.prospect.test_prospect import make_address + + company_address = make_address( + address_title="Company", address_type="Shipping", address_line1="100", city="Mumbai" + ) + company_address.append("links", {"link_doctype": "Company", "link_name": "_Test Company"}) + company_address.save() + + customer_shipping = make_address( + address_title="Customer", address_type="Shipping", address_line1="10" + ) + customer_shipping.append("links", {"link_doctype": "Customer", "link_name": "_Test Customer"}) + customer_shipping.save() + + supplier_billing = make_address(address_title="Supplier", address_line1="2", city="Ahmedabad") + supplier_billing.append("links", {"link_doctype": "Supplier", "link_name": "_Test Supplier"}) + supplier_billing.save() + + po = create_purchase_order(do_not_save=True) + po.shipping_address = customer_shipping.name + self.assertRaises(frappe.ValidationError, po.save) + po.shipping_address = company_address.name + po.save() + + po.billing_address = supplier_billing.name + self.assertRaises(frappe.ValidationError, po.save) + po.billing_address = company_address.name + po.reload() + po.save()