v5.10.3 26 February 2026 Feature Fix Improvement

Quote Preview Endpoint & Currency Boundary Hardening

Quote Preview API

  • New endpoint: POST /quotes/preview — calculates line totals, VAT, and quote total without persisting. Supports decimal quantities and uses Decimal.js arithmetic to match the create route exactly.
  • API documentation — full SpeyDocs entry with curl examples, parameter descriptions, and sample response. Appears under Quotes in the docs site.

Server-Side Calculation Enforcement

  • Quote creation — the new quote form now uses the backend preview endpoint for all line-level and summary calculations. The frontend no longer performs any VAT or monetary arithmetic.
  • Quote editing — edit mode on the quote detail page uses the same backend preview. Totals update live as you modify line items.
  • Invoice editing — edit mode on the invoice detail page now uses the existing /invoices/preview endpoint, replacing the previous client-side calculation.
  • Decimal quantity support — quote preview accepts fractional quantities (e.g. 1.5 hours), matching what the create endpoint already supports.

Currency Boundary Fixes

  • Unit price display in edit mode — when editing an existing quote or invoice, unit prices now display correctly in pounds rather than raw pence values.
  • Unit price submission — form submission now converts pounds to pence consistently via toPence(), fixing a latent boundary bug where pounds could be sent where the API expects minor units.

Form State Stability

  • Event-driven hydration — quote and invoice edit forms now populate via an explicit user action rather than a background effect. This prevents unsaved changes from being overwritten if the browser refreshes data in the background.
  • Select component — resolved the “changing from uncontrolled to controlled” React warning globally. The Radix UI Select primitive now stays in controlled mode for its entire lifecycle.
  • VAT rate guard — selecting an account no longer clears the VAT rate dropdown when the account’s default rate doesn’t match a standard option.

Dashboard

  • Chart aggregation clarity — revenue trend and status donut calculations are now clearly documented as visualisation-only, separated from accounting logic.

Code Quality

  • Frontend linter: zero violations — the custom linter now reports 0 errors and 0 warnings across the entire frontend codebase. All temporary suppressions from the currency consolidation work have been removed, with only permanent suppressions remaining for legitimate chart aggregations.

Bug Fixes

  • Fixed quote and invoice edit forms sending unit prices in pounds instead of pence on save.
  • Fixed unit price fields showing pence values (e.g. 10000) instead of pounds (e.g. 100.00) when entering edit mode.
  • Fixed Select component causing React state warnings across all pages using dropdowns.