Version 9.1.233 (15 June 2026) Communication Portal Resolved Styling mismatches and business rule logic (#150829) Problem When discussions are disabled, no banners are displayed, which is incorrect Styling mismatches when selecting a button, it selects all text to replace when correct typing, but once a space is pressed, it reselects the text  Misalignment No uppercase on wording from mocup   Solution Added logic correction for banners and class to not overwrite the height of the modal, but to still display banner  Corrected styling Adjustments to alignment and overlays   [Communications Porta][End User][Read Button] Implement Read All button (#149151) Problem There is no Read All button   Solution Added new functionality to mark all messages as read   Move to the top of the "No Banner Found" message and fix Translation (#149633) Problem When there are no items, the ganttControl still occupies space and exists, pushing down the no-banner display   Solution Implement destroy to remove space to ensure that no banner displays are inline.   Content Management Add ffmpeg by default to contentmanagementapi during build (#143882) Problem ffmpeg is not installed on contentmanagementai   Solution Add ffmpeg by default to contentmanagementapi during build Add other packages also in the same command without cache to reduce the size of the image    Master Data Fixed adding of Eval Periods in Master Data - Recreated (#147863) Problem An error is thrown when adding an Evaluation Period in master data.   Solution After the new date pickers' changes have been made, the fields for the dates were not sent in the front-end request. The changes I made ensure the date fields are also now included.   Job Management Populating Future Dated property on Positions table (#146973) Problem The tooltip displayed on a future-dated position is incorrect when an employee is actively appointed in the position. In this scenario, the tooltip should display: “There is a future-dated appointment linked to this position.” The frontend checks the future-dated flag to determine which tooltip to display, but the controller does not currently populate this value, causing it to default to false.    Solution Updated the controller to correctly populate the future-dated flag for positions with a status containing Future or with a validity period that starts in the future. This ensures the correct tooltip is displayed when hovering over the position.   Resolved people group role duplicate when editing (#150074) Problem When a user edits the people group role modal and saved it creates a duplicate entry to the table for UserPeopleGroupRoles. No unique key index nor checks when adding a new userPeopleGroupRole   Solution Added an IsUnique index on needed columns that makes the entity proceed to add an exists check to return the ID value instead of adding a new one.  Add migration to first delete any duplicate entries before trying to add a unique key index   Adding information text to input elements (#147045) Problem The tooltips and placeholders for the Currency dropdown field and the Min / Max Budget fields are not being displayed as specified.    Solution Added the missing tooltip and placeholder configurations for the Currency, Min Budget, and Max Budget fields to ensure the UI behaves according to the specification.   Add missing index on User Company Dates (#148760) Problem Some queries joined to UserCompanyDates are extremely slow due to a missing index on UserCompanyDates table.    Solution Added index to UserCompanyDates. Already added on production and a significant increase (2+mins to < 5 seconds)   Report Builder Added paging on the left-hand side (#149484) Problem Because columns are built dynamically, it grows, and with default styling on datatables, the paging is added on the right, forcing the user to scroll all the way to the right to page    Solution Add styling to only show paging on the left-hand side for the ReportBuilder view Report   Clear all ruleset user report permissions when a new report is added to ensure users have required access when viewing report (#148874) Problem When a new report is added, users who have access to "All Reports" under that category cannot see the report and are presented with a "permission denied" message. This is because of the report permissions being cached when the user logs in / views reports, and the new report not forming part of the permission list. User needs to log out and back in again to see the report.    Solution When the report is created, ensure that ALL report permissions keys for the current ruleset are bust. Added new cache handler method to fetch cache key based on pattern for better performance (Redis does the filtering immediately) and prevent the need to scan through the entire keyset   People Management Splitting Future Dated into Future Appointed and Future Terminated (#135271) Problem The current Future Dated filter combines employees with future appointment start dates and those with future termination dates into a single list. This makes it difficult to distinguish between the two groups.    Solution Split the Future Dated filter into two separate options: Future Appointed and Future Terminated. Future Appointments will display employees with a future appointment start date. Future Terminated will display employees with a future termination date. Employees with future termination dates will continue to appear in the Active list until their termination date is reached, ensuring consistency with current behaviour.   Resolved People Edit on Contact Details (#149468) Problem When on the Summary tab, when editing a user, when updating user details or in this case contact details, and afterwards navigating to the contact details subtab, the values that were just updated and saved are not displayed due to user details being cached but never reset after being saved on the Summary tab    Solution Bust the cache once the values have been saved within the summary tab   Fixing missing tooltip caused by invisible parent element (#149602) Problem When hovering over the copy icon, no tooltip text is displayed. The expected behaviour is for the tooltip text to appear when hovering over the icon.    Solution Updated the tooltip implementation so that it is initialised on the container element instead of the icon itself. This avoids initialisation issues caused by Bootstrap 5 invisible parent elements and ensures the tooltip displays correctly on hover.   Resolved people group selection not taken into effect after hard refresh (#149700) Problem When a people group value has been selected, the filter value is used, but once a hard refresh occurs, the selected value is still selected, but not used for filter search    Solution Added a sync effect that, when the page reloads, and a value exists, just forces that value to be used   Performance considerations for people management SQL queries (#148495) Problem Some performance considerations were excluded due to the urgency of getting the ticket to master. Re-examine people management queries regarding multiple table scans    Solution Updated people management queries to improve performance by not doing multiple table scans   Performance Management Resolved Bulk delete not returning users (#150666) Problem Known as an alias not set to match the record object, class    Solution Added alias naming for KnownAs to map back to the record object   Resolved Moderation screen not opening up (#150410) Problem Wrong library and joins used to fetch materialised data   Solution Correct the joins to retrieve the correct user information   Performance improvement using materialised appointment table (#148356) Problem When retrieving user contracts, a separate gRPC call is made to get all their information and then only populate the details   Solution Adjustments were made to select from read-only tables to get the relevant user information and, within one call, return the correct data.   System Access Addition of the DNS name and the network speed in the login history (#146693) Problem Additional information regarding the DNS name and speed of a user's network during login is required for effective support.    Solution Enhances the login and two-factor authentication (2FA) flows by capturing and recording the user's browser network download and upload speeds during authentication. These speeds are sent as part of the login/2FA form submissions and are stored with each login attempt for further analysis or troubleshooting. The changes span both the frontend (Razor pages and JavaScript) and backend (model and controller logic). These changes provide improved telemetry for user authentication events, enabling better diagnostics and potentially informing user experience improvements based on network conditions.   Ruleset Management Resolved users being created as inactive on the new Tenant (#149848) Problem System users are created as inactive during new Tenant Ruleset creation.    Solution Correct to set as active once created   Amend RulesetCode validation to allow 3 or more characters (#149929) Problem Cannot save information on existing rulesets that have a ruleset code that is 3 characters, since the current validation requires at least 4 characters.    Solution Amend ruleset code length validation to allow 3-character ruleset codes.   Translations Resolved Afrikaans translation (#149167) Problem Incorrect translation for Afrikaans 'close' and a key spelling mistake on Afrikaans, so now the value found    Solution Corrected translation and key value   Dashboards Resolved user guide upsert (#149620) Problem When submitting the form, the selected language is not always selected in some cases when disabled   Solution Enable just before submission occurs to retrieve the value   Resolved timeline on dashboard (#149775) Problem Dashboard column name does not match the record object   Solution Corrected column name   Notifications Filter users by role to only include active appointments (#149619) Problem Role-based notifications are sent to inactive users   Solution Limit role selection in the query used for the recipients to only active people   LearningManagement NotificationsServiceV1 Fails on EvaluationNotification — EventScheduleId Is Null (#148478) Problem Errors on the Learning Management api notification service indicate that EventScheduleId was not provided, the request data indicates that only RulesetId was provided in data and not the other required properties for LM notifications. Found that the EvaluationNotification template was getting triggered due to being on a daily schedule, but the schedule process is only supplying the RulesetId, with the expectation that the event would retrieve its own data accordingly. EvaluationNotification, however, is handled differently with a Quartz Job that fetches the relevant information and compiles the notification to be sent.   Solution Remove the EvaluationNotification template schedules and ensure propagation happens correctly. Combined with helm-chart update to ensure ProcessEventScheduleEventsJob runs as per intention   Perform notification processing only on active rulesets (#148633) Problem Notification processing is done on rulesets that are no longer active   Solution Identify queries that perform notification processing and only filter on active rulesets when processing is done   Imports Refine transfer logic and add dedupe unit tests (#149494) Problem When a person is reappointed to a new position after the previous termination, a duplicate new appointment is created.   Solution The change excludes the appointment from the transfer process so it can be handled as a new appointment, since the last position is no longer active, and the new position does not overlap with it. This pull request improves the robustness and correctness of appointment import logic, with a particular focus on handling duplicate appointments and transfers. It also significantly expands unit test coverage for the RemoveDuplicatesForAppointments method, ensuring correct behaviour across a variety of scenarios. These changes collectively strengthen the reliability of appointment imports and ensure that duplicate handling and transfer logic are thoroughly validated.   People Groups People Groups: Make immediate materialisation more robust (#148355) Problem When the job profiler service receives changes that cause immediate changes to a people group, these events are stored in memory and processed as a parallel queue from memory. When a service then restarts, the in-memory queue is lost, and the materialisation events are never processed.   Solution Add a DB-backed queue that will store unprocessed events for materialisation. When a service starts, this table will be used to recreate the in-memory queue. Once the process of an event completes, it must be deleted from the DB queue to ensure it is not reprocessed.    Exports Large ReportBuilder export causes memory spikes (#147972) Problem Exporting large report builder reports creates large memory spikes in MVC, causing the service to crash   Solution This pull request primarily restructures and refactors the location and namespaces of several extension and enum classes related to OpenXML and dictionary mapping, moving them from the WebMVC project to the SignifyExtensions infrastructure project. It also introduces a new dependency and corrects some naming inconsistencies.    The User Import fails with InternalServerError (149532) Problem When an error occurs during import staging, the error report is not downloaded   Solution This pull request introduces support for a unique tab identifier (tabId) during the import/export process. The changes ensure that a unique tabId is generated and passed through the import workflow, from the frontend view, through the controller, and into the service and export logic. Additionally, there is a refactor to the OpenXML service interface and its usage.   Identity and Authorisation Identity ExceptionHandlerMiddleware Masking 2200 Unhandled Exceptions — RulesetId 0 Is Primary Driver (#148476) Problem Numerous errors on identity caused by instances where the ruleset ID is 0 as retrieved from the theme service.   Solution Added error handling to system access setting fetch, added translations to indicate could not fetch settings and correctly logged errors.   Learning Management Pathways: Auto-save on Marksheet First Load (#148178) Marksheet Auto-saves after Learner Record values are imported Marksheet Auto-saves after Learner Record values are imported when there are existing records already Marksheet Auto-saves after Learner Record values that already existed are updated on the Learner Record, Marksheet is updated and saved to reflect this change Marksheet Auto-save is DISABLED for Periods that do not match the current year, i.e., 2025 Marks (Even if Learner Record values are updated) are not auto-saved if accessed in 2026. Manual save is still possible if the Marksheet is not locked.