The scenario
Let's say we have part of a basic procurement business process
1.  Start:  Determine goods/services are needed
2.  Create a requisition
3.  Route it for approval
4.  Approve/reject
5.  Create a PO (sourcing is already done)
6.  Possibly route it for approval as well
7.  Communicate w/ the supplier
8.  End:  Supplier accepts the PO

Now, for the approvals they are actually a complex sub-process.  If at anytime the requisition is withdrawn then the approval process aborts because there is nothing to approve.  If the requisition is canceled then the whole process just stops.

I've modeled the requisition's approval subprocess, but I'm not sure how to handle its abort & which interrupting events would best be used.

  • My understanding of a cancel event is:  Subprocess is not done.  If cancel message is caught then all activities are undone.
  • My understanding of a compensation event is:  Subprocess is done.  If compensation message is caught then a non-specific set of steps are done to reverse the process.
  • My understanding of a conditional event is:  Subprocess is not done.  If a condition exist then abort the process, but do not undo anything that happened inside the process.

You can withdraw a requisition before, during, or after requisition approval with different responses

  • If you withdraw before routing for approval, then you just revert back to creating / editing the requisition.
  • If you withdraw during the approval subprocess, then you notify the current approver that the requisition is withdrawn.  The process reverts back to the beginning with the requisition going through the creation activity.
  • If you withdraw after the approver subprocess then it is the same as withdrawing it prior to routing for approval.  You just have a record that prior approval was given.  Withdrawal is no longer possible once the PO is created.

Now, for the questions
1.  I think this requisition approval subprocess is a transaction subprocess because the entire approval chain needs to complete and if it does not complete then it needs to be redone from the beginning.  Is that correct?

2.  If I withdraw during the approval then from the business's point-of-view the approval is undone even if the original approval requests exist but cannot be completed.  The approval process is also not complete.  Thus, I should be modeling the interrupt with an intermediate cancel event on the boundary.  Is that correct?

3.  If I am supposed to use an intermediate cancel event then am I required to have a cancel end event within the process?  The withdrawal of the requisition happens outside of the approval process, so it doesn't seem likely.  To rephrase:  can you have an interrupt on the border of a subprocess if you have no throwing event within the subprocess?

4.  Alternatively I could say that I interrupted the approval subprocess because of a state change:  the requisition is withdrawn.  Should I instead be using a conditional event with a sequence flow back to the activity of creating / editing the requisition?

5.  If the requisition is canceled then it means that the request was in error and no further requisition will be coming for that request.  Would this be considered a hazard and thus use an interrupting error event?  Or do I use a cancel?

6.  If I need to withdraw after the approval is done should I have a compensation event on the subproceses border leading to a "Withdraw Requisition" activity via association or do I simply draw a sequence flow from one of the other events (cancel or conditional) back to the "Create Requisition" activity and label the sequence flow as "Requisition was withdrawn"?

7.  Am I overthinking this?  Are there any good examples or reference books which discuss supply chain processes in BPMN terms, even in part?

Tags: BPMN