mirror of
https://github.com/frappe/erpnext.git
synced 2026-10-29 22:57:42 +00:00
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:
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user