From b97d30aad098d87e6c95ff1dab37360ac574e17a Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Tue, 26 Jul 2022 12:57:47 +0530 Subject: [PATCH 1/2] fix: (india) (e-invoice) margin & internal company transfer When the item price is more than the price list rate ( margin added ) discount value becomes negative. The previous attempt to solve this was to convert discount to absolute value. However, that gives incorrect unit price and discount value. To solve this, I have made changes to report net rates in cases where the margin is added or is an internal company transfer. --- erpnext/regional/india/e_invoice/utils.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index bf304bc10dc..8e652bbb163 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -265,6 +265,10 @@ def get_overseas_address_details(address_name): def get_item_list(invoice): item_list = [] + hide_discount_in_einvoice = cint( + frappe.db.get_single_value("E Invoice Settings", "dont_show_discounts_in_e_invoice") + ) + for d in invoice.items: einvoice_item_schema = read_json("einv_item_template") item = frappe._dict({}) @@ -276,17 +280,12 @@ def get_item_list(invoice): item.qty = abs(item.qty) item_qty = item.qty - item.discount_amount = abs(item.discount_amount) item.taxable_value = abs(item.taxable_value) if invoice.get("is_return") or invoice.get("is_debit_note"): item_qty = item_qty or 1 - hide_discount_in_einvoice = cint( - frappe.db.get_single_value("E Invoice Settings", "dont_show_discounts_in_e_invoice") - ) - - if hide_discount_in_einvoice: + if hide_discount_in_einvoice or invoice.is_internal_customer or (item.discount_amount <= 0): item.unit_rate = item.taxable_value / item_qty item.gross_amount = item.taxable_value item.discount_amount = 0 From a843e784e6f4ce60be8d5d5a39154dca3bad07e6 Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Tue, 26 Jul 2022 17:40:59 +0530 Subject: [PATCH 2/2] fix: discount and test added only report net rate if discount is less than 0 and added test. --- .../sales_invoice/test_sales_invoice.py | 26 +++++++++++++++++++ erpnext/regional/india/e_invoice/utils.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 0a5172eaba6..2df095a41a0 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -2712,6 +2712,19 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(einvoice["ItemList"][2]["UnitPrice"], 20) self.assertEqual(einvoice["ItemList"][3]["UnitPrice"], 10) + si = get_sales_invoice_for_e_invoice() + si.apply_discount_on = "" + si.items[1].price_list_rate = 15 + si.items[1].discount_amount = -5 + si.items[1].rate = 20 + si.save() + + einvoice = make_einvoice(si) + validate_totals(einvoice) + + self.assertEqual(einvoice["ItemList"][1]["Discount"], 0) + self.assertEqual(einvoice["ItemList"][1]["UnitPrice"], 20) + def test_einvoice_without_discounts(self): from erpnext.regional.india.e_invoice.utils import make_einvoice, validate_totals @@ -2804,6 +2817,19 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(einvoice["ItemList"][2]["UnitPrice"], 18) self.assertEqual(einvoice["ItemList"][3]["UnitPrice"], 5) + si = get_sales_invoice_for_e_invoice() + si.apply_discount_on = "" + si.items[1].price_list_rate = 15 + si.items[1].discount_amount = -5 + si.items[1].rate = 20 + si.save() + + einvoice = make_einvoice(si) + validate_totals(einvoice) + + self.assertEqual(einvoice["ItemList"][1]["Discount"], 0) + self.assertEqual(einvoice["ItemList"][1]["UnitPrice"], 20) + def test_item_tax_net_range(self): item = create_item("T Shirt") diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index 8e652bbb163..9292fc1cfec 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -285,7 +285,7 @@ def get_item_list(invoice): if invoice.get("is_return") or invoice.get("is_debit_note"): item_qty = item_qty or 1 - if hide_discount_in_einvoice or invoice.is_internal_customer or (item.discount_amount <= 0): + if hide_discount_in_einvoice or invoice.is_internal_customer or item.discount_amount < 0: item.unit_rate = item.taxable_value / item_qty item.gross_amount = item.taxable_value item.discount_amount = 0