diff --git a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index 2330541813e..83c0b4dceba 100644 --- a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -8,7 +8,15 @@ from math import ceil import frappe from frappe import _, bold 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 @@ -207,7 +215,6 @@ def add_current_month_if_applicable(months_passed, date_of_joining, based_on_doj @frappe.whitelist() def create_assignment_for_multiple_employees(employees, data): - if isinstance(employees, string_types): employees = json.loads(employees) @@ -215,6 +222,8 @@ def create_assignment_for_multiple_employees(employees, data): data = frappe._dict(json.loads(data)) docs_name = [] + failed = [] + for employee in employees: assignment = frappe.new_doc("Leave Policy Assignment") assignment.employee = employee @@ -225,18 +234,45 @@ def create_assignment_for_multiple_employees(employees, data): assignment.leave_period = data.leave_period or None assignment.carry_forward = data.carry_forward 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) + if failed: + show_assignment_submission_status(failed) + 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) + "