2021-05-14 06:47:41 +00:00
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
2021-09-02 11:14:59 +00:00
2021-05-14 06:47:41 +00:00
from erpnext . regional . india . utils import get_gst_accounts
2021-09-02 11:14:59 +00:00
2021-05-14 06:47:41 +00:00
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 \n Others " ,
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 ' " ,
2022-03-28 13:22:46 +00:00
) ,
dict (
2021-05-14 06:47:41 +00:00
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 ' " ,
2022-03-28 13:22:46 +00:00
) ,
] ,
2021-05-14 06:47:41 +00:00
" Purchase Invoice " : [
2022-03-28 13:22:46 +00:00
dict (
2021-05-14 06:47:41 +00:00
fieldname = " eligibility_for_itc " ,
label = " Eligibility For ITC " ,
fieldtype = " Select " ,
insert_after = " reason_for_issuing_document " ,
print_hide = 1 ,
options = " Input Service Distributor \n Import Of Service \n Import Of Capital Goods \n ITC on Reverse Charge \n Ineligible As Per Section 17(5) \n Ineligible Others \n All 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 } ,
)
2021-12-26 01:15:57 +00:00
if not gst_accounts :
continue
2021-05-14 06:47:41 +00:00
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 " ] ,
} ,
)