function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
SamCousinsSamCousins 

Creating a new approval process step dynamically

Hi all,

I have the following code
 
public static void submitSplitApprovalStepOne(Id recordId, String firstApprover){

  		approval.ProcessSubmitRequest step1 = new Approval.ProcessSubmitRequest();
		
        step1.setComments('The approver passed is: ' + firstApprover);
        
        step1.setObjectId(recordId); 
        
        step1.setNextApproverIds(new Id[] {firstApprover});
        
        approval.ProcessResult result = Approval.process(step1);

    }


When this method is called and passed a record for an object with a pre redfined approval process activated on it, it successfully creates a step and submits it to the first Approver ID.

How can I extend this code so that I can add another step and set the approver via apex? I know I'll probably have to query the ProcessInstance table to track my job, but I'm not sure how to add a step with an approver via code.

sailee handesailee hande
trigger AutomateApprove on ObjectName(After insert, After update)
{

    for (Integer i = 0; i < Trigger.new.size(); i++)
    {
     try
     {
        if( Trigger.isInsert || (Trigger.new[i].Next_Step__c == 'Submit' && Trigger.old[i].Next_Step__c != 'Submit'))
        {
           submitForApproval(Trigger.new[i]);
        }
        else if(Trigger.isInsert || (Trigger.new[i].Next_Step__c == 'Approve' && Trigger.old[i].Next_Step__c != 'Approve'))
        {
             approveRecord(Trigger.new[i]);
        }
        else if(Trigger.isInsert || (Trigger.new[i].Next_Step__c == 'Reject' && Trigger.old[i].Next_Step__c != 'Reject'))
        {
             rejectRecord(Trigger.new[i]);
        }
     }catch(Exception e)
     {
         Trigger.new[i].addError(e.getMessage());
     }
    }

    public void submitForApproval(ObjectName opp)
    {
        // Create an approval request
        Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest();
        req1.setComments('Submitting request');
        req1.setObjectId(opp.id); 

        req1.setNextApproverIds(new Id[] {opp.Next_Approver__c});

        // Submit the approval request 
        Approval.ProcessResult result = Approval.process(req1);
    }

	/**
	* Get ProcessInstanceWorkItemId using SOQL
	**/
    public Id getWorkItemId(Id targetObjectId)
    {
        Id retVal = null;

        for(ProcessInstanceWorkitem workItem  : [Select p.Id from ProcessInstanceWorkitem p
            where p.ProcessInstance.TargetObjectId =: targetObjectId])
        {
            retVal  =  workItem.Id;
        }

        return retVal;
    }

   
    public void approveRecord(ObjectName opp)
    {
        Approval.ProcessWorkitemRequest req = new Approval.ProcessWorkitemRequest();
        req.setComments('Approving request');
        req.setAction('Approve');
        req.setNextApproverIds(new Id[] {opp.Next_Approver__c});
        Id workItemId = getWorkItemId(opp.id); 

        if(workItemId == null)
        {
            opp.addError('Error');
        }
        else
        {
            req.setWorkitemId(workItemId);
            // Submit the request for approval
            Approval.ProcessResult result =  Approval.process(req);
        }
    }

    
    public void rejectRecord(ObjectName  opp)
    {
        Approval.ProcessWorkitemRequest req = new Approval.ProcessWorkitemRequest();
        req.setComments('Rejected request');
        req.setAction('Reject');
        Id workItemId = getWorkItemId(opp.id);   

        if(workItemId == null)
        {
            opp.addError('Error');
        }
        else
        {
            req.setWorkitemId(workItemId);
            // Submit the request for approval
            Approval.ProcessResult result =  Approval.process(req);
        }
    }
}

You can try this one.If it works then please let me know.

Thanks,
Sailee.
SamCousinsSamCousins
Sailee, thanks for your answer. I can't see any way to add a step to an existing process?

Can you highlight the parts that allow this?

Kind Regards, 

Sam Cousins
Ishwar ShindeIshwar Shinde
Hi Sam,

If I understood it correctly, you need to dyanamically provide the appover Ids for the approval process. 
For this you can ceate custom user lookup fields on object and use them in approval process. While creating a record populate these fields with user Id. It will auto assign user as approver.

Thanks,
Ishwar