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"}, fields=["name"]) if not company: return frappe.reload_doc("regional", "doctype", "gst_settings") frappe.reload_doc("accounts", "doctype", "gst_account") journal_entry_types = frappe.get_meta("Journal Entry").get_options("voucher_type").split("\n") + [ "Reversal Of ITC" ] make_property_setter( "Journal Entry", "voucher_type", "options", "\n".join(journal_entry_types), "" ) custom_fields = { "Journal Entry": [ dict( fieldname="reversal_type", label="Reversal Type", fieldtype="Select", insert_after="voucher_type", print_hide=1, options="As per rules 42 & 43 of CGST Rules\nOthers", depends_on="eval:doc.voucher_type=='Reversal Of ITC'", mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'", ), dict( fieldname="company_address", label="Company Address", fieldtype="Link", options="Address", insert_after="reversal_type", print_hide=1, depends_on="eval:doc.voucher_type=='Reversal Of ITC'", mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'", ), dict( fieldname="company_gstin", label="Company GSTIN", fieldtype="Data", read_only=1, insert_after="company_address", print_hide=1, fetch_from="company_address.gstin", depends_on="eval:doc.voucher_type=='Reversal Of ITC'", mandatory_depends_on="eval:doc.voucher_type=='Reversal Of ITC'", ), ], "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 As Per Section 17(5)\nIneligible Others\nAll Other ITC", default="All Other ITC", ) ], "Purchase Invoice Item": [ dict( fieldname="taxable_value", label="Taxable Value", fieldtype="Currency", insert_after="base_net_amount", hidden=1, options="Company:company:default_currency", print_hide=1, ) ], } 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') """ ) frappe.db.sql( """UPDATE `tabPurchase Invoice` set itc_integrated_tax = '0' WHERE trim(coalesce(itc_integrated_tax, '')) = '' """ ) frappe.db.sql( """UPDATE `tabPurchase Invoice` set itc_state_tax = '0' WHERE trim(coalesce(itc_state_tax, '')) = '' """ ) frappe.db.sql( """UPDATE `tabPurchase Invoice` set itc_central_tax = '0' WHERE trim(coalesce(itc_central_tax, '')) = '' """ ) frappe.db.sql( """UPDATE `tabPurchase Invoice` set itc_cess_amount = '0' WHERE trim(coalesce(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 not gst_accounts: continue 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"], }, )