* 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) |