/** * @description : Use for Generic Method * @author : Satyam Mishra * @group : * @last modified on : 21-jan- 2025 * @last modified by : Satyam Mishra **/ public with sharing class SyncBatchUtility { public static String fetchAllDataWithLinkForNextPage(String shopifyUrlWithId, List configurationList){ String USER_NAME = configurationList[0].HIC_ShopifySync__API_Key__c; String PASSWORD = configurationList[0].HIC_ShopifySync__Private_Key_Password__c; String shopifyUrl = configurationList[0].HIC_ShopifySync__Shopify_URL__c; String store = configurationList[0].Name; new HIC_ShopifyUtility(configurationList); Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue = shopifyUrl + '/admin/'+shopifyUrlWithId; req.setEndpoint(endPointValue); req.setClientCertificateName('Shopify'); req.setHeader('X-Shopify-Access-Token', PASSWORD); req.setHeader('content-type', 'application/json'); req.setMethod('GET'); req.setTimeout(120000); try { HttpResponse res ; res = h.send(req); responseBody = res.getBody(); if(res.getStatusCode() == 200){ WrapperforBatchResponse rs = new WrapperforBatchResponse(); rs.response = responseBody; if(String.isNotBlank(res.getHeader('link'))){ rs.link = getPageInfo(res.getHeader('link')); }else{ rs.link = null; } return JSON.serialize(rs); } }catch(Exception e){ return null; } return null; } public static string getPageInfo(String fulllink){ String finalLink = null; list listofrels = fulllink.split(','); if(!listofrels.isEmpty() && listofrels.size() == 2){ list listofLinkandRel = listofrels[1].split(';'); if(!listofLinkandRel.isEmpty() && listofLinkandRel[1].trim().equalsIgnoreCase('rel="next"')){ finalLink = listofLinkandRel[0].remove('<').remove('>').trim().split('page_info=')[1]; }else if(!listofLinkandRel.isEmpty()){ listofLinkandRel = listofrels[0].split(';'); if(listofLinkandRel[1].trim().equalsIgnoreCase('rel="next"')){ finalLink = listofLinkandRel[0].remove('<').remove('>').trim().split('page_info=')[1]; } } }else if(!listofrels.isEmpty() && listofrels.size() == 1){ list listofLinkandRel = listofrels[0].split(';'); if(!listofLinkandRel.isEmpty() && listofLinkandRel[1].trim().equalsIgnoreCase('rel="next"')){ finalLink = listofLinkandRel[0].remove('<').remove('>').trim().split('page_info=')[1]; } } return finalLink; } public class WrapperforBatchResponse{ public String response; public String link; } public static void updateErrorMassage( List updateResult, String objectName, List objectList, Schema.SobjectField externalIdField, boolean IsWebhook, String store){ String isbatch = 'F'; if(Iswebhook){ isbatch = 'T'; } list listofErrormailfield = new List(); String ErrorfieldMappingquery = 'select ' +CheckAccessibility.isAccessible('name,HIC_ShopifySync__Shopify_Field__c','HIC_ShopifySync__Error_Mapping__c') +' from HIC_ShopifySync__Error_Mapping__c where '+ CheckAccessibility.isAccessible('name','HIC_ShopifySync__Error_Mapping__c') + ' = \''+ objectName +'\' limit 1'; ErrorfieldMappingquery =String.escapeSingleQuotes(ErrorfieldMappingquery).remove('\\'); listofErrormailfield = Database.query(ErrorfieldMappingquery); // Schema.SObjectType ObjectType = Schema.getGlobalDescribe().get(objectName); Schema.SObjectType ObjectType = ((SObject)Type.forName(objectName).newInstance()).getSObjectType(); Map fieldMap = ObjectType.getDescribe().fields.getmap(); Schema.SobjectField theField = null; //use for add in shopify External Id to make it unique if(!listofErrormailfield.isEmpty()){ theField = fieldMap.get(String.ValueOf(listofErrormailfield[0].HIC_ShopifySync__Shopify_Field__c)); } list listoferrors = new list(); //List of errors message list listofsuccesslog = new list(); //List of Shopify logs for(Integer index = 0 ; index < updateResult.size() ; index ++){ //If record successfully upsert if( !updateResult[index].isSuccess() ){ if(Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isAccessible() && (Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isCreateable()||Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isUpdateable()) ){ // Error Message Object HIC_ShopifySync__Error_Message__c errorobj = new HIC_ShopifySync__Error_Message__c(); errorobj.HIC_ShopifySync__Store__c = store; if(CheckAccessibility.isUpdateable('name','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ errorobj.name = objectName; } //Object Contact then modified Shopify's External ID if(theField != null ){ if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Important_Field__c','HIC_ShopifySync__Error_Message__c')) errorobj.HIC_ShopifySync__Important_Field__c = String.valueOf(objectList[index].get(theField)); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__shopify_id__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__shopify_id__c = string.valueof(objectList[index].get(externalIdField)+isbatch); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__error_id__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__error_id__c = string.valueof(objectName+objectList[index].get(externalIdField)+isbatch); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__delivered__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()) { errorobj.HIC_ShopifySync__delivered__c = false; } //Get Error message string errorMsg = ''; for(Database.Error error : updateResult[index].getErrors()){ if(error.getFields() != null && !error.getFields().isEmpty()){ errorMsg += String.join(error.getFields(), ' ') + ' | ' + error.getMessage() + ','; }else{ errorMsg += error.getMessage() + ','; } } // sObjectType schemaType = Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c') ; sObjectType schemaType = ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType(); Map fieldsMap = schemaType.getDescribe().fields.getMap(); if(CheckAccessibility.isUpdateable('HIC_ShopifySync__message__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__message__c = errorMsg.removeEnd(','); } errorobj.HIC_ShopifySync__Iswebhook__c = Iswebhook; if(!errorobj.HIC_ShopifySync__message__c.containsIgnoreCase('duplicate value found: HIC_ShopifySync__Shopify_Id__c duplicates value on record with id') && !errorobj.HIC_ShopifySync__message__c.containsIgnoreCase('unable to obtain exclusive access to this record')){ listoferrors.add(errorobj); } } }else{ HIC_ShopifySync__Shopify_Log__c SuccessLog = new HIC_ShopifySync__Shopify_Log__c(); SuccessLog.HIC_ShopifySync__Store__c = store; SuccessLog.HIC_ShopifySync__Is_Webhook__c = Iswebhook ; SuccessLog.name = Objectname; //Update Shopify's external Id before upsert Shopify logs if(CheckAccessibility.isUpdateable('HIC_ShopifySync__shopify_id__c,HIC_ShopifySync__Error_id__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ SuccessLog.HIC_ShopifySync__Error_id__c = string.valueof(objectList[index].get(externalIdField)+isbatch+Objectname); SuccessLog.HIC_ShopifySync__shopify_id__c = string.valueof(objectList[index].get(externalIdField)); } listofsuccesslog.add(SuccessLog); } } //Upsert Error Messagge records if(!listoferrors.isEmpty()){ if(Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isAccessible() && Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isCreateable()){ Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c'); Map fieldMap1 = objectType1.getDescribe().fields.getMap(); Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Error_id__c'); if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Error_id__c','HIC_ShopifySync__Error_Message__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ database.upsert(listoferrors, theField1); } } } //Upsert Success logs records if(!listofsuccesslog.isEmpty()){ if(Schema.sObjectType.HIC_ShopifySync__Shopify_Log__c.isAccessible() && Schema.sObjectType.HIC_ShopifySync__Shopify_Log__c.isCreateable()){ Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('HIC_ShopifySync__Shopify_Log__c'); Map fieldMap1 = objectType1.getDescribe().fields.getMap(); Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Error_id__c'); if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Error_id__c','HIC_ShopifySync__Shopify_Log__c') && ((SObject)Type.forName('HIC_ShopifySync__Error_Message__c').newInstance()).getSObjectType().getDescribe().isCreateable()){ database.upsert(listofsuccesslog, theField1,False, AccessLevel.USER_MODE); } } } } public static void fetchCustomer(String store, String updated_at_min, String updated_at_max ,List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'customers' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, updated_at_min , updated_at_max, 'customers',listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void fetchOrderAndOpportunity(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c,HIC_ShopifySync__Batch_Size__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'orders' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'orders' ,listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void processSmartCollections(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'collections' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'collections',listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void processCustomCollections(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'collections' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'collections' ,listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void processCollect(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'collections' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'collections', listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void fetchLocationsAndInventoryLevels(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'locations' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'locations', listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch,integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } public static void fetchDraftorders(String store, String updated_at_min, String updated_at_max, List listOfConfiguration){ List listOfRelatedObjects = [ SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c, (SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200), (SELECT Id, HIC_ShopifySync__Default__c, HIC_ShopifySync__Key__c, HIC_ShopifySync__Value_Of__c FROM HIC_ShopifySync__Data_Mappings__r LIMIT 200) FROM HIC_ShopifySync__Object_Mapping__c WHERE HIC_ShopifySync__Resource__c = 'draft_orders' AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ]; SyncShopifyBatch doInBatch = new SyncShopifyBatch('', false,store, '' , '', 'draft_orders' ,listOfRelatedObjects ); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch,integer.valueOf(listOfRelatedObjects[0].HIC_ShopifySync__Batch_Size__c)); }else{ Database.executeBatch(doInBatch); } } }