From 6e6b55ece02c695203018a74cdd980bbe5c2ea4a Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Tue, 19 Jul 2022 15:31:34 +0530 Subject: [PATCH 1/2] fix: (india) (e-invoice) discount in CN/DN discount fixes --- erpnext/regional/india/e_invoice/utils.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index 2addb4017c2..628de807c44 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -273,19 +273,17 @@ def get_item_list(invoice): item.sr_no = d.idx item.description = sanitize_for_json(d.item_name) - item.qty = abs(item.qty) + item.qty = abs(item.qty) or 1 + item.discount_amount = abs(item.discount_amount) + item.taxable_value = abs(item.taxable_value) 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 flt(item.qty) != 0.0: - item.unit_rate = abs(item.taxable_value / item.qty) - else: - item.unit_rate = abs(item.taxable_value) - item.gross_amount = abs(item.taxable_value) - item.taxable_value = abs(item.taxable_value) + item.unit_rate = item.taxable_value / item.qty + item.gross_amount = item.taxable_value item.discount_amount = 0 else: @@ -298,12 +296,10 @@ def get_item_list(invoice): item.discount_amount = item.discount_amount * item.qty if invoice.get("is_return") or invoice.get("is_debit_note"): - item.unit_rate = (abs(item.taxable_value) + item.discount_amount) / ( - 1 if (item.qty == 0) else item.qty - ) + item.unit_rate = (item.taxable_value + item.discount_amount) / item.qty else: try: - item.unit_rate = abs(item.taxable_value + item.discount_amount) / item.qty + item.unit_rate = (item.taxable_value + item.discount_amount) / item.qty except ZeroDivisionError: # This will never run but added as safety measure frappe.throw( @@ -311,8 +307,8 @@ def get_item_list(invoice): msg=_("Quantity can't be zero unless it's Credit/Debit Note."), ) - item.gross_amount = abs(item.taxable_value) + item.discount_amount - item.taxable_value = abs(item.taxable_value) + item.gross_amount = item.taxable_value + item.discount_amount + item.taxable_value = item.taxable_value item.is_service_item = "Y" if item.gst_hsn_code and item.gst_hsn_code[:2] == "99" else "N" item.serial_no = "" From b0efb98237ecad71bb37c92eb579e790219be049 Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Tue, 19 Jul 2022 22:29:38 +0530 Subject: [PATCH 2/2] fix: (india) (e-invoice) qty should not be changed to 1 Qty of 0 is allowed so can't change item.qty to 1 instead created item_qty and used it. --- erpnext/regional/india/e_invoice/utils.py | 32 ++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/erpnext/regional/india/e_invoice/utils.py b/erpnext/regional/india/e_invoice/utils.py index 628de807c44..bf304bc10dc 100644 --- a/erpnext/regional/india/e_invoice/utils.py +++ b/erpnext/regional/india/e_invoice/utils.py @@ -273,39 +273,41 @@ def get_item_list(invoice): item.sr_no = d.idx item.description = sanitize_for_json(d.item_name) - item.qty = abs(item.qty) or 1 + 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: - item.unit_rate = item.taxable_value / item.qty + item.unit_rate = item.taxable_value / item_qty item.gross_amount = item.taxable_value item.discount_amount = 0 else: if invoice.get("apply_discount_on") and (abs(invoice.get("base_discount_amount") or 0.0) > 0.0): # TODO: need to handle case when tax included in basic rate is checked. - item.discount_amount = (item.discount_amount * item.qty) + ( + item.discount_amount = (item.discount_amount * item_qty) + ( abs(item.base_amount) - abs(item.base_net_amount) ) else: - item.discount_amount = item.discount_amount * item.qty + item.discount_amount = item.discount_amount * item_qty - if invoice.get("is_return") or invoice.get("is_debit_note"): - item.unit_rate = (item.taxable_value + item.discount_amount) / item.qty - else: - try: - item.unit_rate = (item.taxable_value + item.discount_amount) / item.qty - except ZeroDivisionError: - # This will never run but added as safety measure - frappe.throw( - title=_("Error: Qty is Zero"), - msg=_("Quantity can't be zero unless it's Credit/Debit Note."), - ) + try: + item.unit_rate = (item.taxable_value + item.discount_amount) / item_qty + except ZeroDivisionError: + # This will never run but added as safety measure + frappe.throw( + title=_("Error: Qty is Zero"), + msg=_("Quantity can't be zero unless it's Credit/Debit Note."), + ) item.gross_amount = item.taxable_value + item.discount_amount item.taxable_value = item.taxable_value