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/previewendpoint, 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.