All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Monetary and numeric fields now hydrate correctly. Sage serialises amounts as numeric strings on the wire (e.g.
"367.09"), which the DTO mappers previously rejected — silently mapping everytotal_amount,outstanding_amount,net_amount, etc. tonull.MapsAttributes::float()now coerces numeric strings, andinteger()coerces whole-number strings. Affects every DTO with a numeric field (invoices, payments, quick entries, ...).
purchaseQuickEntries()resource on theSageclient — Sage purchase quick entries are where many businesses record supplier bills/payables (rather than full purchase invoices).
- Initial v0.1 read SDK built on Saloon v4.
SageConnector: OAuth2 authorization-code grant with rotating-refresh handling, mandatoryX-Businessheader, body-based$nextpagination, Sage rate limits (100/min, 2500/day) and exponential backoff on 429/5xx.Sagehigh-level client: OAuth handshake helpers, guaranteed-fresh access token, and persistence of Sage's rotated refresh token on every refresh.TokenStorecontract with an in-memoryArrayTokenStore.- Typed DTOs:
Business,Contact,Address,PurchaseInvoice,PurchaseInvoiceLineItem,Transaction,Reference,Link, and thePaginatedenvelope. - Resources:
businesses(),contacts(),purchaseInvoices()with lazy pagination. - Full API coverage: a typed DTO for every schema (200+) and a request class for every operation (280+, including writes), generated from the OpenAPI spec via
tools/generate.php. - Contract tests asserting every spec schema and operation has a generated class.