Skip to content

Commit c7f2707

Browse files
authored
Merge pull request #2321 from frappe/version-14-hotfix
2 parents 6c2e611 + 2dd66d4 commit c7f2707

File tree

3 files changed

+72
-14
lines changed

3 files changed

+72
-14
lines changed

hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,11 @@ def _get_months_passed(current_date, from_date, consider_current_month):
180180
months_passed += 1
181181

182182
elif current_date.year > from_date.year:
183-
months_passed = (12 - from_date.month) + current_date.month
183+
months_passed = (
184+
(12 - from_date.month)
185+
+ (current_date.year - from_date.year - 1) * 12
186+
+ current_date.month
187+
)
184188
if consider_current_month:
185189
months_passed += 1
186190

@@ -284,16 +288,7 @@ def create_assignment_for_multiple_employees(employees, data):
284288
failed = []
285289

286290
for employee in employees:
287-
assignment = frappe.new_doc("Leave Policy Assignment")
288-
assignment.employee = employee
289-
assignment.assignment_based_on = data.assignment_based_on or None
290-
assignment.leave_policy = data.leave_policy
291-
assignment.effective_from = getdate(data.effective_from) or None
292-
assignment.effective_to = getdate(data.effective_to) or None
293-
assignment.leave_period = data.leave_period or None
294-
assignment.carry_forward = data.carry_forward
295-
assignment.save()
296-
291+
assignment = create_assignment(employee, data)
297292
savepoint = "before_assignment_submission"
298293
try:
299294
frappe.db.savepoint(savepoint)
@@ -311,6 +306,20 @@ def create_assignment_for_multiple_employees(employees, data):
311306
return docs_name
312307

313308

309+
@frappe.whitelist()
310+
def create_assignment(employee, data):
311+
assignment = frappe.new_doc("Leave Policy Assignment")
312+
assignment.employee = employee
313+
assignment.assignment_based_on = data.assignment_based_on or None
314+
assignment.leave_policy = data.leave_policy
315+
assignment.effective_from = getdate(data.effective_from) or None
316+
assignment.effective_to = getdate(data.effective_to) or None
317+
assignment.leave_period = data.leave_period or None
318+
assignment.carry_forward = data.carry_forward
319+
assignment.save()
320+
return assignment
321+
322+
314323
def show_assignment_submission_status(failed):
315324
frappe.clear_messages()
316325
assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed]

hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py

+47
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
from frappe.utils import add_months, get_first_day, get_year_ending, getdate
77

88
from hrms.hr.doctype.leave_application.test_leave_application import get_employee, get_leave_period
9+
from hrms.hr.doctype.leave_period.test_leave_period import create_leave_period
910
from hrms.hr.doctype.leave_policy.test_leave_policy import create_leave_policy
1011
from hrms.hr.doctype.leave_policy_assignment.leave_policy_assignment import (
12+
create_assignment,
1113
create_assignment_for_multiple_employees,
1214
)
15+
from hrms.hr.doctype.leave_type.test_leave_type import create_leave_type
1316

1417
test_dependencies = ["Employee"]
1518

@@ -20,6 +23,7 @@ def setUp(self):
2023
"Leave Period",
2124
"Leave Application",
2225
"Leave Allocation",
26+
"Leave Policy",
2327
"Leave Policy Assignment",
2428
"Leave Ledger Entry",
2529
]:
@@ -117,6 +121,49 @@ def test_pro_rated_leave_allocation(self):
117121
# pro-rated leave allocation for 9 months
118122
self.assertEqual(allocation, 9)
119123

124+
# tests no of leaves for passed months if assignment is based on Leave Period / Joining Date
125+
def test_get_leaves_for_passed_months(self):
126+
first_day = get_first_day(getdate())
127+
annual_allocation = 10
128+
leave_type = create_leave_type(
129+
leave_type_name="_Test Earned Leave", is_earned_leave=True, allocate_on_day="First Day"
130+
)
131+
leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation)
132+
leave_policy.submit()
133+
134+
data = {
135+
"assignment_based_on": "Joining Date",
136+
"leave_policy": leave_policy.name,
137+
}
138+
139+
self.employee.date_of_joining = add_months(first_day, -5)
140+
self.employee.save()
141+
assignment = create_assignment(self.employee.name, frappe._dict(data))
142+
new_leaves_allocated = assignment.get_leaves_for_passed_months(
143+
annual_allocation, leave_type, self.employee.date_of_joining
144+
)
145+
self.assertEqual(new_leaves_allocated, 5)
146+
147+
self.employee.date_of_joining = add_months(first_day, -35)
148+
self.employee.save()
149+
assignment = create_assignment(self.employee.name, frappe._dict(data))
150+
new_leaves_allocated = assignment.get_leaves_for_passed_months(
151+
annual_allocation, leave_type, self.employee.date_of_joining
152+
)
153+
self.assertEqual(new_leaves_allocated, 30)
154+
155+
leave_period = create_leave_period(add_months(first_day, -23), first_day)
156+
data = {
157+
"assignment_based_on": "Leave Period",
158+
"leave_policy": leave_policy.name,
159+
"leave_period": leave_period.name,
160+
}
161+
assignment = create_assignment(self.employee.name, frappe._dict(data))
162+
new_leaves_allocated = assignment.get_leaves_for_passed_months(
163+
annual_allocation, leave_type, self.employee.date_of_joining
164+
)
165+
self.assertEqual(new_leaves_allocated, 20)
166+
120167
def test_pro_rated_leave_allocation_for_custom_date_range(self):
121168
leave_type = frappe.get_doc(
122169
{

hrms/hr/doctype/leave_type/test_leave_type.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88

99
def create_leave_type(**args):
1010
args = frappe._dict(args)
11-
if frappe.db.exists("Leave Type", args.leave_type_name):
12-
frappe.delete_doc("Leave Type", args.leave_type_name, force=True)
11+
leave_type_name = args.leave_type_name or "_Test Leave Type"
12+
if frappe.db.exists("Leave Type", leave_type_name):
13+
frappe.delete_doc("Leave Type", leave_type_name, force=True)
1314

1415
leave_type = frappe.get_doc(
1516
{
1617
"doctype": "Leave Type",
17-
"leave_type_name": args.leave_type_name or "_Test Leave Type",
18+
"leave_type_name": leave_type_name,
1819
"include_holiday": args.include_holidays or 1,
1920
"allow_encashment": args.allow_encashment or 0,
2021
"is_earned_leave": args.is_earned_leave or 0,
@@ -26,6 +27,7 @@ def create_leave_type(**args):
2627
"earning_component": "Leave Encashment",
2728
"max_leaves_allowed": args.max_leaves_allowed,
2829
"maximum_carry_forwarded_leaves": args.maximum_carry_forwarded_leaves,
30+
"allocate_on_day": args.allocate_on_day or "Last Day",
2931
}
3032
)
3133

0 commit comments

Comments
 (0)