Nordlet

← Dokumentation / Guides

Overførsel fra et andet system

Overfør en virksomheds regnskab i ét enkelt kald - kontoplan, debitorer og kreditorer, åbningsbalancer eller fuld historik, åbne fakturaer, anlægsaktiver og lager.

Når en virksomhed skifter til Nordlet fra et andet regnskabsprogram, starter regnskabet ikke fra nul. Historik-importøren indlæser alt det, som det gamle system efterlader, og gemmer det i ét enkelt kald og én enkelt databasetransaktion: Hvis en enkelt række fejler i en validering, gemmes intet. Den samme pakke kan først køres gennem et valideringsendepunkt (check-only endpoint), som udfører al validering og ruller tilbage.

POST /v1/migration/books/validate   # tjekker alt, gemmer intet
POST /v1/migration/books/import     # gemmer det hele eller intet

Webapplikationen har de samme to knapper under Konto → Overførsel (indsæt JSON eller upload en fil). API-nøglen skal have ledger:write samt skrivetilladelse (write scope) for hver inkluderet sektion (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Begge endepunkter accepterer body-størrelser op til 32 MB.

Skæringsdatoen

Vælg skæringsdatoen (cut-over date): den første dag, hvor virksomheden kører i Nordlet. Alt før denne dato forbliver i det gamle system (eller overføres som historik, se nedenfor), og alt fra denne dag og fremefter indtastes i Nordlet via de normale endepunkter. Alle beløb i pakken er "pr. dagen før skæringsdatoen": den afsluttende saldobalance, ubetalte fakturaer, lagerbeholdningen på hylden og aktiverne i anlægskartoteket.

Gør følgende i Nordlet, før du importerer:

  1. Opret virksomheden og anvend kontoplantemplet (ledger/accounts/apply-template), eller angiv de konti, du skal bruge, i pakkens accounts-sektion.
  2. Opret mindst ét lager (inventory/warehouses/create), hvis du importerer lagerbeholdning.
  3. Kør pakken gennem migration/books/validate, indtil den ikke rapporterer nogen fejl, og du har accepteret dens advarsler.

Pakken

Hver sektion er valgfri; inkludér dem, du har data til. Alle referencer mellem sektioner sker ved hjælp af koder (kontokode, partnerekode, varekode, anlægsgruppekode, lagerkode), og en kode kan enten referere til en post, der allerede findes i Nordlet, eller til en post, der oprettes af en tidligere sektion i den samme pakke.

{
  "cutoverDate": "2026-01-01",
  "source": "Rivilė GAMA",
  "accounts": [
    { "code": "6210", "name": "Advertising expenses", "type": "expense", "parentCode": "6" }
  ],
  "partners": [
    { "code": "301111222", "name": "UAB Klientas", "vatCode": "LT100001112223", "isCustomer": true },
    { "code": "302222333", "name": "UAB Tiekėjas", "isCustomer": false, "isSupplier": true }
  ],
  "items": [
    { "code": "SKU-1", "name": "Widget", "type": "product", "unit": "vnt", "vatRatePercent": "21" }
  ],
  "assetGroups": [
    { "code": "TRANSP", "name": "Vehicles", "assetAccountCode": "1230", "depreciationAccountCode": "1239",
      "defaultUsefulLifeMonths": 60 }
  ],
  "openingBalances": {
    "balancingAccountCode": "3410",
    "entries": [
      { "accountCode": "2710", "debit": "5000.00" },
      { "accountCode": "2410", "debit": "1500.00" },
      { "accountCode": "2040", "debit": "300.00" },
      { "accountCode": "1230", "debit": "12000.00" },
      { "accountCode": "1239", "credit": "2400.00" },
      { "accountCode": "4430", "credit": "700.00" },
      { "accountCode": "3010", "credit": "10000.00" }
    ]
  },
  "openReceivables": [
    { "partnerCode": "301111222", "number": "SF-1050", "issueDate": "2025-12-10", "dueDate": "2026-01-09",
      "grossTotal": "1210.00", "vatTotal": "210.00" },
    { "partnerCode": "301111222", "number": "SF-1049", "issueDate": "2025-11-20",
      "grossTotal": "500.00", "outstanding": "290.00" }
  ],
  "openPayables": [
    { "partnerCode": "302222333", "documentNumber": "T-77", "documentDate": "2025-12-15", "grossTotal": "700.00" }
  ],
  "fixedAssets": [
    { "groupCode": "TRANSP", "code": "CAR-1", "name": "Delivery van", "acquisitionDate": "2025-01-01",
      "acquisitionCost": "12000.00", "accumulatedDepreciation": "2400.00", "depreciatedMonths": 12 }
  ],
  "stock": [
    { "itemCode": "SKU-1", "quantity": "30", "unitCost": "10" }
  ]
}

Beløb er decimale strenge, som alle andre steder i API'et. source er en fri tekstmærkat, som indgår i beskrivelsen af åbningsbalancetransaktionen og i noter på migrerede fakturaer.

accounts

Kontoplantrin: code, name, type (asset, liability, equity, income, expense), samt valgfri parentCode og isPostable. Konti, der allerede findes, berøres ikke og tælles som existing. Brug dette, når det gamle systems kontoplan afviger fra skabelonen, eller spring det over og anvend skabelonen først.

partners og items

Kunder, leverandører og katalogvarer identificeres via code. I Litauen er partnerkoden typisk virksomhedens CVR- eller registreringsnummer; for privatpersoner kan du bruge en vilkårlig kode, der er unik i virksomheden. Eksisterende koder springes over og opdateres ikke. Varer (items) accepterer type (product eller service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.

openingBalances

Det gamle systems afslutningssaldobalance, én række pr. konto: accountCode med enten debit eller credit. Rækkerne bogføres som én enkelt kaddertransaktion (journal transaction) dateret med openingBalances.date (standard er skæringsdatoen) med dokumenttype migration_opening. Rækkerne skal referere til bogføringsberettigede konti (postable accounts).

Transaktionen skal balancere. Hvis det gamle systems saldobalance ikke gør det - f.eks. på grund af afrunding, et resultat der aldrig er overført til egenkapital, eller en manglende konto - kan du angive balancingAccountCode (typisk overført resultat, 3410 i den litauiske skabelon), hvorefter differencen bogføres derop. Svaret rapporterer beløbet som balancingAmount.

Der kan kun findes én åbningsbalancetransaktion pr. virksomhed. En anden import med openingBalances afvises (409). Efterfølgende rettelser foretages som almindelige manuelle kaddertransaktioner (ledger/journal/transactions/create); bogførte transaktioner er uforanderlige, så den oprindelige post forbliver som importeret.

journal - fuld historik i stedet for eller som supplement til saldi

Hvis du ønsker det gamle systems transaktioner ind i Nordlet (så rapporter for tidligere perioder fungerer), skal du sende dem her: én objekt pr. transaktion med date, valgfri description og reference, samt entries bestående af accountCode + debit/credit. Hver transaktion skal balancere i sig selv. De bogføres med dokumenttype migration.

Datoer skal ligge før skæringsdatoen. Hvis pakken også indeholder openingBalances, skal historikken være dateret på eller efter openingBalances.date - det sædvanlige mønster er saldi ved starten af det foregående regnskabsår plus det årets transaktioner, hvor skæringsdatoen er den første dag i det aktuelle år. Undlad at sende både saldi og historik for den samme periode, da saldiene ellers vil blive medregnet to gange.

Enhver måned, der berøres af åbningsbalancen eller historikken, skal være en åben regnskabsperiode (ellers returneres 409).

openReceivables og openPayables

Fakturaer, der stadig var ubetalte (helt eller delvist) på skæringsdatoen. De oprettes som udstedte salgsfakturaer og registrerede købsfakturaer med paidAmount = grossTotal − outstanding, så bankafstemning (bank/transactions/match, bank/transactions/suggest-matches), aldersfordelt debitor-/kreditorliste (debt-aging report) og betalingswebhooks fungerer på dem som på enhver anden faktura.

  • outstanding sættes som standard til grossTotal; vatTotal sættes som standard til 0 (momsen udledes automatisk).
  • dueDate sættes som standard til dokumentdatoen.
  • currency sættes som standard til virksomhedens fakturavaluta. For andre valutaer end virksomhedens basisvaluta kræves fxRate - enheder af den pågældende valuta pr. 1 enhed af basisvalutaen, efter samme konvention som resten af API'et - og den gemmes på fakturaen, så senere betalinger beregner den realiserede valutakursdifferencen korrekt.
  • Salgsfakturaens number er det gamle systems fulde nummer og skal være unikt i virksomheden. Købsfakturaer er unikke pr. partner og documentNumber.
  • Fakturaerne bogføres ikke igen: deres tilgodehavende- eller gældssaldo er allerede en del af åbningsbalancen. De knyttes til åbningsbalancetransaktionen, hvilket er grunden til, at openPayables kræver openingBalances i samme pakke.
  • Fakturalinjer importeres ikke; fakturaen indeholder kun totaler. Det gamle system forbliver kilden til linjedetaljer og momsafregning for perioder før skæringsdatoen.

Hvis det gamle system spores kundesaldi uden åbne poster, oprettes én faktura pr. partner for saldoen (f.eks. med nummer OB-301111222), så den kan udlignes.

Nummerserien fortsætter. Når et importeret salgsfakturanummer har formen PREFIX-N, og dets udstedelsesdato falder i skæringsdatoens år, indstilles nummerserien for dette præfiks og år til N + 1 (den sænkes aldrig). Svaret viser den resulterende numberSeries; i andre tilfælde kan du selv oprette serien med reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).

assetGroups og fixedAssets

Anlægsaktiver overføres med deres afskrivninger til dato: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths og usefulLifeMonths (eller gruppens standardværdi). Den lineære afskrivningskørsel (assets/depreciation/post) fortsætter ud fra den resterende værdi over de resterende måneder. Aktiver, hvis akkumulerede afskrivning allerede svarer til den afskrivningsberettigede værdi, oprettes som fully_depreciated. Intet bogføres - anskaffelsessummen og den akkumulerede afskrivning er en del af åbningsbalancen.

Grupper identificeres via code og kræver assetAccountCode og depreciationAccountCode (standardomkostningskonto 6206).

stock

Lagerbeholdning pr. vare: itemCode, quantity, unitCost (enhedsomkostning i EUR) og valgfrit warehouseCode (standard: standardlageret), lotNumber og expiryDate for varer med parti- eller serienummerstyring. Hver række bliver til en indgående lagerbevægelse dateret på skæringsdatoen med dokumenttype migration og opretter et FIFO-lag til denne enhedspris. Intet bogføres - lagerværdien er en del af åbningsbalancen.

Kontroller og advarsler

Valideringsendepunktet fejer (422) ved manglende konti, ikke-bogføringsberettigede konti, ubalancerede transaktioner, ukendte partner-, vare-, gruppe- eller lagerkoder, duplikerede koder eller numre i pakken, udestående beløb der overstiger bruttobeløbet, akkumulerede afskrivninger der overstiger den afskrivningsberettigede værdi, samt manglende valutakurser. Numre eller koder, der allerede findes i Nordlet, giver 409.

Derudover sammenligner begge endepunkter reskontroerne med finansposteringerne i den samme pakke og returnerer differencer som warnings (advarsler) i stedet for fejl:

  • samlet udestående for openReceivables i forhold til saldoen på debitorerkontoen (sales.receivable bogføringsregel, 2410 som standard);
  • samlet udestående for openPayables i forhold til kreditorerkontoen (purchases.payables, 4430);
  • samlet kostpris for stock i forhold til lagerkontoen (inventory.stock, 2040);
  • pr. anlægsgruppe: aktivernes anskaffelsessum i forhold til gruppens anlægskonto og deres akkumulerede afskrivning i forhold til afskrivningskontoen.

En advarsel betyder, at det gamle systems reskontro og finanskonto ikke stemmer overens. Ret pakken (eller acceptér bevidst differencen) før import.

Svaret

{
  "dryRun": false,
  "cutoverDate": "2026-01-01",
  "accounts": { "created": 1, "existing": 0 },
  "partners": { "created": 2, "existing": 0 },
  "items": { "created": 1, "existing": 0 },
  "assetGroups": { "created": 1, "existing": 0 },
  "openingBalances": { "journalTransactionId": "…", "date": "2026-01-01", "entries": 8,
                        "debitTotal": "18800.00", "creditTotal": "18800.00", "balancingAmount": "5700.00" },
  "journal": { "transactions": 0, "entries": 0 },
  "openReceivables": { "created": 2, "outstandingTotal": "1500.00" },
  "openPayables": { "created": 1, "outstandingTotal": "700.00" },
  "fixedAssets": { "created": 1, "costTotal": "12000.00", "accumulatedDepreciationTotal": "2400.00" },
  "stock": { "movements": 1, "costTotal": "300.00" },
  "numberSeries": [],
  "warnings": []
}

dryRun: true markerer en valideringskørsel; her er journalTransactionId lig med null. En import registreres i hændelsesloggen (audit log) som migration.imported med det samme resumé.

Efter importen

  • Lås perioderne før skæringsdatoen (ledger/periods/lock), så der ikke ved et uheld bogføres i migreret historik.
  • Kontrollér saldobalancen og balancen pr. skæringsdatoen op imod det gamle systems ultimative rapporter.
  • Fortsæt med det normale flow: udsted fakturaer, importer kontoudtog, afstem betalinger - de migrerede åbne fakturaer udlignes som alle andre.

Hvad importøren ikke dækker: fakturalinjer og momsindberetninger for tidligere perioder (behold dem i det gamle system eller dets arkiv), lønhistorik og andre dokumenter end fakturaer (ordrer, fragtbreve, kontrakter).