• Workflow for document approval

  • We tried to make OpenKM as intuitive as possible, but an advice is always welcome.
We tried to make OpenKM as intuitive as possible, but an advice is always welcome.
Forum rules: Please, before asking something see the documentation wiki or use the search feature of the forum. And remember we don't have a crystal ball or mental readers, so if you post about an issue tell us which OpenKM are you using and also the browser and operating system version. For more info read How to Report Bugs Effectively.
 #46368  by dferguson
 
I am trying to develop a workflow such that a document can be routed for approval to one or more users. The initiator of the workflow would start the workflow. Since he/she is the initiator the first step of the workflow would be to select the list of approvers. This list would be an array of usernames that would iterate through a loop. If they "approve" the document, then it would advance to the next user in the list. If any user "rejects" the document, the workflow would go to the end state. If every user "approves" then the workflow would advance to the quality assurance director who would "release" the document.

Starting simple I have the following workflow based off 1 user, but lacks the last steps of QA release.
DocumentApproval.jpg
DocumentApproval.jpg (24.03 KiB) Viewed 7800 times
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>

<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="DocumentApproval">
	<swimlane name="initiator"></swimlane>
	<start-state name="start-state">
		<task swimlane="initiator"></task>
		<transition to="select-user"></transition>
	</start-state>
	
	<task-node name="select-user">
		<task name="select" swimlane="initiator"></task>
		<transition to="Approve-Document"></transition>
	</task-node>
	
	<task-node name="Approve-Document">
		<task name="approve">
			<assignment class="com.openkm.workflow.exercise7.ActorAssignment2"></assignment>
		</task>
		<transition to="approved?"></transition>
	</task-node>

	<decision name="approved?">
		<handler class="com.openkm.workflow.decision.Decision1"></handler>
		<transition to="Approved" name="yes">
			<action name="action1" class="com.openkm.workflow.action.Transaction1Action"></action>
		</transition>
		<transition to="Rejected" name="no">
			<action name="action2" class="com.openkm.workflow.action.Transaction2Action"></action>
		</transition>
	</decision>

	<end-state name="Approved"></end-state>
	<end-state name="Rejected"></end-state>
</process-definition>
The forms.xml
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow-forms PUBLIC "-//OpenKM//DTD Workflow Forms 2.4//EN"
                                "http://www.openkm.com/dtd/workflow-forms-2.4.dtd">

<workflow-forms>
	<workflow-form task="select">
 		<select label="user" name="username" type="simple" optionsQuery="select id, name from User" />
     		<button name="submit" label="submit"/>
	</workflow-form>
  	
	<workflow-form task="approve">
  		<select label="Document Approval" name="approval" type="simple">
  			<option label="Approve" value="1"/>
      			<option label="Reject" value="2"/>
  		</select>
   		<button name="submit" label="submit"/>
	</workflow-form>
</workflow-forms>
The ActorAssignment2 handler
Code: Select all
package com.openkm.workflow.exercise7;

import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;

import com.openkm.bean.form.Select;

public class ActorAssignment2 implements AssignmentHandler {
	private static final long serialVersionUID = 1L;
	
	@Override
	public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception {
		Select username = (Select) executionContext.getContextInstance().getVariable("username");
		
		if (username != null) {
			assignable.setActorId(username.getValue());
		} else {
			assignable.setActorId("okmAdmin");
		}
	}
}
The Decision1 handler
Code: Select all
package com.openkm.workflow.decision;

import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.node.DecisionHandler;

import com.openkm.bean.form.Select;

public class Decision1 implements DecisionHandler {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String decide(ExecutionContext executionContext) throws Exception {
		Select number = (Select) executionContext.getContextInstance().getVariable("approval");
		
		if (number != null) {
			int value = Integer.valueOf(number.getValue());
			
			if (value > 001) {
				return "no";
			} else {
				return "yes";
			}
		} else {
			return "no";
		}
	}
}
Transaction1 and Transaction2 are unchanged from the examples.

In the end I would like the workflow to look more like this...
DocumentApprovalMultiple.jpg
DocumentApprovalMultiple.jpg (30.79 KiB) Viewed 7800 times
The first step I would like to change would be change username from a "simple" to a multiple...
Code: Select all
<workflow-form task="select">
	<select label="user" name="username_array" type="multiple" optionsQuery="select id, name from User" />
	<button name="submit" label="submit"/>        
</workflow-form>
Then I need to add a step to iterate through that array "username_array" and send the single "username" variable to the ActorAssignment2 handler.

The question is, how to I get this array into a variable? I think I can get a handler to iterate through the array, but first how to get a multiple values from a "select" into an array?

I am completely new to all this, including java, but I am determined to figure this out. Any help would be greatly appreciated.

About Us

OpenKM is part of the management software. A management software is a program that facilitates the accomplishment of administrative tasks. OpenKM is a document management system that allows you to manage business content and workflow in a more efficient way. Document managers guarantee data protection by establishing information security for business content.