Nordlet

Dokumentacija / Vadovai

Perkėlimas iš kitos sistemos

Perkelkite įmonės apskaitą viena užklausa — sąskaitų planą, partnerius, pradinius likučius arba visą istoriją, neapmokėtas sąskaitas, ilgalaikį turtą ir atsargas.

Kai įmonė pereina į Nordlet iš kitos apskaitos programos, jos apskaita neprasideda nuo nulio. Istorinių apskaitos duomenų importuotojas paima viską, ką palieka senoji sistema, ir įrašo tai viena užklausa, viena duomenų bazės transakcija: jei nors viena eilutė neatitinka patikros, neįrašoma niekas. Tą patį paketą pirmiausia galima paleisti per tik tikrinantį galinį tašką, kuris atlieka visas patikras ir viską atšaukia.

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

Internetinėje programoje tie patys du mygtukai yra skiltyje Nustatymai → Perkėlimas (įklijuokite JSON arba įkelkite failą). API raktui reikia ledger:write ir kiekvienos įtrauktos skilties rašymo teisės (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Abu galiniai taškai priima iki 32 MB dydžio užklausas.

Perėjimo data

Pasirinkite perėjimo datą — pirmą dieną, kurią įmonės apskaita vedama Nordlet. Viskas iki jos lieka senojoje sistemoje (arba perkeliama kaip istorija, žr. žemiau); viskas nuo tos dienos įvedama į Nordlet įprastais galiniais taškais. Visos paketo sumos yra „dienos prieš perėjimą“ būsenos: uždaromasis bandomasis balansas, dar neapmokėtos sąskaitos, dar sandėlyje esančios atsargos, dar registre esantis turtas.

Prieš importuodami Nordlet atlikite šiuos veiksmus:

  1. Sukurkite įmonę ir pritaikykite sąskaitų plano šabloną (ledger/accounts/apply-template) — arba reikiamas sąskaitas išvardykite paketo skiltyje accounts.
  2. Jei importuojate atsargas, sukurkite bent vieną sandėlį (inventory/warehouses/create).
  3. Leiskite paketą per migration/books/validate, kol jis nebepraneša klaidų ir jums priimtini jo įspėjimai.

Paketas

Kiekviena skiltis neprivaloma; įtraukite tas, kurias turite. Visos nuorodos tarp skilčių yra kodais (sąskaitos kodas, partnerio kodas, prekės kodas, turto grupės kodas, sandėlio kodas), o kodas gali nurodyti tiek jau Nordlet esantį įrašą, tiek įrašą, sukurtą ankstesnėje to paties paketo skiltyje.

{
  "cutoverDate": "2026-01-01",
  "source": "Rivilė GAMA",
  "accounts": [
    { "code": "6210", "name": "Reklamos sąnaudos", "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": "Prekė", "type": "product", "unit": "vnt", "vatRatePercent": "21" }
  ],
  "assetGroups": [
    { "code": "TRANSP", "name": "Transporto priemonės", "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": "Krovininis mikroautobusas", "acquisitionDate": "2025-01-01",
      "acquisitionCost": "12000.00", "accumulatedDepreciation": "2400.00", "depreciatedMonths": 12 }
  ],
  "stock": [
    { "itemCode": "SKU-1", "quantity": "30", "unitCost": "10" }
  ]
}

Sumos, kaip ir visame API, yra dešimtainės eilutės. source — laisvos formos žyma, kuri patenka į pradinių likučių operacijos aprašymą ir į perkeltų sąskaitų pastabas.

accounts

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

partners ir items

Pirkėjai, tiekėjai ir katalogo prekės, identifikuojami pagal code. Lietuvoje partnerio kodas paprastai yra įmonės kodas; fiziniams asmenims naudokite bet kokį įmonėje unikalų kodą. Esami kodai praleidžiami, ne atnaujinami. Prekėms galima nurodyti type (product arba service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.

openingBalances

Senosios sistemos uždaromasis bandomasis balansas, po vieną eilutę sąskaitai: accountCode su debit arba credit. Eilutės užregistruojamos kaip viena žurnalo operacija, datuota openingBalances.date (pagal numatymą — perėjimo data), dokumento tipas migration_opening. Eilutės turi nurodyti sąskaitas, į kurias galima registruoti įrašus.

Operacija turi balansuoti. Jei senosios sistemos bandomasis balansas nebalansuoja — apvalinimas, į nuosavą kapitalą neuždarytas pelnas, trūkstama sąskaita — nurodykite balancingAccountCode (paprastai nepaskirstytasis pelnas, Lietuvos šablone 3410) ir skirtumas bus užregistruotas ten; atsakyme suma pateikiama kaip balancingAmount.

Įmonė gali turėti tik vieną pradinių likučių operaciją. Antras importas su openingBalances atmetamas (409). Vėlesni pataisymai daromi įprastomis rankinėmis žurnalo operacijomis (ledger/journal/transactions/create); užregistruotos operacijos nekeičiamos, tad pradinė lieka tokia, kokia importuota.

journal — visa istorija vietoje likučių arba kartu su jais

Jei norite senosios sistemos operacijas turėti Nordlet (kad veiktų ankstesnių laikotarpių ataskaitos), siųskite jas čia: po vieną objektą operacijai su date, neprivalomais description ir reference bei entriesaccountCode + debit/credit. Kiekviena operacija turi balansuoti atskirai. Jos užregistruojamos su dokumento tipu migration.

Datos turi būti prieš perėjimo datą. Kai pakete yra ir openingBalances, istorija turi būti datuota openingBalances.date dieną arba vėliau — įprastas modelis: likučiai praėjusių finansinių metų pradžioje ir tų metų operacijos, o perėjimas einamųjų metų pirmą dieną. Nesiųskite likučių ir istorijos už tą patį laikotarpį: likučiai būtų suskaičiuoti du kartus.

Kiekvienas mėnuo, kurį paliečia pradiniai likučiai ar istorija, turi būti atviras apskaitos laikotarpis (kitaip 409).

openReceivables ir openPayables

Sąskaitos, kurios perėjimo dieną dar buvo (visiškai ar iš dalies) neapmokėtos. Jos sukuriamos kaip išrašytos pardavimo sąskaitos ir užregistruotos pirkimo sąskaitos su paidAmount = grossTotal − outstanding, todėl banko sudengimas (bank/transactions/match, bank/transactions/suggest-matches), skolų senėjimo ataskaita ir mokėjimų webhook'ai su jomis veikia kaip su bet kuria kita sąskaita.

  • outstanding pagal numatymą lygus grossTotal; vatTotal pagal numatymą 0 (neto suma išvedama).
  • dueDate pagal numatymą — dokumento data.
  • currency pagal numatymą — įmonės sąskaitų valiuta. Bet kuriai ne EUR valiutai privalomas fxRate — tos valiutos vienetų kiekis už 1 EUR, ta pati konvencija kaip visame API — jis išsaugomas sąskaitoje, kad vėlesni mokėjimai teisingai apskaičiuotų realizuotą valiutų kurso skirtumą.
  • Pardavimo sąskaitos number — senosios sistemos pilnas numeris, jis turi būti unikalus įmonėje. Pirkimo sąskaitos unikalios pagal partnerį ir documentNumber.
  • Sąskaitos neregistruojamos antrą kartą: jų gautinos / mokėtinos sumos likutis jau yra pradiniuose likučiuose. Jos susiejamos su pradinių likučių operacija, todėl openPayables reikalauja, kad tame pačiame pakete būtų openingBalances.
  • Sąskaitų eilutės neimportuojamos; sąskaita turi tik sumas. Eilučių detalės ir laikotarpių iki perėjimo PVM registrai lieka senojoje sistemoje.

Jei senoji sistema pirkėjų skolas vedė be atvirų dokumentų, kiekvienam partneriui sukurkite po vieną sąskaitą likučio sumai (pvz., numeriu OB-301111222), kad ją būtų galima sudengti.

Numeracija tęsiama. Kai importuotos pardavimo sąskaitos numeris yra formos PREFIX-N, o jos išrašymo data patenka į perėjimo metus, to prefikso ir metų numerių serija nustatoma į N + 1 (niekada nemažinama). Atsakyme pateikiamos gautos numberSeries; kitais atvejais seriją nustatykite patys per reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).

assetGroups ir fixedAssets

Ilgalaikis turtas perkeliamas su iki šiol sukauptu nusidėvėjimu: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths ir usefulLifeMonths (arba grupės numatytoji reikšmė). Tiesinis nusidėvėjimas (assets/depreciation/post) tęsiamas nuo likusios vertės per likusius mėnesius. Turtas, kurio sukauptas nusidėvėjimas jau lygus nudėvimai vertei, sukuriamas su būsena fully_depreciated. Niekas neregistruojama — įsigijimo vertė ir sukauptas nusidėvėjimas yra pradinių likučių dalis.

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

stock

Atsargų likučiai pagal prekę: itemCode, quantity, unitCost (vieneto savikaina EUR) ir neprivalomi warehouseCode (pagal numatymą — numatytasis sandėlis), lotNumber ir expiryDate partijomis ar serijos numeriais sekamoms prekėms. Kiekviena eilutė tampa įeinančiu atsargų judėjimu, datuotu perėjimo data, su dokumento tipu migration, ir pradeda FIFO sluoksnį ta savikaina. Niekas neregistruojama — atsargų vertė yra pradinių likučių dalis.

Patikros ir įspėjimai

Tikrinimo galinis taškas grąžina klaidą (422) dėl trūkstamų sąskaitų, sąskaitų, į kurias negalima registruoti, nebalansuojančių operacijų, nežinomų partnerių / prekių / grupių / sandėlių kodų, pasikartojančių kodų ar numerių pakete, neapmokėtų sumų, viršijančių bendrą sumą, sukaupto nusidėvėjimo, viršijančio nudėvimą vertę, ir trūkstamų valiutų kursų. Numeriai ar kodai, kurie jau yra Nordlet, grąžina 409.

Be to, abu galiniai taškai palygina analitinius registrus su to paties paketo didžiosios knygos įrašais ir skirtumus grąžina kaip warnings, o ne klaidas:

  • bendra openReceivables neapmokėta suma ir pirkėjų skolų sąskaitos likutis (registravimo taisyklė sales.receivable, pagal numatymą 2410);
  • bendra openPayables neapmokėta suma ir skolų tiekėjams sąskaita (purchases.payables, 4430);
  • bendra stock savikaina ir atsargų sąskaita (inventory.stock, 2040);
  • kiekvienai turto grupei — turto įsigijimo vertė ir grupės turto sąskaita bei sukauptas nusidėvėjimas ir nusidėvėjimo sąskaita.

Įspėjimas reiškia, kad senosios sistemos analitinis registras 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 tikrinimo paleidimą; tada journalTransactionId yra null. Importas įrašomas į audito žurnalą kaip migration.imported su ta pačia suvestine.

Po importo

  • Užrakinkite laikotarpius iki perėjimo (ledger/periods/lock), kad į perkeltą istoriją netyčia nebūtų registruojama.
  • Palyginkite bandomąjį balansą ir balansą perėjimo datai su senosios sistemos uždaromosiomis ataskaitomis.
  • Tęskite įprastą darbą: išrašykite sąskaitas, importuokite banko išrašus, sudenkite mokėjimus — perkeltos neapmokėtos sąskaitos sudengiamos kaip ir visos kitos.

Ko importuotojas neapima: praėjusių laikotarpių sąskaitų eilučių ir PVM registrų (laikykite juos senojoje sistemoje ar jos archyve), darbo užmokesčio istorijos ir kitų nei sąskaitos dokumentų (užsakymų, važtaraščių, sutarčių).