/* * 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,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) { 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'; 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 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) { Id execBTId = Database.executeBatch(new SyncAccountContactToAWS('',SC.getTriggerId()), 1); system.debug('Batch Job Id:'+execBTId); } public static void assignOnceOneMinuteLater() { 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 + ' * * ?'; SyncAccountContactToAWS s = new SyncAccountContactToAWS(); 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); } } }