First to Site
Release 3.9

Release 3.9 Overview

Ordering impersonation picker, reporting-tool UX refresh, project attachment fixes, Sale Check form-save, MYOB sync serialisation, RFI template clone checklist status, silent Project status revert fix, ordering portal LOT address canonicalisation, and admin dashboard logo cap on mobile

Release 3.9 is the consolidated late-April 2026 sprint. It landed across multiple production cuts between 21 and 26 April 2026 (Git tags v3.9.0, v3.9.1, and four additional hotfixes later in the week, up through v3.11.5).

The cycle delivered the new ROLE_ADMIN impersonation picker on the ordering portal, a reporting-tool UX refresh (floating user widget, slim header, layout restructure, signed-in/impersonator banner), a fix for the "attachments disappear when a parent order was orphaned" regression, a Sale Check form-save that preserves rows on empty-submission edge cases, a serialisation layer around MYOB invoice sync that stops concurrent runs from double-posting to MYOB, per-category default checklist status on RFI template clone, a hotfix for a silent Project status regression affecting Core Milestone projects saved from the admin detail form, the long-missing port of LOT address canonicalisation to the ordering portal, and a responsive cap on the admin and customer dashboard logos so mobile viewports no longer hide the search bar.

What's in this release

AreaVersionDetail
Ordering Impersonation Picker3.9.0Paginated searchable user picker on the ordering portal. Gated on ROLE_ADMIN. Retired the ORDERING_IMPERSONATION_ALLOWED_EMAILS env var. New API Platform resource + UserRepository::findImpersonationTargets.
Reporting Tool UX3.9.0Floating collapsible user widget (shows signed-in + impersonator when switch_user active), slim header bar replacing oversized centred logo, unified form + results card widths.
Project Fixes3.9.0Attachment visibility on orphan-parent orders restored. Project::$projectOrders orphanRemoval dropped to prevent silent cascade deletions on form save.
Sale Check Form-Save3.9.0preserveCurrentStsChecklistRowsOnEmptySubmission() guard stops empty-rows submissions from stale tabs / partial JS init from wiping saved rows. Addresses the April wipe incident.
MYOB Sync Serialisation3.9.1DB-level GET_LOCK('fts_myob_invoice_sync') + claim-before-POST with per-invoice flush + per-send audit log. Stops concurrent sync runs from double-posting to MYOB.
Clone Template Checklist Status-Per-category default status on template clone: Admin to No, Part 5 to Non-Compliant, SLHC to Non-Compliant, other to TBA. Existing TBA items get refreshed; user-set statuses preserved. RFI items still Pending.
Silent Project Status Revert - Fixed-Saving a Core Milestone project from the admin form no longer silently regresses its status to Unprocessed. Three interacting defects closed - sidecar status mutation, disabled-select non-submission, and unattributed async recovery write.
Ordering Portal LOT Address Canonicalisation3.11.4Picking a "Lot on Street" suggestion in the ordering portal Create New Project form now rewrites the input to canonical LOT N (streetNo) STREET SUBURB shape instead of leaving the raw ArcGIS label. Mirrors the customer/admin fix from Release 3.7 that had silently missed the ordering portal (Trello 1762).
Admin Dashboard Logo Cap3.11.5Admin and Customer dashboard logos now cap at 56px tall on every viewport. Mobile viewports no longer have the title image span the full screen above the search bar.

Note on reverted work

A series of reporting-tool scoping fixes (fix(reports): scope reporting-tool data to user's company for non-admins and four follow-ups) and fix(sale-check): guard destructive template apply, preserve rows on same-type appear in the CHANGELOG for v3.9.0 but were reverted on the same day at request. Almario's fix: preserve existing Sale Check rows on empty submission is the live Sale Check protection.

Changelog Reference

See the full commit lists in CHANGELOG.md for this release window.