/*
|
* Author: Bubba Li
|
* Created Date: 04/22/2022
|
* Purpose: sync agency contact to aws
|
* Test Class: SyncAccountContactToAWS_Test
|
* History:
|
* 04/22/2022 - Bubba Li - Initial Code.
|
*
|
* */
|
global class SyncAccountContactToAWS implements Schedulable,Database.Batchable<SObject>,Database.AllowsCallouts{
|
|
global String query;
|
global String scheduleId{set;get;}
|
global SyncAccountContactToAWS(String query) {
|
this.query = query;
|
}
|
global SyncAccountContactToAWS() {
|
this.query = 'SELECT id,Doctor_Division1__c,Doctor_Division1_Encrypted__c,Name,Name_Encrypted__c,Type__c,Type_Encrypted__c,AWS_Data_Id__c,Contact__c, Contact__r.Doctor_Division1_Encrypted__c,Contact__r.LastName_Encrypted__c, Contact__r.Type_Encrypted__c FROM Agency_Contact__c WHERE AWS_Data_Id__c =\'\' And Contact__c != null order by lastmodifieddate desc';
|
}
|
global SyncAccountContactToAWS(String query,String scId) {
|
if(String.isBlank(query)||String.isEmpty(query)){
|
this.query = 'SELECT id,Doctor_Division1__c,Doctor_Division1_Encrypted__c,Name,Name_Encrypted__c,Type__c,Type_Encrypted__c,AWS_Data_Id__c,Contact__c, Contact__r.Doctor_Division1_Encrypted__c,Contact__r.LastName_Encrypted__c, Contact__r.Type_Encrypted__c FROM Agency_Contact__c WHERE AWS_Data_Id__c =\'\' And Contact__c != null order by lastmodifieddate desc';
|
}else{
|
this.query = query;
|
}
|
system.debug('This query from Batch:'+this.query);
|
this.scheduleId = scId;
|
}
|
global Database.QueryLocator start(Database.BatchableContext bc) {
|
system.debug('Query by custom soql:'+this.query);
|
return Database.getQueryLocator(this.query);
|
}
|
global void execute(Database.BatchableContext BC, list<Agency_Contact__c> scope) {
|
if(scope!=null && scope.size()>0){
|
for(Agency_Contact__c aContact:scope){
|
aContact.Doctor_Division1_Encrypted__c = aContact.Contact__c!=null&&aContact.Contact__r.Doctor_Division1_Encrypted__c!=''?aContact.Contact__r.Doctor_Division1_Encrypted__c:'';
|
aContact.Name_Encrypted__c = aContact.Contact__c!=null&&aContact.Contact__r.LastName_Encrypted__c!=''?aContact.Contact__r.LastName_Encrypted__c:'';
|
aContact.Type_Encrypted__c = aContact.Contact__c!=null&&aContact.Contact__r.Type_Encrypted__c!=''?aContact.Contact__r.Type_Encrypted__c:'';
|
aContact.AWS_Data_Id__c = '';
|
}
|
system.debug('Agency Contact Info to AWS:'+JSON.serialize(scope));
|
AWSServiceTool2.EncryptPushCore(JSON.serialize(scope),'Agency_Contact__c');
|
}
|
}
|
|
global void execute(SchedulableContext SC) {
|
system.debug('this query from schedule execute method:'+this.query);
|
Id execBTId = Database.executeBatch(new SyncAccountContactToAWS(this.query,SC.getTriggerId()), 1);
|
system.debug('Batch Job Id:'+execBTId);
|
}
|
|
public static void assignOnceOneMinuteLater(List<Agency_Contact__c> acList) {
|
system.debug('ACList:'+JSON.serialize(acList));
|
String hour = String.valueOf(Datetime.now().hour());
|
String min = String.valueOf(Datetime.now().minute() + 1);
|
String ss = String.valueOf(Datetime.now().second());
|
//parse to cron expression
|
String nextFireTime = ss + ' ' + min + ' ' + hour + ' * * ?';
|
//Prepare the soql to agency account
|
String soqlForAgencyAccount = '';
|
if(acList!=null && acList.size()>0){
|
soqlForAgencyAccount = 'SELECT id,Doctor_Division1__c,Doctor_Division1_Encrypted__c,Name,Name_Encrypted__c,Type__c,Type_Encrypted__c,AWS_Data_Id__c,Contact__c, Contact__r.Doctor_Division1_Encrypted__c,Contact__r.LastName_Encrypted__c, Contact__r.Type_Encrypted__c FROM Agency_Contact__c WHERE id in ';
|
List<String> acIds = new List<String>();
|
for(Agency_Contact__c ac:acList ){
|
acIds.add(ac.Id);
|
}
|
soqlForAgencyAccount = soqlForAgencyAccount + '(\'' + String.join(acIds, '\', \'') + '\')';
|
}
|
system.debug('SOQL for agency:'+soqlForAgencyAccount);
|
SyncAccountContactToAWS s = new SyncAccountContactToAWS(soqlForAgencyAccount);
|
System.schedule('SyncAccountContactToAWS:' + String.valueOf(Datetime.now()), nextFireTime, s);
|
}
|
|
global void finish(Database.BatchableContext BC) {
|
system.debug('Finish batch job Id:'+BC.getJobId());
|
AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed, TotalJobItems, CreatedBy.Email FROM AsyncApexJob WHERE Id = :BC.getJobId()];
|
//then use the active job id and abort it
|
system.abortJob(a.id);
|
system.debug('Finish schedule job Id:'+scheduleId);
|
if(scheduleId!=null&&scheduleId!=''){
|
system.abortJob(scheduleId);
|
}
|
}
|
}
|