From 019b410af28513143314856da6cb770ed4a550e0 Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 8 Jan 2024 13:26:18 +0530 Subject: [PATCH 1/3] fix(Leave Policy Assignment): calculation of months passed --- .../leave_policy_assignment/leave_policy_assignment.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index b4594d1785..c43c0b82f2 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -188,7 +188,9 @@ def _get_months_passed(current_date, from_date, consider_current_month): months_passed += 1 elif current_date.year > from_date.year: - months_passed = (12 - from_date.month) + current_date.month + months_passed = ( + (12 - from_date.month) + (current_date.year - from_date.year - 1) * 12 + current_date.month + ) if consider_current_month: months_passed += 1 From 7592b446fe9c6d3da6f77286ef8dd383eacf495f Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 9 Jan 2024 12:27:37 +0530 Subject: [PATCH 2/3] test: add test for get_leaves_for_passed_months --- .../leave_policy_assignment.py | 25 ++++++----- .../test_leave_policy_assignment.py | 43 +++++++++++++++++++ hrms/hr/doctype/leave_type/test_leave_type.py | 7 +-- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index c43c0b82f2..680ee25e80 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -294,16 +294,7 @@ def create_assignment_for_multiple_employees(employees, data): failed = [] for employee in employees: - assignment = frappe.new_doc("Leave Policy Assignment") - assignment.employee = employee - assignment.assignment_based_on = data.assignment_based_on or None - assignment.leave_policy = data.leave_policy - assignment.effective_from = getdate(data.effective_from) or None - assignment.effective_to = getdate(data.effective_to) or None - assignment.leave_period = data.leave_period or None - assignment.carry_forward = data.carry_forward - assignment.save() - + assignment = create_assignment(employee, data) savepoint = "before_assignment_submission" try: frappe.db.savepoint(savepoint) @@ -321,6 +312,20 @@ def create_assignment_for_multiple_employees(employees, data): return docs_name +@frappe.whitelist() +def create_assignment(employee, data): + assignment = frappe.new_doc("Leave Policy Assignment") + assignment.employee = employee + assignment.assignment_based_on = data.assignment_based_on or None + assignment.leave_policy = data.leave_policy + assignment.effective_from = getdate(data.effective_from) or None + assignment.effective_to = getdate(data.effective_to) or None + assignment.leave_period = data.leave_period or None + assignment.carry_forward = data.carry_forward + assignment.save() + return assignment + + def show_assignment_submission_status(failed): frappe.clear_messages() assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed] diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index 79b4c092ac..72ef288ff9 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -6,10 +6,13 @@ from frappe.utils import add_months, get_first_day, getdate from hrms.hr.doctype.leave_application.test_leave_application import get_employee, get_leave_period +from hrms.hr.doctype.leave_period.test_leave_period import create_leave_period from hrms.hr.doctype.leave_policy.test_leave_policy import create_leave_policy from hrms.hr.doctype.leave_policy_assignment.leave_policy_assignment import ( + create_assignment, create_assignment_for_multiple_employees, ) +from hrms.hr.doctype.leave_type.test_leave_type import create_leave_type test_dependencies = ["Employee"] @@ -117,5 +120,45 @@ def test_pro_rated_leave_allocation(self): # pro-rated leave allocation for 9 months self.assertEqual(allocation, 9) + # tests no of leaves for passed months if assignment is based on Leave Period / Joining Date + def test_get_leaves_for_passed_months(self): + annual_allocation = 10 + leave_type = create_leave_type(is_earned_leave=True) + leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation) + leave_policy.submit() + + data = { + "assignment_based_on": "Joining Date", + "leave_policy": leave_policy.name, + } + + self.employee.date_of_joining = add_months(getdate(), -6) + self.employee.save() + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 5) + + self.employee.date_of_joining = add_months(getdate(), -36) + self.employee.save() + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 30) + + leave_period = create_leave_period(add_months(getdate(), -24), getdate()) + data = { + "assignment_based_on": "Leave Period", + "leave_policy": leave_policy.name, + "leave_period": leave_period.name, + } + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 20) + def tearDown(self): frappe.db.set_value("Employee", self.employee.name, "date_of_joining", self.original_doj) diff --git a/hrms/hr/doctype/leave_type/test_leave_type.py b/hrms/hr/doctype/leave_type/test_leave_type.py index 39b2c525fc..1dfdea0a33 100644 --- a/hrms/hr/doctype/leave_type/test_leave_type.py +++ b/hrms/hr/doctype/leave_type/test_leave_type.py @@ -8,13 +8,14 @@ def create_leave_type(**args): args = frappe._dict(args) - if frappe.db.exists("Leave Type", args.leave_type_name): - frappe.delete_doc("Leave Type", args.leave_type_name) + leave_type_name = args.leave_type_name or "_Test Leave Type" + if frappe.db.exists("Leave Type", leave_type_name): + frappe.delete_doc("Leave Type", leave_type_name) leave_type = frappe.get_doc( { "doctype": "Leave Type", - "leave_type_name": args.leave_type_name or "_Test Leave Type", + "leave_type_name": leave_type_name, "include_holiday": args.include_holidays or 1, "allow_encashment": args.allow_encashment or 0, "is_earned_leave": args.is_earned_leave or 0, From 031137a413579e29dd7b6123969cafe4c184bb65 Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 9 Jan 2024 13:34:32 +0530 Subject: [PATCH 3/3] test: fix setUp --- .../leave_policy_assignment/test_leave_policy_assignment.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index 72ef288ff9..c2e0f9a240 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -24,6 +24,7 @@ def setUp(self): "Leave Application", "Leave Allocation", "Leave Policy Assignment", + "Leave Policy", "Leave Ledger Entry", ]: frappe.db.delete(doctype) @@ -123,7 +124,7 @@ def test_pro_rated_leave_allocation(self): # tests no of leaves for passed months if assignment is based on Leave Period / Joining Date def test_get_leaves_for_passed_months(self): annual_allocation = 10 - leave_type = create_leave_type(is_earned_leave=True) + leave_type = create_leave_type(leave_type_name="_Test Earned Leave", is_earned_leave=True) leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation) leave_policy.submit()