Nordlet

← Dokumentācija / Ceļveži

Migrēšana no citas sistēmas

Pārnesiet uzņēmuma grāmatvedību ar vienu pieprasījumu - kontu plānu, partnerus, sākuma atlikumus vai pilnu vēsturi, neatmaksātos rēķinus, pamatlīdzekļus un krājumus.

Kad uzņēmums pāriet uz Nordlet no citas grāmatvedības programmas, tā grāmatvedība nesākas no nulles. Vēsturiskās grāmatvedības importētājs apstrādā visu, ko vecā sistēma atstājusi, un ieraksta datus vienā pieprasījumā, vienā datubāzes transakcijā: ja kaut viena rinda neiziet pārbaudi, nekas netiek saglabāts. To pašu pakotni vispirms var palaist caur pārbaudes galapunktu (endpoint), kas veic visas validācijas un atceļ izmaiņas (rollback).

POST /v1/migration/books/validate   # visu pārbauda, neko neraksta
POST /v1/migration/books/import     # ieraksta visu vai neko

Tīmekļa lietotnē tie paši divi taustiņi atrodas sadaļā Konts → Migrācija (ielīmējiet JSON vai augšupielādējiet failu). API atslēgai ir nepieciešama tiesība ledger:write, kā arī katras iekļautās sadaļas rakstīšanas tiesību tvērums (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Abi galapunkti pieņem pamattekstus (bodies) līdz 32 MB.

Slēgšanas datums

Izvēlieties slēgšanas datumu (cut-over date): pirmo dienu, kurā uzņēmums darbojas Nordlet. Viss, kas bija pirms tā, paliek vecajā sistēmā (vai tiek pārnestas kā vēsture, skat. tālāk); viss no šīs dienas tiek ievadīts Nordlet, izmantojot parastos galapunktus. Visas pakotnē esošās summas ir "uz dienu pirms slēgšanas datuma": noslēdzošā apgrozījuma bilance, joprojām neapmaksātie rēķini, plauktos esošie krājumi, reģistrā esošie pamatlīdzekļi.

Pirms importēšanas veiciet Nordlet šādas darbības:

  1. Izveidojiet uzņēmumu un lietojiet kontu plāna veidni (ledger/accounts/apply-template) - vai uzskaitiet pakotnes sadaļā accounts nepieciešamos kontus.
  2. Izveidojiet vismaz vienu noliktavu (inventory/warehouses/create), ja importējat krājumus.
  3. Palaidiet pakotni caur migration/books/validate, līdz tā neuzrāda kļūdas un jūs apstiprināt tās brīdinājumus.

Pakotne

Katra sadaļa nav obligāta; iekļaujiet tās, kuras jums ir. Visas atsauces starp sadaļām tiek veidotas pēc koda (kontu kods, partnera kods, preces kods, pamatlīdzekļu grupas kods, noliktavas kods), un kods var atsaukties gan uz ierakstu, kas jau pastāv Nordlet, gan uz ierakstu, ko izveidojusi tā pašu pakotne iepriekšējā sadaļā.

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

Summas ir decimāldaļu virknes, tāpat kā visur citur API. source ir brīvas formas apraksts, kas parādās sākuma atlikumu transakcijas aprakstā un migrēto rēķinu piezīmēs.

accounts

Kontu plāna rindas: code, name, type (asset, liability, equity, income, expense), neobligāts parentCode un isPostable. Esošie konti netiek aiztikt un tiek skaitīti kā existing (esoši). Izmantojiet šo, ja vecās sistēmas kontu plāns atšķiras no veidnes, vai izlaidiet to un vispirms lietojiet veidni.

partners un items

Klienti, piegādātāji un kataloga preces, kas identificētas pēc code. Lietuvā partnera kods parasti ir uzņēmuma reģistrācijas kods; privātpersonām izmantojiet jebkuru kodu, kas ir unikāls uzņēmuma ietvaros. Esošie kodi tiek izlaisti, nevis atjaunināti. Precēm var norādīt type (product vai service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.

openingBalances

Vecās sistēmas noslēdzošā apgrozījuma bilance, viena rinda uz katru kontu: accountCode ar debit vai credit. Rindas tiek grāmatotas kā viena žurnāla transakcija ar datumu openingBalances.date (pēc noklusējuma slēgšanas datums) un dokumenta tipu migration_opening. Rindām ir jānorāda uz kontiem, kuros var grāmatot.

Transakcijai ir jāsabalansējas. Ja vecās sistēmas apgrozījuma bilance nesabalansējas - noapaļošanas dēļ, peļņa, kas nekad nav slēgta uz pašu kapitālu, vai trūkstošs konts -, norādiet balancingAccountCode (parasti nesadalītā peļņa, 3410 Lietuvas veidnē), un starpība tiks iegrāmatota tur; atbilde ziņo par summu kā balancingAmount.

Katram uzņēmumamm var pastāvēt tikai viena sākuma atlikumu transakcija. Otra importēšana ar openingBalances tiek noraidīta (409). Labojumi pēc faktiem ir parastas manuāla žurnāla transakcijas (ledger/journal/transactions/create); iegrāmatotās transakcijas nav labojamas (immutable), tāpēc oriģināls paliek tāds, kāds tas tika importēts.

journal - pilna vēsture aizstāšanai vai papildināšanai ar atlikumiem

Ja vēlaties vecās sistēmas transakcijas redzēt Nordlet (lai darbotos agrāko periodu atskaites), nosūtiet tās šeit: viens objekts uz katru transakciju ar date, neobligātu description un reference, un entries ar accountCode + debit/credit. Katrai transakcijai ir jāsabalansējas pašai par sevi. Tās tiek iegrāmatotas ar dokumenta tipu migration.

Datumiem jābūt pirms slēgšanas datuma. Ja pakotne satur arī openingBalances, vēsturei ir jābūt datumā, kas ir vienāds ar openingBalances.date vai vēlāks - parasti bilance ir iepriekšējā finanšu gada sākumā, kam seko attiecīgā gada transakcijas, un slēgšanas datums ir kārtējā gada pirmajā dienā. Nesūtiet atlikumus un vēsturi par to pašu periodu: atlikumi tiktu ieskaitīti divreiz.

Katram mēnesim, kuru skar sākuma atlikumi vai vēsture, ir jābūt atvērtam grāmatvedības periodam (pretējā gadījumā tiek atgriezts 409).

openReceivables un openPayables

Rēķini, kas uz slēgšanas brīdi joprojām bija neapmaksāti (pilnībā vai daļēji). Tie tiek izveidoti kā izrakstīti pārdošanas rēķini un reģistrēti pirkuma rēķini ar paidAmount = grossTotal − outstanding, lai bankas datu saskaņošana (bank/transactions/match, bank/transactions/suggest-matches), debitoru parādu novecojuma atskaites un maksājumu tīmekļa āķi (webhooks) darbotos ar tiem tāpat kā ar jebkuru citu rēķinu.

  • outstanding pēc noklusējuma ir vienāds ar grossTotal; vatTotal pēc noklusējuma ir 0 (PVN nesekojošā summa tiek aprēķināta automātiski).
  • dueDate pēc noklusējuma ir dokumenta datums.
  • currency pēc noklusējuma ir uzņēmuma rēķinu valūta. Jebkurai valūtai, kas nav uzņēmuma bāzes valūta, ir nepieciešams fxRate - šīs valūtas vienību skaits pret 1 bāzes valūtas vienību, ievērojot to pašu konvenciju kā pārējā API -, un tas tiek saglabāts rēķinā, lai vālamākie maksājumi pareizi aprēķinātu realizēto valūtas kursa starpību.
  • Pārdošanas rēķina number ir vecās sistēmas pilnais numurs, un tam jābūt unikālam uzņēmumā. Pirkuma rēķini ir unikāli katram partnerim un documentNumber.
  • Rēķini netiek iegrāmatoti atkārtoti: to debitoru/kreditoru atlikums jau ir daļa no sākuma atlikumiem. Tie ir saistīti ar sākuma atlikumu transakciju, tāpēc openPayables pieprasa openingBalances tajā pašā pakotnē.
  • Rēķinu rindas netiek importētas; rēķins satur tikai kopsummas. Vecā sistēma paliek par avotu rindu detaļām un pirms slēgšanas datuma periodu PVN reģistriem.

Ja vecā sistēma sekoja līdzi klientu atlikumiem bez atsevišķiem neapmaksātiem dokumentiem, izveidojiet vienu rēķinu uz katru partneri par šo atlikumu (piemēram, ar numuru OB-301111222), lai to varētu dzēst.

Numerācija turpinās. Ja importētam pārdošanas rēķina numuram ir forma PREFIX-N un tā izrakstīšanas datums iekrīt slēgšanas gadā, šim prefiksam un gadam numuru sērija tiek iestatīta uz N + 1 (tā nekad netiek samazināta). Atbilde uzskaita rezultātā iegūto numberSeries; citos gadījumos iestatiet sēriju pats, izmantojot reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).

assetGroups un fixedAssets

Pamatlīdzekļi tiek pārnesti ar to uzkrāto nolietojumu līdz datumam: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths un usefulLifeMonths (vai grupas noklusējuma vērtība). Lineārā nolietojuma aprēķins (assets/depreciation/post) turpinās no atlikušās vērtības par atlikušajiem mēnešiem. Pamatlīdzekļi, kuru uzkrātais nolietojums jau sasniedz nolietojamo vērtību, tiek izveidoti ar statusu fully_depreciated (pilnībā nolietots). Nekas netiek iegrāmatots - iegādes vērtība un uzkrātais nolietojums ir daļa no sākuma atlikumiem.

Grupas tiek identificētas pēc code, un tām ir nepieciešams assetAccountCode un depreciationAccountCode (noklusējuma izmaksu konts 6206).

stock

Krājumatzīmes noliktavā uz vienību: itemCode, quantity, unitCost (izmaksas uz vienību EUR) un pēc izvēles warehouseCode (pēc noklusējuma: noklusējuma noliktava), lotNumber un expiryDate precēm ar partijas vai sērijas numuru uzskaiti. Katra rinda kļūst par ienākošo krājumu kustību ar datumu, kas sakrīt ar slēgšanas datumu, un dokumenta tipu migration, un tā sāk FIFO slāni par šo pašizmaksu. Nekas netiek iegrāmatots - krājumu vērtība ir daļa no sākuma atlikumiem.

Pārbaudes un brīdinājumi

Validācijas galapunkts atgriež kļūdu (422) trūkstošu kontu, negrāmatojamu kontu, nesabalansētu transakciju, nezināmu partnera/preces/grupas/noliktavas kodu, dubultotu kodu vai numuru pakotnē, summu virs kopsummas neatmaksātajai daļai, uzkrātā nolietojuma virs nolietojamās vērtības un trūkstošu valūtas kursu gadījumā. Numuri vai kodi, kas jau eksistē Nordlet, atgriež 409.

Papildus tam abi galapunkti salīdzina pakārtotos reģistrus (sub-ledgers) ar virsgrāmatas ierakstiem tajā pašā pakotnē un atgriež atšķirības kā warnings (brīdinājumus), nevis kļūdas:

  • openReceivables kopējo neatmaksāto summu pret debitoru konta atlikumu (sales.receivable grāmatojuma nosacījums, pēc noklusējuma 2410);
  • openPayables kopējo neatmaksāto summu pret kreditoru kontu (purchases.payables, 4430);
  • stock kopējās izmaksas pret krājumu kontu (inventory.stock, 2040);
  • katrai pamatlīdzekļu grupai - pamatlīdzekļu izmaksas pret grupas pamatlīdzekļu kontu un to uzkrāto nolietojumu pret nolietojuma kontu.

Brīdinājums nozīmē, ka vecās sistēmas pakārtotais reģistrs un virsgrāmata nesakrīt. Pirms importēšanas labojiet pakotni (vai apzinieties un pieņemiet šo atšķirību).

Atbilde

{
  "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 apzīmē pārbaudes palaidi (validate run); šajā gadījumā journalTransactionId ir null. Importēšana tiek reģistrēta audita žurnālā kā migration.imported ar tādu pašu kopsavilkumu.

Pēc importēšanas

  • Slēdziet periodus pirms slēgšanas datuma (ledger/periods/lock), lai migrētajā vēsturē nejauši netiktu iegrāmatots nekas cits.
  • Pārbaudiet apgrozījuma bilanci un bilanci uz slēgšanas datumu pret vecās sistēmas noslēguma atskaitēm.
  • Turpiniet ar parasto plūsmu: izrakstiet rēķinus, importējiet bankas konta izrakstus, saskaņojiet maksājumus - migrētie neapmaksātie rēķini dzēšas tāpat kā jebkurš cits rēķins.

Ko importētājs neaptver: iepriekšējo periodu rēķinu rindas un PVN reģistrus (saglabājiet tos vecajā sistēmā vai tās arhivā), algu vēsturi un dokumentus, kas nav rēķini (pasūtījumus, pavadzīmes, līgumus).