Version 9.1.248 (17 August 2026)
Notifications
Update materialised birthday column to Alias 'Birthday', else query can't find the column (#153450)
Problem
- Manager Birthdays and Work Anniversaries email template not firing on scheduled jobs
Solution
- Update the materialised birthday column to Alias 'Birthday', else query can't find the column
Implement end-of-service warning notifications for month and day period warnings (#138602)
Problem
- The Line Manager is not warned on user is ending their service soon
Solution
- Introduced new functionality to support manager notifications about subordinates' upcoming end of service, both for short-term (days) and longer-term (months) periods.
- It adds new event and recipient codes, extends the data model and queries, and updates the notification service to deliver these new types of notifications.
- Additionally, it introduces a bi-weekly schedule type and improves code structure by refactoring repeated logic.
Performance Management
Fixing mdb script reference (#153492)
Problem
- Models do not open because the MDB script reference is incorrect.
Solution
- Fixed the MDB script reference. Modals open as expected again.
Resolved issue where Overall Final Score label mappings were not showing (#153405)
Problem
- Score label mappings for Overall Final Score were not showing
Solution
- Fixed condition check that determines whether to display for overall final score
Job Management
Insert missing UserCompanyDates records during user import (#146950)
Problem
- `ImportUserDatesAsync` (used by the JobProfiler user import) only ever `UPDATE`d existing `JobProfiler.UserCompanyDates` rows. Since the materialisation rework, `UserCompanyDates` is no longer created as part of the User aggregate, so newly imported users never got a `UserCompanyDates` row created for them — their start dates were silently dropped.
Solution
- Added an `INSERT INTO JobProfiler.UserCompanyDates` step (before the existing `UPDATE`) that creates a row for any imported user matched by username who doesn't already have one for that ruleset, using the same create-vs-update semantics as `UserDomainService.UpdateUserCompanyDatesIfRequiredAsync`.
- Replaced the row-by-row string-concatenated `INSERT` loop used to populate the `#UserDates` temp table with a `SqlBulkCopy`, matching the pattern already used elsewhere in `UserQueries.cs` (e.g. `ListUserOrgPathsAsync`). This also removes the manual string escaping that was needed for the old concatenation approach.
Communication Portal
Resolved archived items not shown when collapsed (#151781)
Problem
- Archived items can not be seen when the system alert has elapsed
Solution
- Add a change to the query that, when searching archived, ignores the dates of the system alert to be shown
Resolved flatpickr that caused errors on communication portal banners (#153083)
Problem
- flatpickr injects a hidden type="number" minute input with step="5". If the banner datetime has a minute like 17, browser validation marks that hidden control invalid and blocks submission before the AJAX save handler runs.
Solution
- Set minuteIncrement: 1, so all valid minute values 0-59 pass native validation
Data Warehouse
Added ID fields within lmEvent tables (#151434)
Problem
- Field EventStatusID needs to be added within lmEventSchedules
- Field AttendanceStateID needs to be added within lmEventScheduleSessions
- Field BookingStatusID needs to be added within lmEventScheduleAttendees
Solution
- Added the field EventStatusID within lmEventSchedules
- Added field AttendanceStateID within lmEventScheduleSessions
- Added field BookingStatusID within lmEventScheduleAttendees
Updated Insert step for lmEventScheduleSessions_Staging_V9 (#153307)
Problem
- Duplicate results are returned
- The #Source is not needed in Insert lmEventScheduleSessions_Staging_V9
Solution
- Added DISTINCT and removed #Source within Insert lmEventScheduleSessions_Staging_V9