← Grunnleggende / SDK-er
Migrering fra et annet system
Overfør et selskaps regnskap i én forespørsel - kontoplan, partnere, åpningsbalanse eller full historikk, åpne fakturaer, anleggsmidler og beholdning.
Når et selskap flytter til Nordlet fra et annet regnskapsprogram, starter ikke regnskapet på null. Historikkimportøren tar alt det det gamle systemet etterlater seg, og lagrer det i én forespørsel og én databasetransaksjon: Hvis en enkelt rad feiler i en kontroll, lagres ingenting. Den samme pakken kan kjøres gjennom et eget testendepunkt først, som utfører all validering og ruller tilbake.
POST /v1/migration/books/validate # sjekker alt, lagrer ingenting
POST /v1/migration/books/import # lagrer alt eller ingenting
Nettapplikasjonen har de samme to knappene under Konto → Migrering (lim inn JSON eller last opp en fil). API-nøkkelen trenger ledger:write samt skrivetilgang for hver seksjon du tar med (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Begge endepunkter godtar forespørsler på opptil 32 MB.
Skjæringsdatoen
Velg skjæringsdatoen: den første dagen selskapet kjøres i Nordlet. Alt før denne datoen blir værende i det gamle systemet (eller tas med som historikk, se nedenfor), og alt fra denne dagen og utover registreres i Nordlet gjennom de vanlige endepunktene. Alle beløp i pakken gjelder «per dagen før skjæringsdatoen»: utgående saldobalanse, ubetalte fakturaer, beholdning på lager og anleggsmidler i registeret.
Gjør følgende i Nordlet før du importerer:
- Opprett selskapet og ta i bruk kontoplantemplaten (
ledger/accounts/apply-template), eller list opp kontoene du trenger i pakkensaccounts-seksjon. - Opprett minst ett lager (
inventory/warehouses/create) hvis du importerer beholdning. - Kjør pakken gjennom
migration/books/validatetil den ikke rapporterer noen feil, og du godtar advarslene dens.
Pakken
Hver seksjon er valgfri; ta med de du har. Alle referanser mellom seksjoner gjøres med kode (kontokode, partnerkode, varenr., anleggsgruppe- eller lagerkode), og en kode kan enten referere til en post som allerede finnes i Nordlet, eller en som opprettes i en tidligere seksjon i 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øp er desimalstrenger, som ellers i API-et. source er en valgfri tekst som havner i beskrivelsen på åpningsbalansetransaksjonen og i merknadene på de migrerte fakturaene.
accounts
Kontoplansrader: code, name, type (asset, liability, equity, income, expense), samt eventuelt parentCode og isPostable. Kontoer som allerede finnes, berøres ikke og telles som existing. Bruk dette når det gamle systemets kontoplan avviker fra malen, eller hopp over det og bruk malen først.
partners og items
Kunder, leverandører og artikkelkatalog, identifisert med code. I Litauen er partnerkoden som regel foretaksregisteret; for privatpersoner kan du bruke en hvilken som helst kode som er unik for selskapet. Eksisterende koder blir hoppet over, ikke oppdatert. Varer godtar type (product eller service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.
openingBalances
Det gamle systemets utgående saldobalanse, én rad per konto: accountCode med enten debit eller credit. Radene bokføres som én bilagstransaksjon datert openingBalances.date (standard er skjæringsdatoen) med bilagstype migration_opening. Radene må referere til kontoer det kan bokføres på.
Transaksjonen må gå i balanse. Hvis det gamle systemets saldobalanse ikke gjør det (pga. avrunding, et overskudd som aldri ble overført til egenkapitalen, eller en manglende konto), oppgir du balancingAccountCode (typisk udekket/disponert resultat, 3410 i den litauiske malen), og differansen bokføres der. Svaret rapporterer beløpet som balancingAmount.
Det kan bare finnes én åpningsbalansetransaksjon per selskap. En ny import med openingBalances avvises (409). Korreksjoner i etterkant gjøres som vanlige manuelle bilagstransaksjoner (ledger/journal/transactions/create); bokførte transaksjoner kan ikke endres, så originalen forblir slik den ble importert.
journal - full historikk i stedet for, eller i tillegg til, saldi
Hvis du vil ha det gamle systemets transaksjoner inn i Nordlet (slik at rapporter for tidligere perioder fungerer), sender du dem hit: ett objekt per transaksjon med date, valgfri description og reference, samt entries med accountCode + debit/credit. Hver transaksjon må balansere i seg selv. De bokføres med bilagstype migration.
Datoene må være før skjæringsdatoen. Når pakken også inneholder openingBalances, må historikken dateres på eller etter openingBalances.date. Det vanlige mønsteret er saldi ved starten av forrige regnskapsår pluss det årets transaksjoner, med skjæringsdato på den første dagen i inneværende år. Ikke send saldi og historikk for samme periode, da ville saldiene bli telt dobbelt.
Hver måned som berøres av åpningsbalansene eller historikken, må være en åpen regnskapsperiode (ellers fås 409).
openReceivables og openPayables
Fakturaer som fremdeles var ubetalte (helt eller delvis) ved skjæringsdatoen. De opprettes som utstedte salgsfakturaer og registrerte kjøpsfakturaer med paidAmount = grossTotal − outstanding, slik at bankavstemming (bank/transactions/match, bank/transactions/suggest-matches), aldersfordelt purrerapport og betalingswebhooks fungerer på dem som på hvilken som helst annen faktura.
outstandingsetter standard tilgrossTotal;vatTotalsetter standard til0(momsen beregnes ut fra dette).dueDatesetter standard til bilagsdatoen.currencysetter standard til selskapets fakturavaluta. For andre valutaer enn selskapets basisvaluta krevesfxRate- antall enheter av denne valutaen per 1 enhet av basisvalutaen, etter samme konvensjon som resten av API-et - og den lagres på fakturaen slik at senere betalinger beregner realisert valutagevinst/tap korrekt.- Salgsfakturaens
numberer det gamle systemets fulle nummer og må være unikt i selskapet. Kjøpsfakturaer er unike per partner ogdocumentNumber. - Fakturaene bokføres ikke på nytt: fordrings-/gjeldsbalansen er allerede en del av åpningsbalansene. De knyttes til åpningsbalansetransaksjonen, som er grunnen til at
openPayableskreveropeningBalancesi samme pakke. - Fakturalinjer importeres ikke; fakturaen inneholder kun totalsummer. Det gamle systemet forblir kilden for linjedetaljer og mva-meldinger for perioder før skjæringsdatoen.
Hvis det gamle systemet fulgte opp kundesaldi uten åpne poster, oppretter du én faktura per partner for saldi (for eksempel med nummer OB-301111222) slik at de kan avregnes.
Nummereringen fortsetter. Når et importert salgsfakturanummer har formen PREFIX-N og utstedelsesdatoen faller i skjæringsåret, settes nummerserien for det prefikset og året til N + 1 (senkes aldri). Svaret lister opp den resulterende numberSeries; for andre tilfeller setter du opp serien selv med reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).
assetGroups og fixedAssets
Anleggsmidler overføres med hittil påløpt avskrivning: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths og usefulLifeMonths (eller gruppens standardverdi). Den lineære avskrivningskjøringen (assets/depreciation/post) fortsetter fra gjenværende verdi over gjenstående måneder. Midler der akkumulert avskrivning allerede er lik avskrivbar verdi, opprettes som fully_depreciated. Ingenting bokføres - anskaffelseskost og akkumulert avskrivning er en del av åpningsbalansene.
Grupper identifiseres med code og krever assetAccountCode og depreciationAccountCode (standard kostnadskonto 6206).
stock
Varebeholdning på lager per vare: itemCode, quantity, unitCost (kostpris per enhet i EUR) og eventuelt warehouseCode (standard: standardlageret), lotNumber og expiryDate for varer med parti- eller serienummerstyring. Hver rad blir til en inngående lagertransaksjon datert på skjæringsdatoen med bilagstype migration, og starter et FIFO-lag til den kostprisen. Ingenting bokføres - vareverdien er en del av åpningsbalansene.
Kontroller og advarsler
Valideringsendepunktet feiler (422) ved manglende kontoer, kontoer det ikke kan bokføres på, ubalanserte transaksjoner, ukjente partner-, vare-, gruppe- eller lagerkoder, dupliserte koder eller numre i pakken, utestående beløp som overstiger bruttobeløpet, akkumulert avskrivning som overstiger avskrivbar verdi, og manglende valutakurser. Numre eller koder som allerede finnes i Nordlet, gir 409.
I tillegg sammenligner begge endepunkter reskontroene med hovedbokstransaksjonene i den samme pakken og returnerer differansene som warnings i stedet for feil:
- samlet utestående for
openReceivablesmot saldoen på kundefordringskontoen (sales.receivable-bokføringsregel,2410som standard); - samlet utestående for
openPayablesmot leverandørgjeldskontoen (purchases.payables,4430); - samlet kostpris for
stockmot varelagerkontoen (inventory.stock,2040); - per anleggsgruppe, midlenes kostpris mot gruppens anleggskonto og deres akkumulerte avskrivning mot avskrivningskontoen.
En advarsel betyr at det gamle systemets reskontro og hovedbok ikke stemmer overens. Rett opp pakken (eller aksepter differansenbevisst) før du importerer.
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 testkjøring; da er journalTransactionId satt til null. En import registreres i revisjonsloggen som migration.imported med det samme sammendraget.
Etter importen
- Lås periodene før skjæringsdatoen (
ledger/periods/lock) slik at ingenting ved et uhell blir bokført i migrert historikk. - Kontroller saldobalansen og balansen per skjæringsdatoen mot det gamle systemets avslutningsrapporter.
- Fortsett med den vanlige flyten: utsted fakturaer, importer kontoutskrifter, avstem betalinger - de migrerte åpne fakturaene gjøres opp på lik linje med alle andre.
Hva importøren ikke dekker: fakturalinjer og mva-meldinger for tidligere perioder (behold dem i det gamle systemet eller arkivet der), lønnshistorikk og andre dokumenter enn fakturaer (ordrer, fraktbrev, kontrakter).