Základem workflow a procesů je nástroj Activiti. Jeho součástí je programátorské rozhraní Activiti REST API Toto rozhraní je přístupné na této adrese:
/c/<identifikátor firmy>/activiti/
Existují tato omezení:
- Není podporované rozhraní
/login
. Používá se autorizace ABRA Flexi. - Není podporovaná modifikace uživatelů, skupin a členství. Vše se dělá přes rozhraní ABRA Flexi.
- Nahrání nového procesu musí být realizováno přes ABRA Flexi (kvůli definici platností workflow). Aktualizace procesů mohou být již přes Activiti API.
API pro ABRA Flexi
Výpis definicí workflow k dané evidenci:
GET /c/<identifikátor firmy>/<evidence>/workflows.xml
Spuštění workflow
PUT /c/<identifikátor firmy>/<evidence>/<id záznamu>/workflows/<processId>/start
Při spuštění je možné také předat parametry pro workflow, které možné použít při rozhodování:
PUT /c/<identifikátor firmy>/<evidence>/<id záznamu>/workflows/<processId>/start?parametr1=value1¶metr2=value2
Seznam událostí (poznámek a úkolů) u daného objektu:
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/udalost
Vypsání událostí včetně dalších atributů workflow:
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/udalost.xml?includes=udalost/actRuTask
Při práci s workflow chcete obvykle úkoly pouze určitého typu:
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/udalost/(typUdalosti = 'druhUdal.workflow')
Výpis všech úkolů pro konkrétní workflow:
/c/<identifikátor firmy>/udalost/(typUdalosti = 'druhUdal.workflow' and processDefinitionId = '<processId>')
Výpis všech úkolů s daným klíčem úkolu pro konkrétní workflow:
/c/<identifikátor firmy>/udalost/(typUdalosti = 'druhUdal.workflow' and processDefinitionId = '<processId>' and taskDefinitionKey = '<taskKey>')
Výpis všech úkolů, které může aktuálně přihlášený uživatel vyřešit:
/c/<identifikátor firmy>/udalost@ukoly-k-realizaci
Zaslání signálu všem běžícím workflow, které na něj může reagovat:
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/workflow-signal/<signalId>?param1=value
Zaslání zprávy všem běžícím workflow, které na něj může reagovat:
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/workflow-message/<messageId>?param1=value
Práce s úkolem:
/c/<identifikátor firmy>/udalost/<ID záznamu>/<operace>
claim.xml | přivlastnit si úkol |
unclaim.xml | odvlastnit si úkol |
complete.xml | vyřešit úkol |
assign.xml?username=user | předat úkol uživateli user |
add-comment.xml?comment=text | přidat komentář k úkolu |
- Pro hodnoty parametrů obsahující jiné než povolené znaky URL (mezera, zavináč atd.), je zapotřebí provést URL encoding.
- Kódování textů je očekáváno v
UTF-8
.
Poznámka: události, které jsou typu úkol pro workflow se zruší po tom co jsou vyřešeny. Místo .xml lze také použit .json
nebo hlavičku Accept
.
Seznam úkolů a k nim související objekty
/c/<identifikátor firmy>/<evidence>/<ID záznamu>/udalost.xml?includes=udalost/doklFak
Objekty použitelné při rozhodování ABRA Flexi
| Vrací uživatele s uvedeným jménem |
| Vrátí dotazovací objekt uživatele s uvedeným jménem (výstup je shodný s metodou objectQuery). |
| Vrátí objekt daného typu, který je připojen k úkolu workflow |
| Umožňuje filtrovat objekty v relaci. |
| Umožňuje vrátit první objekt ve filtrované relaci. |
| Umožňuje sečíst objekty ve filtrované relaci. |
| Umožňuje zřetězit zpracování dotazování. |
| Umožňuje filtrovat objekty v relaci. |
| Umožňuje vrátit první objekt v relaci. |
| Umožňuje sečíst objekty v relaci. |
| Obalí objekt pomocí query (stejný výsledek jako vrací např. |
| Vrátí jeden objekt daného typu, který odpovídá uvedenému filtru. |
| Vyvolá signál nad všemi workflow, které běží nad zvoleným záznamem. |
| Vrátí všechny objekty daného typu, který odpovídá uvedenému filtru. |
| Vrátí počet objektů daného typu, který odpovídá uvedenému filtru. |
| Vrátí sum daného sloupečku pro všechny objekty daného typu, který odpovídá uvedenému filtru. |
| Vrátí max daného sloupečku pro všechny objekty daného typu, který odpovídá uvedenému filtru. |
| Vrátí min daného sloupečku pro všechny objekty daného typu, který odpovídá uvedenému filtru. |
| Vrátí avg daného sloupečku pro všechny objekty daného typu, který odpovídá uvedenému filtru. |
| Umožní řazení vzestupně (více na řazení v API). |
| Umožní řazení sestupně (více na řazení v API). |
| Vrátí aktuální nastavení firmy (evidence |
| Vrátí nastavení firmy (evidence |
| Vrátí interní název proměnné, kterou používá ABRA Flexi pro vazbu jednotlivých workflow na doklady a objekty v ABRA Flexi. Používá se obvykle při volání podprocesu. |
| Vrátí true pokud workflow aktuálně běží v desktopové aplikaci |
| Vrátí true pokud workflow aktuálně běží přes REST API nebo v prohlížeči |
| Provede import XML řetězce dle ABRA Flexi REST API. Vrací kolekci identifikátorů objektů ze XML importu. |
| Aktuální datum a čas. |
| Jméno aktuálně přihlášeného uživatele (pro více informací je nutné použít |
| Záznam activiti, který reprezentuje úkol (více dokumentace acitiviti). |
| Informace o aktuálně běžícím workflow (více dokumentace acitiviti). |
Volání podprocesu
Pokud voláte podproces a chtete, aby výsledné úkoly byly provázány k dokladům, je nutné aktivovat propagaci vazební proměnné do workflow. To učiníte takto:
<callActivity id="callSubProcess" calledElement="checkCreditProcess"> <extensionElements> <activiti:in source="${flexibee.varName('faktura-prijata')}" target="${flexibee.varName('faktura-prijata')}" /> <activiti:in source="initiator" target="initiator" /> </extensionElements> </callActivity>
Práce s uživateli ve workflow
Pokud chcete pracovat s uživateli, je několik následujících možností. Dejte si pozor, abyste v rámci definice uživatelů nepoužili znak čárky (,). Activiti má chybu, která zabraňuje jeho použití.
Původce workflow
Při startu workflow nadefinujte proměnnou initiator
. Tu pak můžete použít jako název uživatele pro přidělení úkolu.
<startEvent id="theStart" activiti:initiator="initiator">
Aktuální uživatel
Pokud chcete úkol přidělit stejnému uživateli, který provedl aktuální operaci, použijte proměnnou authenticatedUserId
.
Konkrétní uživatel
Při zpracování můžete použít konkrétního uživatele. Můžete také vyhledat uživatele podle určitých kritérií (např. štítek):
<formalExpression>${flexibee.query('uzivatele').relation('stitek = "code:PRACOVNIK"').one().kod}</formalExpression>
Nebo uživatelskou vazbu:
<formalExpression>${flexibee.userQuery(initiator).relation('uzivatelske-vazby').filter('typVazby = "code:NADRIZENY"').one().kod}</formalExpression>
Modifikace dokladů
Někdy je nutné při zpracování workflow modifikovat jeden nebo více dokladů. To lze provést použitím flexibee-xml
. Aby metoda flexibee.object()
fungovala, musí být workflow navázané na tento dokument.
<serviceTask id="storno" activiti:class="flexibee-xml"> <extensionElements> <activiti:field name="object" expression="${flexibee.object('faktura-vydana')}"/> <activiti:field name="xml"> <activiti:expression> <![CDATA[ <winstrom> <faktura-vydana action="storno"> </faktura-vydana> </winstrom> ]]> </activiti:expression> </activiti:field> </extensionElements> </serviceTask>
Lze také modifikovat více objektů:
<serviceTask id="storno" activiti:class="flexibee-xml"> <extensionElements> <activiti:field name="xml"> <activiti:expression> <![CDATA[ <winstrom> <faktura-vydana action="storno"> <id>code:FAV0001/2013</id> </faktura-vydana> <faktura-vydana action="storno"> <id>code:FAV0002/2013</id> </faktura-vydana> </winstrom> ]]> </activiti:expression> </activiti:field> </extensionElements> </serviceTask>
Získání identifikátorů modifikovaných objektů
Pomocí proměnné idsVar
lze získat kolekci identifikátorů, které byly modifikovány XML importem.
<serviceTask id="import" activiti:class="flexibee-xml"> … <extensionElements> <activiti:field name="idsVar" stringValue="seznamId" /> </extensionElements> </serviceTask>
Po úspěšně vykonaném XML importu pak bude proměnná seznamId
obsahovat kolekci identifikátorů zmodifikovaných objektů.
Zpracování chyb při importu XML
Pokud nastane chyba při importu XML v tasku typu flexibee-xml
, je zpracování workflow přerušeno výjimkou WSBusinessRTException
. Výjimka obsahuje popis chyby a zobrazí se v GUI jako chybový dialog.
Pokud má workflow pokračovat i při chybě v importu, lze definici tasku rozšířit o parametry errorVar
a errorMessageVar
:
<serviceTask id="storno" activiti:class="flexibee-xml"> … <extensionElements> <activiti:field name="errorVar" stringValue="wasError" /> <activiti:field name="errorMessageVar" stringValue="errorMessage" /> </extensionElements> </serviceTask>
proměnná | datový typ | popis |
|
| definuje název proměnné (např. |
|
| definuje název proměnné (např. |
Podmíněné větvení na základě objektů
Ve workflow lze pokládat dotazy ABRA Flexi a reagovat na základě odpovědi:
${flexibee.object('objednavka-prijata').sumCelkem > 1000}
Lze se ptát i obecně, např. kolik neuhrazených faktur je u firmy, která je uvedena u aktuální faktury.:
${flexibee.query('faktura-vydana').filter('stavUhrK != "stavUhr.uhrazeno" and stavUhrK != "stavUhr.uhrazenoRucne" and firma='.concat(flexibee.object('faktura-vydana').firma.id)).sum('sumCelkem') > 1000}
Přenášení stavu workflow do dokladu
Někdy je nutné na základě stavu workflow měnit i stav dokladu. To lze realizovat pomocí štítků, které jsou přiděleny do jedné skupiny u které je nastavena exkluzivita (pak při nastavení nového štítku ze stejné skupiny dojde ke zrušení ostatních). Realizace je pak opět pomocí flexibee-xml
, které zavoláte při každé změně stavu workflow:
<serviceTask id="storno" activiti:class="flexibee-xml"> <extensionElements> <activiti:field name="object" expression="${flexibee.object('faktura-vydana')}"/> <activiti:field name="xml"> <activiti:expression> <![CDATA[ <winstrom> <faktura-vydana> <stitky>SCHVÁLENO</stitky> </faktura-vydana> </winstrom> ]]> </activiti:expression> </activiti:field> </extensionElements> </serviceTask>