spiff-arena/doc/bpmn/multiinstance.rst
Dan 05e226fcab Squashed 'SpiffWorkflow/' changes from 0e61be85c..11e4b4f96
11e4b4f96 fix two incorrectly names attributes in node parser
abec918a8 Merge pull request #291 from rachfop/fix-grammar
a597f9ce9 Fixes grammar, typos, and spellings
00ffaf067 Assure that when something goes wrong calling a service task that we get as much good information about the problem as possible.
c044b5646 Fix that dreadful unknown "KeyError" exception that was cropping up. Adding a bit of detail to the spiffworkflow exceptions when a duplicate process model is found. Disable the submit button on tasks after you click submit (avoid the double click and give users a better experience)

git-subtree-dir: SpiffWorkflow
git-subtree-split: 11e4b4f96f03a036bd29632f1560e347a4e69aae
2023-02-14 16:51:09 -05:00

113 lines
4.1 KiB
ReStructuredText

MultiInstance Tasks
===================
BPMN Model
----------
We'll be using the following files from `spiff-example-cli <https://github.com/sartography/spiff-example-cli>`_.
- `multiinstance <https://github.com/sartography/spiff-example-cli/blob/master/bpmn/multiinstance.bpmn>`_ workflow
- `call activity multi <https://github.com/sartography/spiff-example-cli/blob/master/bpmn/call_activity_multi.bpmn>`_ workflow
- `product_prices <https://github.com/sartography/spiff-example-cli/blob/master/bpmn/product_prices.dmn>`_ DMN table
- `shipping_costs <https://github.com/sartography/spiff-example-cli/blob/master/bpmn/shipping_costs.dmn>`_ DMN table
Suppose we want our customer to be able to select more than one product.
If we knew how many products they would select at the beginning of the workflow, we could
configure 'Select and Customize Product' as a Sequential MultiInstance Task. We would
specify the name of the collection and each iteration of the task would add a new item
to it.
Since we can't know in advance how many products the order, we'll need to modify that
workflow to ask them whether they want to continue shopping and maintain their product
selections in a collection.
.. figure:: figures/call_activity_multi.png
:scale: 30%
:align: center
Selecting more than one product
We'll also need to update our element documentation to display all products.
.. figure:: figures/documentation_multi.png
:scale: 30%
:align: center
Updated Documentation for 'Review Order'
.. note::
Note that we are using a dot instead of the typical python dictionary access to obtain
the values. Spiff automatically generates such a representation, which simplifies creating the
documentation strings; however regular Python syntax will work as well.
Parallel MultiInstance
^^^^^^^^^^^^^^^^^^^^^^
We'll also update our 'Retrieve Product' task and 'Product Not Available' flows to
accommodate multiple products. We can use a Parallel MultiInstance for this, since
it does not matter what order our Employee retrieves the products in.
.. figure:: figures/multiinstance_task_configuration.png
:scale: 30%
:align: center
MultiInstance task configuration
Spiff will generate a task for each of the items in the collection. Because of the way
SpiffWorkflow manages the data for these tasks, the collection MUST be a dictionary.
Each value in the dictionary will be copied into a variable with the name specified in
the 'Element Variable' field, so you'll need to specify this as well.
.. figure:: figures/multiinstance_form_configuration.png
:scale: 30%
:align: center
MultiInstance form configuration
We'll also need to update the form field id so that the results will be added to the
item of the collection rather than the top level of the task data. This is where the
'Element Variable' field comes in: we'll need to change `product_available` to
`product.product_available`, because we set up `product` as our reference to the
current item.
.. figure:: figures/multiinstance_flow_configuration.png
:scale: 30%
:align: center
Product available flow configuration
Finally, we'll need to update our 'No' flow to check all items in the collection for
availability.
.. note::
In our form configuration, we used `product.product_available` but when we reference
it in the flow, we use the standard python dictionary syntax. We can't use that
notation in form fields, so in this case we need to use SpiffWorkflow's dot notation
conversion.
Sequential MultiInstance
^^^^^^^^^^^^^^^^^^^^^^^^
SpiffWorkflow also supports Sequential MultiInstance Tasks for previously defined
collections, or if the loopCardinality is known in advance, although we have not added an
example of this to our workflow.
For more information about MultiInstance Tasks and SpiffWorkflow, see :doc:`/bpmn/advanced`.
Running The Model
^^^^^^^^^^^^^^^^^
If you have set up our example repository, this model can be run with the
following command:
.. code-block:: console
./run.py -p order_product \
-d bpmn/product_prices.dmn bpmn/shipping_costs.dmn \
-b bpmn/multiinstance.bpmn bpmn/call_activity_multi.bpmn