Nordlet

← Dokumentacija / Vadovai

Migravimas iš kitos sistemos

Perkelkite įmonės buhalteriją vienu užklausimu – sąskaitų planą, partnerius, pradinius likučius arba visą istoriją, neapmokėtas sąskaitas faktūras, ilgalaikį turtą ir atsargas.

Kai įmonė pereina prie „Nordlet“ iš kitos apskaitos programos, jos apskaita neprasideda nuo nulio. Istorinių duomenų importavimo įrankis paima viską, ką paliko senoji sistema, ir įrašo per vieną užklausą, įvykdydamas vieną duomenų bazės operaciją (database transaction): jei bent viena eilutė nepraeina patikros, nieko neišsaugoma. Tą patį paketą pirmiausia galima paleisti per patikros galinį punktą (validate-only endpoint), kuris atlieka visas patikras ir atšaukia pakeitimus.

POST /v1/migration/books/validate   # viską patikrina, nieko neįrašo
POST /v1/migration/books/import     # įrašo viską arba nieko

Žiniatinklio programoje (web app) po skiltimi Nustatymai → Migravimas (Settings → Migration) yra tie du patys mygtukai (įklijuokite JSON arba įkelkite failą). API raktui reikia teisės ledger:write bei visų įtraukiamų dalių įrašymo teisių (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Abi sąsajos priima iki 32 MB dydžio užklausų turinius (bodies).

Perkėlimo data

Pasirinkite perkėlimo datą (cut-over date) – tai pirmoji diena, kai įmonės apskaita tvarkoma „Nordlet“. Viskas, kas buvusio iki jos, lieka senojoje sistemoje (arba perkeliama kaip istorija, žr. toliau), o viskas nuo tos dienos įvedama „Nordlet“ per įprastus galinius punktus. Visos pakete esančios sumos yra „būklė dieną prieš perkėlimą“: uždarymo bandomasis balansas (trial balance), dar neapmokėtos sąskaitos faktūros, sandėlyje esančios atsargos, registre esantis turtas.

Prieš importuodami „Nordlet“ atlikite šiuos veiksmus:

  1. Sukurkite įmonę ir pritaikykite sąskaitų plano šabloną (ledger/accounts/apply-template) arba nurodykite reikalingas sąskaitas paketo skiltyje accounts.
  2. Jei importuojate atsargas, sukurkite bent vieną sandėlį (inventory/warehouses/create).
  3. Vykdykite paketą per migration/books/validate, kol nebeliks klaidų ir priimsite jo įspėjimus.

Paketas

Kiekviena skiltis yra neprivaloma; įtraukite tas, kurias turite. Visos nuorodos tarp skilties dalių nurodomos pagal kodą (sąskaitos kodą, partnerio kodą, prekės kodą, turto grupės kodą, sandėlio kodą), o kodas gali nurodyti arba „Nordlet“ jau esantį įrašą, arba įrašą, sukurtą ankstesnėje to paties paketo skiltyje.

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

Sumos yra dešimtainės eilutės (decimal strings), kaip ir visur API. source yra laisvos formos žyma, kuri įrašoma į pradinių likučių operacijos aprašymą ir migruotų sąskaitų faktūrų pastabas.

accounts

Sąskaitų plano eilutės: code, name, type (asset, liability, equity, income, expense), neprivalomi parentCode ir isPostable. Jau egzistuojantys kodai paliekami nepakeisti ir skaičiuojami kaip existing (esami). Tai naudokite, kai senosios sistemos planas skiriasi nuo šablono, arba praleiskite šią dalį ir pirmiausia pritaikykite šabloną.

partners ir items

Klientai, tiekėjai ir katalogo prekės, identifikuojamos pagal code. Lietuvoje partnerio kodas paprastai yra įmonės kodas; privatiems asmenims naudokite bet kokį kodą, kuris yra unikalus įmonės viduje. Esami kodai praleidžiami, o ne atnaujinami. Prekėms galima nurodyti type (product arba service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.

openingBalances

Senosios sistemos uždarymo bandomasis balansas, po vieną eilutę sąskaitai: accountCode su debit arba credit. Eilutės įtraukiamos kaip viena žurnalo operacija, kurios data openingBalances.date (numatytoji reikšmė yra perkėlimas data) ir dokumento tipas migration_opening. Eilutėse privaloma nurodyti sąskaitas, į kurias galima įrašyti (postable accounts).

Operacija turi būti suderinta (debetas lygus kreditui). Jei senosios sistemos bandomasis balansas nesutampa – dėl apvalinimo, pelno, kuris niekada nebuvo uždarytas į nuosavą kapitalą, ar trūkstamos sąskaitos – nurodykite balancingAccountCode (paprastai nepaskirstytą pelną, 3410 lietuviškame šablone), ir skirtumas bus įtrauktas ten; atsakyme ši suma pateikiama kaip balancingAmount.

Vienai įmonei gali būti sukurta tik viena pradinių likučių operacija. Antras importas su openingBalances yra atmetamas (409). Vėlesni pataisymai atliekami kaip įprastos rankinės žurnalo operacijos (ledger/journal/transactions/create); užregistruotos operacijos yra nekintamos, todėl originalas lieka toks, koks buvo importuotas.

journal – visa istorija vietoje likučių arba papildomai prie jų

Jei „Nordlet“ norite turėti senosios sistemos operacijas (kad veiktų ankstesnių laikotarpių ataskaitos), pateikite jas čia: po vieną objektą operacijai su date, neprivalomais description ir reference, bei entries (accountCode + debit/credit). Kiekviena operacija turi būti subalansuota atskirai. Jos įregistruojamos su dokumento tipu migration.

Datos turi būti ankstesnės už perkėlimo datą. Jei pakete taip pat yra openingBalances, istorijos data turi būti lygi openingBalances.date arba vėlesnė už ją. Įprastas šablonas yra likučiai praėjusių finansinių metų pradžioje plius tų metų operacijos, o perkėlimas atliekamas pirmąją einamųjų metų dieną. Nesiųskite likučių ir istorijos tam pačiam laikotarpiui, nes likučiai būtų suskaičiuoti du kartus.

Kiekvienas mėnuo, kurį veikia pradiniai likučiai arba istorija, turi būti atviras apskaitos laikotarpis (kitaip grąžinamas 409 klaidos kodas).

openReceivables ir openPayables

Sąskaitos faktūros, kurios perkėlimo dieną dar buvo neapmokėtos (visiškai arba iš dalies). Jos sukuriamos kaip išrašytos pardavimo sąskaitos faktūros ir registruotos pirkimo sąskaitos faktūros, kuriose paidAmount = grossTotal − outstanding, kad banko suderinimas (bank/transactions/match, bank/transactions/suggest-matches), skolų senėjimo ataskaita ir mokėjimų webhook pranešimai veiktų taip pat, kaip ir su bet kuria kita sąskaita faktūra.

  • outstanding numatytoji reikšmė yra grossTotal; vatTotal numatytoji reikšmė yra 0 (suma be PVM apskaičiuojama automatiškai).
  • dueDate numatytoji reikšmė yra dokumento data.
  • currency numatytoji reikšmė yra įmonės sąskaitų faktūrų valiuta. Bet kuriai valiutai, išskyrus įmonės bazinę valiutą, privaloma nurodyti fxRate – tos valiutos vienetų kiekį už 1 bazinės valiutos vienetą (laikantis tokio paties susitarimo kaip ir visame API), – ir ji išsaugoma sąskaitoje faktūroje, kad vėlesni mokėjimai teisingai apskaičiuotų realizuotą valiutos kurso skirtumą.
  • Pardavimo sąskaitos faktūros number yra pilnas senosios sistemos numeris ir turi būti unikalus įmonėje. Pirkimo sąskaitos faktūros yra unikalios pagal partnerį ir documentNumber.
  • Sąskaitos faktūros nėra registruojamos iš naujo: jų gautinų / mokėtinų sumų likutis jau yra pradinių likučių dalis. Jos susiejamos su pradinių likučių operacija, todėl openPayables tame pačiame pakete reikalauja openingBalances.
  • Sąskaitų faktūrų eilutės neimportuojamos; sąskaitoje faktūroje pateikiami tik bendri duomenys. Senoji sistema lieka eilučių išsamios informacijos ir ankstesnių laikotarpių PVM registrų šaltiniu.

Jei senoji sistema sekė kliento likučius be atskirų dokumentų, sukurkite po vieną sąskaitą faktūrą partneriui likučiui padengti (pavyzdžiui, numeriu OB-301111222), kad ją būtų galima sudengti.

Numeracija tęsiama. Kai importuotos pardavimo sąskaitos faktūros numeris yra formato PREFIX-N ir jos išrašymo data patenka į perkėlimo metus, to prefikso ir metų numerių seka nustatoma į N + 1 (niekada nesumažinama). Atsakyme pateikiami gauti numberSeries; kitais atvejais seką nustatykite patys per reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).

assetGroups ir fixedAssets

Ilgalaikis turtas perkeliamas kartu su iki tol apskaičiuotu nusidėvėjimu: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths ir usefulLifeMonths (arba grupės numatytoji reikšmė). Tiesinio nusidėvėjimo skaičiavimas (assets/depreciation/post) tęsiamas nuo likusios vertės per likusius mėnesius. Turtas, kurio sukauptas nusidėvėjimas jau prilygsta nudėvimai vertei, sukuriamas kaip fully_depreciated (visiškai nudėvėtas). Nieko neregistruojama – įsigijimo vertė ir sukauptas nusidėvėjimas yra pradinių likučių dalis.

Grupės identifikuojamos pagal code ir joms reikia assetAccountCode bei depreciationAccountCode (numatytoji sąnaudų sąskaita 6206).

stock

Turimos atsargos pagal prekes: itemCode, quantity, unitCost (savikaina už vienetą EUR) ir pasirinktinai warehouseCode (numatytoji reikšmė: numatytasis sandėlis), partijomis arba serijos numeriais sekamoms prekėms – lotNumber ir expiryDate. Kiekviena eilutė tampa gaunamu atsargų judėjimu, kurio data yra perkėlimo data, o dokumento tipas – migration, ir sukuria FIFO sluoksnį ta savikaina. Nieko neregistruojama – atsargų vertė yra pradinių likučių dalis.

Patikros ir įspėjimai

Patikros galinis punktas grąžina klaidą (422), jei trūksta sąskaitų, nurodytos sąskaitos, į kurias negalima įrašyti, nesubalansuotos operacijos, nežinomi partnerio / prekės / grupės / sandėlio kodai, pakete kartojasi kodai ar numeriai, neapmokėtos sumos viršija bendrą sumą, sukauptas nusidėvėjimas viršija nudėvimą vertę arba trūksta valiutos kursų. „Nordlet“ jau esantys numeriai ar kodai grąžina 422 klaidą (409).

Be to, abu galiniai punktai palygina suba-apskaitą (sub-ledgers) su didžiosios knygos įrašais tame pačiame pakete ir skirtumus grąžina kaip warnings (įspėjimus), o ne klaidas:

  • bendras openReceivables likutis palyginti su gautinų sumų sąskaitos likučiu (sales.receivable registravimo taisyklė, pagal nutylėjimą 2410);
  • bendras openPayables likutis palyginti su mokėtinų sumų sąskaita (purchases.payables, 4430);
  • bendra stock savikaina palyginti su atsargų sąskaita (inventory.stock, 2040);
  • kiekvienai turto grupei – turto įsigijimo vertė palyginti su grupės turto sąskaita ir sukauptas nusidėvėjimas palyginti su nusidėvėjimo sąskaita.

Įspėjimas reiškia, kad senosios sistemos sub-apskaita ir didžioji knyga nesutampa. Prieš importuodami pataisykite paketą (arba sąmoningai priimkite skirtumą).

Atsakymas

{
  "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 žymi patikros vykdymą; ten journalTransactionId yra null. Importas įregistruojamas audito žurnale (audit log) kaip migration.imported su tokia pačia suvestine.

Po importo

  • Užrakinkite laikotarpius iki perkėlimo datos (ledger/periods/lock), kad į migruotą istoriją per klaidą niekas nebūtų įrašyta.
  • Patikrinkite bandomąjį balansą ir balansą perkėlimo datą, palygindami juos su senosios sistemos uždarymo ataskaitomis.
  • Tęskite įprastą eigą: išrašykite sąskaitas faktūras, importuokite banko išrašus, sudengti mokėjimus – migruotos atviros sąskaitos faktūros sudengiamos taip pat, kaip ir bet kurios kitos.

Ko importavimo įrankis neapima: praėjusių laikotarpių sąskaitų faktūrų eilučių ir PVM registrų (laikykite juos senojoje sistemoje arba jos archyve), darbo užmokesčio istorijos ir jokių kitų dokumentų, išskyrus sąskaitas faktūras (užsakymų, važtaraščių, sutarčių).