Untitled
unknown
apex
2 years ago
5.8 kB
11
Indexable
global class Posigen_ProjectAttachmentSyncToJobBatch implements Database.Batchable<sObject>, Database.Stateful, Schedulable{
global String vSOQL;
private List<sitetracker__Error_Report__c> listErrorReportIns = new List<sitetracker__Error_Report__c>();
private static Set<String> setJobStatusToAvoid = new Set<String>{'Completed', 'Cancelled'};
global Posigen_ProjectAttachmentSyncToJobBatch(String pSOQL){
if(pSOQL != null){
this.vSOQL = pSOQL;
}else{
this.vSOQL = 'SELECT Id, (SELECT Id FROM sitetracker__Jobs__r WHERE sitetracker__Job_Status__c NOT IN: setJobStatusToAvoid),'+
' (SELECT Id, sitetracker__ContentDocumentRecord__c FROM sitetracker__Attachments1__r WHERE sitetracker__ContentDocumentRecord__c != null)'+
' FROM sitetracker__Project__c'+
' WHERE Id IN (SELECT sitetracker__Project__c'+
' FROM sitetracker__Job__c'+
' WHERE sitetracker__Job_Status__c NOT IN: setJobStatusToAvoid)'+
' AND Id IN (SELECT sitetracker__Proj__c'+
' FROM sitetracker__Attachment__c'+
' WHERE sitetracker__Proj__c != null)';
}
}
/**
* @description Initial SOQL
* @param Database.BatchableContext pBatchContext
*/
global Database.QueryLocator start(Database.BatchableContext pBatchContext){
return Database.getQueryLocator(this.vSOQL);
}
/**
* @description Executes the necessary actions.
* @param Database.BatchableContext pBatchContext
* @param List<SObject> pScope
*/
global void execute(Database.BatchableContext pBatchContext, List<SObject> pScope){
if(pScope != null && !pScope.isEmpty()){
Set<Id> setContDocId = new Set<Id>();
Set<Id> setJobId = new Set<Id>();
for(sitetracker__Project__c forProj: (List<sitetracker__Project__c>) pScope){
// Filter the ContentDocumentIds
if(!forProj.sitetracker__Attachments1__r.isEmpty()){
for(sitetracker__Attachment__c forAttach: forProj.sitetracker__Attachments1__r){
setContDocId.add(forAttach.sitetracker__ContentDocumentRecord__c);
}
}
// Filter the Job Ids
if(!forProj.sitetracker__Jobs__r.isEmpty()){
for(sitetracker__Job__c forJob: forProj.sitetracker__Jobs__r){
setJobId.add(forJob.Id);
}
}
}
if(!setContDocId.isEmpty() && !setJobId.isEmpty()){
// Query the Jobs to get the related ContentDocumentLink
List<sitetracker__Job__c> listJobs = [
SELECT Id, (SELECT ContentDocumentId FROM ContentDocumentLinks)
FROM sitetracker__Job__c
WHERE Id IN: setJobId
];
for(sitetracker__Job__c forJob: listJobs){
// Remove the ContentDocumentId from the set where the file is already shared
if(!forJob.ContentDocumentLinks.isEmpty()){
for(ContentDocumentLink forCDL: forJob.ContentDocumentLinks){
if(setContDocId.contains(forCDL.ContentDocumentId)){
setContDocId.remove(forCDL.ContentDocumentId);
}
}
}
}
// If is not empty, meaning that there are still files to link
if(!setContDocId.isEmpty()){
List<ContentDocumentLink> listCDLIns = new List<ContentDocumentLink>();
// Create the link with the Job
for(sitetracker__Job__c forJob: listJobs){
for(Id forContDocId: setContDocId){
ContentDocumentLink link = new ContentDocumentLink(
LinkedEntityId = forJob.Id,
ContentDocumentId = forContDocId,
ShareType = 'I'
);
listCDLIns.add(link);
}
}
if(!listCDLIns.isEmpty()){
List<Object> listCDLResult = Database.insert(listCDLIns);
// Insert Error Reports
sitetracker__Error_Report__c errorReport = Posigen_Utils.getErrorReportFromResult(
listCDLResult,
Posigen_ProjectAttachmentSyncToJobBatch.class.getName(),
UserInfo.getUserId(),
'Failed to link the File from Project to Job: '
);
if (errorReport != null) {
this.listErrorReportIns.add(errorReport);
}
}
}
}
}
}
/**
* @description Executes the necessary actions after all actions (final action).
* @param Database.BatchableContext pBatchContext
*/
global void finish(Database.BatchableContext pBatchContext){
if(!this.listErrorReportIns.isEmpty()){
insert this.listErrorReportIns;
}
}
/**
* @description Default execute method.
* @param SchedulableContext pContext
*/
global void execute(SchedulableContext pContext){
Database.executeBatch(new Posigen_ProjectAttachmentSyncToJobBatch(null), 10);
}
}Editor is loading...