Teach Me Salesforce

A community approach to learning salesforce.com

Apex Trigger and an Asprin can give you a dynamic approval process

with 3 comments

This post is crossed posted on my blog.

Ever come across the need of a large approval process where you do not know who the approver of the next stage will be? We all do don’t we?

In a recent project requirement, I had to work on a big approval process. My basic requirement was:

1. One approval process for child object
2. Once child is approved, it should trigger the master object approval process

Both the approval process had around 5 steps and the approvers where determined by the role hierarchy and the region of the submitter.

Yikes isn’t it?

Pre-requisites:
For this recipe, you need
1. Basic knowledge of APEX and trigger
2. Basic knowledge of Approval process
3. Aspirin (just in case you miss a step and go reverse engineering on it, its scary!!!)

Part I: The Child Object Dynamic Approval process.

Steps for Child Object Dynamic Process
1. Create two fields on the child object. These fields should not be shown on Page Layout.
i) Approval_step__c: Text field to determine which step the approval is.
ii) Next_approval__c: A user field to store the approver. (In case there are multiple approvers or parallel approver, create multiple fields)

2. Create the approval process.
i) Initial submission action will be field update: Approval_step__c=’Submitted for approval’
ii) In approver step, select related user and add the Next_approval__c
iii) In the approval Step Action, field update for Approval_step__c with the next step of Approval, e.g., ‘Regional Manager’ or maybe ‘Higher Manager’. Keep a  note of these keywords. (If the approval process is directly tied to the role hierarchy it is advisable to Update the field with next Role in approval, that way you can avoid confusion)
iv) Repeat the ii) and iii) till you finish all the approval steps.

3. Write a before update trigger on child object
i) Check if Trigger.old.Approval_step__c != Trigger.new.Approval_step__c (this is a pseudo code, you will have to iterate through trigger.new and old and compare all values, if you do not know how to do this, add a comment below)
ii) Now based on the value in Approval_step__c fetch the respective user from Role Hierarchy or anywhere else. Better option would be to use custom settings for this. Add this user in Next_approval__c
iii) Repeat step ii) till you finish all the approval steps. The final approval step would be to either empty the  Next_approval__c field or set it back to manager of the user.


4. Optional step If you need to trigger another approval process after this.
i) In the approval process, set the final approval action to ‘Approved’
ii) In the trigger if the field value is ‘Approved’ then submit the Master in Approval process using Apex Code. (There are many links which give you direct code, I might share the code later, but it has to be done in code if you want continuous approval process)

That’s it. It is easily understood that you need to repeat the whole process for master if it needs dynamic approval.
After you done everything, take a deep breath and test your code. If it doesn’t the way it should, take an aspirin and debug. Since this uses hand-shake between trigger and approval steps make sure you don’t miss out on any step.

Note: As this approval process updates back-end, the visual process manager won’t be able to visualize it.

Try it and hope you don’t need a aspirin.

P.s. This is my first post on this blog, do share your thoughts.

Written by Siddhesh Kabe

May 25, 2011 at 1:46 pm

3 Responses

Subscribe to comments with RSS.

  1. I’d have to check with you here. Which is not something I ordinarily do! I enjoy reading a post that will make people think. Also, thanks for allowing me to comment!

    Nichol Gaige

    May 26, 2011 at 1:06 pm

  2. thanks

    please post more.. 🙂

    udi

    May 28, 2011 at 6:09 am

  3. Hi,
    I would really appreciate your help if you can do. here is my scenario

    I have Opportunity as master-details relationship with one custom object A which is again Master with another object B and I want to submit Object A as approval for a queue. As object A in Mater details relationship with object B we can’t create a queue on this because salesforce doesn’t allow. so can you tell me what alternative we can have for this issue. one idea which i have in mind is to use delegate approvers settings because delegate approver is Lookup(User,Group) on user object but at the same time it doesn’t show group in lookup when i edit user.

    himanshu

    October 21, 2011 at 2:23 am


Leave a comment