From 7e8e8ba714b859837482377b1397f4431cfed760 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 26 Feb 2014 15:13:44 +0530 Subject: [PATCH] pricing rule --- .../doctype/pricing_rule/test_pricing_rule.py | 13 +++++++++- erpnext/stock/get_item_details.py | 24 +++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index d09902ccdd..0f18eaff4f 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 @@ class TestPricingRule(unittest.TestCase): 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 @@ class TestPricingRule(unittest.TestCase): 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 79613c3a45..411435ee58 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -265,9 +265,13 @@ def get_pos_settings(company): 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 @@ def apply_pricing_rule(out, args): 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 @@ def get_pricing_rules(args_dict, price_or_discount): 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 @@ def get_pricing_rules(args_dict, price_or_discount): 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):