diff --git a/hrms/hr/doctype/attendance/attendance.js b/hrms/hr/doctype/attendance/attendance.js index 17d4531175..113c53e3a5 100644 --- a/hrms/hr/doctype/attendance/attendance.js +++ b/hrms/hr/doctype/attendance/attendance.js @@ -27,4 +27,34 @@ frappe.ui.form.on("Attendance", { ); } }, + + employee(frm) { + if (frm.doc.employee && frm.doc.attendance_date && !frm.doc.shift) { + frm.trigger("set_employee_shift"); + } + }, + + attendance_date(frm) { + if (frm.doc.employee && frm.doc.attendance_date && !frm.doc.shift) { + frm.trigger("set_employee_shift"); + } + }, + + set_employee_shift(frm) { + if (!frm.doc.employee || !frm.doc.attendance_date) return; + + frappe.call({ + method: "hrms.hr.doctype.attendance.attendance.get_employee_shift", + args: { + employee: frm.doc.employee, + for_date: frm.doc.attendance_date || frappe.datetime.get_today(), + consider_default_shift: true, + }, + callback(r) { + if (r.message && !frm.doc.shift) { + frm.set_value("shift", r.message); + } + }, + }); + }, }); diff --git a/hrms/hr/doctype/attendance/attendance.py b/hrms/hr/doctype/attendance/attendance.py index cd4f31a388..8b198e6b81 100644 --- a/hrms/hr/doctype/attendance/attendance.py +++ b/hrms/hr/doctype/attendance/attendance.py @@ -468,3 +468,42 @@ def get_unmarked_days( from_date = add_days(from_date, 1) return unmarked_days + + +@frappe.whitelist() +def get_employee_shift(employee: str, for_date: str | date | None = None) -> str | None: + if not employee: + return None + + if employee and not frappe.has_permission("Employee", "read", employee): + return None + + if not for_date: + for_date = nowdate() + + for_date = getdate(for_date) + + if not frappe.has_permission("Shift Assignment", "read"): + return None + + shifts = frappe.get_all( + "Shift Assignment", + filters={ + "employee": employee, + "docstatus": 1, + "status": "Active", + "start_date": ("<=", for_date), + }, + fields=["shift_type", "start_date"], + order_by="start_date desc", + limit=1, + ) + + if shifts: + return shifts[0].shift_type + + default_shift = frappe.db.get_value("Employee", employee, "default_shift") + if default_shift: + return default_shift + + return None diff --git a/hrms/hr/doctype/attendance_request/attendance_request.js b/hrms/hr/doctype/attendance_request/attendance_request.js index be67112f9d..4336c5c82f 100644 --- a/hrms/hr/doctype/attendance_request/attendance_request.js +++ b/hrms/hr/doctype/attendance_request/attendance_request.js @@ -23,4 +23,34 @@ frappe.ui.form.on("Attendance Request", { }); } }, + + employee(frm) { + if (frm.doc.employee && frm.doc.from_date && !frm.doc.shift) { + frm.trigger("set_employee_shift"); + } + }, + + from_date(frm) { + if (frm.doc.employee && frm.doc.from_date && !frm.doc.shift) { + frm.trigger("set_employee_shift"); + } + }, + + set_employee_shift(frm) { + if (!frm.doc.employee || !frm.doc.from_date) return; + + frappe.call({ + method: "hrms.hr.doctype.attendance.attendance.get_employee_shift", + args: { + employee: frm.doc.employee, + for_date: frm.doc.from_date, + consider_default_shift: true, + }, + callback(r) { + if (r.message && !frm.doc.shift) { + frm.set_value("shift", r.message); + } + }, + }); + }, });