diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js index 5c02fd2f127..f9cc2cd7e43 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js @@ -9,10 +9,15 @@ frappe.ui.form.on("Shipping Rule", { }, company: function (frm) { + if (frm.previous_company !== frm.doc.company) { + frm.previous_company = frm.doc.company; + frm.set_value("account", ""); + } erpnext.accounts.dimensions.update_dimension(frm, frm.doctype); }, refresh: function (frm) { + frm.previous_company = frm.doc.company; frm.set_query("account", function () { return { filters: { diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py index 68da0eb519f..11ec45ccc2a 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py @@ -52,10 +52,23 @@ class ShippingRule(Document): # end: auto-generated types def validate(self): + self.validate_account_company() self.validate_from_to_values() self.sort_shipping_rule_conditions() self.validate_overlapping_shipping_rule_conditions() + def validate_account_company(self): + if not self.company or not self.account: + return + + if frappe.get_cached_value("Account", self.account, "company") != self.company: + throw( + _("Shipping Account {0} does not belong to Company {1}").format( + frappe.bold(self.account), frappe.bold(self.company) + ), + title=_("Invalid Shipping Account"), + ) + def validate_from_to_values(self): if self.calculate_based_on == "Fixed": if self.conditions: diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py index a5a0ada8ba5..c9b7b30c6b5 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py @@ -15,6 +15,39 @@ test_records = frappe.get_test_records("Shipping Rule") class TestShippingRule(unittest.TestCase): + def test_account_company_on_insert(self): + for rule_type in ("Selling", "Buying"): + with self.subTest(shipping_rule_type=rule_type): + shipping_rule = frappe.copy_doc(test_records[0]) + shipping_rule.label = f"{rule_type} Delivery" + shipping_rule.shipping_rule_type = rule_type + shipping_rule.company = "_Test Company 1" + shipping_rule.cost_center = None + with self.assertRaisesRegex(frappe.ValidationError, "does not belong to Company"): + shipping_rule.insert() + + def test_account_company_on_update(self): + shipping_rule = frappe.copy_doc(test_records[0]) + shipping_rule.label = "Standard Delivery" + shipping_rule.insert() + shipping_rule.company = "_Test Company 1" + shipping_rule.cost_center = None + with self.assertRaisesRegex(frappe.ValidationError, "does not belong to Company"): + shipping_rule.save() + + shipping_rule.reload() + shipping_rule.company = "_Test Company 1" + shipping_rule.account = "_Test Account Shipping Charges - _TC1" + shipping_rule.cost_center = None + shipping_rule.save() + shipping_rule.reload() + self.assertEqual(shipping_rule.company, "_Test Company 1") + self.assertEqual(shipping_rule.account, "_Test Account Shipping Charges - _TC1") + + shipping_rule.account = "_Test Account Shipping Charges - _TC" + with self.assertRaisesRegex(frappe.ValidationError, "does not belong to Company"): + shipping_rule.save() + def test_from_greater_than_to(self): shipping_rule = frappe.copy_doc(test_records[0]) shipping_rule.name = test_records[0].get("name")