From 567b1bbf6fee1e5850865fd181f0b16ffbee6eef Mon Sep 17 00:00:00 2001 From: 14987 Date: Tue, 17 Oct 2023 20:12:06 +0530 Subject: [PATCH 1/4] refactor: Employee working on holiday (cherry picked from commit b6675bea69a1463d6b0ad346c56fb0ddb8a970ab) --- .../employees_working_on_a_holiday.py | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index b9522c2d37..2b99c4ee46 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -17,11 +17,33 @@ def execute(filters=None): def get_columns(): return [ - _("Employee") + ":Link/Employee:120", - _("Name") + ":Data:200", - _("Date") + ":Date:100", - _("Status") + ":Data:70", - _("Holiday") + ":Data:200", + { + "label": _("Employee"), + "fieldtype": "Link", + "fieldname": "employee", + "options": "Employee", + "width": 120, + }, + { + "label": _("Name"), + "fieldtype": "Data", + "width": 200, + }, + { + "label": _("Date"), + "fieldtype": "Date", + "width": 100, + }, + { + "label": _("Status"), + "fieldtype": "Data", + "width": 70, + }, + { + "label": _("Holiday"), + "fieldtype": "Data", + "width": 200, + }, ] @@ -43,22 +65,27 @@ def get_employees(filters): holiday_names[holiday.holiday_date] = holiday.description if holidays_list: - cond = " attendance_date in %(holidays_list)s and status not in ('On Leave','Absent') " + attendance_doctype = frappe.qb.DocType("Attendance") + employee_list = ( + frappe.qb.from_(attendance_doctype) + .select( + attendance_doctype.employee, + attendance_doctype.employee_name, + attendance_doctype.attendance_date, + attendance_doctype.status, + ) + .where(attendance_doctype.attendance_date.isin(holidays_list)) + .where(attendance_doctype.status.notin(["Absent", "On Leave"])) + ) if filters.holiday_list: - cond += ( - """ and (employee in (select employee from tabEmployee where holiday_list = %(holidays)s))""" + employee = frappe.qb.DocType("Employee") + employee_based_on_holiday = ( + frappe.qb.from_(employee).select(employee.employee).where(employee.holiday_list == holidays) ) + employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) - employee_list = frappe.db.sql( - """select - employee, employee_name, attendance_date, status - from tabAttendance - where %s""" - % cond.format(", ".join(["%s"] * len(holidays_list))), - {"holidays_list": holidays_list, "holidays": filters.holiday_list}, - as_list=True, - ) + employee_list = employee_list.run(as_list=True) for employee_data in employee_list: employee_data.append(holiday_names[employee_data[2]]) From 6a63b7a5438bfcab7e460d5a457d38b7b3e82361 Mon Sep 17 00:00:00 2001 From: 14987 Date: Tue, 17 Oct 2023 20:37:34 +0530 Subject: [PATCH 2/4] fix: Update condition in query builder (cherry picked from commit a74e831bd1ebe0beafd081517cc5f0ccd02d5067) --- .../employees_working_on_a_holiday.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index 2b99c4ee46..b2625157c4 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -81,7 +81,9 @@ def get_employees(filters): if filters.holiday_list: employee = frappe.qb.DocType("Employee") employee_based_on_holiday = ( - frappe.qb.from_(employee).select(employee.employee).where(employee.holiday_list == holidays) + frappe.qb.from_(employee) + .select(employee.employee) + .where(employee.holiday_list == filters.holiday_list) ) employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) From b08c8904f8c2f85bbb44dd9157d98571fdbf660b Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 14 Oct 2024 14:16:31 +0530 Subject: [PATCH 3/4] refactor: show only holidays from employee's holidays (cherry picked from commit 2e0f20ca6becd019145a3646eaa36ddff9399862) --- .../employees_working_on_a_holiday.js | 14 ++++ .../employees_working_on_a_holiday.py | 74 +++++++++---------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js index 4ce5ba4bc5..6f1137c713 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js @@ -23,5 +23,19 @@ frappe.query_reports["Employees working on a holiday"] = { fieldtype: "Link", options: "Holiday List", }, + { + fieldname: "department", + label: __("Department"), + fieldtype: "Link", + options: "Department", + }, + { + fieldname: "company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + reqd: 1, + default: frappe.defaults.get_user_default("Company"), + }, ], }; diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index b2625157c4..b37b90557c 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -5,13 +5,15 @@ import frappe from frappe import _ +from erpnext.setup.doctype.employee.employee import get_holiday_list_for_employee + def execute(filters=None): if not filters: filters = {} columns = get_columns() - data = get_employees(filters) + data = get_data(filters) return columns, data @@ -47,51 +49,41 @@ def get_columns(): ] -def get_employees(filters): - holiday_filter = [ - ["holiday_date", ">=", filters.from_date], - ["holiday_date", "<=", filters.to_date], - ] - if filters.holiday_list: - holiday_filter.append(["parent", "=", filters.holiday_list]) +def get_data(filters): + Attendance = frappe.qb.DocType("Attendance") + Holiday = frappe.qb.DocType("Holiday") - holidays = frappe.get_all("Holiday", fields=["holiday_date", "description"], filters=holiday_filter) + data = [] - holiday_names = {} - holidays_list = [] + employee_filters = {"company": filters.company} + if filters.department: + employee_filters["department"] = filters.department - for holiday in holidays: - holidays_list.append(holiday.holiday_date) - holiday_names[holiday.holiday_date] = holiday.description + for employee in frappe.get_list("Employee", filters=employee_filters, pluck="name"): + holiday_list = get_holiday_list_for_employee(employee, raise_exception=False) + if not holiday_list or (filters.holiday_list and filters.holiday_list != holiday_list): + continue - if holidays_list: - attendance_doctype = frappe.qb.DocType("Attendance") - employee_list = ( - frappe.qb.from_(attendance_doctype) + working_days = ( + frappe.qb.from_(Attendance) + .inner_join(Holiday) + .on(Attendance.attendance_date == Holiday.holiday_date) .select( - attendance_doctype.employee, - attendance_doctype.employee_name, - attendance_doctype.attendance_date, - attendance_doctype.status, + Attendance.employee, + Attendance.employee_name, + Attendance.attendance_date, + Attendance.status, + Holiday.description, ) - .where(attendance_doctype.attendance_date.isin(holidays_list)) - .where(attendance_doctype.status.notin(["Absent", "On Leave"])) - ) - - if filters.holiday_list: - employee = frappe.qb.DocType("Employee") - employee_based_on_holiday = ( - frappe.qb.from_(employee) - .select(employee.employee) - .where(employee.holiday_list == filters.holiday_list) + .where( + (Attendance.employee == employee) + & (Attendance.attendance_date[filters.from_date : filters.to_date]) + & (Attendance.status.notin(["Absent", "On Leave"])) + & (Attendance.docstatus == 1) + & (Holiday.parent == holiday_list) ) - employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) - - employee_list = employee_list.run(as_list=True) - - for employee_data in employee_list: - employee_data.append(holiday_names[employee_data[2]]) + .run(as_list=True) + ) + data.extend(working_days) - return employee_list - else: - return [] + return data From 257b4e4251a750d07340ee7bb3201caa9d7b11dd Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 14 Oct 2024 15:16:11 +0530 Subject: [PATCH 4/4] refactor: column widths (cherry picked from commit 68924492368afb0bf8ffb3205176eb6a3f75e012) --- .../employees_working_on_a_holiday.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index b37b90557c..3fa87892cb 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -24,22 +24,23 @@ def get_columns(): "fieldtype": "Link", "fieldname": "employee", "options": "Employee", - "width": 120, + "width": 300, }, { - "label": _("Name"), + "label": _("Employee Name"), "fieldtype": "Data", - "width": 200, + "width": 0, + "hidden": 1, }, { "label": _("Date"), "fieldtype": "Date", - "width": 100, + "width": 120, }, { "label": _("Status"), "fieldtype": "Data", - "width": 70, + "width": 100, }, { "label": _("Holiday"),