Nordlet

← 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:

  1. Vytvořte společnost a aplikujte šablonu účtové osnovy (ledger/accounts/apply-template), případně uveďte požadované účty v sekci accounts balíčku.
  2. Pokud importujete zásoby, vytvořte alespoň jeden sklad (inventory/warehouses/create).
  3. 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 outstanding je grossTotal; pro vatTotal je výchozí hodnota 0 (základ daně se dopočítá).
  • Výchozí hodnotou pro dueDate je datum vystavení dokladu.
  • Výchozí hodnotou pro currency je měna fakturace společnosti. Pro jakoukoliv jinou měnu než je základní měna společnosti je vyžadován údaj fxRate - 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 number odpoví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 pole documentNumber.
  • 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č openPayables vyžadují přítomnost openingBalances ve 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 openReceivables vs. zůstatek na účtu pohledávek (pravidlo zaúčtování sales.receivable, standardně 2410);
  • celková výše neuhrazených závazků openPayables vs. účet závazků (purchases.payables, 4430);
  • celková hodnota zásob stock vs. úč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).