1. ALL REGIONS
FEATURES
[#1919] Finance Snapshot ENHANCEMENTS
We’re introducing much more granular options how for setting Finance Snapshot in each office. This new feature allows showing/hiding elements of the Finance Snapshot widget. We can drive Main Indicator, each of 5 available pie charts and data blocks in the ‘Details’ section. There we can show, or hide whole ‘Estimates’, ‘Actual Costs’, ‘Invoices’ and ‘Project Margin’ sections + Bookings and non-Billable Costs.
[#2216 ] Feature: Resource Scheduling from Tasks
Users can now initiate and manage resource bookings directly from the Task Detail form’s Manage Notifications modal using the Resource Booking Flyout, with pre-populated contextual details such as project, user, and activity. The Booking Flyout is accessible via the Manage Users modal within the Task Flyout and ensures that each booking is directly linked to its respective task, displayed under the “Linked Tasks” tab.
Access control is the same as for the Resource Scheduler:
- Bookable? User must be “bookable” to be able to make bookings.
- View Access users can request bookings, which are automatically set to “Unapproved” and display as tentative with a striped header. They can view (but not edit) only the bookings they’ve created.
- View and Edit Access users can both create and modify bookings for any user. All fields are editable except booking status, which is read-only unless confirmed.
The system automatically determines booking dates based on available metadata:
- If the task is linked to a Timeline Item, booking dates match that item’s date range.
- If the task only has a Start Date, a default 2-day booking is applied.
- If no dates are present, booking defaults to a 2-day period from the current date.
The Booking Flyout is the same as used in the Resource Scheduler, including the use of striped headers for unconfirmed bookings.
This release lays foundational groundwork for more tightly coupled task/resource planning and helps teams ensure accurate and authorized scheduling without leaving the task context.
[#2243] Feature: Brands API Updates
We’ve delivered a series of improvements to how Brands and Products are managed in Pulse. These changes make brand/product governance clearer, improve data consistency, and streamline approvals and reporting. Here’s what’s new:
Blocked Brands & Products
- A new “Blocked” checkbox is now available for Brands and Products.
- A Brand or Product can be marked as Blocked (even while still active), preventing it from being used in new projects, the Project Wizard, Edit Project Details, and Agreements.
- When a Brand is blocked, all its Products are automatically blocked too.
- Blocked status is now included in:
- Brand & Product Import templates
- Exports
Search Enhancements
- Users can now search by Brand Code in addition to Brand Name on the Brand page.
Improved Code Generation
- Master Clients, Brands, and Products now use updated logic to generate unique codes:
- Master Clients: Codes are fixed at 5 letters, prioritizing letters from the name.
- Brands: Codes are 6 letters (3 from the master client code + 3 from the brand name).
- Products: Codes are 8–12 characters (5 from master client + 3+ from brand name), ensuring uniqueness and readability.
Better Reporting
- New columns have been added to Brand and Product pages and exports:
- Blocked status
- Country, Ledger, Finance Profile
- Total Projects and Active Projects
- Brand Approver and Magnitude Code Approver
- Master Client (on the Product page)
- Active/All Projects links on Brand and Product pages now point to the New Project List for consistency.
Project Safety Enhancements
- Brands with active or in-review projects cannot be archived to avoid breaking Agresso links and timesheet submissions.
Brand/Product Requests
- Users can no longer request new products under a blocked brand.
- If a brand is blocked between the request and approval, the request cannot be approved, but it can still be rejected with a reason.
- Validation for missing attributes is only required on approval, not rejection.
General UI Improvements
- In the Brand page, “Brand Mappings” is now correctly labelled as “Mapped Products”.
- The “Blocked” column now appears between Status and Active Projects on both Brand and Product pages.
[#66827] Feature: Restrict Alien User Invitation
This release introduces a new configuration for handling “Global Workers” in projects, aiming to address issues with billing complications when alien users are assigned incorrect roles.
New Feature: A new setting, “Default Roles Required,” has been added to the Resource Sharing Settings of Global Worker Agreements. This allows users to enforce that an alien user must have a default role assigned before being invited to work on a project.
If set to “Yes”: Alien users can only be invited if they have a default alien role assigned for the relevant office or Finance Profile. If no default role is assigned, users will see an error message and will not be able to proceed with the invitation.
If set to “No”: There are no restrictions on inviting alien users, and roles can be selected on the fly.
How it Works:
For existing agreements: Users can find and update the new “Default Roles Required” setting to either “Yes” or “No.” If set to “Yes,” project managers will only be able to mark users as alien if they have a default alien role assigned. If set to “No,” there are no restrictions.
For new agreements: The “Default Roles Required” field will default to “No.” However, this can be modified during the creation of the agreement.
UI Enhancements:
If “Default Roles Required” is set to “Yes,” users who are marked as alien without a default role will see a message: “This action requires a default role, but none is assigned. Please contact an Operations member from {Lending Office Name} to set up a default role for this user.”
The role dropdown will be disabled for users without a default role.
This change helps ensure that alien users are correctly assigned roles based on their home records, reducing billing complications and improving the project setup process.
Enhancements
[#72983][#71135] Improve the speed of “User” dropdowns
The User dropdown performance has been improved by removing the unnecessary inclusion of accountUser->client in the User endpoint. This change eliminates additional SQL queries that were previously slowing down features like Timesheet Reports, Pending Approval, and others. As a result, the dropdowns for Project Owner, Time Approved By, Supervisor, and similar fields now load faster across the application.
[#72838] BE: Add Mag Code and Mag Code Description
We’ve added two new optional columns to the Finance Summary Report V2 and Finance Detail Report V2 to provide greater visibility into project financials:
- Magnitude Code
- Magnitude Code Description
These values are derived from each job’s associated brand and help clarify the financial classification used.
[#70878] Move Purchase Order PDFs to V2
We’ve upgraded the Purchase Order PDF Sync process to use the newer and more robust v2 sync framework in Pulse.
Previously handled by an older script, the sync has now been refactored to align with the v2 structure used by other modern Agresso integrations. While there’s no change to the way data appears in the UI, this update improves maintainability, reliability, and consistency with other sync processes.
[#72343] BE: Ensure we are saving rate when saving alien time
An issue has been resolved where the correct rate was not being saved for alien users’ time entries.
Now, when alien users log their time, the system ensures that the correct rate from the project’s rate card and currency is applied. If no rate is found, it will correctly show as 0. This fix ensures accurate time tracking and correct billing for alien users.
[#73009] US Rates IB Sync Update
We’ve made an update to the US Rates integration to automatically set the “approved_rate” to “Y” for US roles, as only approved rates are used in the US. This will improve the display when creating estimates in POP US.
[#73010] BE: Enhancements to the Role / Product Dropdown
We’ve enhanced the Role/Product dropdown for Agresso Finance Documents to display the INCCAT alongside the Role Name when the rate is approved.
Now, if the rate is approved (approved_rate = Y), the dropdown will show the format: “Role Name [INCCAT]”
Additionally, users can now search by both role name and INCCAT, making it easier to find the right options.
If the rate is not approved, the dropdown remains as it was previously. This improvement applies to the quote and invoice finance endpoints.
[#71423] FE: Lock UI for Agresso-sourced user attributes
This release introduces updates to the Pulse UI, ensuring that certain Agresso-linked user attributes are now protected from being edited by non-superusers. Specifically, the following fields will be made read-only for users without superuser privileges:
- Min Timesheet Hours (Timesheet Tab)
- Employee Type (Payroll Tab)
- Employee Start Date (Payroll Tab)
These changes prevent accidental edits to important employee data that is linked with Agresso, ensuring data consistency across systems.
FIXES
[#62433] Bug: The Mine: No validation message after editing collection
We’ve resolved an issue where users did not receive a confirmation message after editing a collection in The Mine. Now, when changes are saved, a “Collection successfully updated” message will appear, ensuring clear feedback that updates have been applied.
[#72396] Bug: Office holidays don’t show when you move dates
We’ve fixed missing Office Holidays in the Resource Scheduler in case when those were out of the initial date range load. When user moved into a history, or future, those were not loaded.
[#72426] Bug: Auto Approval of Phantom Job not setting Timesheet Start & End Date
We’ve fixed an issue with Phantom Jobs where the Timesheet Start and End Dates were not being set correctly during auto-approval.
Previously, the Timesheet Start Date was incorrectly taken from the main project, and the End Date was left blank. This caused problems when processing timesheets for users on Phantom Jobs.
With this update, Pulse will now automatically set the correct date range for Phantom Jobs:
- Timesheet Start Date: 1 Jan 2019
- Timesheet End Date: 31 Dec 2099
[#72904] Fix: CSV Export of Users List from Address Book is missing data
We fixed an issue on Austroads instance where the exported user list from the address book on Austroads only contains email and some phone numbers. We fixed it so the exported file includes names and other expected user details.
[#72011] Bug: Edge case causing DIH queue records to be missed
We’ve improved the reliability of invoicing for German finance profiles by adding extra safeguards when syncing invoices between Pulse and Agresso.
In rare cases, Pulse could mistakenly think an invoice submission failed due to an error message from Agresso—even though the invoice was actually received and processed. This caused discrepancies between the two systems.
To resolve this, we’ve enhanced our cleanup process to detect this edge case and ensure the invoice is correctly registered in Pulse. If Agresso has the invoice but Pulse doesn’t recognize it, the system will now create the missing record needed to bring everything back in sync.
[#71197] Bug: Timesheet Period sync is expensive
We’ve improved the performance and efficiency of the Timesheet Period Sync feature.
Previously, the system would pull all available timesheet periods from Agresso—regardless of fiscal year—which led to unnecessarily large data loads. With this update, the sync is now limited to only the relevant fiscal years (the current year and up to three years ahead). This significantly reduces the number of records being processed—typically to around 400 or fewer per finance profile—making the sync faster and more efficient.
[#70170] Bug: old Job List > Export works only with primary office of the user
The excel export in the old Job List wasn’t pulling projects for other than Primary office of the user, even these were displayed in the app. This is fixed now.
[#72398] Bug: The Office holiday name hover doesn’t work
No office holiday name was displayed when user hovered it in the Scheduler. This is now resolved and we added also which office the holiday belongs to.
[#73288] Fixes for “Financialise”
We fixed several issues in process of Financialization of a project.
[#72427] Bug: Showing Asset Catalogue as a project
A performance issue caused by showing Asset Catalog projects as “Linked Projects” in Phantom Jobs has been resolved. Previously, projects without a Job Number were being included, causing slow project loading. Now, projects with no Job Number (such as Asset Catalog projects) are correctly excluded from the “Linked Projects” list, improving the user experience and performance.
[#72269] Address Book: Groups: Wrong message when successfully updated group settings
We’ve fixed an issue where updating a group in the Address Book displayed the wrong confirmation message. Now, when you successfully update a group, you’ll see the correct message: “Group updated.”
[#72451] Fix: Add option of retrying Pulse Amendment
Added the ability to retry a failed Pulse amendment when the “Approve” button is still visible. If the amendment was already successful in Agresso, it will now be correctly marked as successful in Pulse.
[#72932] FE: Fix the Contract Client Dropdown in Amendments
The Contract Client dropdown in amendments now loads additional records as you scroll, ensuring you can access the full list without limitations.
[#72397] Bug: Office holidays are not subtracted in the booking form
Office holidays were not subtracted when booking was made over these days. This is resolved now.
[#72961] Bug: Agresso Customer label displayed incorrectly on Global Worker Agreement setup
Fixed an issue with the Agresso Client label being displayed incorrectly in the Global Worker Handshake Builder. In some cases, clients such as “POP UK” were incorrectly shown as “Havas Media Belgium” after saving an agreement.
The system now correctly shows the Agresso Client label as set during the setup of an agreement.
[#73038] Fixed: Master job issue
We’ve fixed an issue where the Finances tab on Master Jobs was displaying a 500 error and showing empty graphs, even when linked sub-jobs had approved financial data.
[#72874] Bug: Review: Changing Review Title in the settings does not dynamically change its name in the review grid. Need to reload the page to see the change in the grid
Fixed an issue where updating a Review title in the settings did not dynamically update the title in the Review grid. The grid now reflects the updated title immediately without requiring a page reload.
[#72877] Bug: Stages Accordion Collapse Issue in Review Detail Flyout
Fixed an issue where the Stages Accordion in the Review Detail Flyout was not functioning correctly. The accordion now opens and closes as expected, retains its state when navigating between sections, and no longer triggers console errors during interaction.
[#72931] Production: Address Book > Users: Typing ‘*’ in the search bar causes error when exporting the user list
We’ve fixed an issue in the Address Book > Users tab where using an asterisk (*) in the search bar would cause the Export as CSV function to fail.
Previously, typing * and then clicking Export List as CSV resulted in a 403 error and a message: “Failed to download user list.”
This was due to the request being blocked for security reasons when special characters like * were included.
[#72836] FE: Duplicated error message when submitting project amendment without mandatory reason
We’ve fixed a bug in the Project Amendments form where users would see duplicate error messages when submitting without a mandatory reason.
Previously, if you left the “Reason for Request” field blank on a required amendment type, the system would display the same validation error twice, which could be confusing.
[#73348] Bug: Scheduler – Stuck in infinite loading
We’ve resolved an issue where the Resource Scheduler on the Beta site failed to load when accessed by a superuser.
Previously, users attempting to open the Resource Scheduler would see a loading popup that never disappeared, preventing access to the tool.
[#72371] Bug: JDE Mine: Asset’s detail note issue
We’ve fixed a bug in The JDE Mine (Jacobs) where notes added to an asset were not displaying correctly in the asset detail view.
Previously, after adding a comment:
- The note would disappear after closing and reopening the asset.
- A broken placeholder note (e.g., “Written by… at…”) would appear instead.
[#72370] Bug: The Mine: Missing initial upload comment in asset’s detail
We’ve fixed an issue in The New Mine where the initial “File uploaded” comment was not visible in the Notes section until an additional comment was added.
Previously, after uploading a file and viewing its details, users would not see the automatic upload note—leading to confusion about upload activity tracking.
3. TECH DEBT
[#72833] FE – Require unique key in PulseDatePicker Component
We’ve resolved a front-end issue on the Timesheets Report page that was causing unexpected error popups.
[#72541] NR: Exception ‘TypeError’ with message ‘array_key_exists(): Argument #2 ($array) must be of type array, null given’
We’ve fixed an error that was causing the Project List API to fail when no filters were provided.
Previously, accessing /v2/api/project-list without specifying filters resulted in a server error: array_key_exists(): Argument #2 must be of type array, null given
This happened because the system wasn’t handling the absence of filters properly.
Now, if no filters are applied, the API will gracefully fall back to default values and return the project list as expected—eliminating the error and restoring full functionality.
[#73043] NR: Uncaught exception ‘mysqli_sql_exception’ with message ‘Illegal mix of collations (utf8mb3_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation ‘like”
We’ve resolved a database error that occurred when users searched for jobs in the Timesheet module using special characters—such as emojis or non-Latin characters (e.g., Japanese, Chinese).
Previously, this triggered an error due to a mismatch in database character sets: “Illegal mix of collations (utf8mb3_general_ci and utf8mb4_unicode_ci) for operation ‘LIKE'”
With this fix, the system now correctly handles searches containing special characters, ensuring results load as expected without errors. This improves support for international characters and enhances the overall user experience.
[#73159] NR: Exception with message ‘SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘groupid’ cannot be null (SQL: insert into `client_user_groups` (`reference`, `clientid`, `groupid`, `name`) values (client-ops-group, 41117, ?, ?)) in client setting
We’ve fixed a bug that caused an error when managing Operations Groups in the Client Settings section of the Address Book.
Previously, trying to add or remove an Operations Group could fail with a database error: Column ‘groupid’ cannot be null
This happened when the system attempted to save a group without a valid ID.
With this fix, you can now successfully add or remove Office Groups without triggering any errors—ensuring smooth and reliable updates to client settings.
[#72944] FE – DayPicker cached seleted day
We’ve fixed an issue with the day picker in the Timesheets Report filter panel that prevented users from re-selecting previously chosen dates.
This issue appeared after a recent upgrade to MUI version 5, which affected how dates were compared in the calendar component. As a result, the date picker failed to recognize previously selected dates as valid, making it impossible to switch back to them.
The logic has now been updated to work with the new MUI structure, and the day picker is functioning as expected, allowing users to freely select and re-select any date without issues.
[#72539] Optimize schedule task ScanForRecentChangedFinanceCalculableJobs to dispatch only changed projects
We’ve optimized how Forecasted Bookings are recalculated to improve system performance and prevent duplicate processing errors.
Previously, projects with current or future bookings were being recalculated every minute, which was unnecessary and led to issues like: Duplicate entry for key ‘summary_table_event_queues_event_source_table_signature_unique’
With this update:
- Forecasted Bookings are now recalculated once per day, reducing system load and avoiding redundant database activity.
- A new dedicated daily task handles this calculation separately from other finance recalculations.
[#72543] NR: Uncaught exception ‘TypeError’ with message ‘array_map(): Argument #2 ($array) must be of type array, null given’
We’ve fixed an issue in the Mine Collections feature where saving a collection without any assigned admin users caused an error. Previously, if all admin users were removed and the settings were saved, the system would fail with a type error. This has now been resolved, and collections can be saved successfully even when the admin user list is empty.
[#72865] NR: Uncaught exception ‘mysqli_sql_exception’ error in Resource Planner
We’ve fixed a SQL syntax error in the Resource Planner that occurred when filtering jobs using the “Requested By” option. The error was due to an incorrectly constructed SQL JOIN statement involving the booking_requested_by table. This has now been resolved, and the Resource Planner will load job data as expected with a 200 status, even when filters like “Requested By” are applied.
[#72866] NR: Uncaught exception ‘mysqli_sql_exception’ error in getFullCalandarHolidays
We’ve fixed a SQL syntax error that occurred when accessing calendar holiday data via the job view. The issue was caused by a missing user ID in a query condition, resulting in a malformed statement like OR job.createdby = ). This has now been corrected, and the system will return the expected data with a proper 200 status, even when certain user-related values are missing.
[#71347] Timelines: Operation user lost the adminTimelines permission, and also cannot edit template after being invited as Edit user
We’ve fixed an issue where Operation users with the adminTimelines permission couldn’t see or edit timeline templates created by other users, even though they should have full access by default.
Previously, an Operation user couldn’t see a template unless explicitly invited, and even then, the Edit (pencil) button wasn’t visible, blocking them from making changes. This behavior has now been corrected—Operation users with adminTimelines enabled can view and edit all timeline templates created within their office, without needing to be manually added as collaborators.
[#73034] NR: Exception ‘Illuminate\Routing\Exceptions\UrlGenerationException’ with message ‘Missing required parameter for [Route: passport] [URI: passport/{job}]’
We’ve fixed an issue where users without permission to manage a project were encountering a 500 error when trying to access the project edit URL directly. This happened because the system failed to generate the correct redirect route due to a missing job ID. With this fix, users who lack edit access are now properly redirected to the project dashboard, avoiding the error and ensuring a smoother user experience.
[#72330] Update callLaravelServiceMethod to call method directly
We’ve streamlined how the v1 codebase interacts with v2 services, eliminating the need for self-referencing HTTP requests.
[#72445] NR: Using php-function “in_array” and “implode” as a modifier is deprecated
We’ve resolved a backend issue related to deprecated usage of PHP functions in our template engine, which was generating repetitive error logs in New Relic.
The system was previously using PHP functions like implode and in_array directly as modifiers in Smarty templates, which is no longer supported in newer PHP versions.
[#72534] Exception ‘Exception’ with message ‘Failed to load amendment type’ in ProjectAmendmentController.php
We’ve fixed an issue that was causing errors when attempting to load Project Amendments for projects that don’t have any mandatory amendment fields.
Previously, when opening certain projects users encountered a server error:”Failed to load amendment type”, even though no mandatory fields were expected.
This issue has now been resolved. Projects without required amendment fields will correctly return an empty list instead of an error, allowing the amendment process to proceed without interruption.
[#72448] NR: Uncaught exception ‘TypeError’ with message ‘implode(): Argument #2 ($array) must be of type ?array, string given’
We’ve fixed an error that occurred when deleting certain users from the Address Book in Pulse.
Previously, when trying to delete a user with unapproved timesheet data, the system could trigger a server error: implode(): Argument #2 must be of type array, string given
This happened because the backend was expecting a list (array) of values but received a single string instead.
The issue has now been resolved. User deletions will complete successfully without triggering errors, even if the user has pending timesheet data.
[#72446] Exception ‘TypeError’ with message ‘Unsupported operand types: string – int’
An error that occurred when fetching finance report details with invalid or missing parameters has been fixed. Previously, a “TypeError” was thrown when the query included a null value for the report number. Now, the system properly handles such cases and displays the data without any errors.
[#70264] Get Estimates to use the Standard Unit4 Service
We’ve enhanced the estimation process for the Standard Unit4 Service across the UK, EU, and eventually US to use the UNIT4 standard processing service.
[#72393] NR: Uncaught exception ‘TypeError’ with message ‘checkConfigIsEnabledForClient(): Argument #2 ($clientId) must be of type int, null given
We’ve resolved an issue that caused an error when saving costs for jobs linked to clients without a specified country.
[#72907] NR: Error with message ‘Cannot access offset of type string on string’ in V1 Support page
An issue where an error occurred during support form submissions has been resolved. Previously, a “TypeError” was thrown when the form details were processed. Now, the form submits correctly, and users can view their message without encountering any errors.
[#72446] Exception ‘TypeError’ with message ‘Unsupported operand types: string – int’
Resolved an issue that caused an error when fetching finance report details. The system now correctly processes data without failure.
[#72506] NR: Exception ‘InvalidArgumentException’ with message ‘Nested arrays may not be passed to whereIn method.
Resolved an issue where nested arrays caused an error in the whereIn method when retrieving finance data. The system now correctly processes job finance details without failure.
[#72906] Add Logging to YouTube API Function for Debugging Quota Exceedance
Replaced the YouTube API key to restore functionality after an unexpected quota exceedance. Enhanced logging has been implemented to capture request details, user context, and error messages, allowing better diagnosis of future quota issues.
[#72929] NR: Uncaught exception ‘mysqli_sql_exception’ with message ‘You have an error in your SQL syntax’ in project-wizard
Resolved an issue where an SQL syntax error occurred when querying pulse rate cards with specific keywords. The system now properly returns the requested data without errors when the query includes a keyword parameter.
[#72968] NR: Exception ‘Error’ with message Call to a member function toArray() on array or null
Resolved an issue that caused an exception when attempting to update the role of an alien user in the team management user modal. The system now correctly processes the role update without throwing an error, provided the current user has the appropriate permissions to manage the alien user.
[#72984] NR: Uncaught exception ‘Exception’ with message ‘File ./images/logo.gif not found!’ in /var/www/html/Classes/PHPExcel/Worksheet/Drawing.php:114
An issue has been resolved where users could not export the Project Manager Report due to an error message stating that a file (logo.gif) could not be found. Now, users can successfully generate and download the report without encountering this error.
[#72987] NR: SQL Error when adding notes in the V1 Document Review tab
An error that occurred when adding notes in the document review tab has been fixed. The issue was caused by an expired session and resulted in an SQL error when trying to save the note. After this fix, users can now successfully add notes without encountering this error, even when their session has expired.
[#73000] NR: Uncaught exception ‘SmartyCompilerException’ with message ‘Syntax error in template “file:/var/www/html/Smarty/templates/Site/Wizards/ganttwizard.tpl”
An error that caused a 500 status code when trying to launch the report wizard has been resolved. The issue was due to a template syntax error in the wizard page. Now, users can successfully access and generate the report without encountering the error.
[#73019] NR: Exception ‘Symfony\Component\ErrorHandler\Error\FatalError’ with message ‘Allowed memory size of bytes exhausted (tried to allocate bytes)’ in project-wizard
An issue causing a memory error when selecting certain clients and brands in the Project Wizard has been resolved. The error occurred due to too much data being loaded at once. We’ve moved the data pagination to the database level, which prevents memory overloads and ensures faster and more reliable results. Now, users can select clients and jobs without encountering the error, even with large datasets.