Human Task Manager

The HTM module is a proxy to the HTM AOM from IPF. It uses the connectors provided by HTM and simple spring controllers to proxy the calls from the UI. No data formatting or processing is done beyond permissions and auditing validations.

Configuration

Config

This config is used for the search screen.

htm-bulk-page-results = 1000
htm-page-results = 10
htm-task-types = ["ENFORCE_EXECUTION"]
htm-bulk-task-types = [
  {
    id: "task1",
    translationKey: "task1",
    outcomes: [
      {
        id: "YES",
        translationKey: "outcomeYes"
      },
      {
        id: "NO",
        translationKey: "outcomeNo"
      }
    ],
    executionResultData: {
      id: "name_for_object",
      fields: [
        {
          id: "pegaId",
          translationKey: "supportingFieldPegaId",
          type: "string"
        }
      ]
    }
  },
]

The configurable values are as follows:

Property Description

htm-page-results

Maximum number of HTM tasks to be displayed per page for search results (is set by default to 10)

htm-bulk-page-results

Maximum number of tasks to be bulk executed by HTM (is set by default to 1000).

htm-task-types

The dropdown list of types available in this implementation of HTM

htm-bulk-task-types

The configuration for bulk execute types. It’s an array of BulkTaskTypes

Bulk Task Type

In order to configure the task types used for bulk execution you must provide the relevant details. Looking at the example config, the properties are defined as follows:

Property Description

id

The unique id for the object

translationKey

The key that is to be used to determine what translation will be used for that specific field

outcomes

An object with key and translationKey properties that will display a radio button for each of the items

field

An object with key, translationKey and type properties (currently only strings but to be updated)

executionResultsData

An object with id and fields array properties used to provide client specific data for that task type

Date Formats

Date Formats from common config can be overwritten for this module by supplying your own htm-date-formats.conf. If you don’t provide any values, the dates will be the UK standard

How to create your own HTM Task Execution Screen

Custom task execution screens can be configured by providing a HOCON file. The pages are built with the following components:

Component Properties

Page

id is a unique identifier. This must exactly match one of the configured htm-task-types.

panels is a list of one or more panels.

Panel

cards is a list of one or more cards.

Card

id is a unique identifier.

titlePath is a path to the title translation.

content is the card content.

Content

type is one of LIST (a list with row headers), SIMPLE (displays a single string) or FORM_GROUP (one or more form fields).

elements is a list of one or more elements.

The properties of the elements depend on the type of content:

Content Type Element Properties

LIST or SIMPLE

id is a unique identifier.

description is a path to the row header translation. If content is SIMPLE, this can be null.

type is the type of element displayed. Currently, the only supported type is STRING.

valuePath is a path to the value in the taskDetails response to be displayed.

FORM_GROUP

id is a unique identifier.

type is the type of form field. Currently, the only supported types are SELECT and TEXT_INPUT.

formControlName is the name of the form field.

label is a path to the label translation.

validators is a list of validators. Currently, the only supported validator is REQUIRED, which ensures the field is not left empty. If no validation is required, this can be null.

optionsPath is a path to the dropdown options for SELECT. For TEXT_INPUT, this can be null.

valuePath is a path to the pre-selected value for SELECT or to the initial string to display for TEXT_INPUT.

The paths provided for optionsPath and valuePath should point to fields in the taskDetails response:

{
  "taskDetails": {
    "taskId": "1d01a5d0-4fa6-4ddd-9c65-b6563c0d3370",
    "processingContext": {
      "processingEntity": "BANK_ENTITY_1",
      "associationId": "e0f89f7d-ed66-4df4-ad52-ef3b21d67ccd",
      "unitOfWorkId": "17ade666-117d-40a3-ab85-a63250e5f26a",
      "clientRequestId": "9a589945-4029-4cc2-ac02-79d27c9a042d"
    },
    "createdAt": "2025-07-02T15:45:48.991Z",
    "status": "Complete",
    "priority": 1,
    "requiredApprovals": 0,
    "dueDateTime": "2025-10-02T15:45:48.949Z",
    "type": "FORCE_EXECUTION",
    "claimedBy": "htm_payment_executions",
    "metaDataTags": [
      {
        "category": "EXECUTION",
        "value": "DBTTRANSFER"
      }
    ],
    "supportingData": {
      "type": "IPFPaymentPDS",
      "value": "{\"splmtryDatas\":{\"splmtryData\":[{\"envlp\":{\"any\":{\"@class\":\"ipf.iso.std.iso._20022.tech.xsd.supl_001_001_01.Document\",\"ids\":{\"creditId\":\"EJGKVXAYWZYTZIRH\",\"sessionId\":\"ZPEXMBJYXKTLZHNACHQK\"},\"usrs\":{\"cntrctAppvr\":\"CYCAFGYGXFTCJUFT\",\"cntrctCreatr\":\"HTKZISHKOKUFHAQT\"}}},\"splmtryDataNm\":\"supl1\"}]}}"
    },
    "receivedApprovals": 0,
    "possibleOutcomes": [
      "Execute",
      "Cancel"
    ],
    "executionOutcome": "Execute",
    "executionNote": "Bulk Executing",
    "_links": {
      "self": {
        "href": "http://human-task-manager-app:8080/tasks/1d01a5d0-4fa6-4ddd-9c65-b6563c0d3370"
      }
    }
  },
  "permissions": [
    "EXECUTE",
    "REJECT",
    "ASSIGN",
    "VIEW",
    "APPROVE"
  ]
}
The taskDetails prefix is not required in the paths. Use processingContext.processingEntity, not taskDetails.processingContext.processingEntity.
Data from supportingData.value can be displayed by providing paths to the keys of the stringified object in the typical way.

Predefined Forms

There is one predefined execution form group. This provides a SELECT form field to choose the outcome of a task, eg. 'Execute', and a TEXT_INPUT to enter execution notes. This can be configured by adding a card with predefined = "EXECUTION_FORM" to any panel like so:

panels = [
    {
      cards = [
        {
          predefined = "EXECUTION_FORM"
        }
      ]
    }
]

All other configured forms collect input which is added to executionResultData.value of the execution request as a stringified object.

The card id and formControlName serve as keys.

{
    "executeTaskRequest": {
        "operatorId": "123",
        "outcome": "Execute",
        "note": "Execution Note",
        "executionResultData": {
            "type": "executionResultData",
            "value": "{\"cardId-1\":{\"formControlName-1\":\"form input\"},\"cardId-2\":{\"formControlName-2\":\"form input\",\"formControlName-3\":\"form input\"}}"
        }
    }
}

To configure the pages, provide an ipf.custom-page.conf file like so:

ipf.custom-page {
  htm {
    pages = {
      "TASK_TYPE" = {
        id = "TASK_TYPE",
        panels = [
          {
            cards = [
              {
                id = "ids-list",
                titlePath = "heading.processingIds",
                content = {
                  elements = [
                    {
                      id = "client-request-id",
                      description = "rowHeader.clientRequestId",
                      type = "STRING",
                      valuePath = "processingContext.clientRequestId"
                    },
                    {
                      id = "unit-of-work-id",
                      description = "rowHeader.unitOfWorkId",
                      type = "STRING",
                      valuePath = "processingContext.unitOfWorkId"
                    },
                    {
                      id = "association-id",
                      description = "rowHeader.associationId",
                      type = "STRING",
                      valuePath = "processingContext.associationId"
                    }
                  ],
                  type = "LIST"
                }
              },
              {
                id = "task-status",
                titlePath = "heading.status",
                content = {
                  elements = [
                    {
                      id = "task-status",
                      description = null,
                      type = "STRING",
                      valuePath = "status"
                    },
                  ],
                  type = "SIMPLE"
                }
              },
            ]
          },
          {
            cards = [
              {
                predefined = "EXECUTION_FORM"
              }
            ]
          },
          {
            cards = [
              {
                id = "supplementaryData",
                titlePath = "heading.supplementaryData",
                content = {
                  elements = [
                    {
                      id = "splmtryData-1",
                      type = "TEXT_INPUT",
                      formControlName = "splmtryDataNm",
                      label = "formField.splmtryDataNm",
                      validators = null,
                      optionsPath = null,
                      valuePath = "splmtryDataNm"
                    },
                    {
                      id = "splmtryData-2",
                      type = "TEXT_INPUT",
                      formControlName = "sessionId",
                      label = "formField.sessionId",
                      validators = null,
                      optionsPath = null,
                      valuePath = "sessionId"
                    },
                    {
                      id = "splmtryData-3",
                      type = "TEXT_INPUT",
                      formControlName = "creditId",
                      label = "formField.creditId",
                      validators = null,
                      optionsPath = null,
                      valuePath = "creditId"
                    }
                  ],
                  type = "FORM_GROUP"
                }
              }
            ]
          }
        ]
      }
    }
  }
}