mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-25 16:04:46 +00:00
fix: error handling
This commit is contained in:
@@ -308,14 +308,17 @@ def make_einvoice(invoice):
|
|||||||
"Errors: ", json.dumps(errors, indent=4)
|
"Errors: ", json.dumps(errors, indent=4)
|
||||||
])
|
])
|
||||||
frappe.log_error(title="E Invoice Validation Failed", message=message)
|
frappe.log_error(title="E Invoice Validation Failed", message=message)
|
||||||
if len(errors) > 1:
|
throw_error_list(errors, _('E Invoice Validation Failed'))
|
||||||
li = ['<li>'+ d +'</li>' for d in errors]
|
|
||||||
frappe.throw("<ul style='padding-left: 20px'>{}</ul>".format(''.join(li)), title=_('E Invoice Validation Failed'))
|
|
||||||
else:
|
|
||||||
frappe.throw(errors[0], title=_('E Invoice Validation Failed'))
|
|
||||||
|
|
||||||
return einvoice
|
return einvoice
|
||||||
|
|
||||||
|
def throw_error_list(errors, title):
|
||||||
|
if len(errors) > 1:
|
||||||
|
li = ['<li>'+ d +'</li>' for d in errors]
|
||||||
|
frappe.throw("<ul style='padding-left: 20px'>{}</ul>".format(''.join(li)), title=title)
|
||||||
|
else:
|
||||||
|
frappe.throw(errors[0], title=title)
|
||||||
|
|
||||||
def validate_einvoice(validations, einvoice, errors=[]):
|
def validate_einvoice(validations, einvoice, errors=[]):
|
||||||
for fieldname, field_validation in validations.items():
|
for fieldname, field_validation in validations.items():
|
||||||
value = einvoice.get(fieldname, None)
|
value = einvoice.get(fieldname, None)
|
||||||
@@ -406,6 +409,7 @@ class GSPConnector():
|
|||||||
"response": json.dumps(res, indent=4) if res else None
|
"response": json.dumps(res, indent=4) if res else None
|
||||||
})
|
})
|
||||||
request_log.insert(ignore_permissions=True)
|
request_log.insert(ignore_permissions=True)
|
||||||
|
frappe.db.commit()
|
||||||
|
|
||||||
def fetch_auth_token(self):
|
def fetch_auth_token(self):
|
||||||
headers = {
|
headers = {
|
||||||
@@ -487,11 +491,11 @@ class GSPConnector():
|
|||||||
Contact ERPNext support to resolve the issue.')
|
Contact ERPNext support to resolve the issue.')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log_error(res)
|
|
||||||
raise RequestFailed
|
raise RequestFailed
|
||||||
|
|
||||||
except RequestFailed:
|
except RequestFailed:
|
||||||
self.raise_error()
|
errors = self.sanitize_error_message(res.get('message'))
|
||||||
|
self.raise_error(errors=errors)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log_error(data)
|
self.log_error(data)
|
||||||
@@ -506,11 +510,11 @@ class GSPConnector():
|
|||||||
if res.get('success'):
|
if res.get('success'):
|
||||||
return res.get('result')
|
return res.get('result')
|
||||||
else:
|
else:
|
||||||
self.log_error(res)
|
|
||||||
raise RequestFailed
|
raise RequestFailed
|
||||||
|
|
||||||
except RequestFailed:
|
except RequestFailed:
|
||||||
self.raise_error()
|
errors = self.sanitize_error_message(res.get('message'))
|
||||||
|
self.raise_error(errors=errors)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log_error()
|
self.log_error()
|
||||||
@@ -536,11 +540,11 @@ class GSPConnector():
|
|||||||
self.update_invoice()
|
self.update_invoice()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log_error(res)
|
|
||||||
raise RequestFailed
|
raise RequestFailed
|
||||||
|
|
||||||
except RequestFailed:
|
except RequestFailed:
|
||||||
self.raise_error()
|
errors = self.sanitize_error_message(res.get('message'))
|
||||||
|
self.raise_error(errors=errors)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log_error(data)
|
self.log_error(data)
|
||||||
@@ -577,11 +581,11 @@ class GSPConnector():
|
|||||||
self.update_invoice()
|
self.update_invoice()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log_error(res)
|
|
||||||
raise RequestFailed
|
raise RequestFailed
|
||||||
|
|
||||||
except RequestFailed:
|
except RequestFailed:
|
||||||
self.raise_error()
|
errors = self.sanitize_error_message(res.get('message'))
|
||||||
|
self.raise_error(errors=errors)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log_error(data)
|
self.log_error(data)
|
||||||
@@ -608,15 +612,37 @@ class GSPConnector():
|
|||||||
self.update_invoice()
|
self.update_invoice()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.log_error(res)
|
|
||||||
raise RequestFailed
|
raise RequestFailed
|
||||||
|
|
||||||
except RequestFailed:
|
except RequestFailed:
|
||||||
self.raise_error()
|
errors = self.sanitize_error_message(res.get('message'))
|
||||||
|
self.raise_error(errors=errors)
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log_error(data)
|
self.log_error(data)
|
||||||
self.raise_error(True)
|
self.raise_error(True)
|
||||||
|
|
||||||
|
def sanitize_error_message(self, message):
|
||||||
|
'''
|
||||||
|
message = '2174 : For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable,
|
||||||
|
3095 : Supplier GSTIN is inactive'
|
||||||
|
we search for string between ':' to extract error messages
|
||||||
|
errors = [
|
||||||
|
': For inter-state transaction, CGST and SGST amounts are not applicable; only IGST amount is applicable, 3095 ',
|
||||||
|
': Test'
|
||||||
|
]
|
||||||
|
then we trim down the message by looping over errors
|
||||||
|
'''
|
||||||
|
errors = re.findall(': [^:]+', message)
|
||||||
|
for idx, e in enumerate(errors):
|
||||||
|
# remove colons
|
||||||
|
errors[idx] = errors[idx].replace(':', '').strip()
|
||||||
|
# if not last
|
||||||
|
if idx != len(errors) - 1:
|
||||||
|
# remove last 7 chars eg: ', 3095 '
|
||||||
|
errors[idx] = errors[idx][:-6]
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
def log_error(self, data={}):
|
def log_error(self, data={}):
|
||||||
if not isinstance(data, dict):
|
if not isinstance(data, dict):
|
||||||
@@ -625,23 +651,27 @@ class GSPConnector():
|
|||||||
seperator = "--" * 50
|
seperator = "--" * 50
|
||||||
err_tb = traceback.format_exc()
|
err_tb = traceback.format_exc()
|
||||||
err_msg = str(sys.exc_info()[1])
|
err_msg = str(sys.exc_info()[1])
|
||||||
data = json.dumps(data, default=str, indent=4)
|
data = json.dumps(data, indent=4)
|
||||||
|
|
||||||
message = "\n".join([
|
message = "\n".join([
|
||||||
"Error", err_msg, seperator,
|
"Error", err_msg, seperator,
|
||||||
"Data:", data, seperator,
|
"Data:", data, seperator,
|
||||||
"Exception:", err_tb
|
"Exception:", err_tb
|
||||||
])
|
])
|
||||||
frappe.log_error(title="E Invoicing Error", message=message)
|
frappe.log_error(title=_('E Invoice Request Failed'), message=message)
|
||||||
|
|
||||||
def raise_error(self, raise_exception=False):
|
def raise_error(self, raise_exception=False, errors=[]):
|
||||||
link_to_error_list = '<a href="desk#List/Error Log/List?method=E Invoice Request Failed">Error Log</a>'
|
title = _('E Invoice Request Failed')
|
||||||
frappe.msgprint(
|
if errors:
|
||||||
_('An error occurred while making e-invoicing request. Please check {} for more information.').format(link_to_error_list),
|
throw_error_list(errors, title)
|
||||||
title=_('E Invoice Request Failed'),
|
else:
|
||||||
raise_exception=raise_exception,
|
link_to_error_list = '<a href="desk#List/Error Log/List?method=E Invoice Request Failed">Error Log</a>'
|
||||||
indicator='red'
|
frappe.msgprint(
|
||||||
)
|
_('An error occurred while making e-invoicing request. Please check {} for more information.').format(link_to_error_list),
|
||||||
|
title=title,
|
||||||
|
raise_exception=raise_exception,
|
||||||
|
indicator='red'
|
||||||
|
)
|
||||||
|
|
||||||
def set_einvoice_data(self, res):
|
def set_einvoice_data(self, res):
|
||||||
enc_signed_invoice = res.get('SignedInvoice')
|
enc_signed_invoice = res.get('SignedInvoice')
|
||||||
|
|||||||
Reference in New Issue
Block a user