Release Notes

Currently running: 20260601.18 · e6abac4
Version
20260601.18
Built
2026-06-01T13:10:44-0700
Commit
e6abac4c08eea632004c80461b3d189bb29e887d
Commit date
2026-06-01T20:09:23Z

Changes in this build
  • tz: fix remaining mixed-zone date comparisons (WI #1760 audit follow-up)

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.


June 2026

  • reports/startstop: UTC-pin window + parseDateColumn so 1st-of-month starts show (WI #1759) (PR #2242 · 8d2421d, Jun 1)
  • Merge pull request 2242 from bug-1759-startstop-tz into main (PR #2244 · 7609fcc, Jun 1)
  • cron: dedup monthly auto-invoice on (contract, month) not end_date (WI #1752) (PR #2234 · 9f4ee5c, Jun 1)
  • Merge pull request 2234 from bug-1752-cron-dedup into main (PR #2236 · 061db8a, Jun 1)
  • billing: prorate label only when workdays are actually lost (WI #1753) (PR #2230 · ae9f3ef, Jun 1)
  • Merge pull request 2230 from bug-1753-prorated-label into main (PR #2232 · 0cf8ff0, Jun 1)
  • clients: degrade gracefully when intuit access is denied (WI #1730) (PR #2225 · 7fd0676, Jun 1)
  • Merge pull request 2225 from bug-1730-clients-intuit-fallback into main (PR #2227 · 42d7a0d, Jun 1)
  • docs: list app-owned blob containers in README (WI #969) (PR #2216 · 77d1019, Jun 1)
  • tz: UTC-pin contractInterval in computeInvoiceAmount (WI #1728) (PR #2220 · 46ed0f0, Jun 1)
  • Merge pull request 2220 from bug-1728-mixed-zone-interval into main (PR #2223 · e67247c, Jun 1)
  • tz: migrate date-only render + period-boundary sites to parseDateColumn (WI #1723) (PR #2208 · 20a6ccb, Jun 1)
  • Merge pull request 2208 from task-1723-date-render-sweep into main (PR #2211 · dab69bf, Jun 1)
  • tz: add parseDateColumn helper for DATE columns (WI #1722) (PR #2201 · ef78add, Jun 1)
  • Merge pull request 2201 from task-1722-parse-date-column into main (PR #2204 · 8b69c27, Jun 1)
  • ci: run Test stage on PRs (WI #1133) (PR #2187 · fa39ea2, Jun 1)
  • tz: pin app process timezone to America/Los_Angeles (WI #991) (PR #2189 · a4206d0, Jun 1)
  • secrets: switch plaintext app settings to @Microsoft.KeyVault refs (WI #1160) (PR #2196 · e18955b, Jun 1)
  • tz: pin date-only column parsing to UTC (WI #1720) (PR #2197 · ae69a7f, Jun 1)
  • Merge pull request 2197 from bug-1720-tz-date-render into main (PR #2200 · 4975433, Jun 1)
  • session-secret: adopt portfolio standard via Bicep newGuid() (WI #1576) (PR #2166 · 7d14428, Jun 1)
  • bicep: include DOCKER_REGISTRY_SERVER_* in appSettings (WI #1576 follow-up) (PR #2168 · 0500987, Jun 1)
  • env: harden .gitignore + add .env.dev.example template (WI #1584) (PR #2173 · a3b6c50, Jun 1)
  • db: switch to dedicated bydrec_client_contracts PG role (WI #1425) (PR #2177 · b6e9fad, Jun 1)
  • pipeline: switch to WIF ACR auth via az acr login (WI #1443) (PR #2179 · dadf514, Jun 1)
  • Merge pull request 2179 from bug-1443-wif-sc-migration into main (PR #2180 · 65805c6, Jun 1)
  • Revert "pipeline: switch to WIF ACR auth via az acr login (WI #1443)" (PR #2181 · e9dcd54, Jun 1)
  • Merge pull request 2181 from revert-1443-wif-blocked-on-pt-promote into main (PR #2182 · 35666f6, Jun 1)
  • npm: enforce 7-day min-release-age supply-chain policy (WI #1103) (PR #2185 · 5646a25, Jun 1)
  • Merge pull request 2185 from bug-1103-min-release-age into main (PR #2186 · b37d0dc, Jun 1)
  • Merge pull request 2186 from main into stg (PR #2188 · f45aa66, Jun 1)
  • charts: swap dead Highcharts CDN to jsdelivr; harden route (WI #1698) (PR #2160 · 199af58, Jun 1)
  • Merge pull request 2160 from bug-1698-monthly-contracts-charts into main (PR #2161 · 091d088, Jun 1)
  • Merge pull request 2161 from main into stg (PR #2162 · 8bad862, Jun 1)

May 2026

  • #1526 — deps: bump @bydrec/prisma-schema 1.14.0 → 1.16.0 (cosmos_id-free) (WI #1526) (PR #1999 · d6b1363, May 25)
  • Merge pull request 1999 from issue-1526-prisma-schema-1.16-cosmos-id into main (PR #2000 · 96e8b13, May 25)
  • Merge pull request 2000 from main into stg (PR #2002 · b8cbd82, May 25)
  • #995 — billing: skip cancelled contracts in every invoice-generation path (WI #995) (PR #1542 · 91b6077, May 16)
  • Merge pull request 1542 from issue-995-skip-cancelled-contracts into main (PR #1825 · 4de392b, May 16)
  • Merge pull request 1825 from main into stg (PR #1827 · ae56ac3, May 16)
  • #1197 — helmet: set Referrer-Policy to same-origin so redirect('back') works (WI #1197) (PR #1816 · dd38d28, May 16)
  • Merge pull request 1816 from issue-1197-helmet-referrer-policy into main (PR #1817 · 912e3d6, May 16)
  • Merge pull request 1817 from main into stg (PR #1819 · a66b44b, May 16)
  • #973 — contract-invoice: polish UI to match client-invoice page (WI #973) (PR #1813 · bbf5e14, May 16)
  • Merge pull request 1813 from issue-973-contract-invoice-polish into main (PR #1814 · a55361b, May 16)
  • Merge pull request 1814 from main into stg (PR #1815 · c1df7a1, May 16)
  • invoices: include adjustments + billed absences in /invoices totals (PR #1539 · 69736a3, May 1)
  • Merge pull request 1539 from fix-invoices-page-total-includes-adjustments-and-absences into main (PR #1540 · 77249db, May 1)
  • Merge pull request 1540 from main into stg (PR #1541 · b7570b8, May 1)
  • #990 — invoices: explain holiday/vacation deductions inline (WI #990) (PR #1536 · 7ac03a4, May 1)
  • Merge pull request 1536 from issue-990-deduction-notes into main (PR #1537 · 99ceb1f, May 1)
  • Merge pull request 1537 from main into stg (PR #1538 · 1114659, May 1)

April 2026

  • #987 — month selectors: include current month on the last day (WI #987) (PR #1532 · 396ddf5, Apr 30)
  • Merge pull request 1532 from issue-987-current-month-selectors into main (PR #1533 · 0e38151, Apr 30)
  • Merge pull request 1533 from main into stg (PR #1534 · 9714a6c, Apr 30)
  • #989 — client-invoices: add Status column derived from QB + line states (WI #989) (PR #1529 · ccb24dc, Apr 30)
  • Merge pull request 1529 from issue-989-client-invoice-status-column into main (PR #1530 · ca14e56, Apr 30)
  • Merge pull request 1530 from main into stg (PR #1531 · 0d9fefc, Apr 30)
  • #988 — client-invoice: sortable column headers on the invoice-line table (WI #988) (PR #1526 · 2b4b005, Apr 30)
  • Merge pull request 1526 from issue-988-client-invoice-sort into main (PR #1527 · 433f3dd, Apr 30)
  • Merge pull request 1527 from main into stg (PR #1528 · 8fd9b59, Apr 30)
  • #987 — fix: include current month in close-out dropdown on last day of month (PR #1523 · 505eeb2, Apr 30)
  • Merge pull request 1523 from issue-987 into main (PR #1524 · d9ca4ef, Apr 30)
  • Merge pull request 1524 from main into stg (PR #1525 · e354037, Apr 30)
  • #974 — ui: dynamic per-page tags (WI #974) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1496">PR #1496</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/396835f"><code>396835f</code></a>, Apr 28)</li> <li>Merge pull request 1496 from issue-974-dynamic-page-titles into main (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1497">PR #1497</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/798ab60"><code>798ab60</code></a>, Apr 28)</li> <li>Merge pull request 1497 from main into stg (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1498">PR #1498</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/bf4f1ad"><code>bf4f1ad</code></a>, Apr 28)</li> <li>Revert "Merge pull request 1490 from issue-967-wire-holiday-worked into main" (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1493">PR #1493</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/50b7fac"><code>50b7fac</code></a>, Apr 28)</li> <li>Merge pull request 1493 from revert-967-wrong-repo into main (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1494">PR #1494</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/bc40d7e"><code>bc40d7e</code></a>, Apr 28)</li> <li>Merge pull request 1494 from main into stg (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1495">PR #1495</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/faf64c2"><code>faf64c2</code></a>, Apr 28)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/967">#967</a> — billing: wire HolidayWorked into deduction path + UI (WI #967) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1490">PR #1490</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/f608853"><code>f608853</code></a>, Apr 28)</li> <li>Merge pull request 1490 from issue-967-wire-holiday-worked into main (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1491">PR #1491</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/3fbb2ec"><code>3fbb2ec</code></a>, Apr 28)</li> <li>Merge pull request 1491 from main into stg (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1492">PR #1492</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/7e4c6c2"><code>7e4c6c2</code></a>, Apr 28)</li> <li>client-invoice: move attachments scope from bundle → line (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1484">PR #1484</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/706b850"><code>706b850</code></a>, Apr 27)</li> <li>Merge pull request 1484 from fix-invoice-attachments-line-scope into main (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1485">PR #1485</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/75012f2"><code>75012f2</code></a>, Apr 27)</li> <li>Merge pull request 1485 from main into stg (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1486">PR #1486</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/eb5d442"><code>eb5d442</code></a>, Apr 27)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/942">#942</a> — Bydrec-Mail MCP server (WI #942) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1479">PR #1479</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/2281267"><code>2281267</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/942">#942</a> — mcp-mail: persist finish-rbac.ps1 in the repo (WI #942) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1480">PR #1480</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/b8d825b"><code>b8d825b</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/968">#968</a> — client-invoice: support attachments via invoicedocs blob container (WI #968) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1481">PR #1481</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/b501366"><code>b501366</code></a>, Apr 27)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/946">#946</a> — qbReconciliation: per-resource breakdown UI + admin recompute (WI #946 phase 2b) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1478">PR #1478</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/f7a58a9"><code>f7a58a9</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/946">#946</a> — qbAttribution: persistence + batch recompute (WI #946 phase 2a) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1477">PR #1477</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/baed0c2"><code>baed0c2</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/946">#946</a> — qbAttribution: add algorithm + eval harness (WI #946 phase 1) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1474">PR #1474</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/151e931"><code>151e931</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/937">#937</a> — contracts: support per-contract billable_monthly_hours (WI #937) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1472">PR #1472</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/d3a088c"><code>d3a088c</code></a>, Apr 26)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/933">#933</a> — client-invoice: support supplemental / manual line items (WI #933) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1465">PR #1465</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/def3d25"><code>def3d25</code></a>, Apr 26)</li> <li>ci: switch NodeTool@0 → UseNode@1 to clear the deprecation warning (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1466">PR #1466</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/ac20ad1"><code>ac20ad1</code></a>, Apr 26) A major month — billing-model overhaul, QuickBooks reconciliation, RBAC foundation, and a long tail of UI / data-quality improvements.</li> </ul> <p><strong>Billing model</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/935">#935</a> — refresh <code>/billing-methodology</code> to match current logic (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1453">PR #1453</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/35dedea"><code>35dedea</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/934">#934</a> — billing: honor <code>paid_holidays</code> / <code>paid_vacation</code> on monthly contracts (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1425">PR #1425</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/d6a7a4d"><code>d6a7a4d</code></a>, Apr 22)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/930">#930</a> — billing: <code>computeAbsenceCost</code> honors <code>PRORATION_CUTOFF</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1417">PR #1417</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/3fdf3f7"><code>3fdf3f7</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/901">#901</a> — billing: honor <code>paid_holidays</code> / <code>paid_vacation</code> on daily / hourly contracts (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1395">PR #1395</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/da5ad44"><code>da5ad44</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/900">#900</a> — billing: apply <code>PRORATION_CUTOFF</code> only to monthly contracts (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1392">PR #1392</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/5fbc884"><code>5fbc884</code></a>, Apr 20)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/899">#899</a> — billing: refactor daily / hourly to hours-first (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1389">PR #1389</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/7988925"><code>7988925</code></a>, Apr 20)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/898">#898</a> — fix: daily / hourly <code>daysWorked</code> uses absence / vacation hours, not row count (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1388">PR #1388</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/fc10f55"><code>fc10f55</code></a>, Apr 20)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/897">#897</a> — billing: unify daily / hourly math (<code>daysWorked = weekdays − holidays − absences − vacation</code>) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1387">PR #1387</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/3ee7eea"><code>3ee7eea</code></a>, Apr 20)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/896">#896</a> — UI: hide <code>paid_holidays</code> / <code>paid_vacation</code> in forms, pages, and reports while the model stabilized (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1386">PR #1386</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/94f4856"><code>94f4856</code></a>, Apr 20)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/874">#874</a> — billing: mirror billable <code>resource.InvoiceAdjustment</code> rows onto invoices (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1369">PR #1369</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/7d4a6ff"><code>7d4a6ff</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/879">#879</a> — billing: absences tracked on <code>resource.Absence</code> (<code>billed_at</code>), not adjustments (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1360">PR #1360</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/f15e72a"><code>f15e72a</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/863">#863</a> — billing: proration formula cutoff at <code>2026-04-01</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1343">PR #1343</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/75c408f"><code>75c408f</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/847">#847</a> — invoices: unified billing model — derive calculation from rate type; deprecate <code>proration_scheme</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1313">PR #1313</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/55218b7"><code>55218b7</code></a>, Apr 16)</li> </ul> <p><strong>QuickBooks reconciliation</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/948">#948</a> — QB reconciliation: per-client mismatch totals (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1447">PR #1447</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/3cc7dba"><code>3cc7dba</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/940">#940</a> — resource Gantt: link resource-contract bars to provider app (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1448">PR #1448</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/e0e4215"><code>e0e4215</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/938">#938</a> — QB reconciliation: link Invoice # to ClientInvoice + default-sort by Invoice # (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1449">PR #1449</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/6067c2b"><code>6067c2b</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/943">#943</a> — closeOut: number new invoices from <code>MAX(existing) + 1</code>, not <code>count + 1</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1435">PR #1435</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/a381b81"><code>a381b81</code></a>, Apr 23)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/929">#929</a> — qbRecon: use <code>client.qb_id</code> for explicit client↔QB customer mapping (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1414">PR #1414</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/620fc88"><code>620fc88</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/927">#927</a> — qbRecon: join <code>intuit.Customer</code> on <code>qb_id</code>, not <code>id</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1408">PR #1408</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/a7ea309"><code>a7ea309</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/908">#908</a> — qbRecon: annotate mismatches to preserve investigation findings (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1404">PR #1404</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/827e349"><code>827e349</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/906">#906</a> — qbRecon: subtract billed absences when computing <code>dbTotal</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1398">PR #1398</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/db686a6"><code>db686a6</code></a>, Apr 21)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/846">#846</a> — reports: QuickBooks reconciliation report (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1312">PR #1312</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/7c5df6f"><code>7c5df6f</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/848">#848</a> — reports: import missing invoices from QuickBooks per client (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1316">PR #1316</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/777dfe3"><code>777dfe3</code></a>, Apr 16)</li> <li>fix: QB reconciliation <code>doc_number</code> matching independent of customer match (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1321">PR #1321</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/2eea4e7"><code>2eea4e7</code></a>, Apr 16)</li> <li>reports: add client filter to QB reconciliation report (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1317">PR #1317</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/c70e58c"><code>c70e58c</code></a>, Apr 16)</li> </ul> <p><strong>Reports & access control</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/904">#904</a> — reports: add Contracts Missing SOW report (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1450">PR #1450</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/585deac"><code>585deac</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/947">#947</a> — DataTables: rename <code>data-sort</code> attr → <code>data-order</code> and parse ISO dates so default sorting actually works (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1438">PR #1438</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/0533a3b"><code>0533a3b</code></a>, <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1441">PR #1441</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/ed6f57d"><code>ed6f57d</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/764">#764</a> — RBAC: per-user report access (admin-granted) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1333">PR #1333</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/bda0938"><code>bda0938</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/764">#764</a> — RBAC: add three-tier role hierarchy (Admin > User > Commenter) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1328">PR #1328</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/ea826bc"><code>ea826bc</code></a>, Apr 16)</li> </ul> <p><strong>Invoice & contract UX</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/903">#903</a> — client: allow uploading an MSA PDF (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1452">PR #1452</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/60c94dc"><code>60c94dc</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/902">#902</a> — blobs: redirect back to parent record after upload / delete (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1451">PR #1451</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/04d7052"><code>04d7052</code></a>, Apr 24)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/931">#931</a> — resource Gantt: min-width + border for very short contracts (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1422">PR #1422</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/9eb65b3"><code>9eb65b3</code></a>, Apr 22)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/886">#886</a> — fix: contract invoice page shows Final Amount after absences (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1366">PR #1366</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/0ca263a"><code>0ca263a</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/885">#885</a> — fix: client-invoice Details footer used wrong context for absences total (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1365">PR #1365</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/26f5bbc"><code>26f5bbc</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/884">#884</a> — fix: delete confirms prompt twice on form-based delete buttons (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1364">PR #1364</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/1538942"><code>1538942</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/883">#883</a> — invoices: gate contract-invoice delete button + improve confirm message (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1363">PR #1363</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/fa12f14"><code>fa12f14</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/882">#882</a> — invoices: add Delete invoice button on the client invoice page (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1362">PR #1362</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/276ce78"><code>276ce78</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/881">#881</a> — fix: store actual service period on close-out invoices (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1361">PR #1361</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/d987230"><code>d987230</code></a>, Apr 18)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/875">#875</a> — fix: contract invoice page was double-counting absence deductions (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1357">PR #1357</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/ba59d5d"><code>ba59d5d</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/877">#877</a> — fix: cascade-delete adjustments when deleting a contract invoice (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1356">PR #1356</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/499ad46"><code>499ad46</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/872">#872</a> — invoices: rename Comments column header "Comment" to "Details" (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1353">PR #1353</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/b06a6d0"><code>b06a6d0</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/866">#866</a> — invoices: show billable units (days / hours) for daily & hourly lines (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1352">PR #1352</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/e5edaac"><code>e5edaac</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/871">#871</a> — invoices: add Total column to the client invoices list (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1351">PR #1351</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/28c77d8"><code>28c77d8</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/869">#869</a> — invoices: mark prorated lines with <code>(prorated, date - date)</code> note (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1349">PR #1349</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/5a75071"><code>5a75071</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/868">#868</a> — invoices: add Comments section header on the client invoice page (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1348">PR #1348</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/e033e9d"><code>e033e9d</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/867">#867</a> — invoices: hide Dept Code table when no lines have a dept code (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1347">PR #1347</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/3090058"><code>3090058</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/865">#865</a> — invoices: surface adjustments and absences on the client invoice page (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1346">PR #1346</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/0c51aa6"><code>0c51aa6</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/864">#864</a> — invoices: itemize absences on the contract invoice page (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1345">PR #1345</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/67307f1"><code>67307f1</code></a>, Apr 17)</li> <li>fix: contract invoice detail page crash on missing resource contract (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1344">PR #1344</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/d92aede"><code>d92aede</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/849">#849</a> — invoices: add ability to approve draft invoices (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1319">PR #1319</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/f549c40"><code>f549c40</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/836">#836</a> — invoices: add bulk generation for a date range per client (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1318">PR #1318</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/8461598"><code>8461598</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/150">#150</a> — invoices: custom message block for client invoices (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1309">PR #1309</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/90e1ecf"><code>90e1ecf</code></a>, Apr 15)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/838">#838</a> — invoices: split client invoices by <code>invoice_group</code> on close-out, surface group on contract detail (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1297">PR #1297</a>, <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1298">PR #1298</a>, Apr 14)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/836">#836</a> — invoices: add per-client and global monthly close-out actions (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1292">PR #1292</a>, <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1293">PR #1293</a>, Apr 14)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/835">#835</a> — invoices: add status / <code>generated_by</code> fields, monthly auto-generation cron, status & source badges (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1289">PR #1289</a>, <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1290">PR #1290</a>, <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1291">PR #1291</a>, Apr 14)</li> <li>fix: stack action buttons into rows on client-invoices page (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1320">PR #1320</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/f46001d"><code>f46001d</code></a>, Apr 16)</li> <li>fix: zero-pad invoice numbers to 4 digits (e.g. <code>YELL-0001</code>, not <code>YELL-1</code>) (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1322">PR #1322</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/d391560"><code>d391560</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/281">#281</a> — feat: add typeahead suggestions for contract team field (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1282">PR #1282</a>, Apr 13)</li> <li>fix: redirect to contract page after update instead of using <code>back</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1283">PR #1283</a>, Apr 13)</li> </ul> <p><strong>Security & infra</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/275">#275</a> — security: obfuscate stored PDF file names with UUIDs (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1315">PR #1315</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/e98660c"><code>e98660c</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/828">#828</a> — security: enable Content Security Policy in report-only mode (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1310">PR #1310</a>, Apr 15)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/845">#845</a> — CSP phase-1 follow-up (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1355">PR #1355</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/1334665"><code>1334665</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/855">#855</a> — infra: derive <code>SESSION_SECRET</code> from <code>uniqueString(resourceGroup().id)</code> (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1354">PR #1354</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/ae2e50c"><code>ae2e50c</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/369">#369</a> — fix: remove insecure TLS bypass from email transport (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1281">PR #1281</a>, Apr 13)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/829">#829</a> — auth: redirect unauthenticated users to sign-in instead of returning 401 (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1277">PR #1277</a>, Apr 13)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/870">#870</a> — auth: add dev-only auth bypass via <code>X-Dev-User</code> header (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1350">PR #1350</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/50a0133"><code>50a0133</code></a>, Apr 17)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/841">#841</a> — cleanup: remove <code>cosmos_id</code> references from contract renew (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1327">PR #1327</a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/851">#851</a> — contracts: add <code>cancelled</code> flag, skip cancelled from billing (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1325">PR #1325</a>, Apr 16)</li> <li>fix: coerce <code>cancelled</code> checkbox value to Boolean for Prisma (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1330">PR #1330</a> · <a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/commit/a930b0a"><code>a930b0a</code></a>, Apr 16)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/769">#769</a> — test: add Jest framework and baseline test coverage (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1280">PR #1280</a>, Apr 13)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/767">#767</a> — reliability: add distributed lock for in-process cron jobs (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1247">PR #1247</a>, Apr 11)</li> </ul> <p><strong>Release-notes plumbing (this page)</strong></p> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/829">#829</a> — release-notes: pipeline generates <code>build-info.json</code> and applies OCI labels (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1254">PR #1254</a>, Apr 12)</li> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/829">#829</a> — release-notes: render with layout and expose build info (<a href="https://dev.azure.com/bydrecinc/Client-Contracts/_git/Client-Contracts/pullrequest/1253">PR #1253</a>, Apr 12)</li> </ul> <hr> <h2>March 2026</h2> <p>Quiet month — branch sync to <code>prd</code> only, no feature merges.</p> <hr> <h2>October 2025</h2> <ul> <li>New report: Paid Vacation (Oct 30)</li> </ul> <hr> <h2>July 2025</h2> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/398">#398</a> — Client Invoice List and Client Invoice Detail (PR #711, Jul 29)</li> </ul> <hr> <h2>May 2025</h2> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/184">#184</a> — audit logging: contract comments and discounts (PR #673, May 7)</li> <li>charts: remove decimals from y-axis (May 10)</li> </ul> <hr> <h2>April 2025</h2> <ul> <li>Add Redis session store and logging utility (Apr 2)</li> </ul> <hr> <h2>December 2024</h2> <ul> <li>invoices: add invoice sections (PR #596, Dec 9)</li> </ul> <hr> <h2>November 2024</h2> <ul> <li>delivery cost: total by month (Nov 24)</li> <li>delivery cost: per-month breakdown (Nov 22)</li> <li>delivery cost: column + total in main table (Nov 18)</li> <li>add Payments section (Nov 6)</li> <li>client export to spreadsheet (Nov 1)</li> </ul> <hr> <h2>October 2024</h2> <ul> <li>fix month charts (Oct 28)</li> <li>replace Contract Start with Margin % column (Oct 24)</li> <li>export all contracts (Oct 7)</li> </ul> <hr> <h2>September 2024</h2> <ul> <li><a href="https://dev.azure.com/bydrecinc/Client-Contracts/_workitems/edit/291">#291</a> — margin percent column (Sep 19)</li> <li>alternative charting libraries (Sep 12)</li> <li>filter comments by service date (Sep 11)</li> <li>export to spreadsheet on additional reports (Sep 11)</li> <li>filter contracts longer than one year (Sep 11)</li> </ul> <hr> <h2>August 2024</h2> <ul> <li>monthly contracts report fixes (Aug 7)</li> <li>rename of monthly contracts report (Aug 3)</li> </ul> <hr> <h2>July 2024</h2> <ul> <li>set up CI with Azure Pipelines (Jul 15)</li> </ul> <hr> <h2>May 2024</h2> <ul> <li>support daily and hourly rate types (May 4)</li> </ul> <hr> <h2>Earlier (2021–2022)</h2> <p>Project foundation: initial CI setup, admin group bootstrapping, and miscellaneous early commits. Not individually catalogued — <code>git log --first-parent main</code> is the source of truth for that period.</p> </div> </div> </main> <!-- Footer --> <footer class="text-center text-lg-start bg-light text-muted footer"> <!-- Copyright --> <div class="text-center p-4" style="background-color: rgba(0, 0, 0, 0.05);"> © 2026 Copyright Bydrec. All rights reserved.   |   <a href="/release-notes" class="text-muted">Release Notes</a>  |  <a href="/billing-methodology" class="text-muted">Billing Methodology</a> <br><small class="text-muted"> Build: 2026-06-01T13:10:44-0700 | Commit: e6abac4c08eea632004c80461b3d189bb29e887d (2026-06-01T20:09:23Z) </small> </div> <!-- Copyright --> </footer> <!-- Footer --> <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <!-- <script src="https://unpkg.com/@popperjs/core@2"></script> --> <script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script> <script src="/tableexport/Blob.min.js"> </script> <script src="/tableexport/xls.core.min.js"> </script> <script src="/tableexport/FileSaver.min.js"> </script> <script src="/tableexport/js/tableexport.min.js"> </script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js"></script> <script type="text/javascript" src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/js/bootstrap-select.min.js"></script> <script src="https://d3js.org/d3-dsv.v1.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.11.3/main.min.js"></script> <script src="https://cdn.plot.ly/plotly-2.24.1.min.js" charset="utf-8"></script> <script src="/js/delegated-handlers.js"></script> <script type="text/javascript" nonce="wGBaYxkKNe4Ynv33q2ewAQ=="> jQuery.fn.dataTable.Api.register('sum()', function () { return this.flatten().reduce(function (a, b) { if (typeof a === 'string') { a = a.replace(/[^\d.-]/g, '') * 1; } if (typeof b === 'string') { b = b.replace(/[^\d.-]/g, '') * 1; } return a + b; }, 0); }); $(document).ready(function () { // Bootstrap select $('select').selectpicker(); }); </script> </body> </html>