# Version 9.1.226 (4 May 2026)

#### **Communication Portal**

##### Resolved Master Data deletion relation being slow (#147642)

**Problem**

- SQL cursor performance issue checks every FK relation before attempting to delete the master data item

**Solution**

- SQL improvement to minimise the cursor and a single select to determine any relations

##### Resolved red-dot appears after reading messages (#147066)

**Problem**

- When a message is sent, the end user receives it, and there are local-storage checks to keep track so as not to always hit the database to refresh. But never reset when opening the modal to set the local key, even if the server/database side has been updated to read

**Solution**

- Corrected logic to update values when opening the modal

##### Resolved notification not being sent out (#147971)

**Problem**

- RecipientUserId is needed in the notification service, which the communication portal is not passing through

**Solution**

- Added a change to send through the userId for the recipientUserId

---

#### **API**

##### Ensure font fallbacks work on file conversion (#147982)

**Problem**

- The Docker file is missing some dependencies needed for font fallbacks.

**Solution**

- Add dependencies needed for font fallbacks to the Docker file. Also, improve the code for the fallback to be more robust.

##### Add embedded fonts for sync fusion to use on the Linux server for docx to PDF conversion (#147982)

**Problem**

- Word (docx) files don't display content when converted to PDFs

**Solution**

- Add embedded font types to the Linux server for Sync Fusion to use in conversion. Also, remove previously added debug logs

##### Fix successful logins logged as failed attempts (#147675)

**Problem**

- When logging in successfully multiple times in quick succession, logins are blocked (successful logins marked as unsuccessful attempts)

**Solution**

- Do a check to see if the login was successful, or if the successful login is being routed to the disclaimer required before logging the attempt

---

#### **Imports**

##### Serve PaySpace user export as a stream (#146311)

**Problem**

- Large payspace clients experience the following issue: StatusCode="ResourceExhausted", Detail=" Received message exceeds the maximum configured message size.") Multiple pull requests are also processed using unnecessary resources.

**Solution**

- Change ListUsersExportPerDatePayspaceAnonymous to a server-streaming RPC and update server/client code to stream users in batches.
- The ExportData proto and ExportDataServiceV1 now stream UserExport responses (batched at 1000) and write each batch to the response stream.
- The Import API handler was updated to consume the async server stream from JobProfiler, aggregate users, and adapt logging to per-user transactions.
- Also injected IImportQueries and added a check to prevent concurrent PaySpace pull imports (logs a fatal error and aborts if an active import exists).
- Miscellaneous fixes: improved null-safety and mappings when building UserExport payloads and adjusted log messages.

##### Improve Payspace performance when fetching employee positions and extend logging in Payspace implementation (#146311)

**Problem**

- When pulling a large number of positions from PaySpace, it takes a very long time and fails. Logging is limited to debugging the PaySpace API calls and results

**Solution**

- Introduce several improvements and refactorings to the PaySpace user details import flow, focusing on simplifying data handling, improving logging, and enhancing error/warning reporting.
- The changes include updates to proto files, removal of unnecessary dependencies, streamlining of collection operations, and improved logging for better traceability and maintainability.
- Reduce the fields selected from the position call and implement parallel tasks to speed up processing by 5

---

#### **People Groups**

##### Correct problem with user people group fetch excluding appointments that end on the current day (#147959)

**Problem**

- When a user's appointment ends on the current day, then no people groups are returned on which the user is a part of, resulting in no menu items being displayed.

**Solution**

- Correct the filter condition on the query to consider the end date of the appointment as inclusive.

---

#### **Dashboards**

##### Adding filter info and refreshing image list on upload and delete (#146695)

**Problem**

- Users are not aware that older banners still exist and can be accessed via the search field, as the list is now limited to 21 banners and older items are no longer shown by default.
- When new images are uploaded, they are automatically selected, which can result in more than the maximum of 5 banners being selected.
- In addition, uploads can cause the displayed list to exceed the 21-item limit.
- When images are deleted, the list may drop below 21 items, but older banners are not automatically loaded to fill the available space (where available).

**Solution**

- Added an information section at the bottom of the modal to inform users that older banners can be accessed via the search field.
- Uploads will continue to auto-select new images, but the oldest selected image will now be automatically deselected to enforce the 5-banner limit.
- Uploading and deleting images now trigger a refresh from the database, ensuring the displayed list remains accurate and up to date.

---

#### **Job Management**

##### Update default required fields for requisition HR process level actions (#142989)

**Problem**

- HRPRactitionerId should not be required for the post approval actions

**Solution**

- Remove HRPractionerId as required

---

#### **Data Warehouse**

##### Updated AbsentAttendance for lmTermResults (#147669)

**Problem**

- AbsentWithExcuse needs to be excluded from the absent calculation

**Solution**

- Updated the Attendances calculation step to only select Attendances where they are equal to "Absent"
- Added a step to only fetch attendance records for the current year

##### Adjustments made within lmEmployeeTrainingRequirementsMatrix (#146700)

**Problem**

- The data is not refreshing as expected within the lmEmployeeTrainingRequirementsMatrix when using the date filter

**Solution**

- Adjusted the lmEmployeeTrainingRequirementsMatrix DWH Step to do a full refresh only in the morning, and skipping the staging table step

##### Corrected the Update step for jpAppointments (#144482)

**Problem**

- The Appointments did not update correctly due to how joins were implemented

**Solution**

- Corrected the join to ensure that the existing Appointments are updated correctly

##### Adjustments made within accPAYU tables (#147540)

**Problem**

- RulesetID, RulesetName and SchemaID need to be added and populated within accPAYUSummary
- The accPAYE tables need to be run and populated on the 21st of each month

**Solution**

- Added new fields RulesetID, RulesetName and SchemaID within accPAYUSummary
- Adjusted Container package to execute on the 21st of each month
- Adjusted the Cursor that it runs per DBName and SchemaID
- Added fields DateFrom and DateTo
- Resolved issue where #Totals needs to be done by using #TempOutputWithRowNumber
- Corrected ActivityStart

---

#### **Master Data**

##### Resolve template propagation for prior partial copies (#147828)

**Problem**

- Some email templates are not copied to the newly created ruleset.

**Solution**

- Resolve the problem with partial job runs where templates were not copied, preventing templates from being copied in subsequent job runs.
- Root cause: 
    - newEvents, newRecipients, and newSchedules only contain items added in the current job run. If a prior run was partially completed (e.g. events/recipients were saved, but templates weren't), these lists are empty, and the existing fallback (existingEvent from template navigations) is also empty since there are no existing templates yet.
- Fix — both CopyRecipientsAsync and CopyTemplatesAsync: 
    - Fetch all target-ruleset entities directly from the DB (allTargetEvents, allTargetRecipients, allTargetSchedules) at the start of each method.
    - Merge those with newEvents/newRecipients/newSchedules into allAvailable\* lists, deduplicating by Id to avoid double-entries.
    - Resolve linked entities from allAvailable\* first by PropagatedFromId, then fall back to a code/name match — this handles the partial-run scenario where PropagatedFromId lookup would have been the only path before.

---

#### **Ruleset Management**

##### Remove Google country api (#147832)

**Problem**

- When opening the general table, a call is made to select the current user's country and then set the rulesets

**Solution**

- Remove the Google location API feature; the user must select the country themselves.

##### Default decryption for clientSecret on the payroll model (#147782)

**Problem**

- Connector execution fails due to failing decrypting of ClientSecrets

**Solution**

- Default decryption for clientSecret on the model itself, so it doesn't need to be manually decrypted

##### Correct theme generation due to flatdatepicker styles (#147900)

**Problem**

- The theme selected cannot be generated due to the flatpicker CSS in the site's Sass file.

**Solution**

- Add support for the Flatpickr date picker library by including its CSS in the project. The main changes involve updating resource management and layout files to ensure the Flatpickr styles are available throughout the application.

##### Add the dropdown-toggle class to the dropdown button and hide the caret that is automatically added (#146588)

**Problem**

- The click event on the kebab (Actions) menu icon is no longer firing

**Solution**

- Add the dropdown-toggle class to the dropdown button and hide the caret that it adds automatically

---

#### **Organisational Structure**

##### Fix import creating duplicates (#147839)

**Problem**

- When importing org nodes, blank intermediate org levels are incorrectly replaced with the root node name while building the org path. That produces paths like `Client0001 | Client0001 | Packaged Gases | Sales`, prevents matching the existing node, and can lead to duplicate org nodes being created.

**Solution**

- Only fall back to the root node name for the first org level. Blank intermediate levels are skipped when building the org path, so the generated path matches the existing hierarchy, and the importer can reuse the correct node instead of creating a duplicate.

---

#### **Notifications**

##### As a user receiving a notification, I want the URL to have my Theme URL (#145940)

Ensured that the following notifications take the current theme key from the user acting, which results in the notification:

- Welcome Notification
- Reset Password
- New Person Registered
- Approve Registration Request
- Registration Request has been approved

---

#### **Learning Management**

##### Fix marksheet save and continue navigation (#147137)

**Problem**

- When a user had unsaved marks and chose Save and Continue, the page sometimes tried to reload the current marksheet and move to the next page at the same time. That clash caused the screen to go blank, and the user lost navigation.

**Solution**

- The save process was changed so that, when the user clicks Save and Continue, the system now saves the work and then moves on directly instead of trying to reload the current page first. This prevents the blank screen and keeps navigation working properly.

##### Fix translation for marks save error (#147342)

**Problem**

- When someone tried to save marks, and a duplicate mark already existed, the system showed a confusing technical error message instead of a clear explanation.

**Solution**

- Updated the system so it now shows a proper user-friendly message for that save error, making it clear what went wrong instead of exposing technical text.

---

#### **People Management**

##### Adding optional close on backdrop click to ManagePersonModal (#147824)

**Problem**

- Remove the static backdrop and allow the user to close the modal by simply clicking away from it.

**Solution**

- Adding a boolean to give us the ability to toggle this functionality on and off, since this component is used on multiple different pages. Toggling it on for the People Management page.

##### Ensure user session timeout can be set via configuration (#147837)

**Problem**

- User session timeout is hard-coded to 20 minutes.

**Solution**

- Get session timeout value from configuration/appsettings and also increase the default to 60 minutes

---

#### **Performance Management**

##### Resolved master data searching Perspective (#147640)

**Problem**

- When searching perspective, it results in data, but within the mapping, it fails due to the first check instead of returning a default value.
- Enum value being forced and throws.

**Solution**

- Corrected returning type of tuple null, null

##### Resolved check-in dial phases (#147902)

**Problem**

- On the overall summary check-in dial can not be opened unless ratings have been confirmed, discussion resulted in removing the requirement that ratings should be completed. When a dial is clicked to view the ratings, even if the rating phase is no longer active, it can still be edited

**Solution**

- Removed ratings completed requirement. Added Check-Ins phase active check to pass through that ensures if the edit modal can be opened or not

---

#### **Event Scheduler**

##### Adding a badge to show your booking Reference number (#146254)

**Problem**

- The system should show “Your Booking Reference Number” somewhere when clicking on an upcoming event

**Solution**

- Adding a badge with “Your Booking Reference Number” next to the event heading/title

##### Add more default booking reasons plus seed to other rulesets (#146251)

**Problem**

- Limited booking reasons and master data are not seeded

**Solution**

- Add more default booking reasons, plus seed to other rulesets

---