← Základy / Sady SDK
Migrace z jiného systému
Převeďte účetnictví společnosti jedním voláním - účtovou osnovu, partnery, počáteční stavy nebo plnou historii, otevřené faktury, dlouhodobý majetek a zásoby.
Když společnost přechází do systému Nordlet z jiného účetního programu, její účetnictví nezačíná od nuly. Nástroj pro import historického účetnictví vezme vše, co vám starý systém zanechal, a zapíše to jedním voláním v rámci jedné databázové transakce: pokud jediný řádek neprojde kontrolou, neuloží se nic. Stejný balíček lze nejprve spustit přes koncový bod určený pouze pro kontrolu (check-only), který provede veškeré ověření a provede rollback.
POST /v1/migration/books/validate # vše zkontroluje, nic nezapíše
POST /v1/migration/books/import # zapíše vše nebo nic
Webová aplikace nabízí stejná dvě tlačítka v sekci Účet → Migrace (vložte JSON nebo nahrát soubor). Klíč API
vyžaduje oprávnění ledger:write a oprávnění k zápisu pro každou zahrnutou sekci (partners:write, catalog:write,
sales:write, purchases:write, assets:write, inventory:write). Oba koncové body přijímají tělo požadavku do velikosti 32 MB.
Datum přechodu (cut-over date)
Zvolte datum přechodu (cut-over date): první den, kdy je společnost provozována v systému Nordlet. Všechno před tímto datem zůstává ve starém systému (nebo se přenese jako historie, viz níže); vše od tohoto dne dále se v Nordletu eviduje přes standardní koncové body. Všechny částky v balíčku jsou platné k dni předcházejícímu datu přechodu: konečná předvaha, dosud neuhrazené faktury, zásoby na skladě a majetek v evidenci.
Před zahájením importu proveďte v Nordletu následující kroky:
- Vytvořte společnost a aplikujte šablonu účtové osnovy (
ledger/accounts/apply-template), případně uveďte požadované účty v sekciaccountsbalíčku. - Pokud importujete zásoby, vytvořte alespoň jeden sklad (
inventory/warehouses/create). - Spusťte balíček přes koncový bod
migration/books/validate, dokud nebude hlásit žádné chyby a dokud neodsouhlasíte jeho varování.
Balíček
Každá sekce je volitelná; zahrnuty by měly být ty, které máte k dispozici. Veškeré odkazy mezi sekcemi jsou provázány pomocí kódu (kód účtu, kód partnera, kód položky, kód odpisové skupiny, kód skladu), přičemž kód může odkazovat buď na záznam, který již v Nordletu existuje, nebo na záznam vytvořený v dřívější sekci téhož balíčku.
{
"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" }
]
}
Částky jsou předávány jako desetinná čísla v textovém formátu, stejně jako všude jinde v API. Položka source je
volný popisek, který se promítne do popisu transakce počátečních stavů a do poznámek migrovaných faktur.
accounts
Řádky účtové osnovy: code, name, type (asset, liability, equity, income, expense), volitelně
parentCode a isPostable. Účty, které již existují, zůstanou beze změny a jsou vyhodnoceny jako existing. Tuto
možnost použijte, pokud se účtová osnova starého systému liší od šablony, případně ji přeskočte a nejprve aplikujte šablonu.
partners a items
Zákazníci, dodavatelé a položky katalogu identifikované pomocí klíče code. V Litvě je kódem partnera obvykle
identifikační číslo společnosti (IČO); u fyzických osob použijte jakýkoliv kód, který je v rámci společnosti unikátní.
Existující kódy jsou přeskočeny a nejsou aktualizovány. Položky akceptují atributy type (product nebo service),
unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.
openingBalances
Konečná předvaha starého systému, jeden řádek na účet: accountCode s hodnotou debit nebo credit. Řádky
se zaúčtují jako jedna účetní transakce s datem openingBalances.date (výchozí hodnotou je datum přechodu)
a typem dokladu migration_opening. Řádky musí odkazovat na účty, na které lze účtovat.
Transakce musí být vyrovnaná. Pokud předvaha starého systému vyrovnaná není (kvůli zaokrouhlování, nerozdělenému zisku,
který nebyl převeden do vlastního kapitálu, nebo chybějícímu účtu), uveďte balancingAccountCode (typicky účet nerozděleného
zisku, v litevské šabloně 3410) a rozdíl bude zaúčtován na něj; odpověď tuto částku vykáže pod položkou balancingAmount.
Pro každou společnost může existovat pouze jedna transakce počátečních stavů. Druhý import obsahující openingBalances
bude zamítnut (kód 409). Následné opravy se provádějí formou běžných manuálních účetních transakcí (ledger/journal/transactions/create);
zaúčtované transakce jsou neměnné, takže původní zůstává tak, jak byla importována.
journal - plná historie místo zůstatků nebo jako jejich doplnění
Pokud chcete mít transakce ze starého systému k dispozici v Nordletu (aby fungovaly sestavy za dřívější období),
odešlete je zde: jeden objekt na transakci obsahující date, volitelný description a reference a pole entries
obsahující accountCode a debit/credit. Každá transakce musí být samostatně vyrovnaná. Jsou zaúčtovány s typem
dokladu migration.
Data musí předcházet datu přechodu. Pokud balíček obsahuje také openingBalances, musí mít historie datum
odpovídající openingBalances.date nebo pozdější - obvyklým postupem je uvést stavy k počátku předchozího účetního období
plus transakce tohoto roku, přičemž přechod připadá na první den aktuálního roku. Nezasílejte počáteční stavy a historii
za stejné období: zůstatky by se započítaly dvakrát.
Každý měsíc zasažený počátečními stavy nebo historií musí představovat otevřené účetní období (jinak se vrátí kód 409).
openReceivables a openPayables
Faktury, které byly k datu přechodu stále (zcela nebo částečně) neuhrazené. Jsou vytvořeny jako vydané faktury
ve stavu k proplacení a zaevidované přijaté faktury s hodnotou paidAmount = grossTotal − outstanding,
díky čemuž párování s bankou (bank/transactions/match, bank/transactions/suggest-matches), přehled stárnutí pohledávek
(aging report) a webhooky pro platby fungují u těchto faktur stejně jako u jakýchkoliv jiných.
- Výchozí hodnotou pro
outstandingjegrossTotal; provatTotalje výchozí hodnota0(základ daně se dopočítá). - Výchozí hodnotou pro
dueDateje datum vystavení dokladu. - Výchozí hodnotou pro
currencyje měna fakturace společnosti. Pro jakoukoliv jinou měnu než je základní měna společnosti je vyžadován údajfxRate- vyjadřuje počet jednotek dané měny za 1 jednotku základní měny, což odpovídá konvenci ve zbytku API - a tato hodnota se uloží k faktuře, aby pozdější platby správně spočítaly realizovaný kurzový rozdíl. - Číslo vydané faktury
numberodpovídá plnému číslu ze starého systému a musí být v rámci společnosti unikátní. Přijaté faktury jsou unikátní v rámci kombinace partnera a poledocumentNumber. - Tyto faktury se neúčtují znovu: jejich zůstatek pohledávek či závazků je již součástí počátečních stavů.
- Jsou provázány s transakcí počátečních stavů, což je důvod, proč
openPayablesvyžadují přítomnostopeningBalancesve stejném balíčku. - Položky faktur se neimportují; faktura obsahuje pouze celkové součty. Starý systém zůstává zdrojem detailů položek a DPH registrů pro období předcházející datu přechodu.
Pokud starý systém evidoval zůstatky zákazníků bez otevřených položek, vytvořte pro daný zůstatek jednu fakturu na
partnera (například s číslem OB-301111222), aby ji bylo možné vyrovnat.
Číselná řada pokračuje. Pokud má číslo importované vydané faktury tvar PREFIX-N a datum jejího vystavení spadá
do roku přechodu, nastaví se číselná řada pro daný prefix a rok na hodnotu N + 1 (nikdy se nesnižuje). Odpověď
uvádí výslednou číselnou řadu v poli numberSeries; v ostatních případech si řadu nastavte sami pomocí reference/series/create
({ documentType: "sale_invoice", prefix, year, startAt }).
assetGroups a fixedAssets
Dlouhodobý majetek se importuje včetně dosavadních odpisů: acquisitionCost, salvageValue, accumulatedDepreciation,
depreciatedMonths a usefulLifeMonths (případně výchozí hodnota skupiny). Lineární odpisování (assets/depreciation/post)
pokračuje ze zůstatkové hodnoty po zbývající dobu životnosti. Majetek, jehož oprávnění již dosáhlo odpisovatelné
hodnoty, je vytvořen se stavem fully_depreciated. Nic se neúčtuje - pořizovací cena a oprávky jsou součástí
počátečních stavů.
Skupiny jsou identifikovány klíčem code a vyžadují atributy assetAccountCode a depreciationAccountCode
(výchozí účet nákladů je 6206).
stock
Skladové zásoby na skladě v členění na položky: itemCode, quantity, unitCost (pořizovací cena za jednotku v EUR)
a volitelně warehouseCode (výchozí hodnota: výchozí sklad), lotNumber a expiryDate pro položky evidované podle šarží
nebo sériových čísel. Každý řádek se stane příchozím skladovým pohybem s datem odpovídajícím datu přechodu, typem dokladu
migration a založí novou FIFO vrstvu s touto cenou. Nic se neúčtuje - hodnota zásob je součástí počátečních stavů.
Kontroly a varování
Koncový bod pro ověření (validate) skončí chybou (422) v případě chybějících účtů, účtů bez možnosti účtování, nevyrovnaných transakcí, neznámých kódů partnerů, položek, skupin či skladů, duplicitních kódů nebo čísel v rámci balíčku, neuhrazených částek přesahujících celkovou částku, oprávek přesahujících odpisovatelnou hodnotu nebo chybějících kurzů měn. Čísla nebo kódy, které v Nordletu již existují, vrací kód 409.
Kromě toho oba koncové body porovnávají detailní evidence (sub-ledgers) s hlavní účetní knihou v rámci téhož balíčku
a rozdíly vracejí formou varování (warnings) namísto chyb:
- celková výše neuhrazených pohledávek
openReceivablesvs. zůstatek na účtu pohledávek (pravidlo zaúčtovánísales.receivable, standardně2410); - celková výše neuhrazených závazků
openPayablesvs. účet závazků (purchases.payables,4430); - celková hodnota zásob
stockvs. účet zásob (inventory.stock,2040); - pro každou odpisovou skupinu: pořizovací cena majetku vs. majetkový účet skupiny a jejich oprávky vs. účet oprávek.
Varování znamená, že detailní evidence starého systému a hlavní účetní kniha se neshodují. Před importem balíček upravte (nebo rozdíl vědomě akceptujte).
Odpověď
{
"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 zkušební spuštění kontroly; hodnota journalTransactionId je v takovém případě null.
Provedený import se zaznamená do protokolu auditní stopu jako migration.imported se stejným souhrnem.
Po importu
- Uzavřete účetní období před datem přechodu (
ledger/periods/lock), aby nedošlo k náhodnému zaúčtování transakcí do migrované historie. - Zkontrolujte předvahu a rozvahu k datu přechodu oproti závěrkám ze starého systému.
- Pokračujte standardním postupem: vystavujte faktury, importujte bankovní výpisy, párujte platby - migrované otevřené faktury se uhradí stejně jako jakékoliv jiné.
Co nástroj pro import nepokrývá: položky faktur a DPH registry za minulá období (ponechte je ve starém systému nebo jeho archivu), mzdovou historii a jiné dokumenty než faktury (objednávki, dodací listy, smlouvy).