161 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			3.6 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,
 | |
| 				)
 |