Merge pull request #29374 from nextchamp-saqib/fix-ignore-pricing-rule
fix: ignore pricing rule in transactions
This commit is contained in:
commit
d106ec88ad
@ -586,23 +586,29 @@ class TestPOSInvoice(unittest.TestCase):
|
|||||||
item_price.insert()
|
item_price.insert()
|
||||||
pr = make_pricing_rule(selling=1, priority=5, discount_percentage=10)
|
pr = make_pricing_rule(selling=1, priority=5, discount_percentage=10)
|
||||||
pr.save()
|
pr.save()
|
||||||
pos_inv = create_pos_invoice(qty=1, do_not_submit=1)
|
|
||||||
pos_inv.items[0].rate = 300
|
|
||||||
pos_inv.save()
|
|
||||||
self.assertEquals(pos_inv.items[0].discount_percentage, 10)
|
|
||||||
# rate shouldn't change
|
|
||||||
self.assertEquals(pos_inv.items[0].rate, 405)
|
|
||||||
|
|
||||||
pos_inv.ignore_pricing_rule = 1
|
try:
|
||||||
pos_inv.items[0].rate = 300
|
pos_inv = create_pos_invoice(qty=1, do_not_submit=1)
|
||||||
pos_inv.save()
|
pos_inv.items[0].rate = 300
|
||||||
self.assertEquals(pos_inv.ignore_pricing_rule, 1)
|
pos_inv.save()
|
||||||
# rate should change since pricing rules are ignored
|
self.assertEquals(pos_inv.items[0].discount_percentage, 10)
|
||||||
self.assertEquals(pos_inv.items[0].rate, 300)
|
# rate shouldn't change
|
||||||
|
self.assertEquals(pos_inv.items[0].rate, 405)
|
||||||
|
|
||||||
item_price.delete()
|
pos_inv.ignore_pricing_rule = 1
|
||||||
pos_inv.delete()
|
pos_inv.save()
|
||||||
pr.delete()
|
self.assertEquals(pos_inv.ignore_pricing_rule, 1)
|
||||||
|
# rate should reset since pricing rules are ignored
|
||||||
|
self.assertEquals(pos_inv.items[0].rate, 450)
|
||||||
|
|
||||||
|
pos_inv.items[0].rate = 300
|
||||||
|
pos_inv.save()
|
||||||
|
self.assertEquals(pos_inv.items[0].rate, 300)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
item_price.delete()
|
||||||
|
pos_inv.delete()
|
||||||
|
pr.delete()
|
||||||
|
|
||||||
|
|
||||||
def create_pos_invoice(**args):
|
def create_pos_invoice(**args):
|
||||||
|
@ -249,13 +249,17 @@ def get_pricing_rule_for_item(args, price_list_rate=0, doc=None, for_validate=Fa
|
|||||||
"free_item_data": [],
|
"free_item_data": [],
|
||||||
"parent": args.parent,
|
"parent": args.parent,
|
||||||
"parenttype": args.parenttype,
|
"parenttype": args.parenttype,
|
||||||
"child_docname": args.get('child_docname')
|
"child_docname": args.get('child_docname'),
|
||||||
})
|
})
|
||||||
|
|
||||||
if args.ignore_pricing_rule or not args.item_code:
|
if args.ignore_pricing_rule or not args.item_code:
|
||||||
if frappe.db.exists(args.doctype, args.name) and args.get("pricing_rules"):
|
if frappe.db.exists(args.doctype, args.name) and args.get("pricing_rules"):
|
||||||
item_details = remove_pricing_rule_for_item(args.get("pricing_rules"),
|
item_details = remove_pricing_rule_for_item(
|
||||||
item_details, args.get('item_code'))
|
args.get("pricing_rules"),
|
||||||
|
item_details,
|
||||||
|
item_code=args.get("item_code"),
|
||||||
|
rate=args.get("price_list_rate"),
|
||||||
|
)
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
update_args_for_pricing_rule(args)
|
update_args_for_pricing_rule(args)
|
||||||
@ -308,8 +312,12 @@ def get_pricing_rule_for_item(args, price_list_rate=0, doc=None, for_validate=Fa
|
|||||||
if not doc: return item_details
|
if not doc: return item_details
|
||||||
|
|
||||||
elif args.get("pricing_rules"):
|
elif args.get("pricing_rules"):
|
||||||
item_details = remove_pricing_rule_for_item(args.get("pricing_rules"),
|
item_details = remove_pricing_rule_for_item(
|
||||||
item_details, args.get('item_code'))
|
args.get("pricing_rules"),
|
||||||
|
item_details,
|
||||||
|
item_code=args.get("item_code"),
|
||||||
|
rate=args.get("price_list_rate"),
|
||||||
|
)
|
||||||
|
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
@ -390,7 +398,7 @@ def apply_price_discount_rule(pricing_rule, item_details, args):
|
|||||||
item_details[field] += (pricing_rule.get(field, 0)
|
item_details[field] += (pricing_rule.get(field, 0)
|
||||||
if pricing_rule else args.get(field, 0))
|
if pricing_rule else args.get(field, 0))
|
||||||
|
|
||||||
def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None):
|
def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None, rate=None):
|
||||||
from erpnext.accounts.doctype.pricing_rule.utils import (
|
from erpnext.accounts.doctype.pricing_rule.utils import (
|
||||||
get_applied_pricing_rules,
|
get_applied_pricing_rules,
|
||||||
get_pricing_rule_items,
|
get_pricing_rule_items,
|
||||||
@ -403,6 +411,7 @@ def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None):
|
|||||||
if pricing_rule.rate_or_discount == 'Discount Percentage':
|
if pricing_rule.rate_or_discount == 'Discount Percentage':
|
||||||
item_details.discount_percentage = 0.0
|
item_details.discount_percentage = 0.0
|
||||||
item_details.discount_amount = 0.0
|
item_details.discount_amount = 0.0
|
||||||
|
item_details.rate = rate or 0.0
|
||||||
|
|
||||||
if pricing_rule.rate_or_discount == 'Discount Amount':
|
if pricing_rule.rate_or_discount == 'Discount Amount':
|
||||||
item_details.discount_amount = 0.0
|
item_details.discount_amount = 0.0
|
||||||
@ -421,6 +430,7 @@ def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None):
|
|||||||
item_details.applied_on_items = ','.join(items)
|
item_details.applied_on_items = ','.join(items)
|
||||||
|
|
||||||
item_details.pricing_rules = ''
|
item_details.pricing_rules = ''
|
||||||
|
item_details.pricing_rule_removed = True
|
||||||
|
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
@ -432,9 +442,12 @@ def remove_pricing_rules(item_list):
|
|||||||
out = []
|
out = []
|
||||||
for item in item_list:
|
for item in item_list:
|
||||||
item = frappe._dict(item)
|
item = frappe._dict(item)
|
||||||
if item.get('pricing_rules'):
|
if item.get("pricing_rules"):
|
||||||
out.append(remove_pricing_rule_for_item(item.get("pricing_rules"),
|
out.append(
|
||||||
item, item.item_code))
|
remove_pricing_rule_for_item(
|
||||||
|
item.get("pricing_rules"), item, item.item_code, item.get("price_list_rate")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
@ -628,6 +628,46 @@ class TestPricingRule(unittest.TestCase):
|
|||||||
for doc in [si, si1]:
|
for doc in [si, si1]:
|
||||||
doc.delete()
|
doc.delete()
|
||||||
|
|
||||||
|
def test_remove_pricing_rule(self):
|
||||||
|
item = make_item("Water Flask")
|
||||||
|
make_item_price("Water Flask", "_Test Price List", 100)
|
||||||
|
|
||||||
|
pricing_rule_record = {
|
||||||
|
"doctype": "Pricing Rule",
|
||||||
|
"title": "_Test Water Flask Rule",
|
||||||
|
"apply_on": "Item Code",
|
||||||
|
"price_or_product_discount": "Price",
|
||||||
|
"items": [{
|
||||||
|
"item_code": "Water Flask",
|
||||||
|
}],
|
||||||
|
"selling": 1,
|
||||||
|
"currency": "INR",
|
||||||
|
"rate_or_discount": "Discount Percentage",
|
||||||
|
"discount_percentage": 20,
|
||||||
|
"company": "_Test Company"
|
||||||
|
}
|
||||||
|
rule = frappe.get_doc(pricing_rule_record)
|
||||||
|
rule.insert()
|
||||||
|
|
||||||
|
si = create_sales_invoice(do_not_save=True, item_code="Water Flask")
|
||||||
|
si.selling_price_list = "_Test Price List"
|
||||||
|
si.save()
|
||||||
|
|
||||||
|
self.assertEqual(si.items[0].price_list_rate, 100)
|
||||||
|
self.assertEqual(si.items[0].discount_percentage, 20)
|
||||||
|
self.assertEqual(si.items[0].rate, 80)
|
||||||
|
|
||||||
|
si.ignore_pricing_rule = 1
|
||||||
|
si.save()
|
||||||
|
|
||||||
|
self.assertEqual(si.items[0].discount_percentage, 0)
|
||||||
|
self.assertEqual(si.items[0].rate, 100)
|
||||||
|
|
||||||
|
si.delete()
|
||||||
|
rule.delete()
|
||||||
|
frappe.get_doc("Item Price", {"item_code": "Water Flask"}).delete()
|
||||||
|
item.delete()
|
||||||
|
|
||||||
def test_multiple_pricing_rules_with_min_qty(self):
|
def test_multiple_pricing_rules_with_min_qty(self):
|
||||||
make_pricing_rule(discount_percentage=20, selling=1, priority=1, min_qty=4,
|
make_pricing_rule(discount_percentage=20, selling=1, priority=1, min_qty=4,
|
||||||
apply_multiple_pricing_rules=1, title="_Test Pricing Rule with Min Qty - 1")
|
apply_multiple_pricing_rules=1, title="_Test Pricing Rule with Min Qty - 1")
|
||||||
@ -648,6 +688,7 @@ class TestPricingRule(unittest.TestCase):
|
|||||||
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule with Min Qty - 1")
|
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule with Min Qty - 1")
|
||||||
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule with Min Qty - 2")
|
frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule with Min Qty - 2")
|
||||||
|
|
||||||
|
|
||||||
test_dependencies = ["Campaign"]
|
test_dependencies = ["Campaign"]
|
||||||
|
|
||||||
def make_pricing_rule(**args):
|
def make_pricing_rule(**args):
|
||||||
|
@ -407,6 +407,22 @@ class AccountsController(TransactionBase):
|
|||||||
if item_qty != len(get_serial_nos(item.get('serial_no'))):
|
if item_qty != len(get_serial_nos(item.get('serial_no'))):
|
||||||
item.set(fieldname, value)
|
item.set(fieldname, value)
|
||||||
|
|
||||||
|
elif (
|
||||||
|
ret.get("pricing_rule_removed")
|
||||||
|
and value is not None
|
||||||
|
and fieldname
|
||||||
|
in [
|
||||||
|
"discount_percentage",
|
||||||
|
"discount_amount",
|
||||||
|
"rate",
|
||||||
|
"margin_rate_or_amount",
|
||||||
|
"margin_type",
|
||||||
|
"remove_free_item",
|
||||||
|
]
|
||||||
|
):
|
||||||
|
# reset pricing rule fields if pricing_rule_removed
|
||||||
|
item.set(fieldname, value)
|
||||||
|
|
||||||
if self.doctype in ["Purchase Invoice", "Sales Invoice"] and item.meta.get_field('is_fixed_asset'):
|
if self.doctype in ["Purchase Invoice", "Sales Invoice"] and item.meta.get_field('is_fixed_asset'):
|
||||||
item.set('is_fixed_asset', ret.get('is_fixed_asset', 0))
|
item.set('is_fixed_asset', ret.get('is_fixed_asset', 0))
|
||||||
|
|
||||||
|
@ -1463,7 +1463,8 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
|
|||||||
"item_code": d.item_code,
|
"item_code": d.item_code,
|
||||||
"pricing_rules": d.pricing_rules,
|
"pricing_rules": d.pricing_rules,
|
||||||
"parenttype": d.parenttype,
|
"parenttype": d.parenttype,
|
||||||
"parent": d.parent
|
"parent": d.parent,
|
||||||
|
"price_list_rate": d.price_list_rate
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user