Jak a kdy běží výpočty

Výpočty jsou JavaScript, který na pozadí počítá hodnoty proměnných, mění nastavení úkolu nebo volá okolní systémy. Píšou se do záložky Výpočty v editoru úkolu (viz článek Výpočty na úkolu) a do sdílených skriptů v administraci. Tento článek popisuje, v jakém pořadí a kontextu výpočty běží, jak se k nim připojují sdílené skripty, kam se zapisují jejich chyby a co se stane, když výpočet selže. Konkrétní rozhraní, které máte ve výpočtu k dispozici (vars, proc, task, lib, dt...), popisují další články této sekce.

Kdy se sekce spouští

Záložka Výpočty obsahuje jednu nebo víc sekcí kódu. Každá sekce má zaškrtnuté okamžiky spuštění:

OkamžikKdy přesně
Při spuštěníÚkol se aktivuje – u úkolu pro uživatele po určení řešitele, u e-mailového upozornění před odesláním, u Smart Eventu až po jeho provedení, u podprocesu před založením podřízeného případu.
Na konciÚkol se splní, u všech typů úkolů včetně automatických.
Při přepočítáníŘešitel zvolí v nabídce úkolu Přepočítat. Formulář se nejdřív uloží.
RučněUživatel otevře v okně Událost čekající úkol typu Událost, ještě před zobrazením proměnných.
Před převzetímÚkol se stává úkolem k odběru, těsně před nabídnutím uživatelům.

Má-li úkol víc sekcí se stejným okamžikem, spustí se v pořadí, v jakém jsou na záložce seřazené – přesuňte je ikonou pořadí, pokud na sobě závisí. Vypnutá sekce (přepínač Aktivní) a sekce bez zaškrtnutého okamžiku se nikdy nespustí.

Úkol vs. proces
Výpočty na záložce Výpočty běží vždy v kontextu jednoho úkolu (mají k dispozici task, snaps, storage, excel, jwt, identity, axios, ai, ftp, vault i proc, lib, dt, dr, html, zip). Neexistuje samostatná záložka pro „výpočet celého procesu“ – pokud má počítat něco nezávislého na konkrétním úkolu, dejte to do automatického úkolu nebo do sdíleného skriptu typu Výpočty.

Připojené skripty

Pole Skripty na záložce Výpočty nabízí aktivní sdílené skripty typu Výpočty z Administrace → Skripty (viz článek Globální skripty a React skripty). Kód vybraných skriptů se vloží před kód sekce, takže jejich funkce jsou v sekci rovnou k dispozici – nemusíte nic importovat:

// Skript "ExchangeRates" vybraný v poli Skripty definuje:
function getEurRate() {
    return lib.getExchangeRate('EUR');
}

// Kód sekce ho může rovnou zavolat:
const rate = getEurRate();
vars['totalPriceEur'].setValue(vars['totalPrice'].getValue() / rate);

Vyberete-li víc skriptů, vloží se v pořadí, v jakém jsou v poli vybrané. Když skript v administraci vypnete nebo smažete, zmizí i z výpočtů, které ho používaly, a při příštím uložení šablony se to projeví chybou, pokud na jeho funkce kód odkazuje.

Zdroj a ES6 syntax

Kód píšete do záložky Zdroj. Po uložení ho server přeloží (transpiluje) do podoby na záložce ES6 syntax, která se skutečně spouští – await se tam mimo jiné doplní za každé volání metody API, protože metody jako setValue nebo getDynTable jsou asynchronní. Proto se ve zdroji await obvykle nepíše a nevadí ani zápis bez function/arrow syntaxe, kterou mají starší šablony.

Jak se ukládají hodnoty

Každé volání vars['x'].setValue(...), vars['x'].setAttribute(...), task.setAttribute(...) nebo proc.setAttribute(...) zapíše řádek do databáze okamžitě, ne až na konci výpočtu. Výpočet tedy neběží v jedné všechno-nebo-nic transakci: pokud selže až v polovině, hodnoty nastavené před chybou zůstanou uložené, ale akce, která výpočet spustila (např. splnění úkolu), se nedokončí a uživatel dostane chybové hlášení.

vars['approved'].setValue(true); // tato hodnota zůstane uložená i při chybě níž
const supplier = vars['supplier'].getValue();
vars['supplierEmail'].setValue(supplier.email); // TypeError, pokud je supplier null – úkol se nesplní
Testujte na zkušebním případu
Protože dílčí zápisy zůstávají v databázi i po chybě, při ladění výpočtu na ostrém případu můžete nechat proměnné v mezistavu. Ladění proto dělejte na zkušebním případu, ne na reálné objednávce nebo žádosti.

Logování a ladění

Objekt debug zapisuje do logu, který admin najde v Administrace → Logy → Logy výpočtů (viz článek Logy):

MetodaK čemu slouží
debug.log(message)Zapíše zprávu do Logu výpočtů. Netextovou hodnotu převede na JSON.
debug.dump()Zapíše do logu hodnoty všech proměnných úkolu jako JSON – i když výpočet skončí výjimkou, takže vidíte stav, který se kvůli chybě neuložil.
debug.error(message, languages)Ukončí výpočet chybou se zadanou hláškou; languages je objekt s překlady, např. {cs: '...', en: '...'}.
debug.sleep(seconds)Pozastaví běh výpočtu na daný počet sekund – pro testování časování.
debug.enable() / debug.disable()Zapne/vypne zápis každého řádku výpočtu do logu.
debug.on() / debug.off()Vypne/zapne obalení výpočtu try-catchem; off() použijte jen krátce při ladění, protože necháte neošetřené výjimky projít dál.
debug.log({ step: 'before-approval', total: vars['totalPrice'].getValue() });

if (!vars['supplier'].getValue()) {
    debug.dump();
    throw new Error('Supplier is empty, cannot continue.');
}

Záznam v Logu výpočtů obsahuje případ, úkol a trace ID, takže chybu snadno dohledáte i zpětně.

Související: Výpočty na úkolu, Logy, Reference API výpočtů, Globální skripty a React skripty.

Reference API výpočtů: knihovna lib

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)