Zoznam zmien

2026-10-07: GET /api/v1/payouts/ready vracia stránky

Spätne nekompatibilná zmena štruktúry existujúceho endpointu.

  • Odpoveď je štandardná stránkovaná obálka. GET /api/v1/payouts/ready vracia { items, page, pageSize, total, totalPages } ako všetky ostatné zoznamové endpointy, namiesto holého poľa. Riadky v items sa nemenia.
  • Parametre dopytu page a pageSize. Predvolené je page 1 a pageSize 20, maximum 100. Načítavajte stránky, kým neplatí page >= totalPages, aby ste prečítali všetky záznamy pripravené na výplatu.
  • Pred výplatou načítajte všetky stránky. Vyplatené záznamy zo zoznamu miznú, takže sa zostávajúce záznamy presúvajú na predchádzajúce stránky. Najprv načítajte všetky stránky, odstráňte duplicity podľa id a až potom vytvorte výplatu cez POST /api/v1/payouts. Pri výplate stránku po stránke niektoré záznamy preskočíte.
  • Poradie sa nemení. Naposledy schválené záznamy sú prvé.

2026-10-05: vehicleId pri výdavkoch, ktoré nie sú kilometrovné, sa ignoruje

Zmena správania existujúcich endpointov; štruktúra bez zmeny.

  • Vozidlo si ponechávajú len výdavky na kilometrovné. POST /api/v1/travel-entries/{id}/expenses, PUT /api/v1/travel-entries/{id}/expenses/{expenseId} a expenses v POST /api/v1/travel-entries ukladajú výdavok za palivo, mýto, parkovanie, ubytovanie alebo iný výdavok bez vozidla a každé čítanie preň vracia vehicle: null. vehicleId odoslané pri takom výdavku sa doteraz ukladalo a vracalo v odpovedi.
  • Existujúce hodnoty sa mažú. Pri aktualizácii sa odstráni vozidlo uložené pri existujúcich výdavkoch, ktoré nie sú kilometrovné, takže aj tie vracajú vehicle: null.
  • Vozidlo mimo vašej firmy sa odmieta pri každom type výdavku. Ak vehicleId označuje vozidlo mimo vašej firmy, API vracia 400 VALIDATION_FAILED, aj pri výdavkoch okrem kilometrovného. Pri týchto výdavkoch endpointy pre jednotlivý výdavok doteraz ukladali vehicleId bez kontroly. Archivované služobné vozidlo pri výdavku, ktorý nie je kilometrovné, už POST /api/v1/travel-entries neodmieta; ignoruje sa tam ako každé iné vozidlo.

2026-10-03: vytvorenie vozidla odmietne neznámy type

Zmena správania pri existujúcom endpointe; štruktúra bez zmeny.

  • POST /api/v1/vehicles s hodnotou type mimo Company a Personal vracia 400. Číselná hodnota ako 2 (odstránený typ pre verejnú dopravu) sa doteraz uložila. Teraz ju odmietne odpoveď 400 VALIDATION_FAILED pod errors.Type, ako to PUT /api/v1/vehicles/{id} už robil.

2026-10-03: nové oprávnenie ManageVehicles na zmeny vozidiel

Nová hodnota enumu a zmeny oprávnení pri existujúcich endpointoch pre vozidlá; štruktúra bez zmeny.

  • ManageVehicles v CompanyPermissions. Nový atomický príznak na správu firemných áut: samotné vozidlá, ich náklady, dokumenty, termíny a pripomienky e-mailom. Odpovede s údajmi o zamestnancoch aj webhookové správy ho uvádzajú ako každý iný príznak a každý CompanyAdmin ho teraz má. ManageCompanyData naďalej pokrýva oddelenia, nákladové strediská a výmenné kurzy, vozidlá už nie.
  • Operácie meniace vozidlá vyžadujú ManageVehicles. POST /api/v1/vehicles, PUT /api/v1/vehicles/{id}, DELETE /api/v1/vehicles/{id}, POST /api/v1/vehicles/{id}/archive a POST /api/v1/vehicles/{id}/unarchive vracajú 403 volajúcemu bez neho, bez ohľadu na ostatné oprávnenia. Každý zamestnanec, ktorý mal pred týmto vydaním ManageCompanyData, dostal ManageVehicles, takže žiadny existujúci používateľ nestratí prístup.
  • Čítanie súkromných vozidiel ostatných zamestnancov vyžaduje ManageVehicles. GET /api/v1/vehicles a GET /api/v1/vehicles/{id} vracajú súkromné vozidlá ostatných zamestnancov iba volajúcemu s oprávnením ManageVehicles alebo EditAllEntries (doteraz ManageCompanyData).
  • Posielajte späť celý zoznam. Klient, ktorý zahodí neznáme názvy príznakov a potom zapíše oprávnenia zamestnanca späť, tomuto zamestnancovi odoberie ManageVehicles. Pri spätnom odosielaní oprávnení neznáme názvy zachovajte.
  • Predvoľba FleetManager na vstupe. Zápis oprávnení prijíma FleetManager, ktorý server uloží ako ReadAllEntries a ManageVehicles. Výstupom zostáva zoznam atomických príznakov.

2026-10-03: výkon motora pri vozidlách

Aditívne pole kontraktu; štruktúra bez zmeny.

  • enginePowerKw pri vozidlách. Požiadavky na vytvorenie a úpravu vozidla prijímajú voliteľný maximálny výkon motora ako celé číslo v kilowattoch (pole P.2 osvedčenia o evidencii vozidla, 1 až 2000) a vracajú ho tak odpoveď s detailom vozidla, ako aj zoznam vozidiel. Pri úprave vynechanie uloženú hodnotu ponechá a 0 ju vymaže.

2026-10-03: poškodené bajty obrázka pri multipart prílohách vracajú 400

Zmena správania dvoch existujúcich endpointov; štruktúra bez zmeny.

  • POST /api/v1/travel-entries multipart príloha s poškodenými bajtami obrázka vracia 400. Príloha, ktorej deklarovaný typ je obrázok, ale ktorej bajty sa nedajú dekódovať ako obrázok, doteraz končila s 500. Teraz je odmietnutá odpoveďou 400 VALIDATION_FAILED pod errors.attachments, v rovnakej štruktúre ako akýkoľvek iný odmietnutý typ prílohy.
  • POST /api/v1/travel-entries/{id}/attachments s rovnako poškodeným obrázkom tiež vracia 400. Endpoint pre prílohy doteraz v tomto prípade rovnako končil s 500. Teraz je požiadavka odmietnutá odpoveďou 400 VALIDATION_FAILED pod errors.File, v rovnakej štruktúre ako akýkoľvek iný odmietnutý typ prílohy.

2026-10-02: odstránenie vozidla odmietne používané vozidlo, nový endpoint na archiváciu

Zmena správania existujúceho endpointu a jeden nový endpoint; bez zmeny štruktúry.

  • DELETE /api/v1/vehicles/{id} vracia 409 pre používané vozidlo. Vozidlo, ktoré je na náhrade cestovného príkazu alebo má zadaný náklad, sa už namiesto odstránenia nearchivuje. Odstránené cestovné príkazy a odstránené náhrady či náklady sa nepočítajú, takže vozidlo možno odstrániť, keď ho odoberiete z náhrad a vymažete jeho náklady. Požiadavka je odmietnutá odpoveďou 409 CONFLICT a vozidlo zostane bez zmeny. Vozidlo bez takých záznamov, archivované alebo nie, sa naďalej odstráni s odpoveďou 204.
  • POST /api/v1/vehicles/{id}/archive. Archivuje vozidlo, používané alebo nie, a vráti ho s isArchived: true. Takto sa archivuje vozidlo, ktorého odstránenie je odmietnuté. Archivácia archivovaného vozidla nič nemení; POST /api/v1/vehicles/{id}/unarchive ju vracia späť. Vyžaduje rovnaké oprávnenie ManageCompanyData ako odstránenie.

2026-09-28: zastarané prepísanie mimo nočného okna

Zastarané polia; bez zmeny štruktúry.

  • nightOffWindowOverride a nightOverrideReason pri paušáloch cestovného príkazu. Obe polia v odpovedi zostávajú, jeden prvok na noc, ale každý prvok je teraz false, resp. null. Prepísanie, ktoré vykazovali, je zrušené: odpoveď pre noc kratšiu ako šesť hodín sa zadáva cez nightAllocation a žiadne prepísanie nemení sumu. Prestaňte ich čítať; v niektorej z ďalších verzií môžu byť odstránené.

2026-09-28: vstupy pre cenu pohonnej látky pri náhradách za použitie vozidla

Pridané polia kontraktu; bez zmeny štruktúry.

  • fuelUnitPriceOverride a mileagePetrolGrade pri výdavkoch. Požiadavky na vytvorenie aj úpravu výdavku prijímajú obe polia, vrátane výdavkov vnorených do požiadavky na vytvorenie cestovného príkazu, a každá odpoveď s výdavkom ich vracia, aj vnútri cestovného príkazu. fuelUnitPriceOverride je cena pohonnej látky za liter (za kWh pri elektrickom vozidle) preukázaná dokladom, v základnej mene spoločnosti; na riadku náhrady za použitie vozidla v CZ alebo SK nahrádza priemernú cenu podľa predpisu v zložke za pohonné látky. mileagePetrolGrade (Octane95 alebo Octane98) vyberá priemernú cenu benzínu Natural 95 alebo Natural 98 podľa českej vyhlášky pre vlastné vozidlo na benzín bez ceny z dokladu. Každé pole sa ukladá len tam, kde ovplyvňuje ocenenie riadku, inde je null. Úprava je úplné nahradenie: ak ich vynecháte, riadok sa prepočíta priemernou cenou podľa predpisu, pri benzíne cenou Naturalu 95, preto pošlite hodnoty, ktoré výdavok vrátil, aby ste zachovali cenu z dokladu alebo benzín 98.

2026-09-16 — nákladové strediská pri zamestnancoch

Pridané pole kontraktu; bez zmeny štruktúry.

  • costCenterIds pri zamestnancoch. Odpoveď s detailom zamestnanca aj zoznam zamestnancov vracajú nákladové strediská, na ktoré zamestnanec smie účtovať, a požiadavky na vytvorenie aj úpravu zamestnanca ich prijímajú. Prázdny zoznam znamená bez obmedzenia — k dispozícii sú všetky aktívne nákladové strediská firmy. Pri vytváraní je vynechanie poľa to isté ako poslanie prázdneho zoznamu. Pri úprave vynechanie zachová uložený zoznam, prázdny zoznam ho vymaže a zoznam s hodnotami ho celý nahradí. Každé id musí patriť vašej firme, inak je požiadavka odmietnutá s 400. Pridanie nákladového strediska mimo zoznamu na cestovný príkaz je naďalej odmietnuté s 400 — práve kvôli tomuto odmietnutiu pole existuje. Obmedzenie platí len pre pridávanie: už priradené nákladové strediská sa spätne neodstraňujú, keď stredisko zo zoznamu vypadne. Pri zápise platí bezpečnostná hranica 100 rôznych nákladových stredísk na zamestnanca — duplicity sa počítajú raz a schéma túto hranicu publikuje ako maxItems v oboch telách požiadavky. Stráži veľkosť požiadavky, nie je to obchodný limit: zoznam môže uviesť len nákladové strediská, ktoré firma skutočne má, takže vás v praxi neobmedzí.

2026-09-13 — sumy stravného podľa itinerára v zákonnom čase

Opravené sumy na existujúcich endpointoch stravného podľa itinerára; bez zmeny štruktúry.

  • Výpočet stravného podľa itinerára a from-itinerary. Hodnoty time pri zastávkach sa naďalej čítajú ako UTC a vrátené okná sú naďalej v UTC. Českým a slovenským firmám sa kalendárne dni teraz delia o polnoci pražského, resp. bratislavského času, nie o polnoci UTC. Poľské firmy počítajú noci (21:00–07:00), doby a dátumy účtov podľa varšavského času. Rovnaká požiadavka preto môže pre tieto trhy vrátiť iné hodiny a sumy ako predtým.

2026-09-12 — category je pri úprave vozidla voliteľný

Uvoľnené pole v existujúcej požiadavke; bez zmeny štruktúry.

  • category pri úprave vozidla. Pole je teraz voliteľné. Ak ho vynecháte, uložená kategória zostane nezmenená; pošlite ho, keď ju chcete zmeniť, vrátane 0 na zámerné vymazanie. Pri vytváraní zostáva pole povinné.

2026-08-23 — objem motora pri vozidlách

Aditívne pole kontraktu; bez zmeny štruktúry.

  • engineCapacityCc pri vozidlách. Požiadavky na vytvorenie a úpravu vozidla prijímajú voliteľný objem motora ako celé číslo v cm³ a vracajú ho tak odpoveď s detailom vozidla, ako aj zoznam vozidiel. Pri úprave vynechanie uloženú hodnotu ponechá a 0 ju vymaže.

2026-08-17 — locked teraz hlási zámky dokumentov

Opravená sémantika hodnoty existujúceho poľa odpovede; bez zmeny štruktúry.

  • locked v odpovediach na detail a zoznam cestovných príkazov predtým hlásilo iba staršiu blokáciu z importu pred rokom 2023 a zostávalo false pri dokumentoch zamknutých v aplikácii, vrátane automatického zámku uplatneného pri výplate. Teraz nesie rovnaký odvodený stav zámku, aký už hlási webhook entry.updated v isLocked: true vždy, keď je dokument uzavretý pre zápis. Chápte to ako “tento záznam nemožno upraviť”, nie ako označenie konkrétneho pôvodu zámku.

2026-07-13 — place id, ručné kurzy, prepísania stravného, smer kurzu

Aditívne, spätne kompatibilné polia kontraktu a nový diskriminátor kurzu.

  • Place id na cestovných príkazoch. Požiadavky na vytvorenie a aktualizáciu prijímajú departureLocationPlaceId a destinationPlaceId (Google Places place_id) a odpoveď cestovného príkazu ich vracia. Pošlite uložené hodnoty späť pri aktualizácii s úplnou náhradou, aby ste zachovali identitu miesta pri úprave textu cieľa.
  • Cieľová krajina na cestovných príkazoch. Požiadavky prijímajú nepovinný destinationCountryCode (ISO 3166-1 alpha-2). Keď je zadaný, uloží sa priamo a serverová záloha geocoding sa preskočí.
  • Ručné kurzy. Požiadavky na výdavky a stravné prijímajú nepovinný manualExchangeRate a požiadavky cestovného príkazu manualAdvanceExchangeRate pre preddavok. Každý sa rešpektuje iba vtedy, keď poskytovateľ kurzu nezverejní kurz pre referenčný dátum; odoslanie, keď existuje oficiálny kurz, sa odmietne s EXCHANGE_RATE_UNAVAILABLE.
  • Prepísania stravného. Požiadavka na stravné prijíma overrideAmount a overrideReason a čítacie modely stravného ich vracajú. Na zachovanie existujúceho prepísania pri aktualizácii s úplnou náhradou pošlite hodnoty späť; ich vynechanie vymaže prepísanie a vráti sa k zákonnej výplate.
  • Smer kurzu. GET /api/v1/reference/exchange-rates teraz nesie diskriminátor direction: ForeignPerBase (HNB / ECB) znamená kurz deliť pre prevod na základnú menu, BasePerForeign (CNB) znamená násobiť.

2026-07-08 — dátum preddavku, poskytovateľ kurzu pre CZ/SK

Dve aditívne, spätne kompatibilné zmeny.

  • Dátum preddavku na cestovných príkazoch. Požiadavky na vytvorenie a aktualizáciu teraz prijímajú nepovinný advancePaymentDate (yyyy-MM-dd) a odpoveď cestovného príkazu ho vracia. Ak je pri vytvorení vynechaný, server použije dátum záznamu. Určuje dátum kurzu pre preddavok a pri českých tenantoch referenčný dátum kurzu pre stravné.
  • Poskytovateľ kurzu pre CZ/SK. GET /api/v1/reference/exchange-rates teraz dokumentuje úplnú sadu poskytovateľov: HNB pre HR, ECB pre SI a SK, CNB pre CZ. Pole source môže byť "CNB" a baseCurrency je natívna mena poskytovateľa (EUR pre HNB/ECB, CZK pre CNB). Správanie sa nemení; dokumentácia teraz zodpovedá behu.

2026-06-11 — počty jedál, pôvod menového kurzu, kód pre nedostupný výmenný kurz

Tri aditívne zmeny rozhrania. Všetky sú spätne kompatibilné: existujúce payloady naďalej fungujú bez zmeny a nové polia v odpovediach sú doplnky, ktoré môžete ignorovať, kým ich nebudete potrebovať.

  • Počty jednotlivých jedál pri vytváraní/aktualizácii diet. Požiadavky na diéty teraz prijímajú breakfastsProvided, lunchesProvided a dinnersProvided (celočíselné počty jednotlivých jedál) plus voliteľné denné mealsProvidedAllocation. Predstavujú kánonický model zápisu: server z týchto počtov prepočítava zníženie. Existujúci v1 agregát mealsProvided je stále akceptovaný; keď polia pre jednotlivé jedlá chýbajú, server mapuje agregát ako predtým, takže starší klienti nie sú ovplyvnení. Odpovede naďalej vracajú odvodené mealsProvided (obed + večera, formát podľa chorvátskeho Pravilnika) spolu s počtami jednotlivých jedál, takže cesty na čítanie zostávajú nezmenené.
  • Pôvod menového kurzu (FX) v odpovediach. Odpovede pre výdavky a diéty získavajú exchangeRateSource a odpoveď pre cestovný záznam získava advancePaymentExchangeRateSource, ktoré zaznamenávajú, odkiaľ pochádza použitý kurz: kód poskytovateľa ("HNB", "ECB") pre oficiálny kurz, "MANUAL" pre kurz zadaný používateľom, alebo null pre riadok v rovnakej mene (bez konverzie) či starší riadok uložený pred sledovaním pôvodu. Iba na čítanie; žiadna zmena v požiadavke.
  • Nový chybový kód EXCHANGE_RATE_UNAVAILABLE (HTTP 400). Spustí sa, keď poskytovateľ menových kurzov pre tenanta nezverejní žiadny kurz pre danú menu v požadovanom dátume a neexistuje žiadny historický kurz, na ktorý by sa dalo spoľahnúť. Ide o zlyhanie z rodiny validácií so štandardným telom errors kľúčovaným podľa polí, takže môžete špecificky rozlíšiť prípad nedostupného kurzu a vyzvať na manuálne zadanie kurzu. Pridané do katalógu chýb.

2026-05-23 — časy itinerára pre diéty ukladané ako skutočné UTC (oprava)

Časy diét ukladané cez POST /api/v1/travel-entries/{id}/per-diems/from-itinerary sa teraz ukladajú ako skutočné UTC okamihy. Predtým sa odchod/príchod každej cesty zapisoval pomocou hodnoty lokálneho času označenej ako UTC bez posunu (lokálna cesta o 08:00 bola uložená ako 08:00Z namiesto 07:00Z/06:00Z), takže riadky vygenerované z itinerára sa nezhodovali s manuálne pridanými riadkami o 1–2 hodiny a zobrazovali sa neskoro. Schémy požiadaviek a odpovedí zostávajú nezmenené, ale hodnoty departureTime/arrivalTime, ktoré tento endpoint vracia (a ktoré vracajú aj neskoršie čítania tých istých riadkov), teraz odrážajú opravený UTC okamih. Náhľad bezstavovej kalkulačky stále vracia lokálne časy. Sumy diét nie sú ovplyvnené.

2026-05-23 — kalkulačka diét + uloženie celej cesty

Rozhranie na výpočet diét je konsolidované a získava paritu ukladania celej cesty s webovou aplikáciou locco.

  • Nové POST /api/v1/utilities/per-diems/calculate — bezstavová kalkulačka. Odošlite itinerár (jedna cesta = itinerár s 2 zastávkami) a získajte späť vypočítané riadky s aplikovaným prerozdelením na úrovni itinerára. Žiadny kontext záznamu, nič sa neukladá.
  • Nové POST /api/v1/travel-entries/{id}/per-diems/from-itinerary — prebudovanie diét cestovného záznamu z itinerára v jednom volaní. Server znova spustí svoj vlastný engine nad zastávkami (odoslaným sumám sa nikdy nedôveruje), aplikuje jedlá pre jednotlivé cesty kľúčované podľa (countryCode, departureTime) (dvojice, ktoré vracia kalkulačka), a potom atomicky nahradí diéty záznamu. Toto reprodukuje prerozdelenie na úrovni itinerára a upgrady domácich jednotiek, čo odosielanie riadkov po jednom nedokáže.
  • Odstránené POST /api/v1/travel-entries/{id}/per-diems/compute a POST /api/v1/per-diems/calculate-simple. Obe sú nahradené pomocou utilities/per-diems/calculate — jedna cesta je len itinerár s 2 zastávkami. Presuňte integrácie na novú kalkulačku.

2026-05-22 — podpora slovinského trhu

Počiatočná podpora pre slovinských tenantov. Aktualizujte svojho klienta z obnoveného OpenAPI snapshotu na /api-reference/:

  • Slovinské obce — nové GET /api/v1/reference/slovenian-municipalities vracia zoznam obcí SURS pre rozbaľovacie zoznamy miest v slovinských cestovných formulároch. Volateľné z akéhokoľvek tenanta.
  • Daňová rezidencia zamestnanca — záznamy zamestnancov získavajú pole residency (Resident / NonResident) pre vykazovanie slovinských diét a daní zo mzdy. Predvolená hodnota je Resident.

2026-04-28 — spustenie v1.0

Prvé stabilné vydanie locco partner API. Každé rozhranie je prepojené, typované a pokryté OpenAPI snapshotom na /api-reference/:

  • Cestovné záznamy — plný CRUD plus prechody workflowu (odoslať, schváliť, zamietnuť, zrušiť, vyžiadať zmeny), s atomickými vytváraniami, ktoré v jednom volaní prijímajú vnorené výdavky, diéty, alokácie na nákladové strediská a prílohy.
  • Prílohy — priame nahrávanie do cestovného záznamu cez POST /api/v1/travel-entries/{id}/attachments. Multipart, až 5 súborov na požiadavku.
  • Webhooks — registrácia odberu s jednorazovým zobrazením signing-secret, história doručovania pre každý odber a endpoint na opakovanie pre zlyhané alebo vyčerpané doručenia.
  • Výplaty — zoznam záznamov pripravených na výplatu, vytváranie dávok, história zoznamov, vymazanie dávky.
  • Zamestnanci, Oddelenia, Vozidlá, Nákladové strediská — CRUD + zoznam, s hodnotami vlastných polí pri zamestnancoch.
  • Referencie — chorvátske obce, menové kurzy HNB, tabuľka sadzieb diét, zoznamy povolených krajín a povolených mien spoločnosti.
  • Spoločnosť — čítanie profilu.

Hodnoty enum pre Status, TravelType, PayoutMethod a ostatné sú zdokumentované v OpenAPI schéme ako zoznamy povolených hodnôt enum: [...], takže vygenerovaní klienti sa viažu na kánonické reťazce ("PendingApproval", "BankTransfer", atď.) namiesto nepriehľadných hodnôt.