You need to sign in to do that
Don't have an account?
rosh
global class SchemeAutoApprovalBatch implements Database.Batchable<sObject> {
global Database.QueryLocator start(Database.BatchableContext bc) {
String status = 'Approval Pending';
String query = 'SELECT Id,Name,VConnect_SchemeStartDate__c,VConnect_SchemeEndDate__c,VConnect_Status__c FROM VConnect_Scheme__c WHERE VConnect_Status__c =:status'; // collect the batches of records or objects to be passed to execute
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext bc, List<VConnect_Scheme__c> records){ // process each batch of records
List<ProcessInstanceWorkitem> workItems = [SELECT Id, ProcessInstanceId, OriginalActorId, ActorId, ElapsedTimeInDays,
ElapsedTimeInHours, ElapsedTimeInMinutes, IsDeleted, CreatedDate, CreatedById,
SystemModstamp FROM ProcessInstanceWorkitem
];
Set<Id> processInsId = new Set<Id>();
if(workItems.size()>0){
for(ProcessInstanceWorkitem workItem : workItems){
processInsId.add(workItem.ProcessInstanceId);
}
if(processInsId.size()>0){
Map<Id,ProcessInstance> map_processIns=new Map<Id,ProcessInstance>(
[SELECT Id, TargetObjectId FROM ProcessInstance where Id IN : processInsId]
);
List<ProcessInstance> pInstance_List = [SELECT Id, TargetObjectId FROM ProcessInstance where Id IN : processInsId];
Set<Id> scheme_Info = new Set<Id>();
for(ProcessInstance instance_Item : pInstance_List){
scheme_Info.add(instance_Item.TargetObjectId);
}
/*Map<Id,User> userActiveInfoMap =new Map<Id,User>([SELECT Id, IsActive, Name, ProfileId, Profile.Name, Userrole.Name FROM User
WHERE IsActive = true ]);*/
//Integer hourTime = Integer.valueOf(Scheme_Auto_Approval__mdt.getInstance('total_time').Time_To_Auto_Approve__c);
Map<Id,VConnect_Scheme__c> totalScheme =new Map<Id,VConnect_Scheme__c>([
SELECT Id,Name,VConnect_SchemeStartDate__c,VConnect_SchemeEndDate__c,VConnect_Status__c FROM VConnect_Scheme__c WHERE Id IN :scheme_Info ]);
//List<ProcessInstanceWorkitem> reasignrequests = new List<ProcessInstanceWorkitem>();
List<Approval.ProcessWorkitemRequest> requests = new List<Approval.ProcessWorkitemRequest>();
for(ProcessInstanceWorkitem workItem : workItems){
Id targetId = map_processIns.get(workItem.ProcessInstanceId).TargetObjectId;
if(totalScheme.containsKey(targetId)){
if(workItem.ElapsedTimeInHours > Scheme_Auto_Approval__mdt.getInstance('total_time').Time_To_Auto_Approve__c){
Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
req2.setWorkitemId(workItem.Id);
req2.setAction('Approve');
req2.setComments('Auto Approved');
requests.add(req2);
}
}
}
System.debug(requests);
Approval.ProcessResult[] processResults = Approval.process(requests);
}
}
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}
please help me with test class??
global class SchemeAutoApprovalBatch implements Database.Batchable<sObject> {
global Database.QueryLocator start(Database.BatchableContext bc) {
String status = 'Approval Pending';
String query = 'SELECT Id,Name,VConnect_SchemeStartDate__c,VConnect_SchemeEndDate__c,VConnect_Status__c FROM VConnect_Scheme__c WHERE VConnect_Status__c =:status'; // collect the batches of records or objects to be passed to execute
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext bc, List<VConnect_Scheme__c> records){ // process each batch of records
List<ProcessInstanceWorkitem> workItems = [SELECT Id, ProcessInstanceId, OriginalActorId, ActorId, ElapsedTimeInDays,
ElapsedTimeInHours, ElapsedTimeInMinutes, IsDeleted, CreatedDate, CreatedById,
SystemModstamp FROM ProcessInstanceWorkitem
];
Set<Id> processInsId = new Set<Id>();
if(workItems.size()>0){
for(ProcessInstanceWorkitem workItem : workItems){
processInsId.add(workItem.ProcessInstanceId);
}
if(processInsId.size()>0){
Map<Id,ProcessInstance> map_processIns=new Map<Id,ProcessInstance>(
[SELECT Id, TargetObjectId FROM ProcessInstance where Id IN : processInsId]
);
List<ProcessInstance> pInstance_List = [SELECT Id, TargetObjectId FROM ProcessInstance where Id IN : processInsId];
Set<Id> scheme_Info = new Set<Id>();
for(ProcessInstance instance_Item : pInstance_List){
scheme_Info.add(instance_Item.TargetObjectId);
}
/*Map<Id,User> userActiveInfoMap =new Map<Id,User>([SELECT Id, IsActive, Name, ProfileId, Profile.Name, Userrole.Name FROM User
WHERE IsActive = true ]);*/
//Integer hourTime = Integer.valueOf(Scheme_Auto_Approval__mdt.getInstance('total_time').Time_To_Auto_Approve__c);
Map<Id,VConnect_Scheme__c> totalScheme =new Map<Id,VConnect_Scheme__c>([
SELECT Id,Name,VConnect_SchemeStartDate__c,VConnect_SchemeEndDate__c,VConnect_Status__c FROM VConnect_Scheme__c WHERE Id IN :scheme_Info ]);
//List<ProcessInstanceWorkitem> reasignrequests = new List<ProcessInstanceWorkitem>();
List<Approval.ProcessWorkitemRequest> requests = new List<Approval.ProcessWorkitemRequest>();
for(ProcessInstanceWorkitem workItem : workItems){
Id targetId = map_processIns.get(workItem.ProcessInstanceId).TargetObjectId;
if(totalScheme.containsKey(targetId)){
if(workItem.ElapsedTimeInHours > Scheme_Auto_Approval__mdt.getInstance('total_time').Time_To_Auto_Approve__c){
Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest();
req2.setWorkitemId(workItem.Id);
req2.setAction('Approve');
req2.setComments('Auto Approved');
requests.add(req2);
}
}
}
System.debug(requests);
Approval.ProcessResult[] processResults = Approval.process(requests);
}
}
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}
Did you try creating a record of VConnect_Scheme__c object with VConnect_Status__c as "Approval Pending" .
you can also submit the record for approval as mentioned in the below link.
https://developer.salesforce.com/docs/atlas.en-us.238.0.apexcode.meta/apexcode/apex_process_example.htm
Call thia batch class from your test class this should cover the code.
Let me know if you face any issues.
If this solution helps, Please mark it as best answer.
Thanks,