Version 9.1.183 (22 September 2025)
Master Data
Save Add New to keep some data populated (#133283)
Problem
- When Save Add New master data, remember the previously selected values for the sliders and dropdowns - not any other field.
Solution
- When the form is reset after Save Add New is clicked, exclude the sliders and dropdowns from having their values reset.
Data Warehouse
Labour Relations (#136545)
Problem
- The DWH returned data for accDisciplinaryActions, although it had been marked as deleted
Solution
- The source script for accDisciplinaryActions has been adjusted to only return entries that have not been marked as deleted
Training requirements matrix (#136063)
Issue 1:
Problem
- The query did not return all the users due to an incorrect join within Countries
Solution
- Corrected the join to join with the employee countryId instead of the location
Issue 2:
Problem
- The Query for EmployeeTrainingRequirementsMatrix does not return all the data as expected
Solution
- Adjusted query to fetch the required EmployeeTrainingRequirementsMatrix data
Term 3 report cards (#136081)
Problem
- New subjects are required for the Promotion Status calculations
Solution
- Added the new subjects and required translations
Request for Document Upload Report (#135925)
Problem
- Data for UserFiles does not exist within the Data Warehouse
Solution
- Added DataSource UserFiles within the V9 Datawarehouse package
Event Scheduling
Current Date format not as per the language set in the user's Preferred Language (#136191)
Problem
- The incorrect date format is displayed (not according to the user's language preference) on the update expiry modal.
Solution
- Ensure that the date is formatted according to the language preference of the user on the modal.
Implement Y-Axis (#136528)
Problem
- When filtering on dates where there is no Event, the Graph filter displays a solid line
Solution
- Implement a manual Y-axis for the range selector component (not supported natively)
Filter criteria styling issues (#136525)
Problem
- The field increases/decreases when long/short Event names are selected.
Solution
- Make sure that the filter is a fixed length. Also added a better clear button for the custom select2 component.
Add search functionality on the list page (#134969)
Problem
- Load more appears when filtering events, and there are no more records to load.
Solution
- Ensure that the Load More does not display when a course filter is selected. Along with this, I also fixed an issue with the date ranges on the list view and an infinite load bug which sometimes occurred on the attendance history modal.
Use a different date picker when updating the Attendance History (#134967)
- Add search functionality along with a Course filter select (drop-down). Along with this, I added functionality which sets the correct locale for dayjs, so that formatting works properly for different languages (on REACT and WebMVC).
Auto Doc
Termination Date placeholder not shown in the user's preferred language (#136400)
Problem
- Auto doc string dates are parsed using basic DateTime.TryParse
Solution
- Rather, use CustomDateTimeConverter to improve the success rate.
Termination Date placeholder not shown in the user's preferred language (#136400)
Problem
- Auto doc date placeholders were not properly formatted according to the timezone and preferred language of the user.
Solution
- Ensure that they are formatted according to the timezone and preferred language of the user. Also, if a date has a value equal to the max date, ie 9999, assume that the field does not have a value (especially in the case of termination dates)
Image uploaded when signing is shown overlapping placehold fields (#135952)
Problem
- Redaction was used to clear the signature placeholder before drawing the signature image. This sometimes caused a blank box to display above the signature image.
Solution
- First, draw a transparent rectangle over the placeholder in order to hide it, instead of the redaction.
Additional Placeholders on Auto-Doc (#135690)
Problem
- Not all the required placeholders are available
Solution
- The most significant changes include correcting the spelling of a placeholder description across multiple files and adding additional user details to the document user details query.
- Placeholder description typo fix:
- Corrected the spelling of the placeholder description from `"jobProfiler:labels.personTeminationDate"` to `"jobProfiler:labels.personTerminationDate"` across all relevant migration files and seed data to ensure consistency and prevent future confusion.
- Enhancements to document user details:
- Added new fields to the `GetDocumentUserDetailsAsync` query in `UserQueries.cs` to include `EmployeeCode`, `MobileNumber`, `Email`, `IdNumber`, and `PassportNumber` in the returned user details, providing a more comprehensive data set for document user previews.
- Documentation improvements:
- Added a summary comment to the `CreateSeedData` method in `DocumentBuilderPlaceholders.cs` to clarify its purpose and indicate where new placeholders should be added in related services.
- Placeholder description typo fix:
Learning Management
Add a Warning dialogue when saving (#136438)
Problem
- Within Online Marking, when making changes to the document and the " Save " button is clicked, the document is saved directly, which could lead to missed clicks or cases where the user did not intend to save immediately
Solution
- Implement a confirmation modal to request confirmation from the user if they are sure that they want to proceed and save, as the changes can not be reverted
View full-screen video not scaling (#130573)
Problem
- Fullscreen api call to the browser is not allowed on the LMS portal.
Solution
- Set the permissions of the LMS portal to show the video in full screen
Pathways: Subject Setup: Saving Error (#136283)
Problem
- Unable to save the intervention of a subject cycle. Gives error "The weight cannot exceed 100%"
Solution
- Caused by including deleted interventions in the calculation of the total weight per cycle. Filter out deleted records for the cycle and move the removal of interventions before validation
People Management
Move text to the side of the filters (#135481)
Problem
- The help text displayed when searching for people was not displayed correctly.
Solution
- Fixed the positioning of the people search help text. (Was working when no user was returned.) Removed unused CSS class.
- Changed styling and moved help text to its own component to ensure maintainability.
Save & Go to Profile - We're Sorry Error (#135781)
Problem
- A new change was implemented to have a retry count to look if the signed in users are within the people group after a user have been created, appointed or terminated. Once one of these actions is executed, it clears the cache and resets the people groups, as these groups materialise again, larger people groups take longer, which does not complete before the data needs to be fetched and displayed.
Solution
- Remove the retry count as large rulesets does not complete within the time frame, instead of relying on a retry count, do a bypass validation rule and add to the TempData attribute of MVC which only persists data between one method to another method and then drops the data, so this allows to pass that value to the Edit method which now first check if validation rule must be bypassed else fallback to normal process.
People Groups
Summary shows no entries (#136424)
Problem
- The summary tab does not load any entries when the page is loaded if the summary is selected by default, it only loads when the summary vertical pill is clicked on.
Solution
- Load the people group user summary table on page load if it's the active tab.
HR Processes
Error shown when Process is set to use Fallback, which has not been set up on Global Workflow Fallback Configuration (#136216)
Problem
- An error is shown when Process is set to use Fallback, which has not been set up on the Global Workflow Fallback Configuration.
Solution
- Only allow the user to set a specific fallback type if a configuration exists for it on the ruleset (global or org node).
Ruleset Management
New tag only shown for one of the two newly created rulesets (#136328)
Problem
- Newly created rulesets are missing the "new" tag, which is caused by the ruleset lifetime duration being incorrectly calculated using the CreatedDate in local time and UTC.
Solution
- Ensure that the CreatedDate is converted to UTC before calculating the ruleset's lifetime duration, so the "new" tag is assigned correctly.
Can't turn off certain sections (#135322)
Problem
- On Ruleset 1 (Main) - Edit functionality for sections 1- 3 must be allowed, as well as creating the section if there does not exist any for the newly added page. The user can not see when a new user guide has been created or when Ruleset 1 has been updated.
Solution
- Implement change to fallback to ruleset 1 user guide section 2 and 3 if there does not exist any, also add a check to show the newly added section 2 and 3 for ruleset 1 user, and when being edited, show to the admin on edit section 2 and 3 but witha read-only state
Can't delete external link (#133097)
Problem
- An error occurs when attempting to delete an external link (menu item) that has one or more themes linked to it.
Solution
- First, delete the associated theme menu items that belong to the menu item & save those changes, before deleting the menu item.
Imports
Bulk Imports Failing on 10K, 20K & 50K Users to Import (#132261)
Problem
- Cannot stage more than 9K users at a time. When staging 50K users, the staging query times out
Solution
- This pull request introduces several improvements and modernisations to the codebase, focusing on C# collection initialisation, performance optimisations, and database query handling.
- The changes enhance code readability, leverage newer C# features, and improve the robustness and efficiency of duplicate user checks during import operations.
- C# Modernisation and Code Simplification:
- Replaced traditional collection initialisations with C# 12 collection expressions and target-typed new expressions for arrays and lists in `UserDetails.cs`, making the code more concise and readable.
- Updated empty array and list returns to use the new shorthand `[]` syntax instead of `new()`, improving clarity and reducing verbosity.
- Database Query and Performance Enhancements:
- Added a preliminary SQL check for the presence of staged user data before running duplicate checks in `ImportQueries.cs`, allowing the method to return early and avoid unnecessary processing when there are no records.
- Increased the SQL command timeout to 120 seconds for potentially long-running queries, reducing the risk of timeouts during large imports.
- Utilised collection expressions (`[.. duplicateIds]`) for returning query results, further streamlining the code.
Missing Employee (#135967)
Problem
- When importing a job or position that fails in the import, the exception fails to log the error and always logs the catch failure
- An error occurred trying to import Positions: Collection was modified; enumeration operation may not execute.
- Whenever updating data on any entity, a DB transaction is performed when nothing else but the edited user/date is changed
- When importing many records, the import starts processing before all data has been staged. The staging of import data is not performant
Solution
- The most significant changes include enhancements to bulk insert/update logic for job profiles and positions, improved concurrency in user validation, more robust handling of import statuses, and optimisations in entity tracking and auditing.
- Bulk Operations and Error Handling:
- Implemented bulk insert/update for job profiles and positions, with detailed error handling and logging to ensure that failures in bulk operations are captured and reported in the response.
- Import Status and Entity Tracking:
- Added a new `StagingData` status to the `StatusType` enum and allowed the import process to start in this state, then transition to `Staged` after bulk operations complete.
- Performance and Concurrency Improvements:
- Switched from `List` to `ConcurrentBag` for collecting validation results in `UserDetailsValidationService`, removing the need for explicit locks and improving performance in parallel scenarios.
- Query and Data Handling Optimisations:
- Updated SQL queries to use `WITH(NOLOCK)` for improved read performance during imports.
- Auditing and Integration Events:
- Refined auditing logic to ensure only entities requiring audit are processed, and streamlined the integration event publishing flow.
- These changes collectively improve the reliability, scalability, and maintainability of the import and validation processes.
- Bulk Operations and Error Handling
- Added bulk insert/update logic for job profiles and positions, including error handling and logging, to ensure that failed bulk operations are reported in the response.
- Import status and entity tracking
- Introduced `StagingData` status to `StatusType` and allowed imports to start in this state, transitioning to `Staged` after staging completes.
- Performance and concurrency
- Switched to `ConcurrentBag` for collecting validation results in `UserDetailsValidationService`, eliminating explicit locks and improving concurrency.
- Query and data handling
- Updated SQL queries to use `WITH(NOLOCK)` for better read performance during
- Auditing and integration events
- Bulk Operations and Error Handling:
Admins don't have access to the required Integrations screens (#131940)
Problem
- Performance Management admins couldn't perform imports on the Admin Integrations page - Learning Management admins don't have permissions to the admin gear, and so can't perform imports
Solution
- Grant PM admins access to these imports:
- Performance overall scores to career and succession, Survey imports and Evaluation period master data
- Grant LM admins access to these imports:
- Cost Description, 2 Training intervention imports, Pathway Group Note:
- Some of the items in the admin group don't have gates, so a person with the link can access them and perform admin tasks.
- Cost Description, 2 Training intervention imports, Pathway Group Note:
Wrong link when exporting errors (#135078)
Problem
- When exporting errors or transactions from the imports page and clicking on the link in the success snack message, it is supposed to navigate to the exports tab, but it navigates to the import tab instead.
Solution
- Added the correct navigation URL to the link.
- Made some code format fixes.
Missing Employee (#135967)
Problem
- Custom fields are not included in the validation report.
- Occupation level ID returned as the current value in the validation report.
- When one item fails in a bulk insert, update all items fail.
- Duplicate appointments are sent for bulk processing based on unique fields.
- Addresses that have not changed always get updated.
- When the email address, name or surname is null and custom steps are configured on the account, then the import fails.
- Concurrent errors occur in identity processing.
- When importing, the people groups are not refreshed
Solution
- The main enhancements include robust batch processing for bulk database operations, expanded support for user custom fields, and improved address update logic.
- Additionally, a database migration makes certain user import fields nullable for greater flexibility.
- Bulk processing and error handling improvements:
- * Refactored `BulkInsertUpdateAsync` in `SqlServerDbContext` to process entities in batches, catch and log errors per batch and per item, and handle concurrency exceptions with retries. Errors are collected and reported at the end of the operation.
- * Enhanced audit publishing logic to exclude entities that failed during bulk processing, ensuring only successfully processed entities are audited.
- User custom fields support:
- Added logic to import and persist up to 20 custom user fields during user import, and updated the data model and query layer to expose these fields.
- Address update logic: Improved address upsert logic to update existing addresses only when their properties differ from the imported data, reducing unnecessary database updates.
- Database migration:
- Added a migration to make `Surname`, `Name`, and `EmailAddress` fields nullable in the `UserImportData` table, and updated the model snapshot accordingly.
- Audit and concurrency handling:
- Improved concurrency conflict resolution in bulk operations by reloading and retrying updates, logging failures, and skipping problematic entities.
- People Group Refresh:
- When importing users, the people groups should automatically refresh
Identity and Authorisation
Not generating a new OTP for Login after the existing OTP has been used (#135555)
Problem
- Using an OTP does not automatically invalidate it, as it is a time-based OTP. This results in the same OTP being sent after the existing one has been used if it's been used within the time expiry.
Solution
- Update the security stamp to invalidate the used and previously issued OTPs upon successful OTP Login verification. Also updated the OTP message to match the actual time-step window.
Notifications
The HR Request Fallback Approver template has not been propagated to other rulesets (#136395)
Problem
- HrRequestFallback event was not propagatable
Solution
- Ensure the HrRequestFallback event is propagatable
Formatting issues on the "unread messages" email (#136368)
Problem
- The wrong URL is being taken when generating the email template, as well as the translation not being used within the service
Solution
- Correct URL change, and only do ToString for enum to show the name of the enum for now, as there is currently development to be able to retrieve the translations
Job Management
Job profile loads infinitely when there are 62304 positions linked to the profile (#134819)
Problem
- Positions table was extremely slow with a lot of positions - this was due to the data being processed on the front-end, not a slow query.
Solution
- Change the datatable to render server-side. Other changes: Allow back-end filtering on positions, including on the appointed user and position title and code. Add a custom class for JQueryDataTable params, so that it is not necessary to process the object each time in the controller action.
Location in Org displays character Entity when org name contains apostrophe (#132003)
Problem
- A new tag helper have been created that will do server side sanitizing and encoding, but when a value gets selected or entered or changed cases exist where values are being incorrectly displayed and rendered on the client side.
Solution
- Extend the tag helper to add a class to the control if it is used. On the client side, whenever a new value is set, it will trigger an event to first validate and encode the values, setting the correct, sanitised, and encoded text.
Performance Management
Check-in phase is open, although the PM year is locked (#136475)
Problem
- When a review year setup has been locked, a manager can still navigate to the Overall section on contracts and navigate within the check-ins and proceed with interactions.
Solution
- Add a check to not allow the check-ins to be clicked should the review year be locked, and show the tooltip, which is shown when trying to start an agreement
Performance Review - new members (#136426)
Problem
- When Dual Participation is OFF and the manager has not yet created a contract for the employee, the employee dashboard displays the lock icon with the "Phase not started" message; it should show the Disabled View similar as to when the manager did create a contract.
Solution
- Fix the condition check on whether the phase is active for the Dual Participation Off - No Contract case.
Search not working correctly when adding People Groups to linked Setup (#134227)
Problem
- In the search control, when a user types in a value, it erases the text to a point where the field is empty, the results do not clear and reset.
Solution
- Add an event that, when the input is empty, just triggers the clear button
Typing mistake for Copy from Another (#136420)
Problem
- There was a small typo on the "Copy from another" translation in performance management.
Solution
- Fixed grammatical error.
Search not working correctly when adding People Groups to linked Setup (#134227)
Problem
- In the search control, when a user types in a value, it erases the text to a point where the field is empty, but the results do not clear and reset.
Solution
- Add an event that, when the input is empty, just triggers the clear button
Improve error when copying from an incompatible Review Setup (#135623)
Problem
- When a user contract is copied and an exception occurs, a general message is displayed
Solution
- Add new translations for exception messages, as well as throw the correct message and display to the user the message that occurs.
General Comments does not have a tab on the left-hand side (#133732)
Problem
- General comments are not being displayed in the left nav menu.
Solution
- Implement a change to show the general comment with the correct ref, as well as increase the offset a bit so that it gets triggered when you scroll
Translations
No translation for the message that shows in a table when no data is available (#134020)
Problem
- JQuery DataTable internal tokens were not translated.
Solution
- Translate the jQuery DataTable tokens globally.
Product Setup
Product Setup on V9 to open the v8 menu item (#135685)
V9:
Solution
- Implement a change to allow on Product Setup if the Learning Store is open to post a message to V8 to open the admin modal, add a fallback that if the modal fails to open, the user gets redirected to the product setup, which was the previous flow.
V8:
Solution
- Implement a new change to allow the admin modal to be opened through a message being posted from the iframe within V9, add a security check to determine which domains the message is allowed from, and push back a success to V9 so that it does not default to the old way within V9.
SigniChat
Multi-line messages displayed with the "<br/>" tag (#135973)
Problem
- A new tag helper has been created, which sanitises the text to create the correct implementations for display text, but in a specific case where the last message contained new lines on the chat modal, the line breaks are displayed, which show text being overlapped on top of and below people's messages
Solution
- Extend the tag helper functionality to indicate that it should remove break lines, which will remove all the break lines and replace them with just a space to accommodate this use case
The button to add new chats is still shown when discussions are disabled (#136147)
Problem
- The height of the communication portal is designed to reduce white space if there are no messages to display, but still a lot of white space
Solution
- Decrease the height even more to remove all the white space