Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:dydaktyka:dss:lab07 [2019/12/15 16:42]
kkluza utworzono
pl:dydaktyka:dss:lab07 [2020/12/07 13:28] (aktualna)
kkluza
Linia 1: Linia 1:
-====== ​Basics of BPM systems ​======+====== ​Process execution in a BPM system ​======
  
 ===== Activiti BPM Platform ===== ===== Activiti BPM Platform =====
Linia 7: Linia 7:
   * [[http://​www.manning.com/​rademakers2/​|Activiti in Action]] ​   * [[http://​www.manning.com/​rademakers2/​|Activiti in Action]] ​
  
-Na potrzeby dzisiejszych zajęć na komputerach powinien być uruchomiony JBossna którym działa ​Activiti: +This instruction is for labs **30.11.2020** and **07.12.2020**. 
-<​code>​/etc/init.d/jboss [start|stop]</code>+During these labswe will use Activiti ​5.22.  
 +You can install it from [[https://www.activiti.org/get-started]]  
 +or use the online version on the temporary server: [[http://​134.209.241.80:​8080/​activiti-explorer/​​]].
  
-Proszę uruchomić w przeglądarce aplikację Activiti Explorer: http://​localhost:​8080/​activiti-explorer+**But please remember to save your working models in files between classesas the temporary server will not store the data between the classes. Do not change the password for the admin account, otherwise, the restart of the server will be needed and you will lose your models.** 
-a następnie zalogować się na konto:+ 
 +Log in to an admin account:
   login: kermit   login: kermit
-  ​hasło: kermit+  ​password: kermit
  
-Można także korzystać z wersji serwerowej: http://192.168.1.145:​8080/activiti-explorer/ui/+After logging in, the top bar should contain a menu of 4 icons for managing: 
 +  * //Tasks// -tasks, 
 +  * //Processes// -- processes,​ 
 +  * //Reports// -- reports, 
 +  * //Manage// -- other resources, e.g. users, groups, database management or process implementation.
  
-Po zalogowaniu,​ na górnym pasku powinno widnieć menu złożone z 4 ikon. +Using the //Groups// tab (//Manage menu//)check the existing user groups. ​ 
-Służą one do administracji odpowiednio:​  +As an administrator user, **create your own admin account**. 
-  * //Tasks// -- zadaniami,​ +Remember to assign a unique identifier (e.g. with the initials of the people of your group)
-  * //Processes// -- procesami+so we would not have to use the same kermit user 
-  //Reports// -- raportami+You will also need some users who are not administrators, 
-  * //Manage// -- innymi kwestiami, npużytkownikamigrupami, czy zarządzaniem bazą danych lub wdrożeniami procesów.+so create new regular user accounts for each person in your group (remember about unique ids) 
  
-==== Założenie kont ==== 
  
-W zakładce Groups (menu Manage) obejrzyj istniejące grupy użytkowników. ​ 
-Jako użytkownika administratora będziemy póki co używać użytkownika ''​kermit'',​ natomiast przyda nam się użytkownik nie będący administratorem. 
  
-Utwórz nowego użytkownika. Pamiętaj, aby nadać unikalny identyfikator. ​ 
  
-==== Stworzenie nowego modelu procesu ​====+==== A new process model ====
  
-Aby zapoznać się z działaniem aplikacji przygotujemy bardzo uproszczony ​model procesu ofertowania.+In order to get acquainted with the application,​ as an administrator,​ you will prepare a very simplified ​model of gathering offers.
  
-Z menu proszę wybrać zakładkę ​**Processes**. ​Powinny pojawić się zakładki+Select the **Processes** ​tab from the menuYou should see tabs
-  - //My instances// -- do obserwowania istniejących instancji procesu+  - //My instances// -- to observe the existing instances of the process
-  - //Deployed process definitions//​ -- do uruchamiania procesów wdrożonych na platformie ​Activiti, +  - //Deployed process definitions//​ -- to execute processes implemented on the Activiti ​platform
-  - //Model workspace// -- do tworzenia nowych modeli oraz wdrażania lub edycji istniejących modeli procesów.+  - //Model workspace// -- to create new models and to implement or edit existing process models.
  
-W zakładce ​//Model workspace// klikamy przycisk ​//New model// i tworzymy nowy model procesu przy użyciu Activiti ModeleraProszę nadać swojemu modelowi nazwę oraz opis.+In the opened **Alfresco Activiti Modeler** application window, set the process attributes. 
 +The essential elements are the process identifier (//Process identifier//) and the process name (//Name//), 
 +which will allow you to distinguish your process from other processes or other users' processes 
 +Complete also the process author field (//Process author//).
  
-W otwartym oknie aplikacji **Activiti Modeler** proszę ustawić atrybuty procesu (z prawej strony okna). +{{  :​pl:​dydaktyka:​dss:​lab:​activiti-process-id.png?​500 ​ |}}
-Istotnymi elementami są tutaj identyfikator procesu (//Process identifier//​) i nazwa procesu (//​Name//​),​ +
-dzięki którym odróżnimy nasz proces od innych naszych procesów czy procesów innych użytkowników.  +
-Proszę uzupełnić również pole autora procesu (//Process author//).+
  
-==== Modelowanie prostego procesu ​====+==== Simple process modelling ​====
  
-Przeciągając z lewego menu element ​//Start event// ​rozpoczniemy modelowanie fragmentu docelowego procesu+By dragging a //Start event// ​element from the left menu, you will start modeling the fragment of the target process
-Na początek zamodelujemy bardzo uproszczony procesjak poniżej:\\+Firstmodel a very simplified process as presented below:\\
 {{  :​pl:​dydaktyka:​bim:​lab1:​proces1-diagram.png ​ |}} {{  :​pl:​dydaktyka:​bim:​lab1:​proces1-diagram.png ​ |}}
  
-Tak jak w przypadku procesutak samo dla elementów BPMNa po prawej stronie ustawiamy atrybuty.+As in the case of the processfor the BPMN elements, you can set the selected attributes:
    
-  * Dla elementu ​//Start event//:+  * for //Start event//:
     * //​Documentation//:​ Start proceeding with an offer.     * //​Documentation//:​ Start proceeding with an offer.
-    * //​Initiator//:​ initiator (w tej zmiennej będzie trzymany użytkownik,​ który zainicjował proces)+    * //​Initiator//:​ initiator (the user who initiated the process will be stored in this variable)
     * //Name//: Offer received     * //Name//: Offer received
-    * //Form properties//​ - klikamy na ... i w nowym oknie ustawiamy wg poniższego screenshotu:\\ +    * //Form properties//​ -- click on ... and in the new window set the properties according to the following screenshot:\\
-{{  :​pl:​dydaktyka:​bim:​lab1::​form-properties.png ​ |}}+
  
-  ​Dla zadania ​//Specify offer//:+{{  :​pl:​dydaktyka:​dss:​lab:​form-properties-alfresco.png?​400 ​ |}} 
 + 
 +  ​for //Specify offer// ​task:
     * //​Documentation//:​ Please add available specification for an offer as attachments.     * //​Documentation//:​ Please add available specification for an offer as attachments.
-    * //​Assignments//: ​mamy 3 możliwości\\ +    * //​Assignments//: ​there are three possibilities\\ 
-      * ''​assignee''​ -- przypisać zadanie konkretnemu użytkownikowi+      * ''​assignee''​ -- assign a task to a specific user
-      * ''​candidateUsers''​ -- przypisać zadanie tak, by dowolny z kilku użytkowników mógł je wykonać+      * ''​candidateUsers''​ -- assign a task so that any of several users can perform it
-      * ''​candidateGroups''​ -- przypisać zadanie tak, by dowolny użytkownik należący do przypisanej grupy mógł je wykonać.\\  +      * ''​candidateGroups''​ -- assign a task so that any user belonging to the assigned group can perform it.\\  
-W naszym wypadku ustawiamy tylko zmiennej ​''​assignee'' ​wartość ​''​${initiator}''​ -- oznacza toże jako wykonawcę zadania wskazujemy osobę, która uruchomiła proces+ 
 +In our case, set only the variable ​''​assignee'' ​to ''​${initiator}''​ -- this means that as a task executorwe indicate the person who started the process.
  
-Ponadto dla tego zadania ustawiamy również ​//Form properties//:​ +In addition, for this task, we also set //Form properties//:​ 
-   * //​Specifications details// (id: ''​specDetails''​) - poziom szczegółowości specyfikacji przedmiotu zamówienia ​(póki co ustawiamy jako boolean), ​w dalszej części będziemy chcieli tę zmienną przerobić na typ enum (accurate, sufficient, insufficient). +   * //​Specifications details// (id: ''​specDetails''​) -- level of detail of the specification of the contract offer (for now we set it as a ''​boolean''​), in the next part, we will transform this variable into an enum type (accurate, sufficient, insufficient). 
-   * //Person responsible//​ (id: ''​responsible''​) - osoba przyporządkowana do analizy formalnej wniosku ​(odpowiadająca za przeprowadzenie analizy); tutaj nastąpi przyporządkowanie takiej osoby i przypisanie jej do zmiennej.+   * //Person responsible//​ (id: ''​responsible''​) -- a person assigned to the formal analysis of the application ​(responsible for carrying out the analysis); such a person will be assigned to a variable.
  
-Póki co do przetestowania takiego prostego procesu rezygnujemy z dalszych elementów procesu+For now, to test such a simple process, we skip other elements of the process
-Tymczasem zamarkujmy jedno z końcowych zadań: //Approve offer//, ​w którym ustawiamy jedynie wykonawcę ​-- osobę, która została przyporządkowana do przeprowadzenia analizy formalnej ​(proszę użyć identyfikatora zdefiniowanej ​ zmiennej).+Meanwhile, let's mock one of the final tasks: //Approve offer//, ​in which set only the executor ​-- the person who was assigned to perform the formal analysis ​(please use the identifier of the defined variable).
  
-==== Uruchomienie prostego procesu ​====+==== Executing a simple process model ====
  
-Zapisujemy ​model i wyłączamy ​**Activiti Modeler**. +Save a model and exit **Alfresco ​Activiti Modeler**. 
-Przechodzimy do **Activiti ​Explorera**. +Go back to **Activiti ​Explorer**. 
-W zakładce ​//Model workspace// ​wybieramy nasz proces z menu +In //Model workspace//, select your process from the menu 
-i z listy //Model action// ​wybieramy ​**Deploy**.+and from the //Model action// ​list, choose ​**Deploy**.
  
-Powinno przenieść nas do zakładki ​//​Deployments//​ (**Manage**), ​gdzie wybieramy nasz process (klikając na jego nazwęw sekcji ​//Process Definitions//​\\ +You should be moved to //​Deployments//​ (in **Manage**), ​where you can choose your process (click on its underlined namein //Process Definitions//​. ​After deploying the modelfrom the tab //Deployed process definitions//​, you can start your process with the button ​**Start process**. ​You should see the following form:
-{{  :​pl:​dydaktyka:​bim:​lab1::​proces1-deploy.png  |}} +
-Po wdrożeniuz zakładki ​//Deployed process definitions// ​możemy uruchomić nasz proces przyciskiem ​**Start process**. ​Powinien otworzyć się formularz:\\+
 {{  :​pl:​dydaktyka:​bim:​lab1:​proces1-run1-form.png ​ |}} {{  :​pl:​dydaktyka:​bim:​lab1:​proces1-run1-form.png ​ |}}
-Uzupełniamy formularz dowolnymi danymi i klikamy ​**Start process**.+Fill in the form with any data and click **Start process**.
  
-Jeśli wszystko się powiodłow zakładce ​**Processes** -> //My instances// ​powinniśmy widzieć instancję naszego procesu+If you succeedin the **Processes** -> //My instances//, ​you should see an instance of your process.
  
-Ponieważ pierwsze zadanie zostało przypisane do nas (użytkownika,​ który uruchomił proces), klikamy ikonę ​**Tasks** ​i przechodzimy zakładki ​//​Inbox//, ​gdzie powinno czekać na nas zadanie ​//Specify offer//. +Since the first task is assigned to us (the user who started the process), click the **Tasks** ​icon and go to the //Inbox/// tabwhere the task //Specify offer// ​should be waiting for us
-Uzupełniamy pole //​Responsible// ​nazwą innego __istniejącego__ użytkownika ​(np''​fozzie''​ lub zdefiniowanego wcześniej użytkownika), możemy również zaznaczyć ​checkbox //​Specifications details//​. ​Następnie klikamy ​**Complete task**.+Fill the //​Responsible// ​field with the name of another __existing__ user (e.g. your previously defined user).  
 +You can also tick a checkbox //​Specifications details//​. ​Then, click **Complete task**.
  
-Teraz klikamy ikonę ​**Processes** ​i przechodzimy do zakładki ​//My instances//, aby obejrzeć ​diagram, listę zadań i zmienne naszego procesu+Click **Processes** ​icon and go to //My instances// ​to view the diagram, ​task list, and process variables
-Ponieważ zadanie ​//Approve offer// ​czeka na innego użytkownikalogujemy się na konto podanego użytkownika (jeśli był to użytkownik ''​fozzie'',​ jego hasło to: ''​fozzie''​),​ po czym kończymy zadanie ​//Approve offer//. +Because the task //Approve offer// ​is waiting for your another userlog in to the account of your user and finish the task //Approve offer//. 
-Wracamy na nasze konto i sprawdzamy, czy w zakładce ​//My instances// ​zniknął nasz proces.+Return to the admin account and check if the process has disappeared in the //My instances// ​tab.
  
-Historyczne dane naszego procesu są zapisane w bazie danychktórej szybki podgląd mamy dostępny w zakładce ​//​Database//​ (po kliknięciu w ikonę ​**Manage**). ​Proszę odszukać tabelę ​''​ACT_HI_PROCINST'' ​i znaleźć tam swój proces.   +Historic data of the process are saved in the databasewhich is available in the //​Database// ​tab (in the **Manage** ​tab). Find the table ''​ACT_HI_PROCINST'' ​and find your process there.   
-Ponieważ w laboratorium nasza instalacja ​Activiti ​Activiti ​Modelerem nie ma skonfigurowanego trwałego zapisu modelizapiszemy nasz model u siebie na dyskuW tym celu z menu //​Deployments// ​wybieramy ​//Show all// i odszukujemy nasz procesProszę zapisać na dysku plik swojego procesu ​(plik z rozszerzeniem ​**.bpmn20.xml**) ​i obejrzeć jego składnięZwróć uwagę na atrybuty tagu ''​process''​a także dodatkowe atrybuty innych elementów procesu używane typowo przez Activiti.+Because for this laboratory, ​Activiti ​installation with Alfresco ​Activiti ​Modeler does not save models permanentlysave your model on the hard diskTo do this from the menu //​Deployments// ​select ​//Show all// and search for your processSave your process file (file with extension ​**.bpmn20.xml**) ​and view its syntaxNote some process ​tag attributesas well as the additional attributes of other process elements used by Activiti.
  
  
-==== Rozbudowa modelu ​====+==== Extending model ====
  
-Wracamy do zakładki ​//Model workspace//, by rozbudować nasz model o bramę.  +Return to the //Model workspace// ​tab to extend your model with a gateway.  
-W zależności od poziom szczegółowości specyfikacji ofertyw przypadkugdy jest ona niewystarczająco szczegółowa,​ będziemy chcieli prosić oferent o przesłanie dodatkowych informacji+Depending on the level of detail of the offer specificationif it is not sufficiently detailedwe would like to ask the requester to send us additional information
-Aby rozbudować nasz model wybieramy odpowiedni ​model, po czym klikamy ​//Edit model//.+To extend your model, select the appropriate ​model and click //Edit model//.
  
-Proszę rozbudować ​model do postaci jak na poniższym diagramie:\\+Extend your model to the form as shown in the diagram below:\\
 {{:​pl:​dydaktyka:​bim:​lab1:​process3-diagram.png?​800|}} {{:​pl:​dydaktyka:​bim:​lab1:​process3-diagram.png?​800|}}
  
-Istotnym elementem modelu jest użycie odpowiednich warunków na przepływach po bramie ​XOR (w zależności od wartości zmiennej ​''​specDetails''​).  +An important element of the model is the use of appropriate conditions in the flows from the XOR (exclusive) gateway (depending on the variable value ''​specDetails''​).  
-Sprawdź w [[http://​www.activiti.org/​userguide/​index.html|Activiti User Guide]], ​w jaki sposób zdefiniować odpowiednie warunki dla tej bramy.+Check in [[https://​www.activiti.org/5.x/​userguide/​|Activiti User Guide]], ​how to define the appropriate conditions for this gateway.
  
  
-===== Dalsza rozbudowa modelu ​=====+===== Further model extensions ​=====
  
 === Timer Boundary Event === === Timer Boundary Event ===
  
-Nasz podproces składa się z dwóch zadań, polegających na tym, że kontaktujemy się z klientem mailowo oraz dodatkowo dzwonimy do niego, by poinformować o przesłanym mailuW bardzo szczegółowej wersji powinniśmy jeszcze mieć odpowiednie zadanie z oczekiwaniem na odpowiedź od klienta ​-- dla uproszczenia przyjmijmyże gdy klient uszczegółowił wystarczająco przez telefon informacje, to użytkownik kończy zadanie ​"Call customer", ​w innym wypadku nie kończy tego zadania ​do czasu, aż nie uzyska wystarczających informacji.+Your subprocess consists of two taskscontacting the customer ​by e-mail and phone (call to inform about the e-mail sent to the customer)In a very detailed version, we should additionally have an appropriate task waiting for a response from the customer ​-- but for simplicity let's assume that when the customer has provided detailed information by phonethe user ends the task "Call customer", ​otherwise they do not finish this task until they receive sufficient information.
  
-W standardowym przypadkugdy minie deadline ​na składanie ofertpodproces powinien automatycznie zakończyć się i zakończyć cały procesW tym celu rozbudujemy proces przy użyciu ​''​Timer Boundary Event'':​+In the standard casewhen the deadline ​for submitting offers has passedthe subprocess should automatically end and finish the whole processFor this purpose, expand the process using the ''​Timer Boundary Event'':​
  
 {{  :​pl:​dydaktyka:​bim:​lab1:​process5-eclipse-example.png?​800 ​ |}} {{  :​pl:​dydaktyka:​bim:​lab1:​process5-eclipse-example.png?​800 ​ |}}
  
-Element ​''​Timer Boundary Event'' ​ma następujące atrybuty+''​Timer Boundary Event'' ​has the following attributes
-  * ''​cancelActiviti''​ -- w naszym przypadku należy ustawić ​**''​true''​**, by podproces został przerwany w momnecie wywołania zdarzenia+  * ''​cancelActiviti''​ -- in our case, set **''​true'''​** ​to interrupt the subprocess at the moment when the event is triggered
-  * ''​timeDate''​ -- ustawia konkretną datę (w formacie ​[[wp>ISO 8601]]), ​kiedy odpalić zdarzenienp.+  * ''​timeDate''​ -- sets a specific date (in the format ​[[wp>ISO 8601]]]), when to trigger an evente.g.:
 <code xml> <code xml>
 <​timerEventDefinition>​ <​timerEventDefinition>​
Linia 134: Linia 138:
 </​timerEventDefinition>​ </​timerEventDefinition>​
 </​code>​ </​code>​
-  *  ''​timeDuration''​ -- ustawia okres czasuktóry musi minąć aż zdarzenie zostanie wyzwolone, npdla dni+  *  ''​timeDuration''​ -- sets the period of time that must elapse before an event is triggerede.gfor days
 <code xml> <code xml>
 <​timerEventDefinition>​ <​timerEventDefinition>​
Linia 140: Linia 144:
 </​timerEventDefinition>​ </​timerEventDefinition>​
 </​code>​ </​code>​
-  * ''​timeCycle''​ -- ustawia powtarzające się interwały czasuby wyzwalać zdarzenie periodycznie,​ np. 5 powtórzeńz których każde trwa godzinę:+  * ''​timeCycle''​ -- sets time intervals to trigger an event periodically (repeat it)e.g. 5 repetitionseach for an hour:
 <code xml> <code xml>
 <​timerEventDefinition>​ <​timerEventDefinition>​
Linia 147: Linia 151:
 </​code>​ </​code>​
  
-Aby móc przetestować proces i nie czekać zbyt długo na efekty proponuję ustawić ​''​timeDuration'' ​na minuty.+In order to be able to test the process and not wait too long for the effects, just set the ''​timeDuration'' ​to minutes.
  
-Proszę przetestować działanie swojego modeluobejrzeć ​diagram ​instancji procesu w czasie oczekiwania ​(powinien wyglądać podobnie do modelu widocznego na poniższym diagramie):+Test your modelcheck the diagram ​of the process instance while waiting ​(it should look similar to the model shown in the diagram below):
 {{  :​pl:​dydaktyka:​bim:​lab1:​process5-run-example.png?​800 ​ |}} {{  :​pl:​dydaktyka:​bim:​lab1:​process5-run-example.png?​800 ​ |}}
  
-W tym momencie w zakładce ​**Manage** -> **Jobs** ​powinien pojawić się nowy ''​Timer job''​W razie potrzeby istnieje tu możliwość ręcznego wyzwolenia zdarzenia przyciskiem ​**Execute**:​+At this point, a new "Timer job" should appear in the tab **Manage** -> **Jobs**. ​ 
 +If necessary, the event can be triggered manually by pressing the **Execute** ​button:
  ​{{ ​ :​pl:​dydaktyka:​bim:​lab1:​timer-job.png ​ |}}  ​{{ ​ :​pl:​dydaktyka:​bim:​lab1:​timer-job.png ​ |}}
  
 === Mail task === === Mail task ===
  
-Jedno z zadań w podprocesie powinno wysyłać ​mail do klienta. \\ +One of the tasks in the subprocess should send an e-mail to the client. \\ 
-W pełnym procesie wcześniej należałoby pobrać dodatkowe dane do przesłania maila \\ +In the full process, it would be necessary to download additional data to send an e-mail beforehand. 
-np. jakich szczegółów chcielibyśmy się dowiedzieć,\\ +e.g., what kind of details we'd like to know about. 
-natomiast u nas na razie zamarkujemy działanie tego zadania.+If you use your Activiti installation,​ you can mock the operation of this task. 
 + 
 +If you do not have a configured mail server, you can address the mail to a local address, e.g: "​student@AML-Lab-316.geist.agh.edu.pl"​.\\  
 +After sending the e-mailyou can check the e-mail in the terminal with the "​mail"​ command, if you received the message to the mailbox. 
 + 
 +Please include in the body of the e-mail data held in a variable of the process instance. 
 + 
 +=== Script task === 
 + 
 +Some of the extensions below may require to use an Activiti Designer extension to an Eclipse platform. 
 + 
 +Extend the model to the form as shown in the diagram below:\\ 
 + 
 +{{  :​pl:​dydaktyka:​bim:​lab3:​process8-eclipse-example.png ​ |}} 
 + 
 +For the given properties prepare a form in //Set formal conditions//​ task (boolean type): 
 +  * ''​formalCertificates''​ -- The company has the required certificates 
 +  * ''​formalExperience''​ -- The company has sufficient experience 
 +  * ''​formalConflicts''​ -- Offer causes conflict with other orders 
 + 
 +Depending on your needs, you can set the default values in the appropriate fields using the ''​default''​ attribute. 
 + 
 +In the //Check formal conditions//​ task, select the language ''​groovy'',​ then set the appropriate value (''​negative''​ or ''​positive''​) of the ''​resOffer''​ variable. To define a variable in the groove and then export it to your process, use the following syntax: 
 +<code groovy>​ 
 +def resOffer = "​negative" ​  
 +/* TODO: check the conditions and if necessary,  
 +convert resOffer to positive 
 +*/ 
 +execution.setVariable("​result",​ resOffer) 
 +</​code>​ 
 + 
 +The variable can also be displayed within some //​UserTask//​ by adding a tag in XML: 
 +<code xml><​documentation>​Formal condition check result is: ${result}</​documentation></​code>​ 
 + 
 +The elements of the [[wp>​Groovy (programming language)]] are supported according to its syntax. For checking the syntax, you  can try [[http://​groovyconsole.appspot.com/​|online console]]. 
 + 
 +{{:​pl:​dydaktyka:​bim:​lab3:​eclipse2-designer-gateway.png?​200 ​ |}} 
 + 
 +** Completion of the process with a negative result ** 
 + 
 +If the result of the formal fulfillment of the conditions is negative, the process should end. 
 +Add a gateway that will control the flow depending on the result, in order to finish the process accordingly.
  
-Nie mamy skonfigurowanego serwera poczty, ale możemy zaadresować maila na adres lokalny, \\ np.: ''​student@AML-Lab-316.geist.agh.edu.pl''​.\\  +=== Multi instance task ===
-Po przesłaniu maila możemy sprawdzić w terminalu poleceniem ''​mail'',​ czy mamy go na skrzynce.+
  
-Proszę w treści maila umieścić dane trzymane w jakiejś zmiennej instancji procesu.+** Approval of the offer by the members of the Management Board **
  
 +In order to complete the process, we will model the approval of the offer by the members of the Management Board.
  
 +{{  :​pl:​dydaktyka:​bim:​lab3:​explorer2-execution-multiinstance.png|}}
 +For this purpose, the "​Approve offer" task should be defined as multi-instance task. \\
 +The following parameters are available in the ''​Multi instance''​ tab in the Activiti eclipse environment: ​
 +  * **Sequential** -- sequential (''​true''​) or parallel (''​false''​) execution,
 +  * **Loop cardinality** -- number of instances (checked only once, when creating a task), ​
 +  * **Collection** -- collection variable (a list of users who are to perform the task),
 +  * **Element variable** -- a variable that stores individual users in order to assign them to a task,
 +  * **Completion condition** -- the condition for completing the task.
  
 +In [[https://​www.activiti.org/​5.x/​userguide/​|Activiti User Guide]], check how to define the appropriate condition for completing a task.
 +Let's assume that the Company considers a board decision to have been made if it was made by at least two of the three board members. Since we have not yet defined the board variable, please add the board variable, which is a list of board members (consisting of existing Activiti users). ​
  
 +Then, start the process and test it for different scenarios.
pl/dydaktyka/dss/lab07.1576424520.txt.gz · ostatnio zmienione: 2019/12/15 16:42 przez kkluza
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0