# Version 9.1.225 (4 May 2026)

#### **People Management**

##### Catching and handling error occurring when terminating inactive person (#146377)

**Problem**

- When attempting to terminate a user without an active appointment, a “We’re Sorry” page is displayed.

**Solution**

- A message is now shown instead, clearly explaining the issue without redirecting to the “We’re Sorry” page

##### Implement a unique field configuration on the ESS settings (#144890)

**Problem**

- Cannot define Username, Id Number, Passport Number, Employee Code, and Email as unique for the ruleset using ESS settings

**Solution**

- Introduce enhanced uniqueness validation for user-related operations, ensuring that users cannot be created or updated with duplicate key identifiers (such as username, employee code, ID number, passport number, or email) within the same ruleset, according to the ESS setup's unique field configuration. The changes span updates to the data model, gRPC contracts, and command handlers to support this feature.

##### Resolved transfer user data validation bug (#147063)

**Problem**

- When the termination date is before the appointment date when transferring a user to another ruleset, the validation happens, but no message is displayed. The validation was appearing, but instantly hiding itself again.

**Solution**

- Just ensured that the validation message is not hidden directly after being displayed.

##### Limit My Department users to only active appointments (#147835)

**Problem**

- Users are duplicated per appointment on the My Department page. The duplicated user is also added as a phantom user when switching tabs on people management, like view/edit people.

**Solution**

- Limit My Department users to only active appointments. Duplicate user IDs break the key attribute on React components, causing it not to clear the list properly when switching tabs

---

#### **Data Warehouse**

##### Updated manual step for lmTermResults (#147814)

**Problem**

- Currently, the DWH will remove any entries within TermResults if the Average is equal to 0

**Solution**

- Updated manual step for TermResults by removing the delete step where the average is equal to 0

##### Added step to update existing fields within Data Dictionary (#142732)

**Problem**

- Fields Selectable and Searchable are not available to select within ReportBuilder for Job Positions

**Solution**

- Update fields to be Selectable and Searchable for JobPositions within ReportBuilder

##### Added step to remove duplicate entries within pdmContractPeriodActionPlans (#142737)

**Problem**

- The DWH table pdmContractPeriodActionPlans does contain duplicate entries based on how the source query is structured

**Solution**

- Added a step to remove duplicate entries within pdmContractPeriodActionPlans if the fields ContractPeriodActionPlanID, ContractID and ContractPeriodID are the same

---

#### **Job Profiler**

##### Future and past subordinates being returned (#146082)

**Problem**

- Subordinates are being returned for ListManagerSubordinatesAsync who are not active employees.

**Solution**

- They still had the CurrentPosition = 1 flag. Added the EndDate check for an appointment to filter on present appointments.

---

#### **Dashboards**

##### Updating Main Dashboard banner search functionality on Banner Modal (#146695)

**Problem**

- On the banner selection pop-up, having many banners causes the buttons to move off-screen. When scrolling to reach the buttons, the search bar is no longer visible. Large images can also make the page slow and unresponsive.

**Solution**

- Updated the layout so the banner list is scrollable, keeping the search bar and buttons visible at all times.
- Search results are now limited to 21 banners for better performance.
- Selected banners will always be included in the results, along with any that match the search term.
- Results are ordered with selected banners first, followed by the most recently uploaded banners

##### Adding a clear button to the search field (#146522)

**Problem**

- The search field does not have a clear button.

**Solution**

- Add an eraser icon to clear the search field

---

#### **Event Scheduler**

##### Changed ScheduleComponent event handlers to useCallback to prevent re-render errors (#146447)

**Problem**

- A blank calendar page appears after opening the "Multiple Event Booking" modal and then cancelling/closing it again.

**Solution**

- Improved how the calendar handles updates when opening and closing popups. This ensures the calendar stays visible and continues to display events correctly instead of disappearing or showing a blank screen.

---

#### **Tenant Management**

##### Adding session storage and restore functionality to global search (#142318)

**Problem**

- On the Tenants page, search filters are not retained after editing a tenant. When returning to the list, all filters and paging are reset.

**Solution**

- Added session storage support to the global search control, allowing filter to be preserved where required. This feature can be enabled per data table and is disabled by default. It has been enabled for the Tenants page, ensuring that filters(search terms) are restored when navigating back to the list.

---

#### **Content Management**

##### Add functionality to convert HTML to Word and replace placeholders in a PowerPoint presentation (#145071)

**Problem**

- Functionality required to update a PowerPoint presentation.

**Solution**

- Added functionality to replace placeholders on a PowerPoint presentation. Also added a function to convert HTML to a Word document.

##### Fix typos in document placeholder descriptions (#147637)

**Problem**

- Some of the placeholders had typos in the translation description.

**Solution**

- Fix translation descriptions in placeholders

---

#### **Imports**

##### Add additional unique field validation to pre-import validation (#144890)

**Problem**

- Correct creation and update of unique user fields in import

**Solution**

- Refine the error messages for user creation and update failures in the `ImportUsersCommandHandler` to provide clearer and more accurate information about conflicts due to existing users. The changes clarify that the conflict is with another user and improve the details shown for matching fields.

##### Implemented immediate employee sync (#143194)

**Problem**

- When a new user is created, it is not immediately imported into V8 unless an entire import is kicked off

**Solution**

- Added a change after a new user creation happens, create a user import for that username to V8

##### Add additional unique field validation to pre-import validation (#144890)

**Problem**

- When importing users with the same fields, that is still unique, it is still allowed

**Solution**

- Introduce a Unique flag on SelfServiceSetting and wire it through the validation pipeline to support uniqueness checks for Email, ID Number, Passport Number and Employee Code. Precompute per-field value counts and a uniqueFields map in UserDetailsValidationService, and add duplicate-value checks that emit validation errors when a field marked unique is duplicated. Update all SelfServiceSetting construction sites to pass the new Unique flag and adjust related method signatures. Add unit tests covering unique-field scenarios and update existing tests accordingly.

---

#### **Notifications**

##### Adjusted character count for masking rule (#147452)

**Problem**

- Development was done to do character masking with 1 character count, request to do a 2-character count display

**Solution**

- Added new rules to do character counts, should there be enough characters, 2 prefix shown, masked in between, and the last 2 characters are displayed

---

#### **Performance Management**

##### Change score when review setup and item not in use (#145198)

**Problem**

- When a user has added a rating scale, they can not change the score, as there are business rules defined for this

**Solution**

- Allow a user to only change the score on an item if the review setup has not been used within a contract, and add a safety check within the command to check that the review item has also not been used yet

##### Resolve sanitisation problem by handling newlines properly for data table and textarea (#147709)

**Problem**

- Break tags shown on the add/edit modal of KPI, KC review section items

**Solution**

- Resolve sanitisation problem by handling newlines properly for the data table and the textarea. Items saved from the modal are saved with new line chars \\r\\n. The sanitiser converts these to break tags that display correctly on the data table. When opening this in the modal again, the breaks are shown in the text area. Added helper functions to replace breaks with newlines when opening the modal and vice versa when saving from the modal

---

#### **Workplace Assessment App**

##### Implemented new endpoint for Observation app to upload stream file content (#143882)

**Problem**

- Endpoints created to allow the observation app to stream files, large files to service, due to http2 endpoints not being able to make public, normal http1 api transcoding takes place. But with large files, this causes timeouts and stream errors, for example, 60mb to be converted to a base64 string fails

**Solution**

- Added a new endpoint and proto to accept a streamed body file and use that to then send for the next method. Add a new app setting to allow/regulate the upload max file size

---

#### **Master Data**

##### Resolved master data items being searched (#147640)

**Problem**

- When searching for a master data item, the global search text is not passed through, resulting in no value sent to the master data service. This results in the top 50 records, where after those server results are returned to the page, it only filters client side from the 50, hence why not all records are returned

**Solution**

- Add a correction to also search for the query string, as those values are not part of form data when posted from the jQuery table

---

#### **Learning Management**

##### Log mark audit failures and incorrect audit table names (#147362)

**Problem**

- Users could accidentally save duplicate marks on the Marksheet by clicking the Save or Inherit Marks buttons multiple times before the request is completed. This caused errors that were either silently swallowed or shown as a confusing technical message with no guidance on what to do next.

**Solution**

- Duplicate prevention (frontend) 
    - The Save and Inherit Marks buttons are now disabled while a request is in flight, preventing the user from submitting the same marks more than once.
- Duplicate prevention (database) 
    - Two partial unique indexes have been added to the `Marks` table to enforce that a learner can only have one mark per assessment per cycle at the database level — a safety net even if multiple requests arrive simultaneously.
    - Existing duplicate rows are cleaned up as part of the migration (keeping the most recently edited entry). A backup of the `Marks` table is taken before any changes are made.
- Meaningful error messages 
    - When a duplicate mark is detected, the user now sees a clear message: \_"A mark for this user already exists. Please reload the page to see the latest marks."\_
    - All other save/inherit failures show the server's error details (if available), followed by "Please reload the page and try again."\_ so the user always knows the next step.
    - If there is no specific error detail, only the reload instruction is shown — no empty or generic filler text.

##### Add idle auto-save and unsaved changes warning to Marksheet (#147137 &amp; #147138)

**Problem**

- When teachers or administrators are entering marks on the Marksheet, their work can be lost if they: 
    - Step away from their computer without saving
    - Accidentally navigate away from the page or close the browser tab
    - Get distracted and forget to click Save
- There was no safety net to protect unsaved mark entries, which could result in having to re-enter all the data again

**Solution**

- Idle Auto-Save 
    - The system now automatically saves mark changes after a period of inactivity (defaulting to 5 minutes). If a user steps away or gets distracted, their progress is saved in the background without any action required. This behaviour can be configured or disabled via application settings.
- Unsaved Changes Warning 
    - If a user tries to navigate away from the Marksheet while there are unsaved changes, a clear warning message is shown asking whether they want to save, discard, or stay on the page - giving them full control and preventing accidental data loss.

---

#### **Communication Portal**

##### Resolved member count (#147597)

**Problem**

- User count not returned for group discussions

**Solution**

- Re-added count, and show loading indicator for internal use as well.

---