Fakturaliste
| # | Kunde | Dato | Referanse | Status | Belop (eks MVA) | Handlinger |
|---|
Opprett ny faktura
Kundeliste
| # | Firma | Sted | Telefon | Kontaktperson | Salg (NOK) |
|---|
Produktliste
| # | Tittel | Type | Innpris | Utpris | MVA % | 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 Delphi | Implementation TypeScript | Source |
|---|---|---|
| TVolgaTable (proprietary DB) | D1 SQLite (Cloudflare) | data.pas → schema.sql |
| BeforePost / NewRecord | Validation in handler before INSERT | data.pas:1446 → POST /api/invoices |
| CalcFields (computed) | Server-side calculateLine() | data.pas:1827 → recalculateInvoiceTotal() |
| ApplyUpdates + CommitUpdates | D1 batch() atomic transaction | data.pas:1892 → /api/invoices/:id/issue |
| AppData global singleton | Pure TypeScript functions | data.pas TAppData → index.ts functions |
| Modal form (ShowModal) | REST endpoint + HTML modal | kundeValgForm → GET /api/customers |
| TDataSource binding | Fetch API + DOM update | fakturaForm → dashboard JS |
Invoice Lifecycle (data.pas → REST API)
| Delphi Method | REST Endpoint | Status |
|---|---|---|
| Faktura.Append + BeforePost | POST /api/invoices | 0 → 0 (create draft) |
| FakturaData.Append | POST /api/invoices/:id/lines | add line to draft |
| DoUpdateSumExecute() | calculateLine() + recalculateInvoiceTotal() | auto-recalc |
| Fakturere() | POST /api/invoices/:id/issue | 0 → 1 (issue) |
| BetalFaktura() | POST /api/invoices/:id/pay | 1 → 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.