Nordlet

← Põhitõed / SDK-d

Migreerimine teisest süsteemist

Laadige ettevõtte raamatupidamisandmed üle ühe päringuga – kontoplaan, partnerid, algsaldod või kogu ajalugu, avatud arved, põhivara ja ladu.

Kui ettevõte läheb mõnelt teiselt raamatupidamisprogrammil üle Nordletile, ei alga raamatupidamine nullist. Ajalooliste andmete importija võtab vanast süsteemist kaasa kõik ülejäänu ja kirjutab selle ühe päringu ning ühe andmebaasitehinguga: kui kasvõi üks ainus rida kukub kontrollis läbi, ei salvestata midagi. Sama paketti saab esmalt käivitada ainult kontrollimisele suunatud otspunktis (endpoint), mis teostab kõik valideerimised ja teeb tagasipööramise (rollback).

POST /v1/migration/books/validate   # kontrollib kõike, ei salvesta midagi
POST /v1/migration/books/import     # salvestab kõik või ei midagi

Veebirakenduses on samad kaks nuppu jaotises Konto → Migreerimine (kleepige JSON või laadige fail üles). API võti vajab õigust ledger:write ja lisaks kõigi kaasatud sektsioonide kirjutamisõigusi (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Mõlemad otspunktid aktsepteerivad päringu sisu suurusega kuni 32 MB.

Ülemineku kuupäev

Valige ülemineku kuupäev (cut-over date): esimene päev, mil ettevõtte arvepidamine toimub Nordletis. Kõik, mis jääb sellest ajast varasemasse perioodi, jääb vanasse süsteemi (või tuuakse üle ajalukuna, vt allpool); kõike alates sellest päevast sisestatakse Nordletisse tavapäraste otspunktide kaudu. Kõik paketi summad on seisuga „ülemineku kuupäevale eelnev päev“: lõppsaldo bilanss, seni tasumata arved, riiulil olematu laoseis ja registris olevad põhivaraobjektid.

Enne importimist tehke Nordletis järgmist:

  1. Looge ettevõte ja rakendage kontoplaani mall (ledger/accounts/apply-template) või loetlege vajalikud kontod paketi jaotises accounts.
  2. Looge vähemalt üks ladu (inventory/warehouses/create), kui impordite laoseisu.
  3. Käivitage pakett otspunkis migration/books/validate, kuni see ei anna ühtegi veateadet ja olete nõustunud selle hoiatustega.

Pakett

Iga sektsioon on vabatahtlik; kaasake need, milleandmed teil on. Kõik viited sektsioonide vahel toimuvad koodi alusel (kontokood, partneri kood, artikli kood, põhivara grupi kood, lao kood) ning kood võib viidata kas Nordletis juba eksisteerivale kirjele või kirjele, mille sama paketi varasem sektsioon alles loob.

{
  "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" }
  ]
}

Summad on kümnendmurruna esitatud stringid nagu kõikjal API-s. source on vabas vormis märge, mis salvestatakse algsaldo tehingu selgitusse ja migreeritud arvekirjeldustesse.

accounts

Kontoplaani read: code, name, type (asset, liability, equity, income, expense), valikulised parentCode ja isPostable. Juba eksisteerivaid koode ei muudeta ja need loetakse olemasolevaks (existing). Kasutage seda siis, kui vana süsteemi kontoplaan erineb mallist, või jätke see vahele ja rakendage mall esmalt.

partners ja items

Kliendid, tarnijad ja kataloogi artiklid, indekseerituna koodi (code) järgi. Leedus on partneri koodiks tavaliselt äriregistri kood; füüsiliste isikute puhul kasutage mis tahes koodi, mis on ettevõtte siseselt unikaalne. Olemasolevaid koode jäetakse vahele, neid ei uuendata. Artiklid (items) aktsepteerivad välju type (product või service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.

openingBalances

Vana süsteemi lõppsaldo proovibilanss, üks rida kontorahval: accountCode koos kas deebeti (debit) või kreedidiga (credit). Read kantakse raamatupidamisse ühe raamatupidamiskande tehinguna, mille kuupäevaks on openingBalances.date (vaikimisi ülemineku kuupäev) ja dokumendi tüübiks migration_opening. Read peavad viitama kannet lubavatele (postable) kontodele.

Tehing peab olema tasakaalus. Kui vana süsteemi proovibilanss ei ole tasakaalus (ümardamiserinevused, kasum, mida polnud omakapitali kantud, puuduv konto), esitage balancingAccountCode (tavaliselt eelmiste perioodide jaotamata kasum, Leedu mallis 3410) ja vahe kantakse sinna; vastuses esitatakse see summa väärtusena balancingAmount.

Ettevõtte kohta võib eksisteerida ainult üks algsaldode tehing. Teine openingBalances andmeid sisaldav import lükatakse tagasi (409). Hilisemad parandused tehakse tavaliste käsitsi tehtavate kande tehingute kaudu (ledger/journal/transactions/create); juba kinnitatud tehingud on muutumatud, mistõttu algne säilib imporditud kujul.

journal – täielik ajalugu saldode asemel või lisaks neile

Kui soovite vana süsteemi tehinguid Nordletis näha (et varasemate perioodide aruanded toimiksid), saatke need siia: üks objekt tehingu kohta väljadega date, valikuline description ja reference, ning kanderidadega (entries), mis sisaldavad välju accountCode ning debit/credit. Iga tehing peab eraldi võttes olema tasakaalus. Need kantakse sisse dokumenditüübiga migration.

Kuupäevad peavad olema enne ülemineku kuupäeva. Kui pakett sisaldab lisaks algsaldo andmeid (openingBalances), peab ajaloo kuupäev olema alates openingBalances.date või sellest hilisem – tavapärane muster on saldod eelmise majandusaasta alguses pluss selle aasta tehingud, kusjuures üleminek toimub praeguse aasta esimesel päeval. Ärge saatke sama perioodi kohta nii saldosid kui ka ajalugu: saldod arvestataks muidu topelt.

Iga kuu, mida algsaldod või ajalugu puudutavad, peab olema avatud raamatupidamisperiood (vastasel juhul tagastatakse 409).

openReceivables ja openPayables

Arved, mis olid ülemineku hetkel veel tasumata (täielikult või osaliselt). Need luuakse väljastatud müügiarvete ja registreeritud ostuarvetena, kus paidAmount = grossTotal − outstanding, mis võimaldab pangavastavuste sidumist (bank/transactions/match, bank/transactions/suggest-matches), laekumiste vananemise aruannet ja maksete veebikonksu (webhook) töötamist nagu iga teise arve puhul.

  • outstanding väärtuseks on vaikimisi grossTotal; vatTotal väärtuseks on vaikimisi 0 (netosumma tuletatakse).
  • dueDate vaikimisi on dokumendi kuupäev.
  • currency vaikimisi on ettevõtte arveldusvaluuta. Iga valuuta puhul, mis erineb ettevõtte baasvaluutast, on nõutav fxRate – selle valuuta ühikute arv 1 baasvaluuta ühiku kohta (sama kokkulepe mis ülejäänud API-s) – ja see salvestatakse arvele, et hilisemad maksed arvutaksid realiseeritud kursi vahe õigesti.
  • Müügiarve number on vana süsteemi täielik number ja peab ettevõttes olema unikaalne. Ostuarved on unikaalsed partneri ja välja documentNumber lõikes.
  • Arveid ei kanta teistkordselt raamatupidamisse: nende nõuete ja kohustuste saldo on juba osa algsaldodest. Need lingitakse algsaldo tehinguga, mistõttu openPayables eeldab samas paketis ka openingBalances olemasolu.
  • Arveridu ei impordita; arve sisaldab ainult summasid. Vana süsteem jääb ridade detailandmete ning üleminekuperioodile eelnevate perioodide käibedeklaratsioonide allikaks.

Kui vana süsteem pidas kliendisaldosid ilma avatud arveteta, looge saldo kohta üks arve partneri kohta (näiteks numbriga OB-301111222), et seda saaks tasuda.

Numeratsioon jätkub. Kui imporditud müügiarve number on kujul PREFIX-N ja selle väljastamise kuupäev langeb ülemineku aastasse, määratakse selle eesliite ja aasta numeratsiooniseeriaks N + 1 (seda ei alandata kunagi). Vastuses loetletakse tulemuseks saanud numberSeries; muudel juhtudel määrake seeria ise otspunkts reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).

assetGroups ja fixedAssets

Põhivara tuuakse üle koos selle senise kulumiga: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths ja usefulLifeMonths (või grupi vaikimisi väärtus). Lineaarne kulumiarvutus (assets/depreciation/post) jätkub jääkväärtuselt ülejäänud kuude jooksul. Varad, mille kogunenud kulum võrdub juba kulumiga kaetava väärtusega, luuakse staatuses fully_depreciated (täielikult amortiseerunud). Midagi ei kanta eraldi raamatupidamisse – soetusmaksumus ja kogunenud kulum on osa algsaldodest.

Grupid on indekseeritud koodi (code) järgi ja nõuavad välju assetAccountCode ja depreciationAccountCode (vaikimisi kulukonto 6206).

stock

Laoseis artiklite kaupa: itemCode, quantity, unitCost (ühiku omahind EUR-is) ja valikuliselt warehouseCode (vaikimisi: vaikimisi ladu), lotNumber ja expiryDate partiide või seerianumbritega jälgitavate artiklite jaoks. Igast reast saab ülemineku kuupäevaga sissetuleku laoliikumine dokumenditüübiga migration, mis käivitab FIFO-kihi selle omahinnaga. Midagi ei kanta eraldi raamatupidamisse – laovaru väärtus on osa algsaldodest.

Kontrollid ja hoiatused

Valideerimise otspunkt kukub läbi (422) puuduvate kontode, kandeid mitte lubavate kontode, tasakaalust väljas olevate tehingute, tundmatute partneri-, artikli-, grupi- või laokoodide, paketis esinevate korduvate koodide või numbrite, brutosummat ületavate avatud summade, kulumiga kaetavat väärtust ületava kogunenud kulumi ning puuduvate valuutakursside korral. Numbrid või koodid, mis Nordletis juba eksisteerivad, annavad veakoodi 409.

Lisaks sellele võrdlevad mõlemad otspunktid allregistreid sama paketi raamatupidamiskannetega ja tagastavad erinevused hoiatustena (warnings), mitte vigadena:

  • openReceivables kogusumma tasumata osad nõuete konto saldoga (sales.receivable kande reegel, vaikimisi 2410);
  • openPayables kogusumma tasumata osad kohustuste konto saldoga (purchases.payables, 4430);
  • stock kogumaksumus lao kontoga (inventory.stock, 2040);
  • varade grupi lõikes: varade soetusmaksumus grupi põhivarakontoga ja nende kogunenud kulum kulumikontoga.

Hoiatus tähendab, et vana süsteemi allregistri ja pearaamatu andmed ei lähe kokku. Parandage pakett (või leppige teadlikult erinevusega) enne importimist.

Vastus

{
  "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 tähistab kontrollkäiku; sel juhul on journalTransactionId väärtuseks null. Edukas import salvestatakse auditilogisse sündmusena migration.imported koos sama kokkuvõttega.

Pärast importimist

  • Lukustage perioodid enne ülemineku kuupäeva (ledger/periods/lock), et midagi ei saaks eksikombel migreeritud ajalukku kanda.
  • Kontrollige proovibilanssi ja bilanssi seisuga ülemineku kuupäeval vana süsteemi lõpparuannete vastu.
  • Jätkake tavapärase töövooga: väljastage arveid, importige pangaväljavõtteid, siduge makseid - migreeritud avatud arved tasutakse nagu iga teinegi arve.

Mida importija ei kata: varasemate perioodide arveridu ja käibedeklaratsioone (hoidke neid vanas süsteemis või selle arhiivis), palgaajalugu ja muid dokumente peale arvekannete (tellimused, saatelehed, lepingud).