Raptor Invoice — Migration POC

Delphi (TVolgaTable + TAppData) → TypeScript + Cloudflare D1 | POC 7 — Access International

Fakturaer
Ny Faktura
Kunder
Produkter
Delphi → TS Mapping

Fakturaliste

#KundeDatoReferanseStatusBelop (eks MVA)Handlinger
← Tilbake til listen

Opprett ny faktura

Kundeliste

#FirmaStedTelefonEmailKontaktpersonSalg (NOK)

Produktliste

#TittelTypeInnprisUtprisMVA %Margin

POC 7 — Raptor Invoice: Delphi → TypeScript Migration

Source: Raptor Invoice (Norwegian invoicing software, 98,819 lines Delphi, 121 files, 35 VCL forms, Volga proprietary database)

POC scope: Invoice Core — 3 forms, 4 tables, ~1,333 lines → ~700 lines TypeScript

Methodology: Access International 9-step migration (E1-E7 + E2b + E4b), Principle P1-P8

Pattern Mapping (7 patterns couverts)

Pattern DelphiImplementation TypeScriptSource
TVolgaTable (proprietary DB)D1 SQLite (Cloudflare)data.pas → schema.sql
BeforePost / NewRecordValidation in handler before INSERTdata.pas:1446 → POST /api/invoices
CalcFields (computed)Server-side calculateLine()data.pas:1827 → recalculateInvoiceTotal()
ApplyUpdates + CommitUpdatesD1 batch() atomic transactiondata.pas:1892 → /api/invoices/:id/issue
AppData global singletonPure TypeScript functionsdata.pas TAppData → index.ts functions
Modal form (ShowModal)REST endpoint + HTML modalkundeValgForm → GET /api/customers
TDataSource bindingFetch API + DOM updatefakturaForm → dashboard JS

Invoice Lifecycle (data.pas → REST API)

Delphi MethodREST EndpointStatus
Faktura.Append + BeforePostPOST /api/invoices0 → 0 (create draft)
FakturaData.AppendPOST /api/invoices/:id/linesadd line to draft
DoUpdateSumExecute()calculateLine() + recalculateInvoiceTotal()auto-recalc
Fakturere()POST /api/invoices/:id/issue0 → 1 (issue)
BetalFaktura()POST /api/invoices/:id/pay1 → 3 (pay)

Calculation Formula

Delphi (fakturaForm.pas:490-568):
APris = unit_price
ARabatt = (APris / 100) * discount%
BPris = (APris - ARabatt) * quantity   → eks_mva
CPris = (BPris / 100) * VAT%         → VAT amount
ink_mva = BPris + CPris

TypeScript (calculateLine):
eksMva = (pris - pris * rabatt / 100) * antall
inkMva = eksMva * (1 + mva / 100)

Note: mathematically equivalent. TypeScript formula simplified but produces identical results.