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)