* fix(providers): Fortnox freight and fee as rows, text rows as text, string quantities as numbers
Three shapes seen on live Profilio payloads after #2302's rows-versus-header
check went in:
- Freight and AdministrationFee live on the invoice header, not in
InvoiceRows, while Total and TotalVAT include them. The rows summed to
less than the header by exactly the charge and the check refused the
invoice (14 of Profilio's 384). They are now rows: FreightVAT and
AdministrationFeeVAT are VAT amounts (88 and 22 on a 25 % invoice), and
the charge is gross when VATIncluded is true (99 = 79.20 + 19.80).
- Free-text rows (DeliveredQuantity "0", Total 0, VAT 0) counted as a
stated 0 % rate beside the 25 % rows, so the migration marked the invoice
mixed and nulled its header rate on roughly half of two registers. They
no longer state a rate, and land as line_type 'text' with no amounts, the
way the invoice page and the booking engine expect them.
- DeliveredQuantity is serialised as a string and was stored unparsed.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DG5aYcshzKJ1EA7PPhGtVf
* fix(migration): type the text-row check so resolveInvoiceVat's line shape accepts it
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DG5aYcshzKJ1EA7PPhGtVf
---------
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>