lib je knihovna obecných funkcí dostupná v každém výpočtu (na záložce Výpočty i ve sdílených skriptech typu Výpočty). Namísto vars/proc/task (viz Reference API výpočtů: proměnné a případ) řeší jednotlivé, často opakované úlohy – práci s datem, textem, uživateli, organizační strukturou nebo rolemi. Tento článek shrnuje funkce dostupné v TAS 5.19.12. Funkce pro soubory, DMS a tisk má samostatný článek Tisk a generování souborů ve výpočtech; dynamické tabulky článek Dynamické tabulky ve výpočtech.
Všechny funkce se volají s předponou lib., např. lib.format(...). U funkcí, které čtou nebo mění proměnné/uživatele/role, je prvním argumentem obvykle název, ID nebo samotný objekt (vars['Supplier'], 'Supplier' i číslo TVAR_ID fungují zaměnitelně).
Datum a čas
| Funkce | Vrací | Popis |
|---|
format(date, phpFormat) | string | Formátuje datum podle PHP formátovacího řetězce (yyyy-mm-dd h:MM:ss). |
to_date(strDate) | Date | Převede text YYYY-MM-DDThh:mi:ss na datum. |
alterDate(date, strTime) | Date | Upraví datum stejně jako PHP strtotime(), např. alterDate(vars['Start'], '+4 months'). |
wmd(date, businessDaysCount) | Date | Přidá/odebere počet pracovních dnů. |
wmh(date, hoursAdd, startWork, endWork) | Date | Přidá/odebere počet hodin v rámci pracovní doby a svátků. |
whd(startTime, endTime, startWork, endWork) | number | Počet pracovních hodin mezi dvěma daty. |
wdd(startTime, endTime) | number | Počet pracovních dní mezi dvěma daty. |
wtd(startTime, endTime, unit, startWork, endWork) | number | Pracovní čas mezi dvěma daty v zadané jednotce (minutes, hours...). |
getExchangeRate(currency) | * | Aktuální kurz měny (živě z ČNB). |
getHistoricExchangeRate(currency, date) | * | Kurz měny k danému datu. |
const days = lib.wdd(vars['DepartureDate'].getValue(), vars['ReturnDate'].getValue());
vars['TravelAllowance'].setValue(days * 600);
Text, čísla a pole
| Funkce | Vrací | Popis |
|---|
fnRound(number) | number | Zaokrouhlí na celé číslo. |
fnNumber(number, decimals, decPoint, thousandsSep) | string | Naformátuje číslo na text (oddělovač tisíců, desetinná čárka). |
fnFloor(number) | number | Zaokrouhlí dolů. |
fnSubstr(value, startIndex, endIndex) | string | Ořízne text podle pozic. |
fnStrLength(str) | number | Délka textu. |
fnStrPad(input, padLength, padString) / fnStrPadRight(...) | string | Doplní text zleva/zprava na danou délku. |
truncate(string, maxLength) | string | Zkrátí text na danou délku. |
nl2p(text) | string | Převede nové řádky na odstavce (<p>). |
random_text(length) | string | Náhodný text ze znaků A–Z, a–z, 0–9. |
gen_passc(length) | string | Jednoduché náhodné heslo. |
getChr(asciiCode) | string | Znak podle ASCII kódu. |
fnPregMatch(pattern, subject) | boolean | Test proti regulárnímu výrazu (bez lomítek). |
fnEq/fnNe/fnLt/fnGt... (a jejich ...10 varianty pro 10 hodnot) | boolean | Porovnání hodnot (===, !==, <, >...); argumenty mohou být i funkce. |
fnAnd(v1, v2) / fnOr(v1, v2) | boolean | Logické AND/OR, i pro funkce jako argumenty. |
fnEmpty(v1) | boolean | true, pokud je hodnota undefined, null nebo ''. |
fnContain(v1, v2) | boolean | Zjistí, jestli v1 obsahuje v2. |
fnToArray(v1) | Array<string> | Rozdělí text znakem | na pole. |
fnFromArray(glue, arr) | string | Slepí pole znakem glue. |
fnArrayDiff(array1, array2) / fnArrayMerge(...) / fnArrayUnique(array1) | array | Rozdíl, sjednocení a odstranění duplicit v poli. |
fnInArray(needle, haystack) / fnDelFromArray(needle, haystack) | boolean/array | Hledání a odebrání prvku v poli. |
jsonSumArray(json, pathInJson) | number | Součet pole v JSON podle cesty, např. obj.arr. |
csvToArray(file) / csvToJson(data, delimiter, firstLineColNames) / jsonToCsv(data, mapping) | – | Převody mezi CSV, polem a JSON. |
xmlToJson(xml) / jsonToXml(jsonObj) / xmlSanitize(text) | – | Převody XML ↔ JSON a sanitizace &, <, >. |
htmlToText(html) | string | Odstraní HTML značky. |
md5/sha1/sha256/sha512(input, digest='hex') | string | Hash vstupního řetězce. |
encrypt(input, algorithm, digest) / supportedEncryptAlgorithms() | string/string[] | Obecný hash zvoleným algoritmem Node.js crypto. |
getUUID() / validateUUID(id) | string/boolean | Vygeneruje nebo ověří UUID v4. |
createQrCodeBase64(text, options) / createBarcodeBase64(text, options) | string | QR kód / čárový kód jako base64 obrázek. |
const rate = vars['VatRate'].getValue();
const totalWithVat = lib.fnRound(vars['TotalPrice'].getValue() * (1 + rate));
vars['TotalWithVat'].setValue(lib.fnNumber(totalWithVat, 2, ',', ' '));
Uživatelé, role a organizační struktura
| Funkce | Vrací | Popis |
|---|
initiator() | UserApi | Vlastník (zakladatel) aktuálního případu. |
solver() | UserApi | Řešitel aktuálního úkolu. |
supervisor() | UserApi | Supervizor aktuálního případu. |
lastSolverOf(task) | UserApi | Poslední řešitel zadaného úkolu. |
getCurrentUser() | UserApi | Uživatel, pod kterým výpočet běží. |
manager(orgstr) / orgManager(org) | UserApi | Manažer organizační jednotky (manažer jednotky, resp. její podřízené). |
user(login) | string | „Příjmení Jméno“ uživatele. |
userToFirstName(login) / userToLastName(login) / usersToFullName(login) / usersToDisplayName(login) | string | Jednotlivé tvary jména uživatele. |
getUserNameById(login) | string | Přihlašovací jméno uživatele. |
getUserAttr(login, attributeName) / getOrgAttr(input, attributeName) | * | Hodnota libovolného sloupce uživatele/organizace (např. USER_EMAIL, ORGSTR_NAME). |
getUserByAttr(attributeName, attributeValue, userStatus?) | array | Vyhledá uživatele podle sloupce a hodnoty. |
getOrgByAttr(attributeName, attributeValue, singleResult=true) | OrgStrApi | Organizační jednotka podle sloupce (ORGSTR_NAME, PARENT_ORGSTR_ID...). |
orgUnitOfUser(login) | number | ID organizační jednotky uživatele. |
orgStrNameToId(orgstr) | number | ID organizační jednotky podle názvu. |
userInOrg(login, org) / userInOrgTree(login, org) | boolean | Je uživatel v dané jednotce / jejím stromu? |
userIsManager(login, org) / userIsManagerTree(login, org) | boolean | Je uživatel manažerem dané jednotky / jejího stromu? |
isUserInLevel(userName, level) / isManagerInLevel(userName, level) | boolean | Je uživatel (manažer) na dané úrovni organizační struktury? |
hasOrgChild(orgstr) | boolean | Má jednotka podřízené jednotky? |
roleToId(roleName) / idToRole(roleId) | number/string | Převod mezi názvem a ID role. |
userHasRole(login, role) | boolean | Má uživatel danou roli? |
getUserWithRole(role, filterInactive?) / getUsersWithRole(role, filterInactive?, returnOnlyFirst?) | UserApi/UserApi[] | První, resp. všichni uživatelé s danou rolí. |
getUserWithOrganization(org, filterInactive?) / getUsersWithOrganization(...) | UserApi/UserApi[] | První, resp. všichni uživatelé dané organizační jednotky. |
getUserFromOrgWithRole(destVariableName, functionName, roleName, orgstrId) | string | Najde uživatele dané role v organizační jednotce a uloží ho do proměnné. |
setRoleToUser(user, roleName, roleCategory) / removeRoleFromUser(user, role) / clearRoleFromUsers(role) | * | Přiřadí, odebere roli uživateli, nebo ji odebere všem. |
getUsers(query) / getRoles(query) / getOrgUnits(query) | object | Stránkovaný seznam uživatelů/rolí/org. jednotek – stejné chování jako služby GET /users, /roles, /org-units (filters, sort, page). |
// Doplní e-mail manažera nákupu do proměnné jen pro čtení
const buyerManager = lib.getUserWithRole('Purchasing manager');
vars['ApproverEmail'].setValue(lib.getUserAttr(buyerManager, 'USER_EMAIL'));
Případ, úkoly a čísla řady
| Funkce | Vrací | Popis |
|---|
iprocId() / itaskId(itaskName?) | number | ID aktuálního případu / úkolu podle názvu (case-sensitive). |
getSequenceNumber(name) / getSequenceNumberCond(name, cond) | number | Další číslo z číselné řady (číslování objednávek apod.), případně jen když platí podmínka. |
createNote(note) / createNonEmptyNote(note) | * | Přidá poznámku k případu (druhá varianta jen když text není prázdný). |
setCaseOwner(login) | * | Změní vlastníka případu. |
changeCaseStatus(iprocId, status) | – | Nastaví IPROC_CASE_STATUS cizímu případu. |
setHeaderByName(headerName) / setHeaderByCode(headerCode) | * | Přiřadí hlavičku vícehlavičkové šablony případu. |
getHeaderCode() | string | Kód hlavičky aktuálního případu. |
getParentProcessStatus() | string | Stav nadřazeného procesu (u podprocesu). |
finishSubProcesses() / finishSubprocessTree() | – | Ukončí podprocesy první úrovně, resp. celý strom podprocesů. |
getListSubProcess(archivedIncluded=false) | * | Seznam ID podprocesů případu. |
getSharedVariables(iprocId, {tvarIds, tvarNames}) | object | Proměnné cizího případu označené ke sdílení. |
findShareVariables(filter, iprocStatus, tProcId) | – | Najde případy, kde sdílená proměnná odpovídá filtru. |
setEventFilter(taskName, processVarName, eventVarName) | * | Nastaví filtr na čekání na externí událost. |
addStaticRights(userNames, groupName) / removeStaticRightsGroup(groupName) / removeStaticRightsUser(user) | * | Přidá/odebere statická práva viditelnosti případu. |
assignRightsToSubprocesses() | * | Přidá právo viditelnosti podprocesu. |
changeITaskComment(itaskId, comment, lang?) | – | Změní komentář jiného úkolu stejného případu. |
changeMailRecipient(mails) / changeMailAttribute(attribute, value, language?) | string | Změní příjemce/atribut e-mailové notifikace navázané na tento úkol. |
generalApprover(dtLimit, limitRowId, dtSchval, schvalRowId, actual, totalValue) | number | Vrátí číslo odpovídající schvalovací podmínce v grafu procesu podle limitů v dynamické tabulce. |
customView(cvId, filter, order, sort, offset, limit) | * | Načte data přehledu stejně jako služba cv/:id. |
vars['OrderNumber'].setValue('PO-' + new Date().getFullYear() + '-' + lib.getSequenceNumber('purchaseOrders'));
Dynamické seznamy a legacy funkce dynamické tabulky
Novější kód pro dynamické tabulky používá dt.from(...) (viz Dynamické tabulky ve výpočtech); tyto funkce lib jsou starší ekvivalenty zachované kvůli zpětné kompatibilitě a práci s proměnnou Dynamický seznam/Dynamické řádky:
| Funkce | Vrací | Popis |
|---|
fillDLList(listVarName) / fillList(listVarName) | * | Vybere/naplní všechny povolené hodnoty proměnné typu seznam. |
fullList(varName) | * | Seznam povolených hodnot proměnné typu seznam. |
setUserList(listVarName, source, delimiter) | * | Naplní dynamický seznam uživatelskými jmény odděleným zadaným znakem. |
defDynList(dynListName, operation, fnc, param1, param2, onlyActive) / defDynListOrg(...) | * | Upraví filtr nabídky dynamického seznamu. |
dynListToString(listVarName, glue) | string | Spojí hodnoty seznamu zadaným znakem. |
changeVariableDLName(varName, newDLName) | string | Změní DLIST_NAME proměnné za běhu (časté s hlavičkami). |
dynamicTableGetCell(dlName, colIndex, rowIndex) / dynamicTableUpdateCell(...) / dynamicTableUpdateCellCond(...) | – | Přečte/upraví buňku dynamické tabulky podle indexu. |
dynamicTableGetRowId(dlName, colIndex, rowValue) / dynamicTableGetNewRowId(dlName, method) / dynamicTableGetNewRowIdCond(...) | string | Najde, nebo založí a vrátí index řádku. |
dynamicTableGetRowCounts(dt) | number | Počet řádků tabulky. |
updateDTFromCsv(dynTableName, csvContent, firstLineHeaders, delimiter, operation, fileName) / updateDtFromDb(dbTableName, dynTableName, mapping, operation, rowCb) | * | Naplní dynamickou tabulku z CSV, resp. z databázové tabulky. |
getDRCell(varName, colName, rowIndex) / getDRCol(varName, drColName) / getCurrentRowOfDRCell(varName, colName) | string | Hodnoty Dynamického řádku podle sloupce/řádku/aktuální iterace. |
addRowsToDR(drName, value) / fnDelFromDR(drName, colName, value) | * | Přidá, resp. smaže řádky Dynamického řádku. |
extendDR(srcDRName, dstSrcName, map) | * | Naplní cílový Dynamický řádek daty ze zdrojového podle mapování sloupců. |
translateDynamicRowTemplate(template, drName) | string | Nahradí v textu @Index a @{ColName} hodnotami z Dynamického řádku. |
setDRAsIterator(varName, drColName) / getCurrentIteration() / getIteratorIndex() / iterator(position) | – | Práce s proměnnou jako s iterátorem (multiinstance). |
Ostatní služby ve výpočtu
Kromě lib má výpočet úkolu k dispozici i tyto samostatné objekty:
| Objekt | Co umí |
|---|
html.parse(input) | Naparsuje HTML řetězec do stromu, po kterém lze procházet querySelector/querySelectorAll – hodí se pro čtení dat z HTML odpovědí nebo šablon. |
sql.execute(query, params?) | Spustí raw SQL dotaz nad databází TAS a vrátí pole řádků. Parametry vždy přes druhý argument, nikdy přímo v řetězci (SQL injection). |
jwt.sign/verify/decode(...) | Podepíše, ověří nebo dekóduje JWT token (knihovna jsonwebtoken). jwt.secureSign/secureVerify navíc podepisují tajemstvím z Vaultu podle securitySelector. |
vault.get(name) | Vrátí neserializovatelnou referenci na tajemství z Vaultu – předává se jen důvěryhodným API, např. axios...setVaultHeader(). |
identity.findUser(userName) / findByExternalId/findByObjectGUID/findByImmutableId / findOrCreateUser(...) / assignManagers(...) / setOrganization(...) / createOrganizationStructure(...) | Vyhledání a správa uživatelů/organizační struktury napojená na externí identity (Azure AD apod.). |
ai.processDocument(fileName, schema?) | Pošle přiložený dokument do AI a vyplní jím proměnné úkolu (nebo proměnné podle vlastního JSON schématu). |
ftp.getFtpClient(config) / getFtpClientWithVaultPassword(config, passwordRef) | Vrátí klienta pro FTP/SFTP server s metodami list, upload, download, delete, exists, createDirectory, removeDirectory, rename. |
axios.getAxios(config) | Vrátí HTTP klienta s metodami get/post/put/patch/delete/request, podporou formulářových souborů (sendFile, sendFormData) a vložením tajemství z Vaultu do hlaviček (setVaultHeader). |
// Volání externího API s tokenem z Vaultu
const tokenRef = await vault.get('erp-api-token');
const client = await axios.getAxios({ baseURL: 'https://erp.example.com', timeout: 10000 });
client.setVaultHeader('Authorization', tokenRef, 'Bearer ');
const { data: supplier } = await client.get('/suppliers/' + vars['SupplierId'].getValue());
vars['SupplierName'].setValue(supplier.name);
Související: Reference API výpočtů: proměnné a případ, Dynamické tabulky ve výpočtech, Tisk a generování souborů ve výpočtech, Jak a kdy běží výpočty.