From c0e48ea871f4031eacc48b01e022351e815b2214 Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Fri, 24 Apr 2026 10:01:13 +0530 Subject: [PATCH 1/2] feat(attendance): auto-populate employee shift --- hrms/hr/doctype/attendance/attendance.js | 30 ++++++++++++++++ hrms/hr/doctype/attendance/attendance.py | 35 +++++++++++++++++++ .../attendance_request/attendance_request.js | 30 ++++++++++++++++ 3 files changed, 95 insertions(+) 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..a1611dc693 100644 --- a/hrms/hr/doctype/attendance/attendance.py +++ b/hrms/hr/doctype/attendance/attendance.py @@ -468,3 +468,38 @@ 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 + + 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); + } + }, + }); + }, }); From b1f9f305922fd22ed3896dfa91e116f1ac7f6979 Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Mon, 27 Apr 2026 14:19:31 +0530 Subject: [PATCH 2/2] feat(attendance): add default shift retrieval for employees --- hrms/hr/doctype/attendance/attendance.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hrms/hr/doctype/attendance/attendance.py b/hrms/hr/doctype/attendance/attendance.py index a1611dc693..8b198e6b81 100644 --- a/hrms/hr/doctype/attendance/attendance.py +++ b/hrms/hr/doctype/attendance/attendance.py @@ -502,4 +502,8 @@ def get_employee_shift(employee: str, for_date: str | date | None = None) -> str 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