Skip to main content

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

process overview

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:

create 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.

create business process model

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.

create 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.

create intake user task

In the resulting popup enter Loan Request Intake as 'Name' and loanRequestIntake as 'Key'. Then select Create followed by Finish.

create intake user task

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.

create intake form

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.

configure select values intake form

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:

  1. When the requester’s age is under 21 the request is declined.

  2. 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.

  3. 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.

  4. 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.

create evaluate 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.

create evaluate decision task

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.

create decision input

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

create decision input

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.

create decision output

Again select Save. We now have the inputs and outputs defined:

create decision output

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'.

note

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:

  1. Age: < 21 / Country: - / Amount: - / Approval State: DECLINED

  2. Age: >= 21 / Country: IS IN "NL", "CH" / Amount: >= 100000 / Approval State: REVIEW

  3. Age: >= 21 / Country: IS NOT IN "NL", "CH" / Amount: >= 100000 / Approval State: DECLINED

  4. Age: >= 21 / Country: - / Amount: < 100000 / Approval State: APPROVED

create decision table

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.

select hit policy

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.

set sequence flow condition

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

set custom outcomes

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.

set sequence flow condition 2

Save the process model, and you are done modeling the Loan Request Approval App.

process overview

Decision table: Deploy the Process

To execute the process in Flowable Work or Flowable Engage, we need to deploy the App

process overview

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.

create new process

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

scenario 1 intake form

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.

scenario 1 process state 1

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.

scenario 1 decision audit

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.

scenario 2 decision audit

scenario 2 process state 1