pricing rule
diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
index d09902c..0f18eaf 100644
--- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py
@@ -45,7 +45,16 @@
prule.insert()
details = get_item_details(args)
self.assertEquals(details.get("discount_percentage"), 20)
-
+
+ prule = frappe.bean(copy=test_records[0])
+ prule.doc.applicable_for = "Campaign"
+ prule.doc.campaign = "_Test Campaign"
+ prule.doc.discount = 30
+ prule.insert()
+ args.campaign = "_Test Campaign"
+ details = get_item_details(args)
+ self.assertEquals(details.get("discount_percentage"), 30)
+
args.item_code = "_Test Item 2"
details = get_item_details(args)
self.assertEquals(details.get("discount_percentage"), 15)
@@ -54,6 +63,8 @@
details = get_item_details(args)
self.assertEquals(details.get("discount_percentage"), 15)
+
+
test_records = [
[{
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 79613c3..411435e 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -265,9 +265,13 @@
def apply_pricing_rule(out, args):
args_dict = frappe._dict().update(args)
args_dict.update(out)
-
+ pricing_rules = get_pricing_rules(args_dict)
for rule_for in ["price", "discount"]:
- pricing_rules = get_pricing_rules(args_dict, rule_for)
+ pricing_rules = filter(lambda x: x[rule_for] > 0, pricing_rules)
+ pricing_rules = filter_pricing_rules(args_dict, pricing_rules)
+
+ if len(pricing_rules) > 1:
+ pricing_rules = sorted(pricing_rules, key=lambda x: x[rule_for])
if pricing_rules:
if rule_for == "discount":
out["discount_percentage"] = pricing_rules[-1]["discount"]
@@ -277,8 +281,8 @@
flt(args_dict.plc_conversion_rate) / flt(args_dict.conversion_rate)
-def get_pricing_rules(args_dict, price_or_discount):
- def _filter_pricing_rule(pricing_rules, field_set):
+def filter_pricing_rules(args_dict, pricing_rules):
+ def _filter_pricing_rules(pricing_rules, field_set):
p_rules = []
for field in field_set:
if not p_rules:
@@ -289,13 +293,11 @@
break
return p_rules or pricing_rules
-
- pricing_rules = get_all_pricing_rules(args_dict, price_or_discount)
for field_set in [["item_code", "item_group", "brand"], ["customer", "customer_group",
"territory", "supplier", "supplier_type", "campaign", "sales_partner"]]:
if pricing_rules:
- pricing_rules = _filter_pricing_rule(pricing_rules, field_set)
+ pricing_rules = _filter_pricing_rules(pricing_rules, field_set)
# filter for price list
if pricing_rules:
@@ -312,15 +314,11 @@
max_priority = min([cint(p.priority) for p in pricing_rules])
if max_priority:
pricing_rules = filter(lambda x: x.priority==max_priority, pricing_rules)
-
- if len(pricing_rules) > 1:
- pricing_rules = sorted(pricing_rules, key=lambda x: x[price_or_discount])
return pricing_rules
-def get_all_pricing_rules(args_dict, price_or_discount):
- conditions = " and ifnull(%s, 0) > 0" % price_or_discount
-
+def get_pricing_rules(args_dict):
+ conditions = ""
for field in ["customer", "customer_group", "territory", "supplier", "supplier_type",
"campaign", "sales_partner"]:
if args_dict.get(field):