Showing posts with label Workflow hierarchy. Show all posts
Showing posts with label Workflow hierarchy. Show all posts

Thursday, May 31, 2018

D365/AX7 – How to apply workflow hierarchy type at runtime

The default workflow hierarchy providers as provided by Microsoft Dynamics AX, allow us to use managerial or configurable hierarchy as setup for the workflow. However, when comes a requirement where the hierarchy type of the workflow should be decided at run time, we need to do some customizations with workflow hierarchy providers.


Problem


To select workflow hierarchy type for each record at run time. 







Here, we need the workflow to be approved by the Task hierarchy of the workflow originator (say Aaliyah). The Task hierarchy of the worker Aaliyah is as follows.




Solution


To achieve above requirement, follow the steps below to create custom workflow hierarchy provider for any specified hierarchy type.

Step#1 In order to add a custom workflow hierarchy provider, refer the blog How to add custom workflow hierarchy assignment provider

Step#2 Add a method to get the position hierarchy type from the record the workflow is executing for.

public HcmPositionHierarchyTypeRecId getPositionHierarchyType(
WorkflowContext _workflowContext)
{
MY_TaskTable                 taskTable;

if(_workflowContext.parmTableId() == tableNum(MY_TaskTable))
{
taskTable = MY_TaskTable::find(_workflowContext.parmRecId());
}

return taskTable.PositionHierarchyType;

}

Step#3 Modify the method getNextNode as below

public WorkflowHierarchyProviderNode getNextNode(anytype _nodeId,
WorkflowHierarchyLevel _level,
WorkflowContext _workflowContext)
{
HcmPositionHierarchyTypeRecId positionHierarchyTypeRecId = this.getPositionHierarchyType(_workflowContext);
       
if (positionHierarchyTypeRecId == 0)
{
throw error("Position hierarchy not defined for the workflow");
}

return helper.getNextNode(_nodeId, _level, _workflowContext, dataSource, positionHierarchyTypeRecId);
}

Step#4 Build the relevant model.

Execution


Setup the workflow using task workflow hierarchy provider.


According to the task hierarchy of the worker Aaliya (workflow originator), and the workflow design as above, the task will be first assigned to Adam and then to Julia for approval. 


D365/AX7 – How to add hierarchy token using custom workflow hierarchy provider

Workflow hierarchy assignment usually provides limited options to select the start of the given hierarchy. Most common options to select for the start of hierarchy are Workflow owner, Workflow originator, Personnel number, User etc. E.g. the workflow is assigned to the managerial hierarchy of the workflow originator.


Problem

To add hierarchy token using custom workflow hierarchy provider, so that we have option to select the start of hierarchy other than those already provided by the default provider.


Solution

To achieve above requirement, follow the steps below to create custom workflow hierarchy provider and add the token using it.

Step#1 In order to add a custom workflow hierarchy provider, refer the blog How to add custom workflow hierarchy assignment provider

Step#2 Add new EDT which extends HcmWorkerRecId


Step#3 Assign the EDT to the table field, which you want to be the starting point for workflow managerial hierarchy.



Step#4 Implement the method getSupportedType of custom workflow hierarchy provider class to add your data type i.e. MY_SupervisorWorkerRecId

public Set getSupportedDataType()
{
Set supportedDataTypes = helper.getSupportedDataType();

if(!supportedDataTypes)
{
supportedDataTypes = new Set(Types::String);
}

//Add the required data types
supportedDataTypes.add(extendedTypeStr(MY_SupervisorWorkerRecId));
return supportedDataTypes;

}

Step#5 Implement the method convertToNodeDataType of custom workflow hierarchy provider class to fetch the worker’s personnel number using the field value from the record (workflow document).

public anytype convertToNodeDataType(extendedDataTypeName _dataType,
anytype _value,
       WorkflowContext _workflowContext)
{
HcmPersonnelNumberId personnelNumberId;

if(_dataType == extendedTypeStr(MY_SupervisorWorkerRecId))
{
personnelNumberId = HcmWorker::find(_value).PersonnelNumber;
}
else
{
personnelNumberId = helper.convertToNodeDataType(_dataType, _value, _workflowContext);
}
return personnelNumberId;

}

Step#6 Build the relevant model.

Execution

Setup workflow using custom hierarchy token for supervisor


A task to submit workflow by Admin. We need the workflow approval from line manager of the supervisor here i.e. Aaliyah.




Workflow is assigned to the line manager of Aaliya i.e. Adam Carter, as specified in the workflow designer