public class NotifyBatch implements Database.Batchable,Database.stateful,Schedulable { public Map> maplist = new Map>(); public void execute(SchedulableContext SC) { NotifyBatch obj = new NotifyBatch() ; Database.executeBatch(obj, 50); } public Database.QueryLocator start(Database.BatchableContext bc) { String strPending = 'Pending'; String SOQL = 'SELECT Id, Status, TargetObjectId, ElapsedTimeInDays, CreatedDate from ProcessInstance where Status =:strPending' ; return Database.getQueryLocator(SOQL); } public void execute(Database.BatchableContext bc, List records){ Set pids = new Set(); for(ProcessInstance pLoop : records) { if(pLoop.CreatedDate < Date.Today() || Test.isRunningTest()) pids.add(pLoop.ID); } if(pids.size() > 0) { List PWI = [Select ProcessInstance.CompletedDate,ProcessInstance.ElapsedTimeInDays,ProcessInstance.ElapsedTimeInHours,ProcessInstance.ElapsedTimeInMinutes,ProcessInstance.LastActorId,ProcessInstance.ProcessDefinitionId, ProcessInstance.Status, ProcessInstance.TargetObjectId, ProcessInstance.ID, ID, ActorId, ElapsedTimeInDays, ElapsedTimeInHours, ElapsedTimeInMinutes, OriginalActor.Id, OriginalActor.Email, OriginalActor.LastName, ProcessInstanceId from ProcessInstanceWorkitem where ProcessInstanceId IN: pids ORDER BY CreatedDate Desc]; for(ProcessInstanceWorkitem op2 : PWI) { if(maplist.ContainsKey(op2.OriginalActor.Email)) { List lst = maplist.get(op2.OriginalActor.Email); lst.add(op2.Id); maplist.put(op2.OriginalActor.Email, lst); } else { maplist.put(op2.OriginalActor.Email, new List{op2.Id}); } System.debug('maplist>>>>>> '+maplist.values()); } } } public void finish(Database.BatchableContext bc){ if(maplist.size() > 0) { List Singleemails = new List(); for(String iloop : maplist.keyset()) { List records = maplist.get(iloop); List URLs = new List(); for(Id rec : records) { URLs.add(URL.getSalesforceBaseUrl().toExternalForm() + '/' + rec + '\r\n'); } Messaging.SingleEmailMessage Singleemail = new Messaging.SingleEmailMessage(); Singleemail.settoAddresses(new List{iloop}); Singleemail.setReplyTo('noreply@salesforce.com'); Singleemail.setSenderDisplayName('SFDC Administrator'); Singleemail.setSaveAsActivity(false); Singleemail.setSubject('Waiting for Approval'); String body = 'Hello' + '
' + '
' + 'The below items are waiting for your Approval. Please Approve'; for(String key : URLs) { body = body + '
' + key; } body = body + '
' + '
' + '
' + 'Thanks.'; Singleemail.setHTMLBody(body); Singleemails.add(Singleemail); } if(Singleemails.Size() > 0) Messaging.sendEmail(Singleemails); } } }