When we first decided to try and solve our in-processing problem, we looked around for an existing solution to the workflow problem. Unfortunately at the time (and largely still today) the only solutions that tackled generic workflow management were hugely expensive applications from the likes of Oracle and IBM. Eventually we decided to go ahead and build a flexible workflow management application ourselves, with the hope of turning it into an open source project.
The result is a fully object oriented application written in PHP. The basic concepts are that of a workflow, an element, and an execution. A workflow defines the template that each execution will follow. The execution is one run of the workflow, with a reference object attached to it. In the case of our in-processing workflow, the reference object is the person being hired.
In this case when the element is completed, a new user is inserted into our users table, and the appropriate roles for this position are assigned.