mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-20 21:49:18 +00:00
feat: generate & cancel IRN
This commit is contained in:
@@ -556,20 +556,17 @@ def validate_einvoice(validations, einvoice, errors=[]):
|
|||||||
|
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
def update_einvoice_fields(doctype, name, signed_einvoice):
|
def update_invoice(invoice, res):
|
||||||
enc_signed_invoice = signed_einvoice.get('SignedInvoice')
|
doctype = invoice.doctype
|
||||||
decrypted_signed_invoice = jwt_decrypt(enc_signed_invoice)['data']
|
name = invoice.name
|
||||||
|
|
||||||
if json.loads(decrypted_signed_invoice)['DocDtls']['No'] != name:
|
enc_signed_invoice = res.get('SignedInvoice')
|
||||||
frappe.throw(
|
dec_signed_invoice = jwt.decode(enc_signed_invoice)['data']
|
||||||
_("Document number of uploaded Signed E-Invoice doesn't matches with Sales Invoice"),
|
|
||||||
title=_("Inappropriate E-Invoice")
|
|
||||||
)
|
|
||||||
|
|
||||||
frappe.db.set_value(doctype, name, 'irn', signed_einvoice.get('Irn'))
|
frappe.db.set_value(doctype, name, 'irn', res.get('Irn'))
|
||||||
frappe.db.set_value(doctype, name, 'ewaybill', signed_einvoice.get('EwbNo'))
|
frappe.db.set_value(doctype, name, 'ewaybill', res.get('EwbNo'))
|
||||||
frappe.db.set_value(doctype, name, 'signed_qr_code', signed_einvoice.get('SignedQRCode'))
|
frappe.db.set_value(doctype, name, 'signed_invoice', dec_signed_invoice)
|
||||||
frappe.db.set_value(doctype, name, 'signed_einvoice', decrypted_signed_invoice)
|
frappe.db.set_value(doctype, name, 'signed_qr_code', res.get('SignedQRCode'))
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def download_einvoice():
|
def download_einvoice():
|
||||||
@@ -644,6 +641,8 @@ class GSPConnector():
|
|||||||
self.base_url = 'https://gsp.adaequare.com/'
|
self.base_url = 'https://gsp.adaequare.com/'
|
||||||
self.authenticate_url = self.base_url + 'gsp/authenticate?grant_type=token'
|
self.authenticate_url = self.base_url + 'gsp/authenticate?grant_type=token'
|
||||||
self.gstin_details_url = self.base_url + 'test/enriched/ei/api/master/gstin'
|
self.gstin_details_url = self.base_url + 'test/enriched/ei/api/master/gstin'
|
||||||
|
self.generate_irn_url = self.base_url + 'test/enriched/ei/api/invoice'
|
||||||
|
self.cancel_irn_url = self.base_url + 'test/enriched/ei/api/invoice/cancel'
|
||||||
|
|
||||||
def get_auth_token(self):
|
def get_auth_token(self):
|
||||||
if time_diff_in_seconds(self.credentials.token_expiry, now_datetime()) < 150.0:
|
if time_diff_in_seconds(self.credentials.token_expiry, now_datetime()) < 150.0:
|
||||||
@@ -715,5 +714,40 @@ class GSPConnector():
|
|||||||
frappe.cache().hset('gstin_cache', key, details)
|
frappe.cache().hset('gstin_cache', key, details)
|
||||||
return details
|
return details
|
||||||
|
|
||||||
|
def generate_irn(self, docname):
|
||||||
|
headers = self.get_headers()
|
||||||
|
doctype = 'Sales Invoice'
|
||||||
|
einvoice = make_einvoice(doctype, docname)
|
||||||
|
data = json.dumps(einvoice)
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = make_post_request(self.generate_irn_url, headers=headers, data=data)
|
||||||
|
if res.get('success'):
|
||||||
|
update_invoice(invoice, res)
|
||||||
|
else:
|
||||||
|
# {'success': False, 'message': '3039 : Seller Details:Pincode-560009 does not belong to the state-1, 2177 : Invalid item unit code(s)-UNIT'}
|
||||||
|
self.log_error()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.log_error(e)
|
||||||
|
|
||||||
|
def cancel_irn(self, docname, irn, reason, remark):
|
||||||
|
headers = self.get_headers()
|
||||||
|
doctype = 'Sales Invoice'
|
||||||
|
data = json.dumps({
|
||||||
|
'Irn': irn,
|
||||||
|
'Cnlrsn': reason,
|
||||||
|
'Cnlrem': remark
|
||||||
|
})
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = make_post_request(self.cancel_irn_url, headers=headers, data=data)
|
||||||
|
if res.get('success'):
|
||||||
|
frappe.db.set_value(doctype, docname, 'irn_cancelled', 1)
|
||||||
|
# frappe.db.set_value(doctype, docname, 'cancelled_on', res.get('CancelDate'))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.log_error(e)
|
||||||
|
|
||||||
def log_error(self, exc):
|
def log_error(self, exc):
|
||||||
print(exc)
|
print(exc)
|
||||||
Reference in New Issue
Block a user