From 62b17d3d98901cba3fb4bdcaef242c5cad5becd8 Mon Sep 17 00:00:00 2001 From: Asmita Hase Date: Fri, 24 Jan 2025 14:23:38 +0530 Subject: [PATCH] fix: allocate earned leaves pro-rata if policy assignment is submitted after the effective period (cherry picked from commit bff9ed2158352dbfe61e6e55b42586bb7159a2f5) # Conflicts: # hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py --- .../leave_policy_assignment.py | 7 ++-- .../test_leave_policy_assignment.py | 36 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 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 d9b7863420..811b0cb13f 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -38,6 +38,8 @@ def set_dates(self): ) elif self.assignment_based_on == "Joining Date": self.effective_from = frappe.db.get_value("Employee", self.employee, "date_of_joining") + if not self.effective_to: + self.effective_to = get_last_day(add_months(self.effective_from, 12)) def validate_policy_assignment_overlap(self): leave_policy_assignments = frappe.get_all( @@ -132,12 +134,13 @@ def get_new_leaves(self, annual_allocation, leave_details, date_of_joining): from frappe.model.meta import get_field_precision precision = get_field_precision(frappe.get_meta("Leave Allocation").get_field("new_leaves_allocated")) - + current_date = getdate(frappe.flags.current_date) or getdate() # Earned Leaves and Compensatory Leaves are allocated by scheduler, initially allocate 0 if leave_details.is_compensatory: new_leaves_allocated = 0 + # if earned leave is being allcated after the effective period, then let them be calculated pro-rata - elif leave_details.is_earned_leave: + elif leave_details.is_earned_leave and current_date < getdate(self.effective_to): new_leaves_allocated = self.get_leaves_for_passed_months( annual_allocation, leave_details, date_of_joining ) 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 4416090b87..1c884eb646 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 @@ -2,8 +2,13 @@ # See license.txt import frappe +<<<<<<< HEAD from frappe.tests.utils import FrappeTestCase from frappe.utils import add_months, get_first_day, get_year_ending, getdate +======= +from frappe.tests import IntegrationTestCase +from frappe.utils import add_days, add_months, get_first_day, get_year_ending, get_year_start, getdate +>>>>>>> bff9ed21 (fix: allocate earned leaves pro-rata if policy assignment is submitted after the effective period) 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 @@ -33,6 +38,9 @@ def setUp(self): self.original_doj = employee.date_of_joining self.employee = employee + def tearDown(self): + frappe.db.set_value("Employee", self.employee.name, "date_of_joining", self.original_doj) + def test_grant_leaves(self): leave_period = get_leave_period() leave_policy = create_leave_policy(annual_allocation=10) @@ -208,5 +216,29 @@ def test_pro_rated_leave_allocation_for_custom_date_range(self): self.assertGreater(new_leaves_allocated, 0) - def tearDown(self): - frappe.db.set_value("Employee", self.employee.name, "date_of_joining", self.original_doj) + def test_earned_leave_allocation_if_leave_policy_assignment_submitted_after_period(self): + year_start_date = get_year_start(getdate()) + year_end_date = get_year_ending(getdate()) + leave_period = create_leave_period(year_start_date, year_end_date) + + # assignment 10 days after the leave period + frappe.flags.current_date = add_days(year_end_date, 10) + leave_type = create_leave_type( + leave_type_name="_Test Earned Leave", is_earned_leave=True, allocate_on_day="Last Day" + ) + annual_earned_leaves = 10 + leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_earned_leaves) + leave_policy.submit() + + 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)) + assignment.submit() + + earned_leave_allocation = frappe.get_value( + "Leave Allocation", {"leave_policy_assignment": assignment.name}, "new_leaves_allocated" + ) + self.assertEqual(earned_leave_allocation, annual_earned_leaves)