From 7e8a830f42de7409b4d20fcf96f9b3166876e3c6 Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Wed, 25 Feb 2026 13:21:06 +0530 Subject: [PATCH 1/5] feat(employee): Add birthdays and work anniversaries indicator in form --- erpnext/setup/doctype/employee/employee.js | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index 21d67d70e78..4669a9d5b74 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -45,6 +45,63 @@ frappe.ui.form.on("Employee", { refresh: function (frm) { frm.fields_dict.date_of_birth.datepicker.update({ maxDate: new Date() }); + + frm.trigger("add_anniversary_indicator"); + }, + + date_of_birth: function (frm) { + frm.trigger("add_anniversary_indicator"); + }, + + date_of_joining: function (frm) { + frm.trigger("add_anniversary_indicator"); + }, + + add_anniversary_indicator: function (frm) { + if (!frm.sidebar || !frm.sidebar.sidebar) return; + + let $sidebar = frm.sidebar.sidebar; + let $indicator_section = $sidebar.find(".anniversary-indicator-section"); + + if (!$indicator_section.length) { + $indicator_section = $(` + + `).insertAfter($sidebar.find(".sidebar-meta-details")); + } + + let content = ""; + let today = moment().startOf("day"); + + if (frm.doc.date_of_birth) { + let dob = moment(frm.doc.date_of_birth); + if (dob.date() === today.date() && dob.month() === today.month()) { + content += `
${__( + "Today is their Birthday!" + )}
`; + } + } + + if (frm.doc.date_of_joining) { + let doj = moment(frm.doc.date_of_joining); + if (doj.date() === today.date() && doj.month() === today.month()) { + let years = today.year() - doj.year(); + if (years > 0) { + content += `
${__( + "Today is their {0} Year Work Anniversary!", + [years] + )}
`; + } + } + } + + if (content) { + $indicator_section.find(".anniversary-content").html(content); + $indicator_section.show(); + } else { + $indicator_section.hide(); + } }, prefered_contact_email: function (frm) { From be819eb876914638ffc0e08601534229f0a7544b Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Mon, 9 Mar 2026 16:06:55 +0530 Subject: [PATCH 2/5] fix(employee): correct work anniversary message pluralization --- erpnext/setup/doctype/employee/employee.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index 4669a9d5b74..55dedea167b 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -89,8 +89,8 @@ frappe.ui.form.on("Employee", { let years = today.year() - doj.year(); if (years > 0) { content += `
${__( - "Today is their {0} Year Work Anniversary!", - [years] + "Today is their {0} Work Anniversary!", + [years === 1 ? __("{0} Year", [years]) : __("{0} Years", [years])] )}
`; } } From e4a0d2ab0b155bc655821da4fde41ca1e6d579ae Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Wed, 11 Mar 2026 17:48:12 +0530 Subject: [PATCH 3/5] feat(employee): Enhance milestone indicators for birthdays and work anniversaries --- erpnext/setup/doctype/employee/employee.js | 100 ++++++++++++++------- 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index 55dedea167b..bb69adc8827 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -57,44 +57,76 @@ frappe.ui.form.on("Employee", { frm.trigger("add_anniversary_indicator"); }, + is_employee_birthday: function (frm) { + if (!frm.doc.date_of_birth) return false; + let today = moment().startOf("day"); + let dob = moment(frm.doc.date_of_birth); + return dob.date() === today.date() && dob.month() === today.month(); + }, + + is_work_anniversary: function (frm) { + if (!frm.doc.date_of_joining) return false; + let today = moment().startOf("day"); + let doj = moment(frm.doc.date_of_joining); + let years = today.year() - doj.year(); + return doj.date() === today.date() && doj.month() === today.month() && years > 0; + }, + + get_work_anniversary_years: function (frm) { + let today = moment().startOf("day"); + let doj = moment(frm.doc.date_of_joining); + return today.year() - doj.year(); + }, + + create_milestone_section: function ($sidebar) { + let $indicator_section = $sidebar.find(".anniversary-indicator-section"); + if (!$indicator_section.length) { + $indicator_section = $(` + + `).insertAfter($sidebar.find(".sidebar-meta-details")); + } + return $indicator_section; + }, + + build_anniversary_content: function (frm) { + let items = []; + if (frm.events.is_employee_birthday(frm)) { + items.push(` +
+ + ${frappe.utils.icon("cake", "sm")} + ${__("Birthday")} + +
`); + } + if (frm.events.is_work_anniversary(frm)) { + let years = frm.events.get_work_anniversary_years(frm); + let label = + years === 1 + ? __("{0} Year Work Anniversary", [years]) + : __("{0} Years Work Anniversary", [years]); + items.push(` +
+ + ${frappe.utils.icon("briefcase", "sm")} + ${label} + +
`); + } + return items.join(""); + }, + add_anniversary_indicator: function (frm) { if (!frm.sidebar || !frm.sidebar.sidebar) return; let $sidebar = frm.sidebar.sidebar; - let $indicator_section = $sidebar.find(".anniversary-indicator-section"); - - if (!$indicator_section.length) { - $indicator_section = $(` - - `).insertAfter($sidebar.find(".sidebar-meta-details")); - } - - let content = ""; - let today = moment().startOf("day"); - - if (frm.doc.date_of_birth) { - let dob = moment(frm.doc.date_of_birth); - if (dob.date() === today.date() && dob.month() === today.month()) { - content += `
${__( - "Today is their Birthday!" - )}
`; - } - } - - if (frm.doc.date_of_joining) { - let doj = moment(frm.doc.date_of_joining); - if (doj.date() === today.date() && doj.month() === today.month()) { - let years = today.year() - doj.year(); - if (years > 0) { - content += `
${__( - "Today is their {0} Work Anniversary!", - [years === 1 ? __("{0} Year", [years]) : __("{0} Years", [years])] - )}
`; - } - } - } + let $indicator_section = frm.events.create_milestone_section($sidebar); + let content = frm.events.build_anniversary_content(frm); if (content) { $indicator_section.find(".anniversary-content").html(content); From 831b1d3a79ee0b105779badced445c7a96b92298 Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Thu, 12 Mar 2026 14:19:15 +0530 Subject: [PATCH 4/5] feat(employee): Refactor milestone indicator functions to accept 'today' parameter --- erpnext/setup/doctype/employee/employee.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index bb69adc8827..ee1c1cf15c0 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -57,23 +57,20 @@ frappe.ui.form.on("Employee", { frm.trigger("add_anniversary_indicator"); }, - is_employee_birthday: function (frm) { + is_employee_birthday: function (frm, today) { if (!frm.doc.date_of_birth) return false; - let today = moment().startOf("day"); let dob = moment(frm.doc.date_of_birth); return dob.date() === today.date() && dob.month() === today.month(); }, - is_work_anniversary: function (frm) { + is_work_anniversary: function (frm, today) { if (!frm.doc.date_of_joining) return false; - let today = moment().startOf("day"); let doj = moment(frm.doc.date_of_joining); let years = today.year() - doj.year(); return doj.date() === today.date() && doj.month() === today.month() && years > 0; }, - get_work_anniversary_years: function (frm) { - let today = moment().startOf("day"); + get_work_anniversary_years: function (frm, today) { let doj = moment(frm.doc.date_of_joining); return today.year() - doj.year(); }, @@ -94,8 +91,9 @@ frappe.ui.form.on("Employee", { }, build_anniversary_content: function (frm) { + let today = moment(); let items = []; - if (frm.events.is_employee_birthday(frm)) { + if (frm.events.is_employee_birthday(frm, today)) { items.push(`
@@ -104,8 +102,8 @@ frappe.ui.form.on("Employee", {
`); } - if (frm.events.is_work_anniversary(frm)) { - let years = frm.events.get_work_anniversary_years(frm); + if (frm.events.is_work_anniversary(frm, today)) { + let years = frm.events.get_work_anniversary_years(frm, today); let label = years === 1 ? __("{0} Year Work Anniversary", [years]) @@ -122,7 +120,7 @@ frappe.ui.form.on("Employee", { }, add_anniversary_indicator: function (frm) { - if (!frm.sidebar || !frm.sidebar.sidebar) return; + if (!frm.sidebar?.sidebar) return; let $sidebar = frm.sidebar.sidebar; let $indicator_section = frm.events.create_milestone_section($sidebar); From 3e56b8d71dd0c7aebf00ee965d68f8748b2e1a4d Mon Sep 17 00:00:00 2001 From: Krishna Shirsath Date: Mon, 23 Mar 2026 14:47:54 +0530 Subject: [PATCH 5/5] fix(employee): removed milestone lable and remove unnecessary margins --- erpnext/setup/doctype/employee/employee.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/erpnext/setup/doctype/employee/employee.js b/erpnext/setup/doctype/employee/employee.js index ee1c1cf15c0..d4ca8974e67 100755 --- a/erpnext/setup/doctype/employee/employee.js +++ b/erpnext/setup/doctype/employee/employee.js @@ -79,11 +79,8 @@ frappe.ui.form.on("Employee", { let $indicator_section = $sidebar.find(".anniversary-indicator-section"); if (!$indicator_section.length) { $indicator_section = $(` -