Release Notes
- Version
- 20260915.2
- Built
- 2026-09-15T21:49:10-0700
- Commit
bf73e621f9978a6ce22fbbfdd05a930c17621f4f- Commit date
- 2026-09-16T04:47:53Z
Changes in this build
- fix(reports): normalise the contractor's cost to monthly before taking the margin (WI #3387)
- fix(security): generate the download temp path instead of deriving it from the blob name (WI #3232)
- fix(security): reject unowned blob containers at the /blobs routes (WI #3232)
- fix(reminder): give the close-out heartbeat a third outcome value (WI #3225)
- test(tz): pin the suite to Pacific and run a second CI leg in UTC (WI #3222)
- fix(dates): pin getDateTime to UTC so DATE columns keep their day (WI #3224)
- docs: record that the test suite runs in the wrong timezone (WI #3222)
History
Release Notes
A running, hand-curated digest of what shipped in Client-Contracts, grouped by calendar month (newest first). Each entry links to its work item, the merging pull request, and the merge commit.
Maintenance. Once a month, an engineer sweeps the merged PRs from git log --merges --first-parent main and prepends a new section to this file. Internal-only changes (CI tweaks, dependency bumps, untracking files) are filtered out; user-visible features and bug fixes are kept. Edits to this file ride in their own PR — there's no auto-generation.
April 2026
A major month — billing-model overhaul, QuickBooks reconciliation, RBAC foundation, and a long tail of UI / data-quality improvements.
Billing model
- #935 — refresh
/billing-methodologyto match current logic (PR #1453 ·35dedea, Apr 24) - #934 — billing: honor
paid_holidays/paid_vacationon monthly contracts (PR #1425 ·d6a7a4d, Apr 22) - #930 — billing:
computeAbsenceCosthonorsPRORATION_CUTOFF(PR #1417 ·3fdf3f7, Apr 21) - #901 — billing: honor
paid_holidays/paid_vacationon daily / hourly contracts (PR #1395 ·da5ad44, Apr 21) - #900 — billing: apply
PRORATION_CUTOFFonly to monthly contracts (PR #1392 ·5fbc884, Apr 20) - #899 — billing: refactor daily / hourly to hours-first (PR #1389 ·
7988925, Apr 20) - #898 — fix: daily / hourly
daysWorkeduses absence / vacation hours, not row count (PR #1388 ·fc10f55, Apr 20) - #897 — billing: unify daily / hourly math (
daysWorked = weekdays − holidays − absences − vacation) (PR #1387 ·3ee7eea, Apr 20) - #896 — UI: hide
paid_holidays/paid_vacationin forms, pages, and reports while the model stabilized (PR #1386 ·94f4856, Apr 20) - #874 — billing: mirror billable
resource.InvoiceAdjustmentrows onto invoices (PR #1369 ·7d4a6ff, Apr 18) - #879 — billing: absences tracked on
resource.Absence(billed_at), not adjustments (PR #1360 ·f15e72a, Apr 18) - #863 — billing: proration formula cutoff at
2026-04-01(PR #1343 ·75c408f, Apr 17) - #847 — invoices: unified billing model — derive calculation from rate type; deprecate
proration_scheme(PR #1313 ·55218b7, Apr 16)
QuickBooks reconciliation
- #948 — QB reconciliation: per-client mismatch totals (PR #1447 ·
3cc7dba, Apr 24) - #940 — resource Gantt: link resource-contract bars to provider app (PR #1448 ·
e0e4215, Apr 24) - #938 — QB reconciliation: link Invoice # to ClientInvoice + default-sort by Invoice # (PR #1449 ·
6067c2b, Apr 24) - #943 — closeOut: number new invoices from
MAX(existing) + 1, notcount + 1(PR #1435 ·a381b81, Apr 23) - #929 — qbRecon: use
client.qb_idfor explicit client↔QB customer mapping (PR #1414 ·620fc88, Apr 21) - #927 — qbRecon: join
intuit.Customeronqb_id, notid(PR #1408 ·a7ea309, Apr 21) - #908 — qbRecon: annotate mismatches to preserve investigation findings (PR #1404 ·
827e349, Apr 21) - #906 — qbRecon: subtract billed absences when computing
dbTotal(PR #1398 ·db686a6, Apr 21) - #846 — reports: QuickBooks reconciliation report (PR #1312 ·
7c5df6f, Apr 16) - #848 — reports: import missing invoices from QuickBooks per client (PR #1316 ·
777dfe3, Apr 16) - fix: QB reconciliation
doc_numbermatching independent of customer match (PR #1321 ·2eea4e7, Apr 16) - reports: add client filter to QB reconciliation report (PR #1317 ·
c70e58c, Apr 16)
Reports & access control
- #904 — reports: add Contracts Missing SOW report (PR #1450 ·
585deac, Apr 24) - #947 — DataTables: rename
data-sortattr →data-orderand parse ISO dates so default sorting actually works (PR #1438 ·0533a3b, PR #1441 ·ed6f57d, Apr 24) - #764 — RBAC: per-user report access (admin-granted) (PR #1333 ·
bda0938, Apr 17) - #764 — RBAC: add three-tier role hierarchy (Admin > User > Commenter) (PR #1328 ·
ea826bc, Apr 16)
Invoice & contract UX
- #903 — client: allow uploading an MSA PDF (PR #1452 ·
60c94dc, Apr 24) - #902 — blobs: redirect back to parent record after upload / delete (PR #1451 ·
04d7052, Apr 24) - #931 — resource Gantt: min-width + border for very short contracts (PR #1422 ·
9eb65b3, Apr 22) - #886 — fix: contract invoice page shows Final Amount after absences (PR #1366 ·
0ca263a, Apr 18) - #885 — fix: client-invoice Details footer used wrong context for absences total (PR #1365 ·
26f5bbc, Apr 18) - #884 — fix: delete confirms prompt twice on form-based delete buttons (PR #1364 ·
1538942, Apr 18) - #883 — invoices: gate contract-invoice delete button + improve confirm message (PR #1363 ·
fa12f14, Apr 18) - #882 — invoices: add Delete invoice button on the client invoice page (PR #1362 ·
276ce78, Apr 18) - #881 — fix: store actual service period on close-out invoices (PR #1361 ·
d987230, Apr 18) - #875 — fix: contract invoice page was double-counting absence deductions (PR #1357 ·
ba59d5d, Apr 17) - #877 — fix: cascade-delete adjustments when deleting a contract invoice (PR #1356 ·
499ad46, Apr 17) - #872 — invoices: rename Comments column header "Comment" to "Details" (PR #1353 ·
b06a6d0, Apr 17) - #866 — invoices: show billable units (days / hours) for daily & hourly lines (PR #1352 ·
e5edaac, Apr 17) - #871 — invoices: add Total column to the client invoices list (PR #1351 ·
28c77d8, Apr 17) - #869 — invoices: mark prorated lines with
(prorated, date - date)note (PR #1349 ·5a75071, Apr 17) - #868 — invoices: add Comments section header on the client invoice page (PR #1348 ·
e033e9d, Apr 17) - #867 — invoices: hide Dept Code table when no lines have a dept code (PR #1347 ·
3090058, Apr 17) - #865 — invoices: surface adjustments and absences on the client invoice page (PR #1346 ·
0c51aa6, Apr 17) - #864 — invoices: itemize absences on the contract invoice page (PR #1345 ·
67307f1, Apr 17) - fix: contract invoice detail page crash on missing resource contract (PR #1344 ·
d92aede, Apr 17) - #849 — invoices: add ability to approve draft invoices (PR #1319 ·
f549c40, Apr 16) - #836 — invoices: add bulk generation for a date range per client (PR #1318 ·
8461598, Apr 16) - #150 — invoices: custom message block for client invoices (PR #1309 ·
90e1ecf, Apr 15) - #838 — invoices: split client invoices by
invoice_groupon close-out, surface group on contract detail (PR #1297, PR #1298, Apr 14) - #836 — invoices: add per-client and global monthly close-out actions (PR #1292, PR #1293, Apr 14)
- #835 — invoices: add status /
generated_byfields, monthly auto-generation cron, status & source badges (PR #1289, PR #1290, PR #1291, Apr 14) - fix: stack action buttons into rows on client-invoices page (PR #1320 ·
f46001d, Apr 16) - fix: zero-pad invoice numbers to 4 digits (e.g.
YELL-0001, notYELL-1) (PR #1322 ·d391560, Apr 16) - #281 — feat: add typeahead suggestions for contract team field (PR #1282, Apr 13)
- fix: redirect to contract page after update instead of using
back(PR #1283, Apr 13)
Security & infra
- #275 — security: obfuscate stored PDF file names with UUIDs (PR #1315 ·
e98660c, Apr 16) - #828 — security: enable Content Security Policy in report-only mode (PR #1310, Apr 15)
- #845 — CSP phase-1 follow-up (PR #1355 ·
1334665, Apr 17) - #855 — infra: derive
SESSION_SECRETfromuniqueString(resourceGroup().id)(PR #1354 ·ae2e50c, Apr 17) - #369 — fix: remove insecure TLS bypass from email transport (PR #1281, Apr 13)
- #829 — auth: redirect unauthenticated users to sign-in instead of returning 401 (PR #1277, Apr 13)
- #870 — auth: add dev-only auth bypass via
X-Dev-Userheader (PR #1350 ·50a0133, Apr 17) - #841 — cleanup: remove
cosmos_idreferences from contract renew (PR #1327, Apr 16) - #851 — contracts: add
cancelledflag, skip cancelled from billing (PR #1325, Apr 16) - fix: coerce
cancelledcheckbox value to Boolean for Prisma (PR #1330 ·a930b0a, Apr 16) - #769 — test: add Jest framework and baseline test coverage (PR #1280, Apr 13)
- #767 — reliability: add distributed lock for in-process cron jobs (PR #1247, Apr 11)
Release-notes plumbing (this page)
- #829 — release-notes: pipeline generates
build-info.jsonand applies OCI labels (PR #1254, Apr 12) - #829 — release-notes: render with layout and expose build info (PR #1253, Apr 12)
March 2026
Quiet month — branch sync to prd only, no feature merges.
October 2025
- New report: Paid Vacation (Oct 30)
July 2025
- #398 — Client Invoice List and Client Invoice Detail (PR #711, Jul 29)
May 2025
- #184 — audit logging: contract comments and discounts (PR #673, May 7)
- charts: remove decimals from y-axis (May 10)
April 2025
- Add Redis session store and logging utility (Apr 2)
December 2024
- invoices: add invoice sections (PR #596, Dec 9)
November 2024
- delivery cost: total by month (Nov 24)
- delivery cost: per-month breakdown (Nov 22)
- delivery cost: column + total in main table (Nov 18)
- add Payments section (Nov 6)
- client export to spreadsheet (Nov 1)
October 2024
- fix month charts (Oct 28)
- replace Contract Start with Margin % column (Oct 24)
- export all contracts (Oct 7)
September 2024
- #291 — margin percent column (Sep 19)
- alternative charting libraries (Sep 12)
- filter comments by service date (Sep 11)
- export to spreadsheet on additional reports (Sep 11)
- filter contracts longer than one year (Sep 11)
August 2024
- monthly contracts report fixes (Aug 7)
- rename of monthly contracts report (Aug 3)
July 2024
- set up CI with Azure Pipelines (Jul 15)
May 2024
- support daily and hourly rate types (May 4)
Earlier (2021–2022)
Project foundation: initial CI setup, admin group bootstrapping, and miscellaneous early commits. Not individually catalogued — git log --first-parent main is the source of truth for that period.