cancel
Showing results for 
Search instead for 
Did you mean: 

Problem to assign a task to multiple users.

fbehfar
Champ on-the-rise
Champ on-the-rise
I want to assign a task to multiple user, in my own workflow. I'm trying to do it with the 'wiki sample2' by changing

<actor>#{bpm_assignee}</actor> 

to

<actor>#{bpm_assignees}</actor> 

in the 'Lifecycle_processdefintion.xml' file, but nothing happend. Should I change something else in another file?
or it's better to say, where is the UI configuration of 'LifecycleModel', there is nothing about lifecycle model in the 'web-client-config-custom.xml' file, so how does it understand, which properties to show and in what orders, there is no

<config evaluator="node-type" condition="wf:submitAdhocTask" replace="true"> 
   <property-sheet>
      <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
      <show-property name="bpm:workflowDescription" component-generator="TextAreaGenerator" />
      <show-property name="bpm:workflowPriority" />
      <show-property name="bpm:workflowDueDate" />
      <show-property name="wf:notifyMe" />
      <separator name="sep2" display-label-id="users_and_roles" component-generator="HeaderSeparatorGenerator" />
      <show-association name="bpm:assignee" />
   </property-sheet>
</config>

such a thing for ifecycle workflow in any files!!!
how can I customise it?

my main question is how can I assign a task to multiple users, and in which files should I make changes?
I have changed all the bpm_asignee to bpm_asignees but, nothing happend.
Would anybody help me? It's making me crazy for about 2 weeks.

Thanks,
FSB
8 REPLIES 8

rob562435
Champ in-the-making
Champ in-the-making
For a multiple actor you need to use the "pooled actors" tag in stead of the single actor.
Both in the WIKI and in the supplied examples (for instance "review_pooled_processdefinition.xml") there is information on how to handle pooled actors.
As an alternative you can use the "foreach" method as used in the parallel review example "parallelreview_processdefinition.xml".

Hope this helps.

Rob

fbehfar
Champ on-the-rise
Champ on-the-rise
Thanks Rob,
your hint was really helpfull.
would you help me more?

Actuallay I could deploy the 'parallelreview_processdefinition.xml'. but when I try to do it on my own sample it doesn't let me to select multiple user, then when I push on 'Finish' I recieve this error:
'A system error happened during the operation: Failed to signal transition 'null' from workflow task 'jbpm$34''
I've tried with
<foreach>#{bpm_assignees}</foreach>
and also with
<pooledactors>#{bpm_assignees}</pooledactors>
but each time I get the same error!
Should I add something else in my code?
this is my code with '<foreach>', I've added the lines which are marked as bold '' to my workflow.

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wfl:lifecycleapproval2">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />

        <event type="node-leave">

            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">

                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       if (!bpm_package.children[i].hasAspect("wfl:status"))
                       {
                          bpm_package.children[i].addAspect("wfl:status");
                       }
                    }
                </script>
            </action>
        </event>

        <transition name="" to="review" />
    </start-state>

[b]    <node name="startreview">
        <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
            <foreach>#{bpm_assignees}</foreach>
            <var>reviewer</var>
        </action>
        <transition name="review" to="review" />
    </node>[/b]

    <task-node name="review">
        <event type="node-enter">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "In Review";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:reviewTask">

[b]      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
        <actor>#{reviewer}</actor>
      </assignment>[/b]

            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>
       
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <task-node name="rejected">
        <event type="node-enter">
            <!– Update the status to Draft when we enter this task –>
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Draft";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <event type="node-enter">
            <!– Update the status to Approved when we enter this task –>
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Approved";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

    <event type="process-end">
        <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
                if (cancelled)
                {
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       if (bpm_package.children[0].hasAspect("wfl:status"))
                       {
                          bpm_package.children[i].properties["wfl:status"] = "Draft";
                          bpm_package.children[i].save();
                       }
                    }
                    if (logger.isLoggingEnabled()) logger.log("Workflow cancelled, status reset to Draft");
                }
                else               
                {
                    if (logger.isLoggingEnabled()) logger.log("Workflow completed");
                }
            </script>
        </action>
    </event>

</process-definition>

And this is my code with '<pooledactors>'

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wfl:lifecycleapproval3">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />

        <event type="node-leave">           
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       if (!bpm_package.children[i].hasAspect("wfl:status"))
                       {
                          bpm_package.children[i].addAspect("wfl:status");
                       }
                    }
                </script>
            </action>
        </event>

        <transition name="" to="review" />
    </start-state>

[b]    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <pooledactors>#{bpm_assignees}</pooledactors>
        </assignment>   
    </swimlane>[/b]

    <task-node name="review">
        <event type="node-enter">
            <!– Update the status to In Review when we enter this task –>
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "In Review";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:reviewTask">

      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
        <actor>#{reviewer}</actor>
      </assignment>

            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>

[b]            <event type="task-end">
               <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                  <script>
                     <variable name="bpm_assignee" access="write"/>
                     <expression>
                        if (taskInstance.actorId != null)
                           people.getPerson(taskInstance.actorId);
                        else
                           person;
                     </expression>
                  </script>
               </action>
            </event>[/b]
       
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <task-node name="rejected">
        <event type="node-enter">
            <!– Update the status to Draft when we enter this task –>
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Draft";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <event type="node-enter">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Approved";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

    <event type="process-end">
        <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
                if (cancelled)
                {
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       if (bpm_package.children[0].hasAspect("wfl:status"))
                       {
                          bpm_package.children[i].properties["wfl:status"] = "Draft";
                          bpm_package.children[i].save();
                       }
                    }
                    if (logger.isLoggingEnabled()) logger.log("Workflow cancelled, status reset to Draft");
                }
                else               
                {
                    if (logger.isLoggingEnabled()) logger.log("Workflow completed");
                }
            </script>
        </action>
    </event>

</process-definition>

actullay I'm working on the 'lifecycle_processdefinition.xml' sample but I try to assign it to multiple user!!!

would you help me again?
thank you in advance,
FSB

fbehfar
Champ on-the-rise
Champ on-the-rise
I found my problem,
I changed my code to :

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wfl:lifecycleapproval2">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitParallelReviewTask" swimlane="initiator" />
        <transition name="" to="startreview" />
    </start-state>

    <node name="startreview">
        <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
            <foreach>#{bpm_assignees}</foreach>
            <var>reviewer</var>
        </action>
        <event type="node-enter">
            <script>
                <variable name="wf_approveCount" access="write" />
                <expression>
                    wf_approveCount = 0;
                </expression>
            </script>
        </event>
        <transition name="review" to="review" />
    </node>

    <task-node name="review">
        <event type="node-enter">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "In Review";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:reviewTask">
            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
            <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
               <actor>#{reviewer}</actor>
            </assignment>
        </task>
       
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <join name="endreview">
        <transition to="approved" />
    </join>

    <task-node name="rejected">
        <event type="node-enter">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Draft";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <event type="node-enter">
            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                <script>
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       bpm_package.children[i].properties["wfl:status"] = "Approved";
                       bpm_package.children[i].save();
                    }
                </script>
            </action>
        </event>

        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

    <event type="process-end">
        <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
            <script>
                if (cancelled)
                {
                    for (var i = 0; i &lt; bpm_package.children.length; i++)
                    {
                       if (bpm_package.children[0].hasAspect("wfl:status"))
                       {
                          bpm_package.children[i].properties["wfl:status"] = "Draft";
                          bpm_package.children[i].save();
                       }
                    }
                    if (logger.isLoggingEnabled()) logger.log("Workflow cancelled, status reset to Draft");
                }
                else               
                {
                    if (logger.isLoggingEnabled()) logger.log("Workflow completed");
                }
            </script>
        </action>
    </event>

</process-definition>

now it's working! :lol:
without changing <task name="wf:submitReviewTask" swimlane="initiator"/>  to <task name="wf:submitParallelReviewTask" swimlane="initiator" /> I couldn't see any effect, right???

a question:
where or how can I find differend kinds of methods or properties, like: '.isLoggingEnabled()' or children, or different classes like: 'org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript' ???

Thanks,
FSB

rob562435
Champ in-the-making
Champ in-the-making
As far as your first observation: changing "<task name="wf:submitReviewTask" …" into: "<task name="wf:submitParallelReviewTask" …" is concerned: this has to do with the processmodel sitting behind the process definition. The model definition describes the real modelling of types etc. Look in the Alfresco distribution for the process model file describing the WF: types.

Your last question can only be answered in the way that I gather information: browse through the various forums, especially the one about the workflows is sometimes helpful. Next to that the WIKI contains a lot of information. And finally the Alfresco distribution contains a lot of examples.
Finally I found the documents that Jeff Potts has written very enlightening. You can find them on his site http://ecmarchitect.com/ There are five documents in PDF so far together with source code.
For your convenience I give you the direct links:
http://ecmarchitect.com/images/articles/alfresco-actions/actions-article.pdf
http://ecmarchitect.com/images/articles/alfresco-content/content-article.pdf
http://ecmarchitect.com/images/articles/alfresco-content/content-article-project.zip
http://ecmarchitect.com/images/articles/alfresco-behavior/behavior-article.pdf
http://ecmarchitect.com/images/articles/alfresco-behavior/behavior-article-project.zip
http://ecmarchitect.com/images/articles/alfresco-webscripts/web-script-article.pdf
http://ecmarchitect.com/images/articles/alfresco-webscripts/web-script-article-project.zip
http://ecmarchitect.com/images/articles/alfresco-workflow/advanced-workflow-article.pdf
http://ecmarchitect.com/images/articles/alfresco-workflow/advanced-workflow-article-project.zip

Unfortunately I did not find a pool filled with all information, most is just browsing and reading of what others publishes.

I hope this helps you.

Regards, Rob

fbehfar
Champ on-the-rise
Champ on-the-rise
Thank you sooooooooooooooooooooo much Rob,

All of your hints were really greate and helpful.
The documents are really good, especially 'advanced-workflow-article.pdf '

I couldn't find the description of the WF: types!?!?!?

Thanks again,
FSB

rob562435
Champ in-the-making
Champ in-the-making
Hi, you have to wait until tomorrow morning. At work I have the installation at hand and I will give you the exact file to look for.
Regards, Rob

rob562435
Champ in-the-making
Champ in-the-making
As promised: the file you have to look for is called
workflowModel.xml
and is located in
[Installation directory]\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\workflow

Regards, Rob

fbehfar
Champ on-the-rise
Champ on-the-rise
Thank you so much Rob,

Your helps are really greate.
thanks again,
FSB