diff --git a/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py b/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py index 0d06a5ceb3c..dc4e23eaa3c 100644 --- a/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py +++ b/erpnext/patches/v12_0/create_itc_reversal_custom_fields.py @@ -2,9 +2,10 @@ from __future__ import unicode_literals import frappe from frappe.custom.doctype.custom_field.custom_field import create_custom_fields from frappe.custom.doctype.property_setter.property_setter import make_property_setter +from erpnext.regional.india.utils import get_gst_accounts def execute(): - company = frappe.get_all('Company', filters = {'country': 'India'}) + company = frappe.get_all('Company', filters = {'country': 'India'}, fields=['name']) if not company: return @@ -31,8 +32,64 @@ def execute(): 'Purchase Invoice': [ dict(fieldname='eligibility_for_itc', label='Eligibility For ITC', fieldtype='Select', insert_after='reason_for_issuing_document', print_hide=1, - options='Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible\nAll Other ITC', default="All Other ITC") + options='Input Service Distributor\nImport Of Service\nImport Of Capital Goods\nITC on Reverse Charge\nIneligible As Per Section 17(5)\nIneligible Others\nAll Other ITC', + default="All Other ITC") ] } - create_custom_fields(custom_fields, update=True) \ No newline at end of file + create_custom_fields(custom_fields, update=True) + + # Patch ITC Availed fields from Data to Currency + # Patch Availed ITC for current fiscal_year + + gst_accounts = get_gst_accounts(only_non_reverse_charge=1) + + frappe.db.sql(""" + UPDATE `tabCustom Field` SET fieldtype='Currency', options='Company:company:default_currency' + WHERE dt = 'Purchase Invoice' and fieldname in ('itc_integrated_tax', 'itc_state_tax', 'itc_central_tax', + 'itc_cess_amount') + """) + + # Get purchase invoices + invoices = frappe.get_all('Purchase Invoice', + {'posting_date': ('>=', '2021-04-01'), 'eligibility_for_itc': ('!=', 'Ineligible')}, + ['name']) + + amount_map = {} + + if invoices: + invoice_list = set([d.name for d in invoices]) + + # Get GST applied + amounts = frappe.db.sql(""" + SELECT parent, account_head, sum(base_tax_amount_after_discount_amount) as amount + FROM `tabPurchase Taxes and Charges` + where parent in %s + GROUP BY parent, account_head + """, (invoice_list), as_dict=1) + + for d in amounts: + amount_map.setdefault(d.parent, + { + 'itc_integrated_tax': 0, + 'itc_state_tax': 0, + 'itc_central_tax': 0, + 'itc_cess_amount': 0 + }) + + if d.account_head in gst_accounts.get('igst_account'): + amount_map[d.parent]['itc_integrated_tax'] += d.amount + if d.account_head in gst_accounts.get('cgst_account'): + amount_map[d.parent]['itc_central_tax'] += d.amount + if d.account_head in gst_accounts.get('sgst_account'): + amount_map[d.parent]['itc_state_tax'] += d.amount + if d.account_head in gst_accounts.get('cess_account'): + amount_map[d.parent]['itc_cess_amount'] += d.amount + + for invoice, values in amount_map.items(): + frappe.db.set_value('Purchase Invoice', invoice, { + 'itc_integrated_tax': values.get('itc_integrated_tax'), + 'itc_central_tax': values.get('itc_central_tax'), + 'itc_state_tax': values['itc_state_tax'], + 'itc_cess_amount': values['itc_cess_amount'], + }) \ No newline at end of file