Version 9.1.235 (15 June 2026) Data Warehouse Added step to execute PowerShell scripts for ContentManagement (#136619) Problem The PowerShell scripts need to run first before running the DWH Packages Solution Added a step to execute the required PowerShell scripts for ContentManagement Adjustments made within JobProfiler_ETL SSIS Package (#151077) Problem Redundant fields need to be removed from the JobProfiler SSIS Package  The Insert step needs to be updated for Appointment to fetch all current-year Appointment data  The isLatestAppointments only refreshes at midnight End dates that are NULL need to be updated for Appointments Solution Removed redundant fields within JobProfiler_ETL SSIS Package Updated Insert Script to refresh all Appointment data for the current year  Updated the IsLatestAppointment step to refresh with each run  Added a step to update the EndDate if it is NULL for Appointments Removed redundant fields within PerformanceManagement_ETL SSIS Package (#150517) Problem Redundant fields need to be removed within PerformanceManagement_ETL Solution Removed redundant fields within the PerformanceManagement_ETL SSIS Package People Management Add validation for duplicate support users on the default ruleset, adjust translations for support users (#148351) Problem Unable to log in with the support user that has been assigned to the ruleset. Get error message: Support impersonation is not enabled for the user  Solution Add validation for duplicate support users on the default ruleset, adjust translations for support users to make it clear what the problem is, as the user support date has expired Fixing the "service not available" error Problem Changes to the advanced filter criteria can cause a frontend error when restoring previously saved filter values from local storage. This occurs when the stored filter structure no longer matches the current filter structure expected by the application due to recent development changes to the filter structure. Solution Added validation to compare the stored filter structure against the current filter definition before restoring it. If the stored filter is incompatible, it is automatically cleared and ignored. If the structure is valid, the filter is restored as normal. This prevents errors while maintaining filter persistence for compatible saved filters. Correct export of people dashboard and report builder reports (#149495 & #149491) Problem The People Dashboard cannot be exported. Reports exported do not display under the exports tab  Solution This pull request introduces several improvements and fixes related to file export and upload functionality across the API, gRPC, and web layers. The main focus is on enhancing the handling of user file types, improving error handling during export operations, and refining method implementations for exporting files. Event Scheduler Fix calendar view console warning (#151002) Problem Syncfusion calendar component produced the following warning in the browser console: "[WARNING] :: Module "Week" is not available in the Schedule component! You either misspelt the module name or forgot to load it." Solution Ensure the warning does not display by explicitly setting the calendar current view to Month (we do not use the week view at all)  Notifications Ensure schedule run times are captured as UTC (#149421) Problem Schedule run times get a bit confusing, seeing that the run time is selected as local time, but then, when processed, it is converted to UTC - this leads to inconsistencies.  Solution Just as we do with the additional service imports, where the times are captured and stored directly as UTC, we do the same with schedules. I did update labels to assist the user so that they know the selected times are UTC. I also added help text when selecting the run time, so that you can see what the selected UTC is in local time. This just makes the whole process more consistent and less confusing  Performance Management Inform user buttons are to create agreement for the selected period (#142925) Problem Duplicate heading readings and incomprehensible speech. Solution Remove duplicates and improve the flow to tab through buttons before they are read  Focus on the Review Year drop down after creating agreement (#146075) Problem When loading the page after creating an agreement, the review year drop-down list does not focus.  Solution Focus on the year drop-down list on page reload Improve handling period sections (#146076) Problem My agreement section for review periods and summary has an illogical flow. I need to be able to enter into and have a comprehensible flow.  Solution Group review periods and summary separately, and allow entering into sections for further action and hearing.  Focus on the "Create new agreement" modal after clicking the Start button (#146081) Problem Incomprehensible flow for creating a new performance agreement and missing enter logic to allow user access to all functionality. Solution Update and improve, creating a new agreement flow on all corresponding pages Improve narration in an agreement (#146085) Problem Incomprehensible flow in an open agreement. Solution Improve flow, speech and functionality for all sections, including enter functionality for new grouped tabs Corrected view subordinate button no longer displaying on dashboard (#148720) Problem On the Manager Dashboard, the View Subordinates button was no longer displaying for employees who are managers.  Solution Corrected dashboard query that was incorrectly determining subordinate count by looking at the current user's manager instead of the current user's reportees. Job Management Add confirmation modal for copying a Job Profile (#148305) Problem When copying a job profile, there should be a pop-up modal to confirm if the user wants to copy the JobProfile Solution Added a new modal, which appears when the user clicks on the copy button Identity and Authorisation Improve handling of the expiry of the refresh token to allow the user to log in again (#139977) Problem When a user's refresh token period expires, and the access token cannot be refreshed, the session page breaks due to the existence of invalid authentication cookies. Solution Set cookie authentication defaults and OpenID Connect sign-in/sign-out schemes; add forced sign-out/challenge flow when a user's access token is expired or unavailable to prompt re-authentication and avoid duplicate challenges. Introduce ReAuthenticationTriggeredContextItemKey and ForceSignOutAndChallengeAsync with safeguards and logging. Update CreateUnauthorizedResponse to return a gRPC-compatible response (HTTP/2 OK with grpc-status=Unauthenticated) for gRPC requests and add IsGrpcRequest helper. Also, add Grpc.Core import for status codes. Resolved Null theme for Identity Translation PR (#148357) Problem Incorrect throw for the theme service, which can be null with the first load for identity translations  Solution Removed check Refactor Identity Translations to use MVC translations (#148357) Problem Identity had its own Resource.ResX localizer, as well as MVC, has its own Translation dynamic tree. This means that Identity could not be translated by a ruleset to be used  Solution Removed Resource. resx in Identity  Added a new section identity within MVC translations, implemented a new MemoryCache Localisation to be used within a new base page model to retrieve localisation.  Tries to get the memory cache translation, should it not be available or timed out, fetch new namespace translation from mvc load into memory and use on each page as needed with T("..") System Access Ensure the provider is set for support login (#148127) Problem Provider not available in support login, causing an incorrect redirect on challenge Solution Add a hidden provider input and update client-side submit logic to populate it from the clicked submitter so the provider value is consistently sent with the form. Also, add a server-side fallback in OnPostAsync to default the provider to Microsoft when none is provided. This ensures the provider is always available for processing (covers cases with/without JS and relies on the submitter value when multiple provider buttons exist).  Communication Portal Do not display "Null" (#151091) Problem Incorrect logic was used for item counts on the second inner badge  Solution Correctly handle logic flow Incorrect validation for Mandatory fields (#151085) Problem Banners must be able to create without text and values Solution Added null empty checks to pass in blank The Banners are not displaying to all users by default when there is no Target Audience (#151086) Problem Publish to the dashboard, check used to show within the communication portal banners  Solution Remove check for dependency on publish to dashboard  An empty Target Audience selection list appears when linking Jobs (#151089) Problem In some cases, when opening the link modal, it does not result in items.  Solution Add retry check and stale removal on data for page items An error appears when viewing the "Summary" of the Banner Target Audience (#151092) Problem SQL query times out when having lots of audiences Solution Improve SQL query join The Banner Overlay resets after save (#149890) Problem Culture difference on double pointer Solution Added an attribute to model binding for the attribute to resolve Imports Correct disability import check and change user repository to load navigational properties sequentially (#150961) Problem On the user imports, the user disability records are getting duplicated with each import. Each import creates a brand new disability record for the user, even though the user already has the disability record.  The current user gets from the repository leads to a Cartesian product, causing degraded performance. Consider 1 User, having 200 User Files, the user has 2 next of kin records, the user has UserReleaseHistory for each release, 50 records, and then the user has 100 transgression files. The way EF compiles the query is Users left joined to all the other tables, and multiplies the rows for each collection navigation. The above example leads to 1x 200 x 2 x 50 x 100 = 2 million records returned; this is extremely inefficient.  Solution Fixed the user disabilities query to select disabilities for the user IDs provided (dapper IN was set to be NOT IN) Changed the Get for User to load the main entity and then load each collection sequentially. Initial execution time of cartesion product query: 00:01:05 -> 2, 338, 770 rows, for one user. Updated execution time with sequential collection load: 00:00:01 ALL queries (1 main entity + 9 collection fetches) -> Total 494 rows (across all result sets for user + user's files and transgressions) Send Welcome Email to imported users (#149149) Problem There should be functionality for sending a bulk welcome email during the import process. There should also be a new import setting to toggle whether or not this functionality should occur. Solution Add a new import setting Add the send welcome email functionality to the import process if the setting is active