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.