Set workflow activity via action
Hi all,
I was wondering if it was possible to set the workflow activity via an action.
For example, I want a cancel action instead of having multiple vote paths to the cancel activity in a workflow. This would allow a user to cancel the item from any point. This action should set the lifecycle state to Cancelled and the Workflow Activity to Cancelled. Can this be accomplished without a voting path?
Hi mczbas
It is possible to cancel the item using action and move the life cycle and workflow to cancelled state
Note: Method is using the path Cancelled (Keep the same name in the life cycle and workflow)
Create a Method Workflow_Promote
Innovator inn = this.getInnovator();
Item wfcItem = inn.newItem(this.getType(), "get");
wfcItem.setID(this.getID());
Item workflow = inn.newItem("Workflow", "get");
Item workflowProcess = inn.newItem("Workflow Process", "get");
Item wfpa = inn.newItem("Workflow Process Activity", "get");
Item activity = inn.newItem("Activity", "get");
activity.setProperty("state", "Active");
Item activityAssign = inn.newItem("Activity Assignment", "get");
Item wpp = inn.newItem("Workflow Process Path", "get");
wpp.setProperty("name", "Cancelled");
activity.addRelationship(activityAssign);
activity.addRelationship(wpp);
wfpa.setRelatedItem(activity);
workflowProcess.addRelationship(wfpa);
workflow.setRelatedItem(workflowProcess);
wfcItem.addRelationship(workflow);
wfcItem = wfcItem.apply();
if (wfcItem.isError())
{
return inn.newError("Error retrieving Workflow Process Item: " + wfcItem.getErrorString());
}
Item wfPaths = wfcItem.getItemsByXPath("//Item[@type='Workflow Process Path']");
if (wfPaths.getItemCount() != 1)
{
return inn.newError("Unable to get the Cancelled Path or Item is already in Cancelled State.");
}
string submitPathId = wfPaths.getItemByIndex(0).getID();
Item act = wfcItem.getItemsByXPath("//Item[@type='Workflow Process Activity']/related_id/Item[@type='Activity']");
if (act.getItemCount() != 1)
{
return inn.newError("Unable to get activity");
}
Item actAssign = wfcItem.getItemsByXPath("//Item[@type='Activity Assignment']");
if (actAssign.getItemCount() != 1)
{
return inn.newError("Unable to get activity assignment");
}
StringBuilder voteXml = new StringBuilder("");
voteXml.Append("<Item type=\"Activity\" action=\"EvaluateActivity\">");
voteXml.Append(" <Activity>{0}</Activity>");
voteXml.Append(" <ActivityAssignment>{1}</ActivityAssignment>");
voteXml.Append(" <Paths>");
voteXml.Append(" <Path id=\"{2}\">Cancelled</Path>");
voteXml.Append(" </Paths>");
voteXml.Append(" <DelegateTo>0</DelegateTo>");
voteXml.Append(" <Tasks />");
voteXml.Append(" <Variables />");
voteXml.Append(" <Authentication mode=\"\" />");
voteXml.Append(" <Comments>Cancelled through Action</Comments>");
voteXml.Append(" <Complete>1</Complete>");
voteXml.Append("</Item>");
Item result = inn.newItem();
result.loadAML(String.Format(voteXml.ToString(),act.getID(),actAssign.getID(),submitPathId));
result = result.apply();
return result;Create a Server Action and attach to the item type you want this action
Create a Transition to Cancel State in Life Cycle
Create a Path to Cancel State and Update the Promotion in Each State in Workflow
Demo below. 3 items are in different state (Draft, In Progress and In Review) and Action is allowing to Cancel it.
[View:/cfs-file/__key/communityserver-discussions-components-files/3/Demo.mp4:320:240]
Thank You
Gopikrishnan R