fix: filter pricing rules based on condition
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index e915618..611c2fc 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -32,7 +32,7 @@
self.validate_max_discount()
self.validate_price_list_with_currency()
self.validate_dates()
- validate_condition(self)
+ self.validate_condition()
if not self.margin_type: self.margin_rate_or_amount = 0.0
@@ -143,17 +143,10 @@
if self.valid_from and self.valid_upto and getdate(self.valid_from) > getdate(self.valid_upto):
frappe.throw(_("Valid from date must be less than valid upto date"))
-def validate_condition(pricing_rule, doc=None):
- if pricing_rule.condition and ("=" in pricing_rule.condition) and re.match("""[\w\.:_]+\s*={1}\s*[\w\.@'"]+""", pricing_rule.condition):
- frappe.throw(_("Invalid condition in Pricing Rule - {0}").format(pricing_rule.name), frappe.ValidationError)
- elif doc:
- try:
- return frappe.safe_eval(pricing_rule.condition, None, doc.as_dict())
- except Exception as e:
- frappe.msgprint(_("Pricing Rule - " + pricing_rule.name + " - <b>condition</b> field error:<br>" + \
- str(e).capitalize() + "<br><br>Ignoring Pricing Rule"), indicator="orange", title=_("Warning"))
- return False
- return True
+ def validate_condition(self):
+ if self.condition and ("=" in self.condition) and re.match("""[\w\.:_]+\s*={1}\s*[\w\.@'"]+""", self.condition):
+ frappe.throw(_("Invalid condition in Pricing Rule - {0}").format(pricing_rule.name), frappe.ValidationError)
+
#--------------------------------------------------------------------------------
@frappe.whitelist()
@@ -265,8 +258,6 @@
if pricing_rule.get('suggestion'): continue
- if not validate_condition(pricing_rule, doc): continue
-
item_details.validate_applied_rule = pricing_rule.get("validate_applied_rule", 0)
item_details.price_or_product_discount = pricing_rule.get("price_or_product_discount")
diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py
index 3fd316f..59903a7 100644
--- a/erpnext/accounts/doctype/pricing_rule/utils.py
+++ b/erpnext/accounts/doctype/pricing_rule/utils.py
@@ -37,6 +37,8 @@
rules = []
+ pricing_rules = filter_pricing_rule_based_on_condition(pricing_rules, doc)
+
if not pricing_rules: return []
if apply_multiple_pricing_rules(pricing_rules):
@@ -51,6 +53,22 @@
return rules
+def filter_pricing_rule_based_on_condition(pricing_rules, doc=None):
+ filtered_pricing_rules = []
+ if doc:
+ for pricing_rule in pricing_rules:
+ if pricing_rule.condition:
+ try:
+ if frappe.safe_eval(pricing_rule.condition, None, doc.as_dict()):
+ filtered_pricing_rules.append(pricing_rule)
+ except Exception as e:
+ frappe.msgprint(_("Pricing Rule - " + pricing_rule.name + " - <b>condition</b> field error:<br>" + \
+ str(e).capitalize() + "<br><br>Ignoring Pricing Rule"), indicator="orange", title=_("Warning"))
+ else:
+ filtered_pricing_rules.append(pricing_rule)
+
+ return filtered_pricing_rules
+
def _get_pricing_rules(apply_on, args, values):
apply_on_field = frappe.scrub(apply_on)