Part 1: Decision Table
Introduction
In Flowable there is support to use decision tables directly in a case or process model, but it's also possible to model decision services to orchestrate the data of multiple decision tables. In this model guide we will look into both approaches, starting with the basic decision table approach.
In the second part, modeling decision services is discussed, and an example is provided on how to use a decision service model in a case or process model.
Decision table: Model the Process
We start by creating the 'Loan Approval' app and a process called 'Loan Request Approval'. The process consists of a two-step happy path:
Make the Loan Request: a user task form for providing the required data about the loan.
Evaluate the Loan Request: a DMN decision table that evaluates the loan request.
The result of the decision execution is one of: "APPROVED", "DECLINED" or "REVIEW". In the last case, the process navigates to an additional review step.
First create the Loan Request Application:
Step 1: Create the Business Process Model
In Flowable Design, within the loan request application click the Create
button and choose model type Process
.
Enter Loan Approval as the 'Model name', loanApproval as the 'Model key'
and A loan approval request can be submitted and will be approved. as the
'Description'.
To create the model, click the Create
button.
Step 2: Create the 'Loan Request Intake' Step
After creating the process model, you are directed to the BPMN designer. Here we can model our process.
We start by creating the Intake Form
. For this, we create a
BPMN User task
with a form.
Step 2A: Create the 'Loan Request Intake User Task'
Select the User task
from the palette on the left-hand side and
drag it to the canvas (the middle section), and rename it to Loan Request Intake.
Connect the Start event
with the newly created User task
by selecting
the Start event
and selecting the arrow
from the popover options
and drag it to the Loan Request Intake User task.
Next, we create a new form and attach it to the user task.
Select the Loan Request Intake
task. Then in the panel on the right, select the Form reference
property from the
User Task - General
section.
In the resulting popup enter Loan Request Intake as 'Name' and loanRequestIntake
as 'Key'. Then select Create
followed by Finish
.
Step 2B: Create the 'Loan Request Intake Form'
In the Form Designer, we create the Intake form by dragging the required input fields onto the canvas.
Select the following data entry items from the palette on the left side and drag them to the canvas (the middle section).
When placing the fields on the canvas give them the following names and ids:
type: 'Text', name: Name, id: name.
type: 'Number', name: Age, id: age.
type: 'Select (single)', name: Country, id: country.
type: 'Number', name: Amount, id: amount.
The 'Single select' field country needs to have a list of values configured.
This is done by selecting the field and then selecting the Items
property in the Select (Single) - Datasource
section
in the panel on the right side of the screen.
Fill in the following country values:
Text: United States, Value: USA
Text: United Kingdom, Value: UK
Text: The Netherlands, Value: NL
Text: Switzerland, Value: CH
Finally, select Finished
.
The form is done and is saved by selecting the Save button in the toolbar. After the form is saved, navigate back to the process by selecting the 'Loan Approval Process' tab.
Step 3: Create the 'Evaluate Loan Request' step
In this step, a DMN decision table is used to evaluate the loan request. The decision about the loan is accomplished evaluating rules that utilize the data entered on the submitted form (intake).
The decision table can determine if a request is declined, approved, or if there is the need for a review.
The table consists of the following rules:
When the requester’s age is under 21 the request is declined.
When the requester’s age is 21 or over, lives in The Netherlands or Switzerland, and the requested amount is equal to or greater than 100000, a review is required.
When the requester’s age is 21 or over, does not live in The Netherlands or Switzerland, and the requested amount is equal to or greater than 100000, the request is declined.
When the requester’s age is 21 or over, and the amount is less than 100000, the request is approved.
A decision table can have different 'hit policies'. The hit policy determines what the result of the decision table is when multiple rules are valid. In this case, we want that only one rule can be valid. For this, we chose the hit policy 'Unique'. If we design a table that, depending on the input data, has multiple valid rules, this would result in an invalid result.
Step 3A: Create the 'Evaluate Loan Request Decision Task'
Select the Activites>Decision task
from the palette on the left-hand side and drag
it to the canvas (the middle section).
Double click the Decision task
and rename it to Evaluate Loan Request.
Connect the Loan Request Intake task with the newly created Decision task
by
selecting the Loan Request Intake task and selecting the arrow
from the
popup options and drag it to the Evaluate Loan Request decision task.
We can now create the Decision Table
and attach it to the Decision task by clicking the
Decision table reference
attribute in the Decision Task - General
panel on the right side of the screen.
In the resulting popup set the 'Name' to Evaluate Loan Request and the 'Key' equal to evaluateLoanRequest.
Finally, select Create
followed by Finish
.
Step 3B: Create the 'Evaluate Loan Request Decision Table'
The DMN Decision Table Editor is automatically opened after creating the decision table.
A decision table consists of rules that have one or more expressions and one or more outcomes (outputs). The expressions are evaluated using the defined input data (inputs). In this case, some of the data from our intake form are used. This is done by referring to the variable names used in the definition of the intake form.
Inputs
Let us start by defining the inputs. Expand the left column and select Edit column
, and enter the following values:
- Column label: Age, Variable name: age, Variable type: number.
Next, select Save
and then create the country
input column by
expanding the Age
column and selecting Add column
.
Specify the following information for the new country
column:
- Column label: Country, Variable name: country, Variable type: string
Now create the Amount
input column follow the same steps for adding the Country
column.
- Column label: Amount, Variable name: amount, Variable type: number
Outputs
Now we define the output column. Expand the most right column header
and select Edit Column
and fill in the 'Column label' with Approval State, the
'Variable' with approvalState, and the 'Variable type' with string.
For 'Output values', enter APPROVED, DECLINED, and REVIEW each
into a row of their own.
Again select Save
. We now have the inputs and outputs defined:
And can proceed with constructing the rules.
Rules
Each condition of a rule is constructed by specifying a value and an operator. The available operators depend on the variable type of the 'column'.
There are two exceptions. One is when using the 'dash value'. The other is when using a custom Java Unified Expression Language (JUEL) expression. The dash operator ('-') means that the expression for that rule is ignored when evaluating the table. A custom JUEL expression is declared with surrounding '={}' of '${}' syntax.
For this example, Create the following rules:
Age: < 21 / Country: - / Amount: - / Approval State: DECLINED
Age: >= 21 / Country: IS IN "NL", "CH" / Amount: >= 100000 / Approval State: REVIEW
Age: >= 21 / Country: IS NOT IN "NL", "CH" / Amount: >= 100000 / Approval State: DECLINED
Age: >= 21 / Country: - / Amount: < 100000 / Approval State: APPROVED
Finally set the hit policy by selecting the hit policy indicator in the upper
left-hand corner of the table. (By default there is an F
for First.)
Select Unique
as the policy and then Finish
.
Finally, save the Decision Table and return to the process view.
Step 4: Create the Exclusive Gateway (and End Events)
The resulting output of the valid rule is set as the value of the defined
output variable. In this case, there is a variable with the name approvalState
with the value, 'APPROVED', 'DECLINED' or 'REVIEW' on the process execution scope.
We can use that value to route our process to the next stage. Let us do that
by creating an exclusive gateway
and conditional sequence flows
.
Step 4A: Exclusive Gateway
Select the Exclusive gateway
from the Gateways
section of the palette on the
left and drag it to the canvas.
Connect the Decision task
with the Exclusive gateway
with a sequence
flow (the arrow type line connector).
Step 4B: End Events
The result of the loan request is either approved or declined.
We, therefore, want the process to have two different end states.
We do that by defining two end events: APPROVED
and DECLINED
.
Select the End event
in the palette and drag it to the canvas. Repeat the
same drag action for another End event
.
Double click each End event
and rename one to APPROVED and the other
DECLINED.
Step 4C: Conditional Sequence Flows
To navigate the process to one of the two end events based on a value, we set a condition on the sequence flow.
Let us connect the 'Exclusive gateway' to both 'End events'.
Name the one connecting the APPROVED
end event approved,
and the other one declined.
Now set the conditions by selecting the sequence flow and filling out
the Condition expression
.
Set the field to ${approvalState == 'APPROVED'}
for the approved sequence flow
and set ${approvalState == 'DECLINED'}
for the declined sequence flow.
The process is defined to navigate to one of the two end events based on the
value of the variable approvalState
.
Step 5: Create the 'Review Loan Request' Step
In the previous step, we defined the routing of the process based on
the decision table outcomes APPROVED
and DECLINED
.
There was another outcome: REVIEW
. In this step, we create a review task
with which an appropriate user can manually approve or decline the request.
Step 5A: Create the 'Review Loan Request User Task'
Select the User task
from the palette on the left and drag it to the canvas.
Double click the User task
and rename it to Review Loan Request.
Connect the Exclusive gateway
with the newly created User task
using
a Sequence flow
as we want to navigate to the Review Loan Request User Task
in all cases other than APPROVED
and DECLINED
mark this sequence flow as
the Default flow
.
The default is set by selecting the sequence flow and then
Default flow
attribute in the panel on the right and select the checkbox.
Step 5B: Create the 'Loan Request Intake Form'
To review the current loan request, we want to display the data
from Loan Request Intake Form
.
Let us create a form as done in Step 2 above. First, create the
Loan Request Intake Form
and in addition to the fields described in Step 2, add:
- type: 'Text', name: Remarks, id: remarks, value: {{remarks}}
For approving or declining the loan request, we configure two custom outcomes.
Select the form canvas; make sure you do not select a form field. Then from the Form - General
panel
in the Other
section, select Outcomes
, set reviewState as the variable name and enter the following values:
Label: Approve, Value: APPROVE
Label: Decline, Value: DECLINE
Next select Finish
to save the information.
Step 5C: Exclusive Gateway
Add another Exclusive gateway
and connect the Review Loan Request
User task
with a sequence flow.
Connect the sequence flows from the Exclusive gateway
to both the APPROVED
and DECLINED
End events.
Next set the condition expression: ${reviewState == 'APPROVED'}
for the sequence flow connecting to the APPROVED'
End event.
And enter the condition expression: ${reviewState == 'DECLINED'} for the
sequence flow connecting to the DECLINED
End event.
Save the process model, and you are done modeling the Loan Request Approval App.
Decision table: Deploy the Process
To execute the process in Flowable Work or Flowable Engage, we need to deploy the App
The App including the 'Loan Approval' process (and associated forms and the decision table) is now deployed.
Decision table: Execute the Process
Flowable Engage is used to demonstrate the process and two different scenarios are showing the various potential outcomes of the decision table.
Scenario 1
In Flowable Engage select Work>Create new
in the left menu.
Select the Loan Request Approval Process
from the Loan Request App
.
Select Continue
.
A process instance is started and the process execution halts at the
first step; the Loan Request Intake
user task.
Select the task in the Open tasks
list.
The form is presented. In this first scenario, enter the following data:
name: Requestor One
age: 35
country: Switzerland
amount: 500.000
Next, select the Complete button.
There is now an open task named Review Loan Request
. To find out why
the process is in that state we look at the decision table audit.
Select History
in the toolbar and see a process instance diagram depicting
the current state of the process.
As you can see, the process navigated to the Review Loan Request
user task.
To find out what the result of the decision table was select Decisions
in
the submenu.
Here you can see that rule two was valid, and therefore, REVIEW
is
the outcome of the decision.
Now select Open tasks
again and select the Review Loan Task
. After
reviewing the data, enter an optional remark and select Approve
.
The process is now completed and the request is approved.
Scenario 2
Let us execute another Loan Approval process instance and this time
provide the following data in the Loan Request Intake
user task;
name: Requestor Two
age: 35
country: United States
amount: 500.000
This time the decision table evaluation results in DECLINED
, and
the process ends.