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