Forum Discussion

Morgan's avatar
Morgan
Ideator I
4 years ago
Solved

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

4 Replies

    • Gopikrishnan's avatar
      Gopikrishnan
      Ideator I

      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

      • Ramya8080's avatar
        Ramya8080
        Ideator I

        Gopikrishnan - Thanks for the Code, I tried implementing the same for my project but i face issues on updating the action to other state. Thrown an error not a single item even though it has only one item. Can you help me over here. 

        And i have modified my code in this line - if (actAssign.getItemCount() != 1) as i have 2 active entries in the workflow