Merge pull request #62347 from mihir-kandoi/fix/typed-rate-empty-pricing-rules

fix(pricing rule): keep a typed rate on items no pricing rule was applied to
This commit is contained in:
mergify[bot]
2026-10-26 08:39:32 +00:00
committed by GitHub
3 changed files with 24 additions and 3 deletions
@@ -562,7 +562,8 @@ def get_pricing_rule_for_item(args, doc=None, for_validate=False):
if not doc:
return item_details
elif args.get("pricing_rules"):
# "[]" means no rule was applied, so there is none to remove and the rate typed in stays
elif get_applied_pricing_rules(args.get("pricing_rules")):
item_details = remove_pricing_rule_for_item(
args.get("pricing_rules"),
item_details,
@@ -471,6 +471,24 @@ class TestPricingRule(ERPNextTestSuite):
self.assertEqual(item.discount_amount, 110)
self.assertEqual(item.rate, 990)
def test_typed_rate_stays_when_no_pricing_rule_is_applied(self):
# A coupon based rule without its coupon is considered but not applied: the row holds "[]".
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
pricing_rule = make_pricing_rule(selling=1, discount_percentage=10)
pricing_rule.db_set("coupon_code_based", 1)
si = create_sales_invoice(do_not_save=True)
si.items[0].price_list_rate = 100
si.items[0].rate = 120
si.payment_schedule = []
si.insert(ignore_permissions=True)
self.assertEqual(si.items[0].rate, 120)
si.save()
si.submit()
self.assertEqual(si.items[0].rate, 120)
self.assertEqual(si.items[0].margin_rate_or_amount, 20)
@ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1})
def test_pricing_rule_for_product_discount_on_same_item(self):
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule")
+4 -2
View File
@@ -176,11 +176,13 @@ class calculate_taxes_and_totals:
item.rate_with_margin = 0
return
has_pricing_rules = item.pricing_rules and not self.doc.ignore_pricing_rule
# An item no rule applied to may still hold "[]", which must not override the rate typed in
applied_rules = get_applied_pricing_rules(item.pricing_rules)
has_pricing_rules = bool(applied_rules) and not self.doc.ignore_pricing_rule
if has_pricing_rules:
remove_margin(item)
for d in get_applied_pricing_rules(item.pricing_rules):
for d in applied_rules:
pricing_rule = frappe.get_cached_doc("Pricing Rule", d)
apply_pricing_rule_margin(pricing_rule, item, self.doc)