← Dokumentácia / Príručky
Migrácia z iného systému
Preneste účtovníctvo spoločnosti jedným volaním - účtovnú osnovu, odberateľov a dodávateľov, počiatočné stavy alebo celú históriu, neuhradené faktúry, dlhodobý majetok a zásoby.
Keď spoločnosť prechádza na systém Nordlet z iného účtovného programu, jej účtovníctvo nezačína od nuly. Nástroj na import historického účtovníctva spracuje všetko, čo vám starý systém poskytol, a zapisuje dáta jediným volaním a v jedinej databázovej transakcii: ak jediný riadok neprejde kontrolou, neuloží sa nič. Ten istý balík možno najprv spustiť cez koncový bod určený len na kontrolu (check-only), ktorý vykoná všetky overenia a v prípade chyby vráti dáta späť (rollback).
POST /v1/migration/books/validate # skontroluje všetko, nič nezapíše
POST /v1/migration/books/import # zapíše všetko alebo nič
Webová aplikácia ponúka rovnaké dve tlačidlá v časti Účet → Migrácia (kde môžete vložiť JSON alebo nahrať súbor). Kľúč API vyžaduje oprávnenie ledger:write a navyše oprávnenie na zápis pre každú zahrnutú sekciu (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Obidva koncové body akceptujú telá požiadaviek s veľkosťou do 32 MB.
Dátum rezu (cut-over date)
Zvoľte dátum rezu: prvý deň prevádzky spoločnosti v systéme Nordlet. Všetko, čo predchádza tomuto dátumu, zostáva v starom systéme (alebo sa prenesie ako história, pozri nižšie); všetko od tohto dňa sa v systéme Nordlet zadáva cez bežné koncové body. Všetky sumy v balíku sú platné „k dňu predchádzajúcemu dátum rezu“: konečná predvaha (trial balance), faktúry, ktoré sú stále neuhradené, zásoby na sklade a majetok v registri.
Pred importom vykonajte v systéme Nordlet nasledujúce kroky:
- Vytvorte spoločnosť a aplikujte šablónu účtovnej osnovy (
ledger/accounts/apply-template) - prípadne uveďte účty, ktoré potrebujete, v sekciiaccountsv balíku. - Ak importujete zásoby, vytvorte aspoň jeden sklad (
inventory/warehouses/create). - Spustite balík cez koncový bod
migration/books/validate, kým nehlási žiadne chyby a kým neakceptujete jeho upozornenia.
Balík
Každá sekcia je voliteľná; zahrňte tie, ktoré máte k dispozícii. Všetky odkazy medzi sekciami sú realizované pomocou kódu (kód účtu, kód partnera, kód položky, kód majetkovej skupiny, kód skladu), pričom kód môže odkazovať buď na záznam, ktorý už v systéme Nordlet existuje, alebo na záznam vytvorený v skoršej sekcii toho istého balíka.
{
"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" }
]
}
Súhrnné čiastky sú vyjadrené ako desatinné reťazce, tak ako všade v API. Položka source je voľný textový popis, ktorý sa uloží do popisu transakcie počiatočných stavov a do poznámok migrovaných faktúr.
accounts
Riadky účtovnej osnovy: code, name, type (asset, liability, equity, income, expense), voliteľne parentCode a isPostable. Účty, ktoré už existujú, zostávajú nedotknuté a počítajú sa ako existing. Túto možnosť použite vtedy, keď sa osnova starého systému líši od šablóny, prípadne túto sekciu vynechajte a najprv aplikujte šablónu.
partners a items
Odberatelia, dodávatelia a položky katalógu identifikované pomocou code. V Litve je kódom partnera zvyčajne IČO (registry code); v prípade fyzických osôb použite akýkoľvek kód, ktorý je v rámci spoločnosti jedinečný. Existujúce kódy sa preskočia a neaktualizujú sa. Položky akceptujú typ type (product alebo service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.
openingBalances
Konečná predvaha starého systému, jeden riadok na účet: accountCode s hodnotou debit alebo credit. Riadky sa zaúčtujú ako jedna denníková transakcia s dátumom openingBalances.date (štandardne sa použije dátum rezu) a typom dokumentu migration_opening. Riadky musia odkazovať na účty, na ktoré možno účtovať.
Transakcia musí byť vyrovnaná (má byť v rovnováhe). Ak predvaha starého systému nie je vyrovnaná - kvôli zaokrúhľovaniu, zisku, ktorý nebol nikdy prevedený na vlastné imanie, alebo chýbajúcemu účtu - zadajte balancingAccountCode (zvyčajne nerozdelený zisk minulých rokov, v litovskej šablóne 3410) a rozdiel sa zaúčtuje tam; v odpovedi sa táto suma uvedie ako balancingAmount.
Pre jednu spoločnosť môže existovať iba jedna transakcia počiatočných stavov. Druhý import obsahujúci sekciu openingBalances bude zamietnutý (stav 409). Následné opravy sa vykonávajú formou bežných manuálnych denníkových transakcií (ledger/journal/transactions/create); zaúčtované transakcie sú nemenné, takže pôvodná transakcia zostane v stave, v akom bola importovaná.
journal - úplná história namiesto zostatkov alebo ako doplnok k nim
Ak chcete mať transakcie zo starého systému v systéme Nordlet (aby fungovali reporty za skoršie obdobia), odošlite ich tu: jeden objekt na transakciu obsahujúci date, voliteľný description a reference, ako aj entries pozostávajúce z dvojice accountCode + debit/credit. Každá transakcia musí byť sama osebe vyrovnaná. Zaúčtujú sa s typom dokumentu migration.
Dátumy musia byť pred dátumom rezu. Ak balík obsahuje aj openingBalances, história musí mať dátum rovný alebo neskorší ako openingBalances.date - bežným vzorom je použiť stavy na začiatku predchádzajúceho účtovného obdobia spolu s transakciami tohto roka, pričom dátum rezu pripadá na prvý deň aktuálneho roka. Neodosielajte stavy a históriu za rovnaké obdobie, pretože stavy by sa započítali dvakrát.
Každý mesiac, ktorého sa počiatočné stavy alebo história týkajú, musí byť otvoreným účtovným obdobím (v opačnom prípade sa vráti chyba 409).
openReceivables a openPayables
Faktúry, ktoré k dátumu rezu ešte neboli uhradené (úplne alebo čiastočne). Vytvoria sa ako vystavené odberateľské faktúry a zaevidované dodávateľské faktúry s nastavením paidAmount = grossTotal − outstanding, vďaka čomu párovanie s bankou (bank/transactions/match, bank/transactions/suggest-matches), report starnutia pohľadávok (debt-aging) a webhooky pre platby fungujú pri týchto faktúrach rovnako ako pri akýchkoľvek iných.
- Položka
outstandingmá predvolenú hodnotu rovnúgrossTotal;vatTotalmá predvolenú hodnotu0(základ dane sa dopočíta). - Položka
dueDatemá predvolenú hodnotu rovnú dátumu dokumentu. - Položka
currencymá predvolenú hodnotu rovnú fakturačnej mene spoločnosti. Pre akúkoľvek menu odlišnú od základnej meny spoločnosti je povinná položkafxRate- vyjadruje počet jednotiek danej meny za 1 jednotku základnej meny, pričom sa dodržiava rovnaká konvencia ako vo zvyšku API - a ukladá sa k faktúre, aby neskoršie platby správne vypočítali realizovaný kurzový rozdiel. - Číslo odberateľskej faktúry
numberje úplné číslo zo starého systému a musí byť v rámci spoločnosti jedinečné. Dodávateľské faktúry sú jedinečné v rámci kombinácie partnera a hodnotydocumentNumber. - Faktúry sa opätovne neúčtujú: ich zostatok pohľadávok/záväzkov je už súčasťou počiatočných stavov. Sú prepojené s transakciou počiatočných stavov, a preto sekcia
openPayablesvyžaduje prítomnosť sekcieopeningBalancesv rovnakom balíku. - Položky faktúr sa neimportujú; faktúra obsahuje iba celkové sumy. Starý systém zostáva zdrojom podrobností o položkách a DPH registrov za obdobia pred dátumom rezu.
Ak starý systém sledoval zostatky odberateľov bez otvorených položiek, vytvorte pre daného partnera jednu faktúru na výšku zostatku (napríklad s číslom OB-301111222), aby ju bolo možné vyrovnať.
Číslovanie pokračuje. Ak má číslo importovanej odberateľskej faktúry tvar PREFIX-N a jej dátum vystavenia spadá do roka rezu, číselný rad pre danú predponu a rok sa nastaví na hodnotu N + 1 (nikdy sa znižuje). Odpoveď vracaná API uvádza výsledný rad numberSeries; v iných prípadoch si rad nastavte sami prostredníctvom koncového bodu reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).
assetGroups a fixedAssets
Dlhodobý majetok sa prenáša vrátane doterajších oprávok: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths a usefulLifeMonths (alebo sa použijú predvolené hodnoty skupiny). Výpočet rovnomerného odpisovania (assets/depreciation/post) pokračuje zo zostatkovej hodnoty počas zostávajúcich mesiacov. Majetok, ktorého oprávkynaakumulované odpisy sa už rovnajú odpisovateľnej hodnote, sa vytvorí so stavom fully_depreciated. Účtovne sa nič neúčtuje - obstarávacia cena a oprávky sú súčasťou počiatočných stavov.
Skupiny sú identifikované pomocou code a vyžadujú zadanie assetAccountCode a depreciationAccountCode (predvolený nákladový účet je 6206).
stock
Zásoby na sklade pre jednotlivé položky: itemCode, quantity, unitCost (obstarávacia cena za jednotku v EUR) a voliteľne warehouseCode (predvolene sa použije predvolený sklad), lotNumber a expiryDate pre položky sledované po šaržiach alebo sériových číslach. Každý riadok sa stane príjmovým pohybom zásoby s dátumom rezu a typom dokumentu migration a založí vrstvu FIFO s danou cenou. Účtovne sa nič neúčtuje - hodnota zásob je súčasťou počiatočných stavov.
Kontroly a upozornenia
Koncový bod na validáciu zlyhá (stav 422) v prípade chýbajúcich účtov, účtov bez možnosti účtovania, nevyrovnaných transakcií, neznámych kódov partnerov, položiek, skupín alebo skladov, duplicitných kódov alebo čísel v rámci balíka, neuhradených súm presahujúcich celkovú sumu, oprávok presahujúcich odpisovateľnú hodnotu a chýbajúcich devízových kurzov. Čísla alebo kódy, ktoré už v systéme Nordlet existujú, vrátia stav 409.
Okrem toho obidva koncové body porovnávajú analytickú evidenciu (sub-ledgers) so zaúčtovanými položkami v rovnakom balíku a vzniknuté rozdiely vracajú vo forme warnings (upozornení) namiesto chýb:
- celková neuhradená suma v
openReceivablesverzus zostatok na účte pohľadávok (pravidlo zaúčtovaniasales.receivable, štandardne2410); - celková neuhradená suma v
openPayablesverzus účet záväzkov (purchases.payables,4430); - celková cena zásob v
stockverzus účet zásob (inventory.stock,2040); - pre každú majetkovú skupinu: obstarávacia cena majetku verzus majetkový účet skupiny a oprávky majetku verzus účet oprávok.
Upozornenie znamená, že analytická evidencia starého systému a hlavná kniha sa nezhodujú. Pred importom upravte balík (alebo vedome akceptujte vzniknutý rozdiel).
Odpoveď
{
"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": []
}
Hodnota dryRun: true označuje validačný beh, pričom pole journalTransactionId má hodnotu null. Samotný import sa do protokolu auditu zaznamená ako migration.imported spolu s rovnakým súhrnom.
Po importe
- Uzatvorte obdobia pred dátumom rezu (
ledger/periods/lock), aby sa do migrovanej histórie omylom nič nezaúčtovalo. - Skontrolujte predvahu a súvahu k dátumu rezu porovnaním s koncovými výkazmi zo starého systému.
- Pokračujte v bežnom procese: vystavujte faktúry, importujte bankové výpisy, párujte platby - migrované otvorené faktúry sa vyrovnávajú rovnako ako akékoľvek iné.
Čo nástroj na import nepokrýva: položky faktúry a registre DPH za minulé obdobia (ponechajte ich v starom systéme alebo jeho archíve), históriu mzdy a iné dokumenty ako faktúry (objednávky, dodacie listy, zmluvy).