From edb80d549d77625792a94536e7b5fcb926c6b09f Mon Sep 17 00:00:00 2001 From: Aysha Date: Tue, 29 Oct 2024 17:13:37 +0530 Subject: [PATCH 1/4] fix: stop leave allocation to past employees --- hrms/hr/utils.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index 201a5cdf57..ddeae6592b 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -461,15 +461,29 @@ def round_earned_leaves(earned_leaves, rounding): def get_leave_allocations(date, leave_type): - return frappe.db.sql( - """select name, employee, from_date, to_date, leave_policy_assignment, leave_policy - from `tabLeave Allocation` - where - %s between from_date and to_date and docstatus=1 - and leave_type=%s""", - (date, leave_type), - as_dict=1, + employee = frappe.qb.DocType("Employee") + leave_allocation = frappe.qb.DocType("Leave Allocation") + query = ( + frappe.qb.from_(leave_allocation) + .join(employee) + .on(leave_allocation.employee == employee.name) + .select( + leave_allocation.name, + leave_allocation.employee, + leave_allocation.from_date, + leave_allocation.to_date, + leave_allocation.leave_policy_assignment, + leave_allocation.leave_policy, + ) + .where( + (date >= leave_allocation.from_date) + & (date <= leave_allocation.to_date) + & (leave_allocation.docstatus == 1) + & (leave_allocation.leave_type == leave_type) + & (employee.status != "Left") + ) ) + return query.run(as_dict=1) def get_earned_leaves(): From e96d9fe6dbef595ff7affecc705e6ac76ed2c063 Mon Sep 17 00:00:00 2001 From: Aysha Date: Wed, 30 Oct 2024 12:19:09 +0530 Subject: [PATCH 2/4] fix: cleanup --- hrms/hr/utils.py | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index ddeae6592b..09a7ec019a 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -345,35 +345,35 @@ def allocate_earned_leaves(): for e_leave_type in e_leave_types: leave_allocations = get_leave_allocations(today, e_leave_type.name) - - for allocation in leave_allocations: - if not allocation.leave_policy_assignment and not allocation.leave_policy: - continue - - leave_policy = ( - allocation.leave_policy - if allocation.leave_policy - else frappe.db.get_value( - "Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"] + if leave_allocations: + for allocation in leave_allocations: + if not allocation.leave_policy_assignment and not allocation.leave_policy: + continue + + leave_policy = ( + allocation.leave_policy + if allocation.leave_policy + else frappe.db.get_value( + "Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"] + ) ) - ) - annual_allocation = frappe.db.get_value( - "Leave Policy Detail", - filters={"parent": leave_policy, "leave_type": e_leave_type.name}, - fieldname=["annual_allocation"], - ) - date_of_joining = frappe.db.get_value("Employee", allocation.employee, "date_of_joining") + annual_allocation = frappe.db.get_value( + "Leave Policy Detail", + filters={"parent": leave_policy, "leave_type": e_leave_type.name}, + fieldname=["annual_allocation"], + ) + date_of_joining = frappe.db.get_value("Employee", allocation.employee, "date_of_joining") - from_date = allocation.from_date + from_date = allocation.from_date - if e_leave_type.allocate_on_day == "Date of Joining": - from_date = date_of_joining + if e_leave_type.allocate_on_day == "Date of Joining": + from_date = date_of_joining - if check_effective_date( - from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.allocate_on_day - ): - update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining) + if check_effective_date( + from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.allocate_on_day + ): + update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining) def update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining): From 6f59d79bc6a3ce33df2a6d39067106d41f71de41 Mon Sep 17 00:00:00 2001 From: Aysha Date: Wed, 30 Oct 2024 12:45:41 +0530 Subject: [PATCH 3/4] fix: cleanup --- hrms/hr/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index 09a7ec019a..ba25548704 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -483,7 +483,7 @@ def get_leave_allocations(date, leave_type): & (employee.status != "Left") ) ) - return query.run(as_dict=1) + return query.run(as_dict=1) or [] def get_earned_leaves(): From 67f9bcaade6b1a1a984936e34732f12a3a9f2254 Mon Sep 17 00:00:00 2001 From: Aysha Date: Wed, 30 Oct 2024 12:58:00 +0530 Subject: [PATCH 4/4] fix: remove unnecessary if condition missed in last commit --- hrms/hr/utils.py | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index ba25548704..ba45c2387e 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -345,35 +345,34 @@ def allocate_earned_leaves(): for e_leave_type in e_leave_types: leave_allocations = get_leave_allocations(today, e_leave_type.name) - if leave_allocations: - for allocation in leave_allocations: - if not allocation.leave_policy_assignment and not allocation.leave_policy: - continue - - leave_policy = ( - allocation.leave_policy - if allocation.leave_policy - else frappe.db.get_value( - "Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"] - ) + for allocation in leave_allocations: + if not allocation.leave_policy_assignment and not allocation.leave_policy: + continue + + leave_policy = ( + allocation.leave_policy + if allocation.leave_policy + else frappe.db.get_value( + "Leave Policy Assignment", allocation.leave_policy_assignment, ["leave_policy"] ) + ) - annual_allocation = frappe.db.get_value( - "Leave Policy Detail", - filters={"parent": leave_policy, "leave_type": e_leave_type.name}, - fieldname=["annual_allocation"], - ) - date_of_joining = frappe.db.get_value("Employee", allocation.employee, "date_of_joining") + annual_allocation = frappe.db.get_value( + "Leave Policy Detail", + filters={"parent": leave_policy, "leave_type": e_leave_type.name}, + fieldname=["annual_allocation"], + ) + date_of_joining = frappe.db.get_value("Employee", allocation.employee, "date_of_joining") - from_date = allocation.from_date + from_date = allocation.from_date - if e_leave_type.allocate_on_day == "Date of Joining": - from_date = date_of_joining + if e_leave_type.allocate_on_day == "Date of Joining": + from_date = date_of_joining - if check_effective_date( - from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.allocate_on_day - ): - update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining) + if check_effective_date( + from_date, today, e_leave_type.earned_leave_frequency, e_leave_type.allocate_on_day + ): + update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining) def update_previous_leave_allocation(allocation, annual_allocation, e_leave_type, date_of_joining):