fix: savepoint policy assignment submission, log errors & inform the user about failures (#35507)
This commit is contained in:
@@ -8,7 +8,15 @@ from math import ceil
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _, bold
|
from frappe import _, bold
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import date_diff, flt, formatdate, get_last_day, get_link_to_form, getdate
|
from frappe.utils import (
|
||||||
|
comma_and,
|
||||||
|
date_diff,
|
||||||
|
flt,
|
||||||
|
formatdate,
|
||||||
|
get_last_day,
|
||||||
|
get_link_to_form,
|
||||||
|
getdate,
|
||||||
|
)
|
||||||
from six import string_types
|
from six import string_types
|
||||||
|
|
||||||
|
|
||||||
@@ -207,7 +215,6 @@ def add_current_month_if_applicable(months_passed, date_of_joining, based_on_doj
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_assignment_for_multiple_employees(employees, data):
|
def create_assignment_for_multiple_employees(employees, data):
|
||||||
|
|
||||||
if isinstance(employees, string_types):
|
if isinstance(employees, string_types):
|
||||||
employees = json.loads(employees)
|
employees = json.loads(employees)
|
||||||
|
|
||||||
@@ -215,6 +222,8 @@ def create_assignment_for_multiple_employees(employees, data):
|
|||||||
data = frappe._dict(json.loads(data))
|
data = frappe._dict(json.loads(data))
|
||||||
|
|
||||||
docs_name = []
|
docs_name = []
|
||||||
|
failed = []
|
||||||
|
|
||||||
for employee in employees:
|
for employee in employees:
|
||||||
assignment = frappe.new_doc("Leave Policy Assignment")
|
assignment = frappe.new_doc("Leave Policy Assignment")
|
||||||
assignment.employee = employee
|
assignment.employee = employee
|
||||||
@@ -225,18 +234,45 @@ def create_assignment_for_multiple_employees(employees, data):
|
|||||||
assignment.leave_period = data.leave_period or None
|
assignment.leave_period = data.leave_period or None
|
||||||
assignment.carry_forward = data.carry_forward
|
assignment.carry_forward = data.carry_forward
|
||||||
assignment.save()
|
assignment.save()
|
||||||
try:
|
|
||||||
assignment.submit()
|
|
||||||
except frappe.exceptions.ValidationError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
frappe.db.commit()
|
savepoint = "before_assignment_submission"
|
||||||
|
|
||||||
|
try:
|
||||||
|
frappe.db.savepoint(savepoint)
|
||||||
|
assignment.submit()
|
||||||
|
except Exception as e:
|
||||||
|
frappe.db.rollback(save_point=savepoint)
|
||||||
|
frappe.log_error(title=f"Leave Policy Assignment submission failed for {assignment.name}")
|
||||||
|
failed.append(assignment.name)
|
||||||
|
|
||||||
docs_name.append(assignment.name)
|
docs_name.append(assignment.name)
|
||||||
|
|
||||||
|
if failed:
|
||||||
|
show_assignment_submission_status(failed)
|
||||||
|
|
||||||
return docs_name
|
return docs_name
|
||||||
|
|
||||||
|
|
||||||
|
def show_assignment_submission_status(failed):
|
||||||
|
frappe.clear_messages()
|
||||||
|
assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed]
|
||||||
|
|
||||||
|
msg = _("Failed to submit some leave policy assignments:")
|
||||||
|
msg += " " + comma_and(assignment_list, False) + "<hr>"
|
||||||
|
msg += (
|
||||||
|
_("Check {0} for more details")
|
||||||
|
.format("<a href='/app/List/Error Log?reference_doctype=Leave Policy Assignment'>{0}</a>")
|
||||||
|
.format(_("Error Log"))
|
||||||
|
)
|
||||||
|
|
||||||
|
frappe.msgprint(
|
||||||
|
msg,
|
||||||
|
indicator="red",
|
||||||
|
title=_("Submission Failed"),
|
||||||
|
is_minimizable=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_leave_type_details():
|
def get_leave_type_details():
|
||||||
leave_type_details = frappe._dict()
|
leave_type_details = frappe._dict()
|
||||||
leave_types = frappe.get_all(
|
leave_types = frappe.get_all(
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ frappe.listview_settings['Leave Policy Assignment'] = {
|
|||||||
get_query() {
|
get_query() {
|
||||||
let filters = {"is_active": 1};
|
let filters = {"is_active": 1};
|
||||||
if (cur_dialog.fields_dict.company.value)
|
if (cur_dialog.fields_dict.company.value)
|
||||||
filters["company"] = cur_dialog.fields_dict.company.value;
|
filters["company"] = cur_dialog?.fields_dict?.company?.value;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
filters: filters
|
filters: filters
|
||||||
|
|||||||
Reference in New Issue
Block a user