Skip to content

Latest commit

 

History

History
30 lines (21 loc) · 2.02 KB

File metadata and controls

30 lines (21 loc) · 2.02 KB

Changelog

All notable changes to this project are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.1.2] - 2026-05-30

Fixed

  • 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 every total_amount, outstanding_amount, net_amount, etc. to null. MapsAttributes::float() now coerces numeric strings, and integer() coerces whole-number strings. Affects every DTO with a numeric field (invoices, payments, quick entries, ...).

[0.1.1] - 2026-05-30

Added

  • purchaseQuickEntries() resource on the Sage client — Sage purchase quick entries are where many businesses record supplier bills/payables (rather than full purchase invoices).

[0.1.0] - 2026-05-30

Added

  • Initial v0.1 read SDK built on Saloon v4.
  • SageConnector: OAuth2 authorization-code grant with rotating-refresh handling, mandatory X-Business header, body-based $next pagination, Sage rate limits (100/min, 2500/day) and exponential backoff on 429/5xx.
  • Sage high-level client: OAuth handshake helpers, guaranteed-fresh access token, and persistence of Sage's rotated refresh token on every refresh.
  • TokenStore contract with an in-memory ArrayTokenStore.
  • Typed DTOs: Business, Contact, Address, PurchaseInvoice, PurchaseInvoiceLineItem, Transaction, Reference, Link, and the Paginated envelope.
  • 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.