Merge pull request #15975 from nabinhait/staging-fixes

fix(test): Fixed item discount amount calculation and test cases related to pricing rule
This commit is contained in:
Deepesh Garg 2018-11-15 12:01:09 +05:30 committed by GitHub
commit 3b8c84fa75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 32 deletions

View File

@ -11,11 +11,17 @@ from erpnext.stock.get_item_details import get_item_details
from frappe import MandatoryError from frappe import MandatoryError
class TestPricingRule(unittest.TestCase): class TestPricingRule(unittest.TestCase):
def setUp(self):
frappe.db.sql("delete from `tabPricing Rule`")
def tearDown(self):
frappe.db.sql("delete from `tabPricing Rule`")
def test_pricing_rule_for_discount(self): def test_pricing_rule_for_discount(self):
from erpnext.stock.get_item_details import get_item_details from erpnext.stock.get_item_details import get_item_details
from frappe import MandatoryError from frappe import MandatoryError
frappe.db.sql("delete from `tabPricing Rule`")
test_record = { test_record = {
"doctype": "Pricing Rule", "doctype": "Pricing Rule",
@ -89,14 +95,10 @@ class TestPricingRule(unittest.TestCase):
details = get_item_details(args) details = get_item_details(args)
self.assertEqual(details.get("discount_percentage"), 15) self.assertEqual(details.get("discount_percentage"), 15)
frappe.db.sql("delete from `tabPricing Rule`")
def test_pricing_rule_for_margin(self): def test_pricing_rule_for_margin(self):
from erpnext.stock.get_item_details import get_item_details from erpnext.stock.get_item_details import get_item_details
from frappe import MandatoryError from frappe import MandatoryError
frappe.db.sql("delete from `tabPricing Rule`")
test_record = { test_record = {
"doctype": "Pricing Rule", "doctype": "Pricing Rule",
"title": "_Test Pricing Rule", "title": "_Test Pricing Rule",
@ -138,14 +140,10 @@ class TestPricingRule(unittest.TestCase):
self.assertEqual(details.get("margin_type"), "Percentage") self.assertEqual(details.get("margin_type"), "Percentage")
self.assertEqual(details.get("margin_rate_or_amount"), 10) self.assertEqual(details.get("margin_rate_or_amount"), 10)
frappe.db.sql("delete from `tabPricing Rule`")
def test_pricing_rule_for_variants(self): def test_pricing_rule_for_variants(self):
from erpnext.stock.get_item_details import get_item_details from erpnext.stock.get_item_details import get_item_details
from frappe import MandatoryError from frappe import MandatoryError
frappe.db.sql("delete from `tabPricing Rule`")
if not frappe.db.exists("Item", "Test Variant PRT"): if not frappe.db.exists("Item", "Test Variant PRT"):
frappe.get_doc({ frappe.get_doc({
"doctype": "Item", "doctype": "Item",
@ -213,8 +211,6 @@ class TestPricingRule(unittest.TestCase):
self.assertEqual(details.get("discount_percentage"), 17.5) self.assertEqual(details.get("discount_percentage"), 17.5)
def test_pricing_rule_for_stock_qty(self): def test_pricing_rule_for_stock_qty(self):
frappe.db.sql("delete from `tabPricing Rule`")
test_record = { test_record = {
"doctype": "Pricing Rule", "doctype": "Pricing Rule",
"title": "_Test Pricing Rule", "title": "_Test Pricing Rule",
@ -257,25 +253,19 @@ class TestPricingRule(unittest.TestCase):
self.assertEqual(so.items[0].rate, 100) self.assertEqual(so.items[0].rate, 100)
def test_pricing_rule_with_margin_and_discount(self): def test_pricing_rule_with_margin_and_discount(self):
frappe.delete_doc_if_exists('Pricing Rule', '_Test Pricing Rule') make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10, discount_percentage=10)
make_pricing_rule(selling=1, margin_type="Percentage", margin_rate_or_amount=10)
si = create_sales_invoice(do_not_save=True) si = create_sales_invoice(do_not_save=True)
si.items[0].price_list_rate = 1000 si.items[0].price_list_rate = 1000
si.payment_schedule = [] si.payment_schedule = []
si.insert(ignore_permissions=True) si.insert(ignore_permissions=True)
item = si.items[0] item = si.items[0]
self.assertEqual(item.rate, 1100)
self.assertEqual(item.margin_rate_or_amount, 10) self.assertEqual(item.margin_rate_or_amount, 10)
self.assertEqual(item.rate_with_margin, 1100)
# With discount
item.discount_percentage = 10
si.payment_schedule = []
si.save()
item = si.items[0]
self.assertEqual(item.rate, 990)
self.assertEqual(item.discount_percentage, 10) self.assertEqual(item.discount_percentage, 10)
frappe.db.sql("delete from `tabPricing Rule`") self.assertEqual(item.discount_amount, 110)
self.assertEqual(item.rate, 990)
def make_pricing_rule(**args): def make_pricing_rule(**args):
args = frappe._dict(args) args = frappe._dict(args)

View File

@ -65,12 +65,13 @@ class calculate_taxes_and_totals(object):
if item.doctype in ['Quotation Item', 'Sales Order Item', 'Delivery Note Item', 'Sales Invoice Item']: if item.doctype in ['Quotation Item', 'Sales Order Item', 'Delivery Note Item', 'Sales Invoice Item']:
item.rate_with_margin, item.base_rate_with_margin = self.calculate_margin(item) item.rate_with_margin, item.base_rate_with_margin = self.calculate_margin(item)
if flt(item.rate_with_margin) > 0:
item.rate = flt(item.rate_with_margin * (1.0 - (item.discount_percentage / 100.0)), item.precision("rate"))\ item.rate = flt(item.rate_with_margin * (1.0 - (item.discount_percentage / 100.0)), item.precision("rate"))
if item.rate_with_margin > 0 else item.rate item.discount_amount = item.rate_with_margin - item.rate
elif flt(item.price_list_rate) > 0:
item.discount_amount = item.price_list_rate - item.rate
item.net_rate = item.rate item.net_rate = item.rate
item.discount_amount = item.price_list_rate - item.rate
item.amount = flt(item.rate * item.qty, item.precision("amount")) item.amount = flt(item.rate * item.qty, item.precision("amount"))
item.net_amount = item.amount item.net_amount = item.amount

View File

@ -13,8 +13,8 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
+ flt(effective_item_rate) * ( flt(item.margin_rate_or_amount) / 100); + flt(effective_item_rate) * ( flt(item.margin_rate_or_amount) / 100);
} else { } else {
item.rate_with_margin = flt(effective_item_rate) + flt(item.margin_rate_or_amount); item.rate_with_margin = flt(effective_item_rate) + flt(item.margin_rate_or_amount);
item.base_rate_with_margin = flt(item.rate_with_margin) * flt(this.frm.doc.conversion_rate);
} }
item.base_rate_with_margin = flt(item.rate_with_margin) * flt(this.frm.doc.conversion_rate);
item.rate = flt(item.rate_with_margin , precision("rate", item)); item.rate = flt(item.rate_with_margin , precision("rate", item));

View File

@ -33,6 +33,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
item.margin_rate_or_amount = 0; item.margin_rate_or_amount = 0;
item.rate_with_margin = 0; item.rate_with_margin = 0;
} }
item.base_rate_with_margin = item.rate_with_margin * flt(this.frm.doc.conversion_rate);
cur_frm.cscript.set_gross_profit(item); cur_frm.cscript.set_gross_profit(item);
cur_frm.cscript.calculate_taxes_and_totals(); cur_frm.cscript.calculate_taxes_and_totals();

View File

@ -1,5 +1,6 @@
{ {
"allow_copy": 0, "allow_copy": 0,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0, "allow_guest_to_view": 0,
"allow_import": 0, "allow_import": 0,
"allow_rename": 0, "allow_rename": 0,
@ -15,6 +16,7 @@
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
@ -38,13 +40,15 @@
"read_only": 0, "read_only": 0,
"remember_last_selected_value": 0, "remember_last_selected_value": 0,
"report_hide": 0, "report_hide": 0,
"reqd": 1, "reqd": 0,
"search_index": 0, "search_index": 0,
"set_only_once": 0, "set_only_once": 0,
"translatable": 0,
"unique": 1 "unique": 1
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
@ -72,6 +76,7 @@
"reqd": 0, "reqd": 0,
"search_index": 0, "search_index": 0,
"set_only_once": 0, "set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
} }
], ],
@ -85,7 +90,7 @@
"issingle": 0, "issingle": 0,
"istable": 1, "istable": 1,
"max_attachments": 0, "max_attachments": 0,
"modified": "2017-12-10 20:55:23.814039", "modified": "2018-11-13 06:03:09.814357",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Item Barcode", "name": "Item Barcode",
@ -99,5 +104,6 @@
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1, "track_changes": 1,
"track_seen": 0 "track_seen": 0,
"track_views": 0
} }