dbb76a7d00
* fix: GST on freight charge in e-invoicing * feat(india): bulk e-invoice generation (#24969) * fix: cannot fetch e invoice settings * fix: patch condition (#25301) * fix: patch condition * fix: except einvoice loading error seperately * fix: json.loads error Co-authored-by: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com>
69 lines
3.2 KiB
Python
69 lines
3.2 KiB
Python
from __future__ import unicode_literals
|
|
import json
|
|
import frappe
|
|
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
|
|
|
|
def execute():
|
|
company = frappe.get_all('Company', filters = {'country': 'India'})
|
|
if not company:
|
|
return
|
|
|
|
# move hidden einvoice fields to a different section
|
|
custom_fields = {
|
|
'Sales Invoice': [
|
|
dict(fieldname='einvoice_section', label='E-Invoice Fields', fieldtype='Section Break', insert_after='gst_vehicle_type',
|
|
print_hide=1, hidden=1),
|
|
|
|
dict(fieldname='ack_no', label='Ack. No.', fieldtype='Data', read_only=1, hidden=1, insert_after='einvoice_section',
|
|
no_copy=1, print_hide=1),
|
|
|
|
dict(fieldname='ack_date', label='Ack. Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_no', no_copy=1, print_hide=1),
|
|
|
|
dict(fieldname='irn_cancel_date', label='Cancel Date', fieldtype='Data', read_only=1, hidden=1, insert_after='ack_date',
|
|
no_copy=1, print_hide=1),
|
|
|
|
dict(fieldname='signed_einvoice', label='Signed E-Invoice', fieldtype='Code', options='JSON', hidden=1, insert_after='irn_cancel_date',
|
|
no_copy=1, print_hide=1, read_only=1),
|
|
|
|
dict(fieldname='signed_qr_code', label='Signed QRCode', fieldtype='Code', options='JSON', hidden=1, insert_after='signed_einvoice',
|
|
no_copy=1, print_hide=1, read_only=1),
|
|
|
|
dict(fieldname='qrcode_image', label='QRCode', fieldtype='Attach Image', hidden=1, insert_after='signed_qr_code',
|
|
no_copy=1, print_hide=1, read_only=1),
|
|
|
|
dict(fieldname='einvoice_status', label='E-Invoice Status', fieldtype='Select', insert_after='qrcode_image',
|
|
options='\nPending\nGenerated\nCancelled\nFailed', default=None, hidden=1, no_copy=1, print_hide=1, read_only=1),
|
|
|
|
dict(fieldname='failure_description', label='E-Invoice Failure Description', fieldtype='Code', options='JSON',
|
|
hidden=1, insert_after='einvoice_status', no_copy=1, print_hide=1, read_only=1)
|
|
]
|
|
}
|
|
create_custom_fields(custom_fields, update=True)
|
|
|
|
if frappe.db.exists('E Invoice Settings') and frappe.db.get_single_value('E Invoice Settings', 'enable'):
|
|
frappe.db.sql('''
|
|
UPDATE `tabSales Invoice` SET einvoice_status = 'Pending'
|
|
WHERE
|
|
posting_date >= '2021-04-01'
|
|
AND ifnull(irn, '') = ''
|
|
AND ifnull(`billing_address_gstin`, '') != ifnull(`company_gstin`, '')
|
|
AND ifnull(gst_category, '') in ('Registered Regular', 'SEZ', 'Overseas', 'Deemed Export')
|
|
''')
|
|
|
|
# set appropriate statuses
|
|
frappe.db.sql('''UPDATE `tabSales Invoice` SET einvoice_status = 'Generated'
|
|
WHERE ifnull(irn, '') != '' AND ifnull(irn_cancelled, 0) = 0''')
|
|
|
|
frappe.db.sql('''UPDATE `tabSales Invoice` SET einvoice_status = 'Cancelled'
|
|
WHERE ifnull(irn_cancelled, 0) = 1''')
|
|
|
|
# set correct acknowledgement in e-invoices
|
|
einvoices = frappe.get_all('Sales Invoice', {'irn': ['is', 'set']}, ['name', 'signed_einvoice'])
|
|
|
|
if einvoices:
|
|
for inv in einvoices:
|
|
signed_einvoice = inv.get('signed_einvoice')
|
|
if signed_einvoice:
|
|
signed_einvoice = json.loads(signed_einvoice)
|
|
frappe.db.set_value('Sales Invoice', inv.get('name'), 'ack_no', signed_einvoice.get('AckNo'), update_modified=False)
|
|
frappe.db.set_value('Sales Invoice', inv.get('name'), 'ack_date', signed_einvoice.get('AckDt'), update_modified=False) |