This document provides a quick overview of contents of the ]project-open[ workflow package.
This package lets you define the process that your projects, vacation requests, invoices or any other important object of interest must go through to avoid that any cases falls through the cracks.
Workflows are a way to formalize and understand any business process involving multiple steps and complex participation amongst workers to achieve the final result. In a manufacturing or engineering setting the workflow can be quite rigid and inflexible, while in service and consulting industries changes can be rapid and a process completly out of order and coordination among project members can take a diverse/infinite number of steps and paths towards completion. ]project-open[ workflows are adaptable and customizable to account for and attempt to portray the actual realities of the business world.
]po[ workflows are based on the Petri-Net formalism, inspired by an article from W.M.P. van der Aalst. A ]po[ workflow consists of the following elements:
]po[ supports several types of transitions, as depicted in the figure above:
Using these basic elements, the Petri-Net formalism allows to specify arbitrarily complex processes. Petri-Nets are known to be sufficiently powerful to represent even workflows specified in workflow formalisms such as BPMN and EPC.
In ]po[, every workflow is related to a business object such as a project, vacation request, [translation task] etc. There are more then 40 business objects in ]po[. There can be more then one active workflow per business object.
There are several links between the business objects and it's workflow:
With ]project-open[ V3.4.0, the following objects already include a workflow integration:
In order to start a workflow for these objects, you have to:
For example, you may create a new workflow with the key "simple_vacation_approval_wf" designed for the approval process of absences of type "Vacation". In order to enable this workflow, please enter the "simple_vacation_approval_wf" into the "String1" field of Admin -> Categories -> Intranet Absence Type -> "Vacation". The next time you create a new "Vacation" absence, a workflow is automatically created.
Please note that the WF integration of the objects above includea "skipping" the first WF transition. This trick allows to design workflows with a clean optical appearance with the first transition representing an "Edit Object" action that is not necessary directly after the creation of an object.
The "Inbox" is the interface between the user and the workflow. The inbox will show a new task every time that a user needs to perform a certain workflow action - for example approve a vacation request. This way, the inbox acts like a cockpit for every ]po[ user and allows the user to take actions (approve or reject vacation requests) to follow-up the status of the users's own requests.
The inbox can also send out Email notifications to user for each new task.
Real-world experience with workflows shows that the assignment of users to actions/transitions is suprisingly complex. Assignments depend on the workflow transition (approving a project budget vs. executing the project), on the type of workflow (PMs approve vacation requests of their project members, HR approves sickness leaves) and on the context (project budgets > 50.000 EUR need to be approved by Senior Managers, while the Account Managers may approve smaller budgets).
In order to deal with these real-world requirements, the ]po[ workflow provides several options to assign a transition to a user:
Once a user is assigned to a transition and he clicks on the link in his Inbox, the user is transferred to a page ("panel") where he or she can interact with the system - pressing an "Approve" button, entering a comment or filling out a form.
The ]po[ workflow provides a number of default panels:
"Callbacks" is the mechanism that allows ]po[ workflows to modify its underlying business object and the system in general. For example let's assume that the HR department has approved a vacation request. We now want to set the status of the vacation request to "approved". Technically, a callback is nothing but the name of a PL/SQL procedure, and the following PL/SQL procedure is readily available for this purpose:
im_workflow__set_object_status_id(case_id, transition_key, object_status_id)
The "case_id" and "transition_key" variables are filled in by the ]po[ workflow automatically, so that a developer only needs to specify the "object_status_id". Looking at Admin -> Categories -> Intranet Absence Status we see that the status "active" has the status_id=16000.Other callbacks are used to assign users to otherwise unassigned transitions and to implement the business logic for "guard" decisions.Please see the Workflow Developer's Guide for a detailed description of callbacks.
These workflows come pre-defined (as of version 3.4) as part of the basic ]project-open[ download and install.
tcl/display-procs.tcl Procs to render workflow information in HTML. tcl/expenses-procs.tcl Procs to render workflow information in HTML. tcl/graph-procs.tcl Helper procs for generating graphical representations of workflows. tcl/intranet-workflow-procs.tcl ]project-open[ specific extension for acs-workflow. tcl/wizard-procs.tcl Helper-procs for the process wizard. tcl/workflow-procs.tcl Tcl-API for the workflow engine.
wf_action_pretty Returns the pretty version of a task action. wf_add_arc wf_add_arc_in wf_add_arc_out wf_add_place wf_add_role wf_add_trans_attribute_map wf_add_trans_role_assign_map wf_add_transition wf_assignment_widget Returns an HTML fragment containing a form element for entering the value of an attribute. wf_attribute_value_pretty Returns a nice display version of the value of an attribute. wf_attribute_widget Returns an HTML fragment containing a form element for entering the value of an attribute. wf_case_add_manual_assignment wf_case_add_task_assignment wf_case_cancel Cancels a case wf_case_clear_manual_assignments wf_case_clear_task_assignments wf_case_comment Comment on a case wf_case_info Get information about a case. wf_case_new Creates and initializes a case of the given workflow type. wf_case_remove_case_deadline wf_case_remove_manual_assignment wf_case_remove_task_assignment wf_case_resume Resumes a suspended case wf_case_set_case_deadline wf_case_set_manual_assignments wf_case_set_task_assignments wf_case_suspend Suspends a case wf_decorate_workflow Adds linking information to the workflow net, based on the arguments given. wf_delete_arc wf_delete_place wf_delete_role wf_delete_trans_attribute_map wf_delete_trans_role_assign_map wf_delete_transition wf_expenses_get_assign_panels wf_export_workflow Generates a SQL script that can re-create this process in another installation. wf_generate_dot_representation Generates a dot-file for use with Graphviz. wf_get_workflow_net We cache the workflow net, although we don't really need that anymore. wf_get_workflow_net_internal wf_graphviz_dot_exec Implementation of wf_graphviz_dot_exec. wf_graphviz_installed_p Will tell you whether the AT&T GraphViz package is installed or not. wf_if_null If string is emtpy, returns <code>value_if_null</code>, otherwise returns string. wf_ismap_to_client_map Translates a server-side imagemap as generated by graphviz into a client-side imagemap that you can include in your HTML. wf_journal Get the journal for a case. wf_make_unique Takes a name (split in two parts) and makes it unique with respect to the list passed in <code>taken_names</code>, by putting an integer number between <code>name_part_one</code> and <code>name_part_two</code>, chopping <code>name_part_one</code> as required to stay within maxlen. wf_message_transition_fire Fires a message transition. wf_move_role_down wf_move_role_up wf_name_to_key Generates a key from a name by making it all lowercase, removing non-letters and putting in underscores instead of spaces. wf_new_journal Creates a new journal entry that can be passed to PL/SQL routines wf_progress_bar Returns an HTML fragment that displays the progress of a wizard nicely. wf_simple_wizard_process_def Gives the process definition list for use with <code>wf_progress_bar</code> wf_simple_workflow_p Returns whether the workflow is "almost linear" or not. wf_split_query_url_to_arg_spec Splits a URL including query arguments (e.g., /foo/bar?baz=greble&yank=zazz) up into a list of lists of name/value pairs, that can be passed as an argument to export_vars. wf_sweep_message_transition_tcl Sweep those message transitions that have a TCL callback and advance the transitions. wf_sweep_time_events Sweep timed transitions and hold timeouts. wf_task_action Tells the workflow engine that the given action has been taken. wf_task_actions Returns a list of the possible actions given the task state. wf_task_info Get detailed information about one task. wf_task_list Get information about the tasks are on a user's work list. wf_task_panels Add the panels for a task into the multirow target. wf_task_state_pretty Returns a pretty-print version of a task state. wf_valid_key_p Check that a value is valid as a key for a workflow/transition/place in a workflow definition. wf_wizard_massage_tasks We store tasks in a client property as a list of array gets with the keys: task_name, transition_key, task_time, loop_to_transition_key, loop_question, loop_answer, assigning_transition_key. wf_workflow_changed Flushes the cache. wf_workflow_info Get the definition of a workflow.
sql/postgresql/acs-workflow-create.sql sql/postgresql/acs-workflow-drop.sql sql/postgresql/load-workflow.sql sql/postgresql/sample-article-create.sql sql/postgresql/sample-article-drop.sql sql/postgresql/sample-expenses-create.sql sql/postgresql/sample-expenses-drop.sql sql/postgresql/test/workflow-case-package-test.sql sql/postgresql/upgrade/upgrade-4.0-4.0.1.sql sql/postgresql/upgrade/upgrade-4.0.1-4.1b.sql sql/postgresql/upgrade/upgrade-4.1.1-4.3.sql sql/postgresql/upgrade/upgrade-4.5.0-4.5.1.sql sql/postgresql/upgrade/upgrade-4.5.1-4.5.2.sql sql/postgresql/upgrade/upgrade-4.5.2-4.5.3.sql sql/postgresql/upgrade/upgrade-4.5.3-4.5.4.sql sql/postgresql/upgrade/upgrade-4.5.4-4.5.6.sql sql/postgresql/upgrade/upgrade-4.5.6-4.5.7.sql sql/postgresql/wf-callback-package-body.sql sql/postgresql/wf-callback-package-head.sql sql/postgresql/wf-callback-package.sql sql/postgresql/wf-core-create.sql sql/postgresql/wf-core-drop.sql sql/postgresql/workflow-case-package-body.sql sql/postgresql/workflow-case-package-head.sql sql/postgresql/workflow-case-package.sql sql/postgresql/workflow-package-body.sql sql/postgresql/workflow-package-head.sql sql/postgresql/workflow-package.sql
|arc-delete.tcl||delete an arc.|
|assign-transition-role-2.tcl||Add assignment of a transition to a role.|
|attribute-add-2.tcl||Really add the attribute.|
|attribute-add.tcl||Add a workflow attribute.|
|attribute-delete.tcl||Delete the attribute.|
|attributes.tcl||Manage workflow attributes.|
|case-debug.tcl||Displays information about a case.|
|cases.tcl||View active cases.|
|context-add-2.tcl||Add new context.|
|context-add.tcl||Add new context.|
|define.tcl||The advanced process builder main page.|
|export-2.tcl||Export the definition of a workflow as a SQL script.|
|export-download.tcl||Export the definition of a workflow as a SQL script.|
|export.tcl||Export the definition of a workflow as a SQL script.|
|index.tcl||Admin index page.|
|init-2.tcl||Hack to initialize a new case.|
|init.tcl||This page should go away and the applications take care of this themselves.|
|name-edit-2.tcl||Edit name of workflow.|
|name-edit.tcl||Edit name of workflow.|
|role-add-2.tcl||Adds a role|
|role-add.tcl||Adds a role to a workflow|
|role-edit-2.tcl||Edits a role|
|role-edit.tcl||Edit a role.|
|role-manual-2.tcl||Make role manually assigned.|
|role-manual.tcl||Makes a role manually assigned|
|role-move-down.tcl||Move role down.|
|role-move-up.tcl||Move role up.|
|static-assignments.tcl||Manage static assignments for a workflow.|
|task-actions-2.tcl||Update task attributes.|
|task-assignment-add.tcl||Make assignment manual.|
|task-assignment-delete.tcl||Make assignment static for the given transition.|
|task-assignment.tcl||Manage assignment of a transition.|
|task-attribute-add.tcl||Add another attribute to be set by a task.|
|task-attribute-delete.tcl||The attribute should not be set by the transition.|
|task-attribute-move-up.tcl||Move up one attribute in the sort_order sequence.|
|task-attributes.tcl||Manage attributes to set during a task.|
|task-panel-add-2.tcl||Add the panel.|
|task-panel-add.tcl||Add a task panel.|
|task-panel-delete.tcl||Delete the panel.|
|task-panel-edit-2.tcl||Edit the panel.|
|task-panel-edit.tcl||Edit a task panel.|
|task-panel-move-up.tcl||Move up one task panel in the sort_key sequence.|
|task-panels.tcl||Manage workflow task panels.|
|unassigned-tasks.tcl||List unassigned tasks|
|assignments.tcl||Fourth stage of simple process wizard.|
|create.tcl||Fifth stage of simple process wizard.|
|index.tcl||Simple process wizard.|
|loops.tcl||Third stage of simple process wizard.|
|new-2.tcl||Second stage of simple process wizard.|
|task-move.tcl||Move a task up one step.|
|tasks.tcl||Second stage of workflow definition.|
|workflow-add-2.tcl||Add new process.|
|workflow-add.tcl||Create new process.|
|workflow-cases-delete.tcl||Delete a workflow definition from the system.|
|workflow-copy-2.tcl||Make a copy of a process.|
|workflow-copy.tcl||Make a copy of a process.|
|workflow-delete.tcl||Delete a workflow definition from the system.|
|workflow-dot.tcl||Returns a graphviz-dot file representation of the workflow.|
|workflow-roles.tcl||Display roles for a workflow|
|workflow-summary.tcl||Displays basic aggregate statistics on a workflow|
|workflow.tcl||Index page for a workflow.|
|assign-yourself.tcl||This page assigns a task to the user accessing this page.|
|assignee-add-2.tcl||Add assignee to task.|
|assignee-remove-2.tcl||Remove assignee from task.|
|case-assignment-remove-2.tcl||Remove manual assignment.|
|case-assignment-set-2.tcl||Set case assignments for a role.|
|case-assignment-set.tcl||Set case assignments for a role.|
|case-assignments.tcl||View/change role assignments for a case.|
|case-deadline-remove-2.tcl||Sets deadline for case transition.|
|case-deadline-set-2.tcl||Sets deadline for case transition.|
|case-deadline-set.tcl||Set the deadline for a transition in a case.|
|case-deadlines.tcl||Displays deadlines set for a case.|
|case-state-change.tcl||Change the state of a case|
|case.tcl||Displays information about a case.|
|comment-add-2.tcl||Add a comment to the journal for a case.|
|comment-add.tcl||Add a comment to the journal for a case.|
|index.tcl||Displays the user's task list.|
|task-assignees.tcl||Remove one or more assignees for a task.|
|task-deadline-set-2.tcl||Update deadline for a task|
|task-deadline-set.tcl||Set the deadline for a task|
|task.tcl||Displays information about a specific task.|
|transition-fire.tcl||Fire a transition.|
|workflow.tcl||Admin big picture view of a workflow, including places, transitions and arcs|