/** * ─────────────────────────────────────────────────────────────────────────────────────────────────┐ * This class is use for Shopify utility * Shopify API Documentation: https://shopify.dev/docs/admin-api/rest/reference * Create Shopify Store: https://www.shopify.com/signup?itcat=identity&itterm=create-new-store * Shopify API Release 2020: https://www.shopify.in/partners/blog/shopify-api-release-january-2020 * What is Person Account in Salesforce ? https://help.salesforce.com/articleView?id=account_person.htm&type=5 * ────────────────────────────────────────────────────────────────────────────────────────────────── * @author Sumit * ────────────────────────────────────────────────────────────────────────────────────────────────── */ public with sharing class HIC_ShopifyUtility { public static integer i = 0; public static String USER_NAME ; // Shopify's API Key public static String PASSWORD ; // Shopify's Password public static String shopifyUrl ; // Shopify's Store URL public static String store; //Shopify's Store Name /**************************************HIC_ShopifyUtility*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Class Constructor to set Shopify Details * Get Shopify Store credentials from custom Object configurationList (HIC_ShopifySync__HIC_Configuration__c) * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public HIC_ShopifyUtility(List configurationList){ USER_NAME = configurationList[0].HIC_ShopifySync__API_Key__c; PASSWORD = configurationList[0].HIC_ShopifySync__Private_Key_Password__c; shopifyUrl = configurationList[0].HIC_ShopifySync__Shopify_URL__c; store = configurationList[0].Name; } //Wrapper class for field Mapping public class FieldWrapper{ @AuraEnabled public String filedlabel{get;set;} @AuraEnabled public String filedApiName{get;set;} @AuraEnabled public String dataType{get;set;} } //Wrapper class for tracking Batch process public class WrapperforBatchResponse{ public String response; public String link; } /************************************** Batch Process start *************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Collecting all Shopify Store data and upsert into the Salesfroce. * fetchProducts - BatchToCreateProducts * fetchCustomer - FetchAccounts * fetchOrderAndOpportunity - FetchOrders * processCollections - FetchSmartCollection_Batch * fetchLocations - FetchLocations_Batch * fetchDraftOrders - FetchOrders * ────────────────────────────────────────────────────────────────────────────────────────────── */ //Product2 public static void fetchProducts(List configurationList,String store){ new HIC_ShopifyUtility(configurationList); BatchToCreateProducts doInBatch = new BatchToCreateProducts('',false,store); if(!Test.isRunningTest()){ Database.executeBatch(doInBatch, 1); } } //Accounts and Contact / Person Account public static void fetchCustomer(List configurationList, String store){ new HIC_ShopifyUtility(configurationList); FetchAccounts getAcc = new FetchAccounts('',false,store); if(!Test.isRunningTest()){ Database.executeBatch(getAcc, 1); }else{ Database.executeBatch(getAcc); } } //Accounts and Contact / Person Account public static void fetchCustomer(List configurationList, String store, String updated_at_min, String updated_at_max){ new HIC_ShopifyUtility(configurationList); FetchAccounts getAcc = new FetchAccounts('',false,store,updated_at_min,updated_at_max); if(!Test.isRunningTest()){ Database.executeBatch(getAcc, 1); }else{ Database.executeBatch(getAcc); } } // Order & Order LineItem / Opportunity & Opportunity LineItem public static void fetchOrderAndOpportunity(List configurationList, String store){ new HIC_ShopifyUtility(configurationList); FetchOrders forOrders = new FetchOrders('',false, true, configurationList, store); Database.executeBatch(forOrders, 1); } // Order & Order LineItem / Opportunity & Opportunity LineItem public static void fetchOrderAndOpportunity(List configurationList, String store, String updated_at_min, String updated_at_max){ new HIC_ShopifyUtility(configurationList); FetchOrders forOrders = new FetchOrders('',false, true, configurationList, store, updated_at_min, updated_at_max); Database.executeBatch(forOrders, 1); } //Smart and Custom Collection and Collects public static void processCollections(List configurationList,String Store){ new HIC_ShopifyUtility(configurationList); Integer noOfPages = getNoOfRecordsFromShopify('smart_collections', configurationList); Database.executeBatch(new FetchSmartCollection_Batch('',store),1); } //Smart and Custom Collection and Collects public static void processCollections(List configurationList,String Store, String updated_at_min, String updated_at_max){ new HIC_ShopifyUtility(configurationList); Integer noOfPages = getNoOfRecordsFromShopify('smart_collections', configurationList); Database.executeBatch(new FetchSmartCollection_Batch('',store, updated_at_min, updated_at_max),1); } //Location / Inventory Item / Inventory Level public static void fetchLocations(List configurationList,String store){ new HIC_ShopifyUtility(configurationList); Integer noOfPages = hic_shopifyUtility.getNoOfRecordsFromShopify('locations', configurationList); FetchLocations_Batch callBatch = new FetchLocations_Batch(noOfPages,store); if(!Test.isRunningTest()){ Database.executeBatch(callBatch, 1); } } //Location / Inventory Item / Inventory Level public static void fetchLocations(List configurationList,String store, String updated_at_min, String updated_at_max){ new HIC_ShopifyUtility(configurationList); //Integer noOfPages = hic_shopifyUtility.getNoOfRecordsFromShopify('locations', configurationList); FetchLocations_Batch callBatch = new FetchLocations_Batch('',store, updated_at_min, updated_at_max); if(!Test.isRunningTest()){ Database.executeBatch(callBatch, 1); } } //Draft Order As Salesforce Order with diffrente recordtype public static void fetchDraftOrders(List configurationList, String store){ new HIC_ShopifyUtility(configurationList); FetchOrders forDraftOrders = new FetchOrders('',false, false, configurationList,store); Database.executeBatch(forDraftOrders, 1); } //Draft Order As Salesforce Order with diffrente recordtype public static void fetchDraftOrders(List configurationList, String store, String updated_at_min, String updated_at_max){ new HIC_ShopifyUtility(configurationList); FetchOrders forDraftOrders = new FetchOrders('',false, false, configurationList,store, updated_at_min, updated_at_max); Database.executeBatch(forDraftOrders, 1); } /************************************** Batch Process End *************************************************/ /**************************************fetchAllDataWithLinkForNextPage*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Get next page records links - Used for Pagination with Shopify records * more details: https://shopify.dev/tutorials/make-paginated-requests-to-rest-admin-api * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map ShopifyidvsAccountid - Map of Shopify's External Id Vs Accout's Shopify's ID * @param String ObjectName - Shopify Entity's Name * @param Boolean isPersonAccount - Identify records its person account or not * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static String fetchAllDataWithLinkForNextPage(String shopifyUrlWithId, List configurationList){ 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'); /*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD); String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue); req.setHeader('Authorization', authorizationHeader);*/ 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; } /**************************************deleteSmartCollectionRules*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Deleting old collections rules when update collections or its rules * ────────────────────────────────────────────────────────────────────────────────────────────── * @param set CollectionID - Set of Collection Shopify External ID * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void deleteSmartCollectionRules(set CollectionID){ list listOfRules = new list(); listOfRules = [select id from HIC_ShopifySync__Rules__c where HIC_ShopifySync__Collection__r.HIC_ShopifySync__Shopify_Id__c IN : CollectionID ]; if(!listOfRules.isEmpty() && listOfRules != null && Schema.getGlobalDescribe().get('HIC_ShopifySync__Rules__c').getDescribe().isDeletable()){ delete listOfRules ; } } /**************************************insertSmartCollectionRules*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for usert Smart Collection rules whenwever its update or insert in Shopify * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map CollectionIdVsRulesResponse - Map of Collection Shopify External ID Vs Rule JSON Response * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void insertSmartCollectionRules(Map CollectionIdVsRulesResponse){ list listOfRules = new list(); String sObjectName = 'HIC_ShopifySync__Collection__c'.trim(); sObjectType schemaType = Schema.getGlobalDescribe().get(sObjectName) ; Map fieldsMap = schemaType.getDescribe().fields.getMap(); for(String CollectionID : CollectionIdVsRulesResponse.keySet()){ list allRules = (list) JSON.deserializeUntyped(CollectionIdVsRulesResponse.get(CollectionID)); for(Object rule : allRules){ map ruleMap = (map) rule; if(!ruleMap.isEmpty() && ruleMap.containsKey('condition') && ruleMap.containsKey('relation') && ruleMap.containsKey('column') && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Relation__c.isUpdateable() && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Relation__c.isCreateable() && CheckAccessibility.isUpdateable('HIC_ShopifySync__Relation__c','HIC_ShopifySync__Rules__c' ) && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Condition__c.isUpdateable() && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Condition__c.isCreateable() && CheckAccessibility.isUpdateable('HIC_ShopifySync__Condition__c','HIC_ShopifySync__Rules__c' ) && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Column__c.isUpdateable() && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Column__c.isCreateable() && CheckAccessibility.isUpdateable('HIC_ShopifySync__Column__c','HIC_ShopifySync__Rules__c' ) && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Collection__c.isUpdateable() && Schema.sObjectType.HIC_ShopifySync__Rules__c.fields.HIC_ShopifySync__Collection__c.isCreateable() && CheckAccessibility.isUpdateable('HIC_ShopifySync__Collection__c','HIC_ShopifySync__Rules__c' ) ){ HIC_ShopifySync__Rules__c RuleObj = new HIC_ShopifySync__Rules__c(); if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Shopify_Id__c',fieldsMap)){ HIC_ShopifySync__Collection__c collection = new HIC_ShopifySync__Collection__c(); collection.HIC_ShopifySync__Shopify_Id__c = CollectionID; RuleObj.HIC_ShopifySync__Collection__r = collection; } RuleObj.HIC_ShopifySync__Column__c = String.valueOf(ruleMap.get('column')); RuleObj.HIC_ShopifySync__Condition__c = String.valueOf(ruleMap.get('condition')); RuleObj.HIC_ShopifySync__Relation__c = String.valueOf(ruleMap.get('relation')); listOfRules.add(RuleObj); } } } if(!listOfRules.isEmpty() && listOfRules != null){ if(Schema.getGlobalDescribe().get('HIC_ShopifySync__Rules__c').getDescribe().isCreateable() && Schema.getGlobalDescribe().get('HIC_ShopifySync__Rules__c').getDescribe().isUpdateable()) Insert listOfRules; } } /**************************************getPageInfo*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for split the next page details for Shopify Pagination * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map fulllink - Complete URL for next page records details (Pagination) * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static string getPageInfo(String fulllink){ String finalLink = null; System.debug('fulllink--'+fulllink); 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; } /**************************************getPageInfo*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for get Shopify's fields which includes in collout response(JSON) * * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map ObjectName - Pass the Shopify Entity's name (Object name) * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static string getShopifyFields(String ObjectName){ List shopifyAccountFieldSet = new List(); List shopifyAccountFieldSet2 = new List(); String FieldsToQueryforShopifyFields = 'Name,HIC_ShopifySync__GQL_Field_API__c,HIC_ShopifySync__UI_Label_Name__c,HIC_ShopifySync__Field_Name__c,HIC_ShopifySync__Data_Type__c,HIC_ShopifySync__Nested__c'; shopifyAccountFieldSet = database.query( 'select '+Checkaccessibility.isAccessible(FieldsToQueryforShopifyFields,'HIC_ShopifySync__Shopify_Fields__c')+' from HIC_ShopifySync__Shopify_Fields__c where '+Checkaccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__Shopify_Fields__c')+' = \'' +ObjectName+ '\' and '+Checkaccessibility.isAccessible('HIC_ShopifySync__Data_Type__c','HIC_ShopifySync__Shopify_Fields__c')+' != \'Reference\' LIMIT 49999'); for(HIC_ShopifySync__Shopify_Fields__c fm : shopifyAccountFieldSet){ system.debug('fm'+fm); if(fm.HIC_ShopifySync__Nested__c != null){ if(fm.HIC_ShopifySync__Field_Name__c.contains(',')){ string temp = ''; for(string sf : fm.HIC_ShopifySync__Field_Name__c.split(',')){ if(temp == ''){ temp += fm.HIC_ShopifySync__Nested__c+'.'+sf; }else{ temp += ','+fm.HIC_ShopifySync__Nested__c+'.'+sf; } } fm.HIC_ShopifySync__UI_Label_Name__c = temp;//+' ('+fm.HIC_ShopifySync__Data_Type__c+')'; shopifyAccountFieldSet2.add(fm); }else{ fm.HIC_ShopifySync__UI_Label_Name__c = fm.HIC_ShopifySync__Nested__c+'.'+fm.HIC_ShopifySync__Field_Name__c;//;+' ('+fm.HIC_ShopifySync__Data_Type__c+')'; shopifyAccountFieldSet2.add(fm); } }else{ fm.HIC_ShopifySync__UI_Label_Name__c = fm.HIC_ShopifySync__Field_Name__c;//+' ('+fm.HIC_ShopifySync__Data_Type__c+')'; shopifyAccountFieldSet2.add(fm); } } if(shopifyAccountFieldSet2 != null && !shopifyAccountFieldSet2.isEmpty() ){ return JSON.serialize( shopifyAccountFieldSet2 ); }else{ return 'Null'; } } /**************************************getDefaultFieldMapping*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Get Default fieldmapping from the Configuration Object * ────────────────────────────────────────────────────────────────────────────────────────────── * @param String ObjecetName * @param String isPersonAccount * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ //Deprecated public static string getDefaultFieldMapping(String ObjecetName, boolean isPersonAccount){ List fm = new List(); List listofupdatedAccountFieldMapping = new List(); if(isPersonAccount ){ fm = [select id,HIC_ShopifySync__GQL_Field_API__c,name,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__Field_Mapping__c where (HIC_ShopifySync__Object_Name__c =: ObjecetName or HIC_ShopifySync__Object_Name__c = 'PersonAccount' ) and HIC_ShopifySync__SF_Field__c != 'name' and HIC_ShopifySync__SF_Field__c != 'Account-RecordTypeId' and HIC_ShopifySync__SF_Field__c != 'PersonAccount-company' and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; }else{ fm = [select id,HIC_ShopifySync__GQL_Field_API__c,name,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__Field_Mapping__c where HIC_ShopifySync__Object_Name__c =: ObjecetName and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; } Schema.DescribeSObjectResult d = Schema.SObjectType.Account; Map rtMapById = d.getRecordTypeInfosById(); for(HIC_ShopifySync__Field_Mapping__c fmm : fm){ /*if(fmm.HIC_ShopifySync__SF_Field__c != null && fmm.HIC_ShopifySync__SF_Field__c != '' && fmm.HIC_ShopifySync__SF_Field__c == 'RecordTypeId'){ fmm.HIC_ShopifySync__SF_Field__c = 'Record Type Name'; Schema.RecordTypeInfo rtById = rtMapById.get(fmm.HIC_ShopifySync__Shopify_Fields__c); if(rtById != null){ fmm.HIC_ShopifySync__Shopify_Fields__c = rtById.getName() ; }else{ fmm.HIC_ShopifySync__Shopify_Fields__c = ''; } } if(fmm.HIC_ShopifySync__SF_Field__c != null && fmm.HIC_ShopifySync__SF_Field__c != '' ){ if(ObjecetName.equalsIgnoreCase('DraftOrder')){ ObjecetName = 'order'; } if(ObjecetName.equalsIgnoreCase('DraftOrderItem')){ ObjecetName = 'OrderItem'; } if(AddDeleteCOntroller.CheckingFieldExisting((fmm.HIC_ShopifySync__SF_Field__c).toLowerCase().trim(),ObjecetName.toLowerCase())){ listofupdatedAccountFieldMapping.add(fmm); } }*/ } if(listofupdatedAccountFieldMapping != null && !listofupdatedAccountFieldMapping.isEmpty()){ return JSON.serialize(listofupdatedAccountFieldMapping); } else{ return 'Null'; } } public static string getDefaultFieldMapping(String ObjecetName, boolean isPersonAccount, String store){ List fm = new List(); List listofupdatedAccountFieldMapping = new List(); if(isPersonAccount ){ fm = [select id,name,HIC_ShopifySync__GQL_Field_API__c,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__HIC_Field_Mapping__c where (HIC_ShopifySync__Object_Name__c =: ObjecetName or HIC_ShopifySync__Object_Name__c = 'PersonAccount' ) and HIC_ShopifySync__SF_Field__c != 'name' and HIC_ShopifySync__SF_Field__c != 'Account-RecordTypeId' and HIC_ShopifySync__SF_Field__c != 'PersonAccount-company' and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' AND HIC_ShopifySync__Object_Mapping__c = null AND HIC_ShopifySync__Store__c =: store order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; }else{ fm = [select id,name,HIC_ShopifySync__GQL_Field_API__c,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__HIC_Field_Mapping__c where HIC_ShopifySync__Object_Name__c =: ObjecetName and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' AND HIC_ShopifySync__Object_Mapping__c = null and HIC_ShopifySync__Store__c =: store order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; } if(fm.isEmpty()){ store = 'Default'; if(isPersonAccount ){ fm = [select id,name,HIC_ShopifySync__GQL_Field_API__c,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__HIC_Field_Mapping__c where (HIC_ShopifySync__Object_Name__c =: ObjecetName or HIC_ShopifySync__Object_Name__c = 'PersonAccount' ) and HIC_ShopifySync__SF_Field__c != 'name' and HIC_ShopifySync__SF_Field__c != 'Account-RecordTypeId' and HIC_ShopifySync__SF_Field__c != 'PersonAccount-company' and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' AND HIC_ShopifySync__Object_Mapping__c = null and HIC_ShopifySync__Store__c =: store order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; }else{ fm = [select id,name,HIC_ShopifySync__GQL_Field_API__c,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__SF_Field_Type__c,HIC_ShopifySync__Shopify_Field_Type__c,HIC_ShopifySync__Shopify_Fields__c,HIC_ShopifySync__Nested__c from HIC_ShopifySync__HIC_Field_Mapping__c where HIC_ShopifySync__Object_Name__c =: ObjecetName and HIC_ShopifySync__Shopify_Field_Type__c != 'Reference' AND HIC_ShopifySync__Object_Mapping__c = null and HIC_ShopifySync__Store__c =: store order by HIC_ShopifySync__Nested__c,HIC_ShopifySync__Shopify_Fields__c asc limit 49999]; } } Schema.DescribeSObjectResult d = Schema.SObjectType.Account; Map rtMapById = d.getRecordTypeInfosById(); for(HIC_ShopifySync__HIC_Field_Mapping__c fmm : fm){ if(fmm.HIC_ShopifySync__SF_Field__c != null && fmm.HIC_ShopifySync__SF_Field__c != '' && fmm.HIC_ShopifySync__SF_Field__c == 'RecordTypeId'){ fmm.HIC_ShopifySync__SF_Field__c = 'Record Type Name'; Schema.RecordTypeInfo rtById = rtMapById.get(fmm.HIC_ShopifySync__Shopify_Fields__c); if(rtById != null){ fmm.HIC_ShopifySync__Shopify_Fields__c = rtById.getName() ; }else{ fmm.HIC_ShopifySync__Shopify_Fields__c = ''; } } if(fmm.HIC_ShopifySync__SF_Field__c != null && fmm.HIC_ShopifySync__SF_Field__c != '' ){ if(ObjecetName.equalsIgnoreCase('DraftOrder')){ ObjecetName = 'order'; } if(ObjecetName.equalsIgnoreCase('DraftOrderItem')){ ObjecetName = 'OrderItem'; } if(AddDeleteCOntroller.CheckingFieldExisting((fmm.HIC_ShopifySync__SF_Field__c).toLowerCase().trim(),ObjecetName.toLowerCase())){ listofupdatedAccountFieldMapping.add(fmm); } } } if(listofupdatedAccountFieldMapping != null && !listofupdatedAccountFieldMapping.isEmpty()){ return JSON.serialize(listofupdatedAccountFieldMapping); } else{ return 'Null'; } } /**************************************fetchAllData*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Get Default fieldmapping from the Configuration Object * ────────────────────────────────────────────────────────────────────────────────────────────── * @param String objectType - Shopify Entity's Name (Object's name) * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static String fetchAllData(String objectType, List configurationList){ new HIC_ShopifyUtility(configurationList); Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue = shopifyUrl + '/admin/'+objectType;//+'.json'; String queryParam = ''; req.setEndpoint(endPointValue); //Adding certificate to HTTP Requests req.setClientCertificateName('Shopify'); /*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD); String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue); req.setHeader('Authorization', authorizationHeader);*/ req.setHeader('X-Shopify-Access-Token', PASSWORD); req.setHeader('content-type', 'application/json'); //Use get Method as we are retrieving data from shopify req.setMethod('GET'); req.setTimeout(120000); try { HttpResponse res ; // if(!Test.isRunningTest()){ res = h.send(req); responseBody = res.getBody(); if(res.getStatusCode() == 200){ return responseBody; } }catch(Exception e){ } return null; } /**************************************getNoOfRecordsFromShopify*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Get count of Shopify records in Shopofy platform * ────────────────────────────────────────────────────────────────────────────────────────────── * @param String objectType - Shopify Entity's Name (Object's name) * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Integer getNoOfRecordsFromShopify(String objectType, List configurationList){ new HIC_ShopifyUtility(configurationList); Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue; if (objectType != 'orders'){ endPointValue = shopifyUrl + '/admin/'+objectType+'/count.json'; } else{ endPointValue = shopifyUrl + '/admin/'+objectType+'/count.json?status=any'; } String queryParam = ''; req.setEndpoint(endPointValue); //Adding certificate to HTTP Requests req.setClientCertificateName('Shopify'); /*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD); String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue); req.setHeader('Authorization', authorizationHeader);*/ req.setHeader('X-Shopify-Access-Token', PASSWORD); req.setHeader('content-type', 'application/json'); //Use get Method as we are retrieving data from shopify req.setMethod('GET'); req.setTimeout(120000); try { HttpResponse res ; if(!Test.isRunningTest()){ res = h.send(req); responseBody = res.getBody(); } else{ responseBody = '{"count":66}'; } if(Test.isRunningTest() || res.getStatusCode() == 200 ){ Map countSize = (Map)JSON.deserializeUntyped(responseBody); Integer intCountSize = Integer.valueOf(countSize.get('count')); if(intCountSize > 50){ decimal noOfPages = intCountSize/50.0; if(String.ValueOf(noOfPages).Contains('.')){ List splittedCount = String.valueOf(noOfPages).split('\\.'); if(Integer.valueOf(splittedCount[1]) > 0){ Integer newCountSize = Integer.valueOf(splittedCount[0]) + 1; return newCountSize; } }else{ return Integer.valueOf(noOfPages); } }else{ return 1; } } }catch(Exception e){ } return null; } /**************************************fetchAllDataUsingId*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for collouts in shopify with record's Id * ────────────────────────────────────────────────────────────────────────────────────────────── * @param String shopifyUrlWithId - PostFix Value of EndPoint URL * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static String fetchAllDataUsingId(String shopifyUrlWithId, List configurationList){ new HIC_ShopifyUtility(configurationList); Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue = shopifyUrl + '/admin/'+shopifyUrlWithId; String queryParam = ''; req.setEndpoint(endPointValue); //Adding certificate to HTTP Requests req.setClientCertificateName('Shopify'); /*Blob headerValue = Blob.valueOf(USER_NAME + ':' + PASSWORD); String authorizationHeader = 'Basic ' + EncodingUtil.base64Encode(headerValue); req.setHeader('Authorization', authorizationHeader);*/ req.setHeader('X-Shopify-Access-Token', PASSWORD); req.setHeader('content-type', 'application/json'); //Use get Method as we are retrieving data from shopify req.setMethod('GET'); req.setTimeout(120000); try { HttpResponse res ; res = h.send(req); responseBody = res.getBody(); if(res.getStatusCode() == 200){ return responseBody; } }catch(Exception e){ } return null; } /**************************************upsertSobjectList*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for upsert Records in Salesforce Dynamically * ────────────────────────────────────────────────────────────────────────────────────────────── * @param String singleJSONobj - Shopify Record JSON Respons * @param List sObjectList - List Of Record with field Mapping * @param String sObjectName - Shopify's Entity Name (Object's Name) * @param String externalFieldName - Field Name which includes in CSV body while sending mail to the user * @param List sObjectList - ListofConfigurationSettings * @param Boolean IsWebhook - Identify records its process for webhook record or Batch records * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void upsertSobjectList(String singleJSONobj,List sObjectList, String sObjectName, String externalFieldName, List configurationList, Boolean IsWebhook, String store){ new HIC_ShopifyUtility(configurationList); if(sObjectList.Isempty()) return; Schema.SObjectType objectType = Schema.getGlobalDescribe().get(sObjectName); Map fieldMap = objectType.getDescribe().fields.getMap(); Schema.SobjectField theField = fieldMap.get(externalFieldName); system.debug('theField-->'+theField); if(!sObjectList.isEmpty()){ EmailErrorCSV.makeCsvAndSendInEmail(singleJSONobj,sObjectName,sObjectList,theField,IsWebhook,store); } } /**************************************processSobjectList*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for upsert Records in Salesforce Dynamically * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List FieldsList - Pass Shopify's Entity Field Mapping from the Object HIC_ShopifySync__HIC_Field_Mapping__c * @param List sObjectList - List Of Record with field Mapping * @param String sObjectName - Shopify's Entity Name (Object's Name) * @param String externalFieldName - Field Name which includes in CSV body while sending mail to the user * @param List sObjectList - ListofConfigurationSettings * @param Boolean IsWebhook - Identify records its process for webhook record or Batch records * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void processSobjectList(List FieldsList,List objectList,String sObjectName, String externalFieldName, List configurationList,Boolean IsWebhook, String store){ new HIC_ShopifyUtility(configurationList); List sobjectList = fillObjectValues(FieldsList, sObjectName, objectList, configurationList); if(sobjectList.Isempty()) return; upsertSobjectList(JSON.serialize(objectList),sobjectList,sObjectName,externalFieldName, configurationList,IsWebhook,store); } /**************************************insertOrderfulfillments*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for upsert Orderfulfillment Records in Salesforce * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List objectList - List Of Record with field Mapping * @param List configurationList - ListofConfigurationSettings * @param Boolean IsWebhook - Identify records its process for webhook record or Batch records * @param Boolean store - Shopify's Store name * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void insertOrderfulfillments(List objectList, List configurationList, boolean IsWebhook, String store){ new HIC_ShopifyUtility(configurationList); Map oProdMap = new Map(); List listOfAllfullfillmentOrderitem = new List(); List orderfulfillmentproductList = new List(); List listOfAllfullfillmentOrder = new List(); List orderFulfillmentsList = new List(); List orderfulfillmentFieldsList = new List([Select HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Default_Value__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c, HIC_ShopifySync__IsSFID__c from HIC_ShopifySync__HIC_Field_Mapping__c Where HIC_ShopifySync__Object_Name__c = 'HIC_ShopifySync__Order_Fulfillment__c' AND HIC_ShopifySync__Store__c =: store]); List orderfulfillmentitemFieldsList = new List([Select HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Default_Value__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c, HIC_ShopifySync__IsSFID__c from HIC_ShopifySync__HIC_Field_Mapping__c Where HIC_ShopifySync__Object_Name__c = 'HIC_ShopifySync__Order_Fulfillment_Item__c' AND HIC_ShopifySync__Store__c =: store]); for(Object ordobjforfulfillment : objectList ){ Map orderproductMap = (Map)ordobjforfulfillment; if(orderproductMap != null && !orderproductMap.isEmpty() && orderproductMap.containskey('fulfillments') ){ orderFulfillmentsList = (List)orderproductMap.get('fulfillments'); listOfAllfullfillmentOrder.addall(orderFulfillmentsList); } } try{ if(!listOfAllfullfillmentOrder.isEmpty() && !orderfulfillmentFieldsList.isEmpty()){ processSobjectList(orderfulfillmentFieldsList,listOfAllfullfillmentOrder,'HIC_ShopifySync__Order_Fulfillment__c', 'HIC_ShopifySync__Shopify_Id__c', configurationList,IsWebhook,store); } }catch(Exception e){ system.debug('For OrderFulfillment '+ e.getMessage() + 'at line '+e.getLineNumber()); } if(orderFulfillmentsList != null && !orderFulfillmentsList.isEmpty()){ for(Object orderfulfillmentitem : orderFulfillmentsList){ Map orderfulfillmentitemMap = (Map)orderfulfillmentitem; if(orderfulfillmentitemMap != null && !orderfulfillmentitemMap.isEmpty() && orderfulfillmentitemMap.containskey('line_items')){ orderfulfillmentproductList = (List)orderfulfillmentitemMap.get('line_items'); for(Object orderfuilmentitem : orderfulfillmentproductList){ oProdMap = (Map)orderfuilmentitem; oProdMap.put('orderfulfillmentId',String.valueOf(orderfulfillmentitemMap.get('id'))); oProdmap.put('id', string.valueOf(orderfulfillmentItemmap.get('id'))+oProdmap.get('id')); orderfuilmentitem = (Object)oProdMap; } listOfAllfullfillmentOrderitem.addAll(orderfulfillmentproductList); } } } try{ if(!listOfAllfullfillmentOrder.isEmpty() && !orderfulfillmentFieldsList.isEmpty()){ processSobjectList(orderfulfillmentitemFieldsList,listOfAllfullfillmentOrderitem,'HIC_ShopifySync__Order_Fulfillment_Item__c', 'HIC_ShopifySync__Shopify_Id__c', configurationList,IsWebhook,store); } }catch(Exception e){ system.debug('For OrderFulfillment '+ e.getMessage() + 'at line '+e.getLineNumber()); } } /**************************************initailizeProductandVaraint*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Insert Default ProductandVaraint in Salesforce. * Whenever Shopify's ProductandVaraint is not found in Shopify and records are in Salesforce and its required on records * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List lineItems - ListoflineItems * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void initializeProductandVaraint(List lineItems){ Set shProductIdSet = new Set(); Set shVariantIdSet = new Set(); Map shProductMap = new Map(); Map shVariantMap = new Map(); for(Object line : lineItems){ map lineMap = (map) line; if(lineMap.get('product_id') != null){ shProductIdSet.add(string.valueof(lineMap.get('product_id'))); System.debug('shProductIdSet-->'+shProductIdSet); } if(lineMap.get('variant_id') != null){// || ordproduct.Product2Id == 'null' shVariantIdSet.add(string.valueof(lineMap.get('variant_id'))); System.debug('shVariantIdSet-->'+shVariantIdSet); } } System.debug('lineItems-->'+lineItems); for(Product2 pro : [Select HIC_ShopifySync__Shopify_Id__c,Name from Product2 where HIC_ShopifySync__Shopify_Id__c IN :shProductIdSet ]){ System.debug('pro-->'+pro); shProductMap.put(pro.HIC_ShopifySync__Shopify_Id__c, pro.Name); System.debug('shProductMap-->'+shProductMap); } List productListToCreate = new List(); for(String shProductId : shProductIdSet){ System.debug('shProductId-->'+shProductId); if(shProductMap.isEmpty() || !shProductMap.containsKey(shProductId)){ System.debug('shProductMap-->'+shProductMap); Product2 product = new Product2(); product.Name = 'Does not exist in Shopify anymore'; product.HIC_ShopifySync__Shopify_Id__c = shProductId; productListToCreate.add(product); System.debug('productListToCreate-->'+productListToCreate); } } if(!productListToCreate.isEmpty()) insert productListToCreate; System.debug('productListToCreate-->'+productListToCreate); for(HIC_ShopifySync__Variant__c vari : [Select HIC_ShopifySync__Shopify_Id__c,Name from HIC_ShopifySync__Variant__c where HIC_ShopifySync__Shopify_Id__c IN :shVariantIdSet ]){ if(vari != null){ shVariantMap.put(vari.HIC_ShopifySync__Shopify_Id__c, vari.Name); } System.debug('shVariantMap-->'+shVariantMap); } List variantListToCreate = new List(); for(String shVariantId : shVariantIdSet){ System.debug('shVariantId-->'+shVariantId); if(shVariantMap.isEmpty() || !shVariantMap.containsKey(shVariantId)){ HIC_ShopifySync__Variant__c variant = new HIC_ShopifySync__Variant__c(); variant.Name = 'Does not exist in Shopify anymore'; variant.HIC_ShopifySync__Shopify_Id__c = shVariantId; variantListToCreate.add(variant); System.debug('variantListToCreate-->'+variantListToCreate); } } if(!variantListToCreate.isEmpty()) insert variantListToCreate; System.debug('variantListToCreate-->'+variantListToCreate); } /**************************************InitializeAccount*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Insert Default Account in Salesforce. * Whenever Shopify's Account is not found in Salesforce and its required on records * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map ShopifyidvsAccountid - Map of Shopify's External Id Vs Accout's Shopify's ID * @param String ObjectName - Shopify Entity's Name * @param Boolean isPersonAccount - Identify records its person account or not * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void InitializeAccount (Map ShopifyidvsCustomersBody, List configurationList, String store){ try{ String ObjectName = 'Account'; new HIC_ShopifyUtility(configurationList); //Map ShopifyidvsObjectidPresent = new Map(ShopifyidvsAccountid); Set SetofShopifyId = ShopifyidvsCustomersBody.keyset(); String query = 'select id, HIC_ShopifySync__Shopify_id__c from ' + ObjectName + ' where HIC_ShopifySync__Shopify_id__c IN: SetofShopifyId '; Type typLstSObject = Type.forName('List<'+ObjectName+'>'); List sObjectListToSearch = (List)typLstSObject.newInstance(); sObjectListToSearch = Database.query(query); Schema.SObjectType objectType = Schema.getGlobalDescribe().get(ObjectName); Map fieldMap = objectType.getDescribe().fields.getMap(); Schema.SobjectField theFieldShopif = fieldMap.get('HIC_ShopifySync__Shopify_Id__c'); Schema.SobjectField theFieldId = fieldMap.get('id'); for(SObject obj :sObjectListToSearch){ //ShopifyidvsObjectidPresent.put((String)obj.get('HIC_ShopifySync__Shopify_Id__c'),(String)obj.get('Id')); ShopifyidvsCustomersBody.remove((String)obj.get('HIC_ShopifySync__Shopify_Id__c')); } if(!ShopifyidvsCustomersBody.isEmpty()){ updateCustomer(ShopifyidvsCustomersBody.values(), configurationList, store); } }catch(Exception e){ // CustomSettingRecordInsert.SuccessMailSend('Error message from shopifyUtility '+e.getMessage() + ' at line number ' + e.getLineNumber()); } } public static void updateCustomer(List scope, List listofConfiguration, String store){ Integer count = 0; String JSONsingleobj; for(Object obj : scope){ JSONsingleobj = JSON.serialize(obj); } for(Object customerObj : scope){ Map customerMap = (Map)customerObj; customerMap.put('Accountid',String.valueof(customerMap.get('id'))); system.debug('customerMap--->>> '+customerMap); if(!customerMap.isEmpty() && customerMap.containskey('default_address')){ Map accMap = (Map)customerMap.get('default_address'); if(!accMap.isEmpty() && accMap.containsKey('company') && (accMap.get('company') == null || accMap.get('company') == '' || accMap.get('company') == 'null')){ /*if(accMap.get('first_name') != null || accMap.get('last_name') != null) accMap.put('company', accMap.get('first_name')+' '+ accMap.get('last_name')); else accMap.put('company', customerMap.get('first_name')+' '+ customerMap.get('last_name')); customerMap.put('default_address', accMap); //Update On 18/102023 // --------------------------------------------------------- Start if (!String.isBlank((String)accMap.get('first_name')) || !String.isBlank((String)accMap.get('last_name'))) { accMap.put('company', (String.isBlank((String)accMap.get('first_name')) ? '' : (String)accMap.get('first_name')) + (String.isBlank((String)accMap.get('last_name')) ? '' : ' ' + (String)accMap.get('last_name')) ); } else { accMap.put('company', (String.isBlank((String)customerMap.get('first_name')) ? '' : (String)customerMap.get('first_name')) + (String.isBlank((String)customerMap.get('last_name')) ? '' : ' ' + (String)customerMap.get('last_name')) ); }*/ String FirstName = (accMap.get('first_name') != null ? ''+accMap.get('first_name') : '') ; String LastName = (accMap.get('last_name') != null ? ''+accMap.get('last_name') : ''); String DefaultFirst = (customerMap.get('first_name') != null ? ''+customerMap.get('first_name') : ''); String DefaultLast = (customerMap.get('last_name') != null ? ''+customerMap.get('last_name') : ''); String fullName = (String.isNotBlank(FirstName) ? FirstName : '') + (String.isNotBlank(LastName) ? ' ' + LastName : ''); String defaultFullName = (String.isNotBlank(DefaultFirst) ? DefaultFirst + ' ' : '') + (String.isNotBlank(DefaultLast) ? DefaultLast : ''); String finalFullName = String.isNotBlank(fullName) ? fullName.trim() : defaultFullName.trim(); System.debug(finalFullName); accMap.put('company', finalFullName); customerMap.put('default_address', accMap); // --------------------------------------------------------- End } }else if((customerMap.containsKey('first_name') && customerMap.get('first_name') != null) || (customerMap.containsKey('last_name') && customerMap.get('last_name') != null)){ customerMap.put('default_address', new Map{'company' => (String)customerMap.get('first_name') + customerMap.get('last_name')}); } customerObj = (Object)customerMap; } //If Account And Contact True Only if(!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Account_Contact__c == true && listofConfiguration[0].HIC_ShopifySync__Person_Account__c == false && listofConfiguration[0].HIC_ShopifySync__Default_Account__c == false ){ List accountFieldsList = new List(); String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c, HIC_ShopifySync__Default_Value__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c Where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \'Account\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; accountFieldsList = Database.query(query); if(!accountFieldsList.isEmpty() && !scope.isEmpty()){ if(!Test.isRunningTest()){ HIC_ShopifyUtility.processSobjectList(accountFieldsList,scope,'Account','HIC_ShopifySync__Shopify_Id__c',listOfConfiguration,false,store); } } List contactFieldsList = new List([Select HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c, HIC_ShopifySync__Default_Value__c from HIC_ShopifySync__HIC_Field_Mapping__c Where HIC_ShopifySync__Object_Name__c = 'Contact' AND HIC_ShopifySync__Store__c =: store]); try{ if(!contactFieldsList.isEmpty() && !scope.isEmpty()){ HIC_ShopifyUtility.processSobjectList(contactFieldsList,scope,'Contact','HIC_ShopifySync__Shopify_Id__c',listOfConfiguration,false,store); } }catch(Exception e){ } }else //IF Account & Contact and Defuault Account Ture Only if(!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Account_Contact__c == true && listofConfiguration[0].HIC_ShopifySync__Person_Account__c == false && listofConfiguration[0].HIC_ShopifySync__Default_Account__c == true ){ String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__IsCurrencyChanged__c,HIC_ShopifySync__Batch_Is_Processing__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c, HIC_ShopifySync__Default_Value__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c Where ' +CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \'Contact\'AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; List contactFieldsList = new List(); contactFieldsList = Database.query(query); for(Object customerObj : scope){ Map customerMap = (Map)customerObj; if(Schema.sObjectType.Account.fields.getMap().containsKey( 'ispersonaccount' ) || Test.isRunningTest() ){ if(listofConfiguration[0].HIC_ShopifySync__Person_Account__c){ if(!(String.valueOf(customerMap.get('id'))).contains('Person ')){ customerMap.put('id','Person '+String.valueof(customerMap.get('id'))); } }else if(!listofConfiguration[0].HIC_ShopifySync__Person_Account__c){ if(!(String.valueOf(customerMap.get('id'))).contains('Business ')){ customerMap.put('id','Business '+String.valueof(customerMap.get('id'))); } } }else{ if(!(String.valueOf(customerMap.get('id'))).contains('Business ')) customerMap.put('id','Business '+String.valueof(customerMap.get('id'))); } customerObj = (Object)customerMap; system.debug('mapid-->'+customerMap.get('id')); } for(Object customerObj : scope){ Map customerMap = (Map)customerObj; system.debug('mapid2-->'+customerMap.get('id')); } try{ if(!contactFieldsList.isEmpty() && !scope.isEmpty()){ HIC_ShopifyUtility.processSobjectList(contactFieldsList,scope,'Contact','HIC_ShopifySync__Shopify_Id__c',listOfConfiguration,false,store); } }catch(Exception e){ system.debug('exception at line no '+e.getLineNumber()+' error '+e.getMessage()); } }else //IF Person Account True And Default Account is False if(!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Person_Account__c == true && listofConfiguration[0].HIC_ShopifySync__Default_Account__c == false){ List accountFieldsList = new List(); String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c, HIC_ShopifySync__Default_Value__c, HIC_ShopifySync__Object_name__c','HIC_ShopifySync__HIC_Field_Mapping__c' )+' from HIC_ShopifySync__HIC_Field_Mapping__c Where ('+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+'= \'Account\' OR '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \'PersonAccount\' ) And '+CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' != \'name\' AND '+CheckAccessibility.isAccessible('Name','HIC_ShopifySync__HIC_Field_Mapping__c')+' != \'Account-RecordTypeId\'AND '+CheckAccessibility.isAccessible('Name','HIC_ShopifySync__HIC_Field_Mapping__c')+' != \'PersonAccount-company\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999' ; accountFieldsList = Database.query(query); for(Object customerObj : scope){ Map customerMap = (Map)customerObj; if(customerMap.get('last_name') == null || customerMap.get('last_name') == ''){ customerMap.put('last_name','REQ'+string.valueof(system.now().getTime()+ count++)); } } if(!accountFieldsList.isEmpty() && !scope.isEmpty()){ HIC_ShopifyUtility.processSobjectList(accountFieldsList,scope,'Account','HIC_ShopifySync__Shopify_Id__c',listOfConfiguration,false,store); } } } /**************************************InitializeAccount*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Insert Default Account in Salesforce. * Whenever Shopify's Account is not found in Salesforce and its required on records * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map ShopifyidvsAccountid - Map of Shopify's External Id Vs Accout's Shopify's ID * @param String ObjectName - Shopify Entity's Name * @param Boolean isPersonAccount - Identify records its person account or not * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static void InitializeAccount (Map ShopifyidvsAccountid,String ObjectName, Boolean isPersonAccount, List configurationList){ try{ new HIC_ShopifyUtility(configurationList); Map ShopifyidvsObjectidPresent = new Map(ShopifyidvsAccountid); Set SetofShopifyId = ShopifyidvsAccountid.keyset(); String query = 'select id, HIC_ShopifySync__Shopify_id__c from ' + ObjectName + ' where HIC_ShopifySync__Shopify_id__c IN: SetofShopifyId '; Type typLstSObject = Type.forName('List<'+ObjectName+'>'); List sObjectListToSearch = (List)typLstSObject.newInstance(); sObjectListToSearch = Database.query(query); Schema.SObjectType objectType = Schema.getGlobalDescribe().get(ObjectName); Map fieldMap = objectType.getDescribe().fields.getMap(); Schema.SobjectField theFieldShopif = fieldMap.get('HIC_ShopifySync__Shopify_Id__c'); Schema.SobjectField theFieldId = fieldMap.get('id'); for(SObject obj :sObjectListToSearch){ ShopifyidvsObjectidPresent.put((String)obj.get('HIC_ShopifySync__Shopify_Id__c'),(String)obj.get('Id')); } Map allRequiredFieldMap = objectType.getDescribe().fields.getMap(); Map fieldMapVsrequired = new Map(); List sObjectListToupsert = (List)typLstSObject.NewInstance(); for(String ShopifyID : ShopifyidvsObjectidPresent.keySet()){ if(sObjectListToSearch.IsEmpty() || ShopifyidvsObjectidPresent.get(ShopifyID) == 'false' ){ for(String fieldName : allRequiredFieldMap.keySet()) { Schema.SObjectField field = allRequiredFieldMap.get(fieldName); Schema.DescribeFieldResult f = field.getDescribe(); if(!f.isNillable() && f.isUpdateable() && f.isCreateable() && isPersonAccount && fieldName.contains('__pc')){ if(f.isNamefield() && fieldName == 'Name'){ fieldMapVsrequired.put(fieldName,true); } }else if((!f.isNillable() || f.isNamefield()) && f.isUpdateable() && f.isCreateable() && !isPersonAccount && !fieldName.contains('__pc')){ if(f.isNamefield() && (fieldName == 'first Name' || fieldName == 'Last Name')){ fieldMapVsrequired.put(fieldName,true); } } } if(fieldMapVsrequired.containsKey('ownerid')){ fieldMapVsrequired.remove('ownerid'); } SObject sObjRecord = Schema.getGlobalDescribe().get(ObjectName).newSObject() ; for(String fld : fieldMapVsrequired.keySet()){ Schema.SObjectType t = Schema.getGlobalDescribe().get(ObjectName); Schema.DescribeSObjectResult ObjectResult = t.getDescribe(); Schema.DescribeFieldResult fieldResult = ObjectResult.fields.getMap().get(fld).getDescribe(); String fieldType = fieldResult.getType().name().toLowerCase(); if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent'){ sObjRecord.put(fld , Double.valueof(1)); }else if(fieldType == 'integer'){ sObjRecord.put(fld , Integer.valueof(1)); } else if(fieldType == 'String'){ sObjRecord.put(fld,'DE'); }else if(fieldType == 'date'){ sObjRecord.put(fld,System.today()); }else if(fieldType == 'datetime'){ sObjRecord.put(fld,System.now()); }else if(fieldType == 'email'){ sObjRecord.put(fld,'test@gmail.com'); } } sObjRecord.put('HIC_ShopifySync__Shopify_id__c',ShopifyID); sObjRecord.put('name',ShopifyID); sObjectListToupsert.add(sObjRecord); } } Database.upsert(sObjectListToupsert); }catch(Exception e){ // CustomSettingRecordInsert.SuccessMailSend('Error message from shopifyUtility '+e.getMessage() + ' at line number ' + e.getLineNumber()); } } /**************************************InsertProduct*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Insert Default Account in Salesforce. * Whenever Shopify's Account is not found in Salesforce and its required on records * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map> oProdMap - Map of Shopify's Product vs name vs Id * @param List configurationList - ListofConfigurationSettings * @param Boolean IsWebhook - Identify records its webhook or Batch record * @param String store - Shopify's Store Name * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Map InsertProduct(Map> oProdMap, List configurationList, boolean IsWebhook, String store){ new HIC_ShopifyUtility(configurationList); List productFieldsList = new List([Select HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c, HIC_ShopifySync__Default_Value__c from HIC_ShopifySync__HIC_Field_Mapping__c Where HIC_ShopifySync__Object_Name__c = 'Product2' AND HIC_ShopifySync__Store__c =: store ]); List prodListToQuery = new List (); Set shopifyIds = new Set (); Set names = new Set (); for (String str : oProdMap.keySet()){ if(oProdMap.get(str) != null && oProdMap.get(str).get('name') != null){ names.add((String)oProdMap.get(str).get('name')); } } prodListToQuery = [Select id, HIC_ShopifySync__Shopify_Id__c, Name From Product2 Where HIC_ShopifySync__Shopify_Id__c IN : oProdMap.keySet() OR Name IN : names]; Map nameVsId = new Map (); for(Product2 proObj : prodListToQuery){ if(proObj.Name != null && proObj.HIC_ShopifySync__Shopify_Id__c != null){ nameVsId.put(proObj.Name, proObj.HIC_ShopifySync__Shopify_Id__c); } else if(proObj.HIC_ShopifySync__Shopify_Id__c != null){ shopifyIds.add(proObj.HIC_ShopifySync__Shopify_Id__c); } } Map prodMapToInsert = new Map (); //List sObjecListToUpsert = new List (); List objl = new List(); if ((shopifyIds != null && !shopifyIds.isEmpty()) || prodListToQuery.isEmpty()){ for (String str : oProdMap.keySet()){ if((prodListToQuery != null && !prodListToQuery.isEmpty() && !shopifyIds.contains(str)) || prodListToQuery.isEmpty()){ Map productMap = (Map) oProdMap.get(str); productMap.put('id', str); oProdMap.put(str, productMap); objl.add((object)oProdMap.get(str)); if((nameVsId != null && !nameVsId.isEmpty() && !nameVsId.containsKey((String)oProdMap.get(str).get('name'))) || nameVsId == null || nameVsId.isEmpty()){ nameVsId.put((String)oProdMap.get(str).get('name'), str); } } } if(productFieldsList != null && !productFieldsList.isEmpty() && objl != null && !objl.isEmpty()){ HIC_ShopifyUtility.processSobjectList(productFieldsList, objl, 'Product2', 'HIC_ShopifySync__Shopify_Id__c', configurationList,IsWebhook,store); } } if(nameVsId != null && !nameVsId.isEmpty()){ return nameVsId; } return null; } /**************************************InitializePricebookEntryId*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Insert Pricebook Entry in Salesforce. * Whenever Shopify's Product insert/upsert or order insert/upsert upsert Pricebook Entry as per the user selection on the page * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Map productVsPricebookEntryMap - Map of Shopify's Product External ID vs Pricebook Entry ID * @param Map productVsUnitePriceMap - Map of Shopify's Product External ID vs Product Unit Price value * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Map InitializePricebookEntryIdorder(Map productVsPricebookEntryMap ,Map productVsUnitePriceMap,List configurationList, string presentmentCurrency,string store){ new HIC_ShopifyUtility(configurationList); Boolean multiCurrencyEnabled = Schema.getGlobalDescribe().containsKey('CurrencyType'); /*List pricebook2MappingList = new List(); String query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c, HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__HIC_Field_Mapping__c') +'= \'Pricebook2Id\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; pricebook2MappingList = database.query(query);*/ List conList = new List(); String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c, name,HIC_ShopifySync__Salesforce_Pricebook__c ','HIC_ShopifySync__HIC_Configuration__c')+' from HIC_ShopifySync__HIC_Configuration__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c', 'HIC_ShopifySync__HIC_Configuration__c')+' = \''+store+'\' LIMIT 49999'; conList = database.query(query); List currencyMappingList = new List(); query = ''; String CurrencyShopifyFieldValue = ''; if(multiCurrencyEnabled){ query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__Default_Value__c,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__HIC_Field_Mapping__c') +'= \'CurrencyISOCODE\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; currencyMappingList = database.query(query); if (!currencyMappingList.isEmpty()) { if (currencyMappingList[0].HIC_ShopifySync__Default_Value__c) { CurrencyShopifyFieldValue = currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c; } else { CurrencyShopifyFieldValue = presentmentCurrency; } } } String PricebookShopifyFieldValue = conList[0].HIC_ShopifySync__Salesforce_Pricebook__c; if(Test.isRunningTest() && PricebookShopifyFieldValue == null) PricebookShopifyFieldValue = Test.getStandardPricebookId(); Map shopifyidVSproductidMap = new Map(); String queryFields = ''; if(Schema.sObjectType.Product2.fields.id.isAccessible()){ queryFields += 'Product2Id,'; } if(multiCurrencyEnabled){ //if(Schema.SObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE') && Schema.sObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE').isAccessible()){ if(Checkaccessibility.isAccessible('CurrencyISOCODE','PricebookEntry').equalsIgnoreCase('CurrencyISOCODE')){ queryFields += 'CurrencyISOCODE,'; } } if(Schema.sObjectType.Product2.fields.Name.isAccessible()){ queryFields += 'Product2.Name,'; } if(Schema.sObjectType.Product2.fields.HIC_ShopifySync__Shopify_Id__c.isAccessible()){ queryFields += 'Product2.HIC_ShopifySync__Shopify_Id__c,'; } if(Schema.sObjectType.PricebookEntry.fields.Pricebook2Id.isAccessible()){ queryFields += 'Pricebook2Id '; } Set pbEntry = new Set (); pbEntry = productVsPricebookEntryMap.keyset(); system.debug('pbEntry-->'+pbEntry); query = ''; if(multiCurrencyEnabled){ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And CurrencyISOCODE = \'' + CurrencyShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null'; }else{ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null' ; } List listOfPriceBookEntry = new List(); System.debug('query--'+query); listOfPriceBookEntry = Database.query(query); if(!listOfPriceBookEntry.isEmpty()){ for(PricebookEntry obj : listOfPriceBookEntry){ if(productVsPricebookEntryMap.containskey(obj.Product2.HIC_ShopifySync__Shopify_Id__c)){ if(obj.Pricebook2Id == PricebookShopifyFieldValue) productVsPricebookEntryMap.put(obj.Product2.HIC_ShopifySync__Shopify_Id__c,obj.id); } } } // system.debug('productVsUnitePriceMap.get(obj)-->'+productVsUnitePriceMap.get(obj)); List pricebookEntryListToInsert = new List(); List StandarPricebookList = new List(); StandarPricebookList = database.query('select '+Checkaccessibility.isAccessible('id,HIC_ShopifySync__Shopify_Id__c,name', 'pricebook2')+' from pricebook2 where '+Checkaccessibility.isAccessible('IsStandard', 'pricebook2')+ ' = true LIMIT 1'); if(!productVsPricebookEntryMap.isEmpty()){ for(String obj : productVsPricebookEntryMap.keyset()){ if((productVsPricebookEntryMap.get(obj) == null || productVsPricebookEntryMap.get(obj) == '') && obj != null ) { if(!StandarPricebookList.isEmpty() && StandarPricebookList[0].id != PricebookShopifyFieldValue){ sObject standardPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; standardPbEntry.put('Pricebook2id',StandarPricebookList[0].id); if(multiCurrencyEnabled){ standardPbEntry.put('CurrencyISOCODE',CurrencyShopifyFieldValue); } standardPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; standardPbEntry.putSObject('Product2',product); standardPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); standardPbEntry.put('HIC_ShopifySync__Shopify_Id__c',string.valueof(obj)); PricebookEntry pbe = (PricebookEntry)standardPbEntry; pricebookEntryListToInsert.add(pbe); } sObject NewPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; NewPbEntry.put('Pricebook2id',PricebookShopifyFieldValue); if(multiCurrencyEnabled){ NewPbEntry.put('CurrencyISOCODE', CurrencyShopifyFieldValue); } NewPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; NewPbEntry.putSObject('Product2',product); NewPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); NewPbEntry.put('HIC_ShopifySync__Shopify_Id__c',string.valueof(obj)+DateTime.now().format('yyyy-MM-dd HH:mm:ss.SSS')); PricebookEntry pbe = (PricebookEntry)NewPbEntry; pricebookEntryListToInsert.add(pbe); } } if(pricebookEntryListToInsert.IsEmpty()) return productVsPricebookEntryMap; try{ Database.upsertResult[] updateResult; if(CheckAccessibility.isUpsertable('Pricebook2Id,HIC_ShopifySync__Shopify_Id__c,isActive,Product2Id,UnitPrice', 'PricebookEntry')){ try{ system.debug('pricebookEntryListToInsert-->'+pricebookEntryListToInsert); updateResult = Database.upsert(pricebookEntryListToInsert,PricebookEntry.HIC_ShopifySync__Shopify_Id__c,false); }catch(Exception e){ system.debug('error--> '+e.getMessage()+' error all '+e); } } set setofinsert = new set(); for(Integer index = 0 ; index < updateResult.size() ; index ++){ if( updateResult[index].isSuccess() ){ setofinsert.add(updateResult[index].getId()); }else{ for(Database.Error error : updateResult[index].getErrors()){ system.debug('errorMsg--> '+error.getMessage()); } } } List listofinsetedpricebookEntry = new List(); String InsertedPbQuery; if(multiCurrencyEnabled){ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ + 'From PricebookEntry Where '+ CheckAccessibility.isAccessible('CurrencyISOCODE','PricebookEntry') +' = \'' + CurrencyShopifyFieldValue + '\' And id IN : setofinsert'; }else{ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ CheckAccessibility.isAccessible('Product2.HIC_ShopifySync__Shopify_Id__c','PricebookEntry') + 'From PricebookEntry Where id IN : setofinsert'; } listofinsetedpricebookEntry = Database.query(InsertedPbQuery); if(!listofinsetedpricebookEntry.isEmpty()){ for(PricebookEntry pbe : listofinsetedpricebookEntry){ if(pbe.Pricebook2Id == PricebookShopifyFieldValue){ productVsPricebookEntryMap.put(pbe.Product2.HIC_ShopifySync__Shopify_Id__c,pbe.Id); } } } } catch(Exception e){ system.debug('error '+e.getMessage()+' at line number' +e.getLineNumber()); } } return productVsPricebookEntryMap; } public static Map InitializePricebookEntryId(Map productVsPricebookEntryMap ,Map productVsUnitePriceMap,List configurationList, string store){ new HIC_ShopifyUtility(configurationList); Boolean multiCurrencyEnabled = Schema.getGlobalDescribe().containsKey('CurrencyType'); /*List pricebook2MappingList = new List(); String query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c, HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__HIC_Field_Mapping__c') +'= \'Pricebook2Id\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; pricebook2MappingList = database.query(query);*/ List conList = new List(); String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c, name,HIC_ShopifySync__Salesforce_Pricebook__c ','HIC_ShopifySync__HIC_Configuration__c')+' from HIC_ShopifySync__HIC_Configuration__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c', 'HIC_ShopifySync__HIC_Configuration__c')+' = \''+store+'\' LIMIT 49999'; conList = database.query(query); List currencyMappingList = new List(); query = ''; String CurrencyShopifyFieldValue = ''; if(multiCurrencyEnabled){ query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' from HIC_ShopifySync__HIC_Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__HIC_Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__HIC_Field_Mapping__c') +'= \'CurrencyISOCODE\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999'; currencyMappingList = database.query(query); CurrencyShopifyFieldValue = currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c; } String PricebookShopifyFieldValue = conList[0].HIC_ShopifySync__Salesforce_Pricebook__c; if(Test.isRunningTest() && PricebookShopifyFieldValue == null) PricebookShopifyFieldValue = Test.getStandardPricebookId(); Map shopifyidVSproductidMap = new Map(); String queryFields = ''; if(Schema.sObjectType.Product2.fields.id.isAccessible()){ queryFields += 'Product2Id,'; } if(multiCurrencyEnabled){ //if(Schema.SObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE') && Schema.sObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE').isAccessible()){ if(Checkaccessibility.isAccessible('CurrencyISOCODE','PricebookEntry').equalsIgnoreCase('CurrencyISOCODE')){ queryFields += 'CurrencyISOCODE,'; } } if(Schema.sObjectType.Product2.fields.Name.isAccessible()){ queryFields += 'Product2.Name,'; } if(Schema.sObjectType.Product2.fields.HIC_ShopifySync__Shopify_Id__c.isAccessible()){ queryFields += 'Product2.HIC_ShopifySync__Shopify_Id__c,'; } if(Schema.sObjectType.PricebookEntry.fields.Pricebook2Id.isAccessible()){ queryFields += 'Pricebook2Id '; } Set pbEntry = new Set (); pbEntry = productVsPricebookEntryMap.keyset(); system.debug('pbEntry-->'+pbEntry); query = ''; if(multiCurrencyEnabled){ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And CurrencyISOCODE = \'' + CurrencyShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null'; }else{ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null' ; } List listOfPriceBookEntry = new List(); System.debug('query--'+query); listOfPriceBookEntry = Database.query(query); if(!listOfPriceBookEntry.isEmpty()){ for(PricebookEntry obj : listOfPriceBookEntry){ if(productVsPricebookEntryMap.containskey(obj.Product2.HIC_ShopifySync__Shopify_Id__c)){ if(obj.Pricebook2Id == PricebookShopifyFieldValue) productVsPricebookEntryMap.put(obj.Product2.HIC_ShopifySync__Shopify_Id__c,obj.id); } } } // system.debug('productVsUnitePriceMap.get(obj)-->'+productVsUnitePriceMap.get(obj)); List pricebookEntryListToInsert = new List(); List StandarPricebookList = new List(); StandarPricebookList = database.query('select '+Checkaccessibility.isAccessible('id,HIC_ShopifySync__Shopify_Id__c,name', 'pricebook2')+' from pricebook2 where '+Checkaccessibility.isAccessible('IsStandard', 'pricebook2')+ ' = true LIMIT 1'); if(!productVsPricebookEntryMap.isEmpty()){ for(String obj : productVsPricebookEntryMap.keyset()){ if((productVsPricebookEntryMap.get(obj) == null || productVsPricebookEntryMap.get(obj) == '') && obj != null ) { if(!StandarPricebookList.isEmpty() && StandarPricebookList[0].id != PricebookShopifyFieldValue){ sObject standardPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; standardPbEntry.put('Pricebook2id',StandarPricebookList[0].id); if(multiCurrencyEnabled){ standardPbEntry.put('CurrencyISOCODE',currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c); } standardPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; standardPbEntry.putSObject('Product2',product); standardPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); standardPbEntry.put('HIC_ShopifySync__Shopify_Id__c',string.valueof(obj)); PricebookEntry pbe = (PricebookEntry)standardPbEntry; pricebookEntryListToInsert.add(pbe); } sObject NewPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; NewPbEntry.put('Pricebook2id',PricebookShopifyFieldValue); if(multiCurrencyEnabled){ NewPbEntry.put('CurrencyISOCODE', currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c); } NewPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; NewPbEntry.putSObject('Product2',product); NewPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); NewPbEntry.put('HIC_ShopifySync__Shopify_Id__c',string.valueof(obj)+DateTime.now().format('yyyy-MM-dd HH:mm:ss.SSS')); PricebookEntry pbe = (PricebookEntry)NewPbEntry; pricebookEntryListToInsert.add(pbe); } } if(pricebookEntryListToInsert.IsEmpty()) return productVsPricebookEntryMap; try{ Database.upsertResult[] updateResult; if(CheckAccessibility.isUpsertable('Pricebook2Id,HIC_ShopifySync__Shopify_Id__c,isActive,Product2Id,UnitPrice', 'PricebookEntry')){ try{ system.debug('pricebookEntryListToInsert-->'+pricebookEntryListToInsert); updateResult = Database.upsert(pricebookEntryListToInsert,PricebookEntry.HIC_ShopifySync__Shopify_Id__c,false); }catch(Exception e){ system.debug('error--> '+e.getMessage()+' error all '+e); } } set setofinsert = new set(); for(Integer index = 0 ; index < updateResult.size() ; index ++){ if( updateResult[index].isSuccess() ){ setofinsert.add(updateResult[index].getId()); }else{ for(Database.Error error : updateResult[index].getErrors()){ system.debug('errorMsg--> '+error.getMessage()); } } } List listofinsetedpricebookEntry = new List(); String InsertedPbQuery; if(multiCurrencyEnabled){ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ + 'From PricebookEntry Where '+ CheckAccessibility.isAccessible('CurrencyISOCODE','PricebookEntry') +' = \'' + CurrencyShopifyFieldValue + '\' And id IN : setofinsert'; }else{ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ CheckAccessibility.isAccessible('Product2.HIC_ShopifySync__Shopify_Id__c','PricebookEntry') + 'From PricebookEntry Where id IN : setofinsert'; } listofinsetedpricebookEntry = Database.query(InsertedPbQuery); if(!listofinsetedpricebookEntry.isEmpty()){ for(PricebookEntry pbe : listofinsetedpricebookEntry){ if(pbe.Pricebook2Id == PricebookShopifyFieldValue){ productVsPricebookEntryMap.put(pbe.Product2.HIC_ShopifySync__Shopify_Id__c,pbe.Id); } } } } catch(Exception e){ system.debug('error '+e.getMessage()+' at line number' +e.getLineNumber()); } } return productVsPricebookEntryMap; } //Deprecated public static Map InitializePricebookEntryId(Map productVsPricebookEntryMap ,Map productVsUnitePriceMap,List configurationList){ /*new HIC_ShopifyUtility(configurationList); Boolean multiCurrencyEnabled = Schema.getGlobalDescribe().containsKey('CurrencyType'); List pricebook2MappingList = new List(); String query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c, HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__Field_Mapping__c')+' from HIC_ShopifySync__Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__Field_Mapping__c') +'= \'Pricebook2Id\' limit 49999'; pricebook2MappingList = database.query(query); List currencyMappingList = new List(); query = ''; String CurrencyShopifyFieldValue = ''; if(multiCurrencyEnabled){ query = ' select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__SF_Field__c, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Nested__c , HIC_ShopifySync__IsSFID__c','HIC_ShopifySync__Field_Mapping__c')+' from HIC_ShopifySync__Field_Mapping__c where '+CheckAccessibility.isAccessible('HIC_ShopifySync__Object_Name__c','HIC_ShopifySync__Field_Mapping__c')+ ' = \'order\' And ' +CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c','HIC_ShopifySync__Field_Mapping__c') +'= \'CurrencyISOCODE\' limit 49999'; currencyMappingList = database.query(query); CurrencyShopifyFieldValue = currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c; } String PricebookShopifyFieldValue = pricebook2MappingList[0].HIC_ShopifySync__Shopify_Fields__c; Map shopifyidVSproductidMap = new Map(); String queryFields = ''; if(Schema.sObjectType.Product2.fields.id.isAccessible()){ queryFields += 'Product2Id,'; } if(multiCurrencyEnabled){ //if(Schema.SObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE') && Schema.sObjectType.PricebookEntry.fields.getMap().containsKey('CurrencyISOCODE').isAccessible()){ if(Checkaccessibility.isAccessible('CurrencyISOCODE','PricebookEntry').equalsIgnoreCase('CurrencyISOCODE')){ queryFields += 'CurrencyISOCODE,'; } } if(Schema.sObjectType.Product2.fields.Name.isAccessible()){ queryFields += 'Product2.Name,'; } if(Schema.sObjectType.Product2.fields.HIC_ShopifySync__Shopify_Id__c.isAccessible()){ queryFields += 'Product2.HIC_ShopifySync__Shopify_Id__c,'; } if(Schema.sObjectType.PricebookEntry.fields.Pricebook2Id.isAccessible()){ queryFields += 'Pricebook2Id '; } Set pbEntry = new Set (); pbEntry = productVsPricebookEntryMap.keyset(); query = ''; if(multiCurrencyEnabled){ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And CurrencyISOCODE = \'' + CurrencyShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null'; }else{ query = 'Select '+ queryFields + 'From PricebookEntry Where Pricebook2Id = \''+ PricebookShopifyFieldValue + '\' And Product2.HIC_ShopifySync__Shopify_Id__c IN : pbEntry and Product2.HIC_ShopifySync__Shopify_Id__c != null' ; } List listOfPriceBookEntry = new List(); listOfPriceBookEntry = Database.query(query); if(!listOfPriceBookEntry.isEmpty()){ for(PricebookEntry obj : listOfPriceBookEntry){ if(productVsPricebookEntryMap.containskey(obj.Product2.HIC_ShopifySync__Shopify_Id__c)){ if(obj.Pricebook2Id == pricebook2MappingList[0].HIC_ShopifySync__Shopify_Fields__c) productVsPricebookEntryMap.put(obj.Product2.HIC_ShopifySync__Shopify_Id__c,obj.id); } } } List pricebookEntryListToInsert = new List(); List StandarPricebookList = new List(); StandarPricebookList = database.query('select '+Checkaccessibility.isAccessible('id,name', 'pricebook2')+' from pricebook2 where '+Checkaccessibility.isAccessible('IsStandard', 'pricebook2')+ ' = true LIMIT 1'); if(!productVsPricebookEntryMap.isEmpty()){ for(String obj : productVsPricebookEntryMap.keyset()){ if((productVsPricebookEntryMap.get(obj) == null || productVsPricebookEntryMap.get(obj) == '') && obj != null ) { if(!StandarPricebookList.isEmpty() && StandarPricebookList[0].id != pricebook2MappingList[0].HIC_ShopifySync__Shopify_Fields__c){ sObject standardPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; standardPbEntry.put('Pricebook2id',StandarPricebookList[0].id); if(multiCurrencyEnabled){ standardPbEntry.put('CurrencyISOCODE',currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c); } standardPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; standardPbEntry.putSObject('Product2',product); standardPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); PricebookEntry pbe = (PricebookEntry)standardPbEntry; pricebookEntryListToInsert.add(pbe); } sObject NewPbEntry = Schema.getGlobalDescribe().get('PricebookEntry').newSObject() ; NewPbEntry.put('Pricebook2id',pricebook2MappingList[0].HIC_ShopifySync__Shopify_Fields__c); if(multiCurrencyEnabled){ NewPbEntry.put('CurrencyISOCODE', currencyMappingList[0].HIC_ShopifySync__Shopify_Fields__c); } NewPbEntry.put('isActive',true); Product2 product = new Product2(); product.HIC_ShopifySync__shopify_Id__c = obj; NewPbEntry.putSObject('Product2',product); NewPbEntry.put('UnitPrice',decimal.valueof(productVsUnitePriceMap.get(obj))); PricebookEntry pbe = (PricebookEntry)NewPbEntry; pricebookEntryListToInsert.add(pbe); } } if(pricebookEntryListToInsert.IsEmpty()) return productVsPricebookEntryMap; try{ Database.SaveResult[] updateResult; if(CheckAccessibility.isInsertable('Pricebook2Id,isActive,Product2Id,UnitPrice', 'PricebookEntry')){ try{ updateResult = Database.insert(pricebookEntryListToInsert,false); }catch(Exception e){ system.debug('error--> '+e.getMessage()+' error all '+e); } } set setofinsert = new set(); for(Integer index = 0 ; index < updateResult.size() ; index ++){ if( updateResult[index].isSuccess() ){ setofinsert.add(updateResult[index].getId()); }else{ for(Database.Error error : updateResult[index].getErrors()){ system.debug('errorMsg--> '+error.getMessage()); } } } List listofinsetedpricebookEntry = new List(); String InsertedPbQuery; if(multiCurrencyEnabled){ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ + 'From PricebookEntry Where '+ CheckAccessibility.isAccessible('CurrencyISOCODE','PricebookEntry') +' = \'' + CurrencyShopifyFieldValue + '\' And id IN : setofinsert'; }else{ InsertedPbQuery = 'Select id,Pricebook2Id,Product2.HIC_ShopifySync__Shopify_Id__c '+ CheckAccessibility.isAccessible('Product2.HIC_ShopifySync__Shopify_Id__c','PricebookEntry') + 'From PricebookEntry Where id IN : setofinsert'; } listofinsetedpricebookEntry = Database.query(InsertedPbQuery); if(!listofinsetedpricebookEntry.isEmpty()){ for(PricebookEntry pbe : listofinsetedpricebookEntry){ if(pbe.Pricebook2Id == pricebook2MappingList[0].HIC_ShopifySync__Shopify_Fields__c){ productVsPricebookEntryMap.put(pbe.Product2.HIC_ShopifySync__Shopify_Id__c,pbe.Id); } } } } catch(Exception e){ system.debug('error '+e.getMessage()+' at line number' +e.getLineNumber()); } }*/ return productVsPricebookEntryMap; } /**************************************fillObjectValues*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Dynamic Field Mapping * Map Salesfoce field with Shopify Field * Map Shopify Field values into Salesforce based on Salesforce Field DataType * Retun list of Maped Salesforce and Shopify Field Values * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List FieldsList - Map of Shopify's Product External ID vs Pricebook Entry ID * @param String ObjectName - Shopify Entity's Name (Object name) * @param List objectList - list of records object to upser in Salesfroce * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static List fillObjectValues(List FieldsList, String ObjectName, List objectList, List configurationList){ new HIC_ShopifyUtility(configurationList); String companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey; String ListType = 'List<' + ObjectName + '>'; List sobjListToUpsert = (List)Type.forName(ListType).newInstance(); List accListToQuery = new List (); for(Object obj : objectList){ Map ObjectMap = (Map)obj; if(ObjectMap != null && !ObjectMap.isEmpty()){ SObject sObjRecord = processFieldTypeAndMapping(FieldsList,ObjectName,ObjectMap, configurationList, companyTimeZone); if(sObjRecord != null){ sobjListToUpsert.add(sObjRecord); } } } return sobjListToUpsert; } /**************************************processFieldTypeAndMapping*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Dynamic Field Mapping * Map Salesfoce field with Shopify Field * Map Shopify Field values into Salesforce based on Salesforce Field DataType * Retun Maped Salesforce and Shopify Field Values * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List fieldsMappingList - Map of Shopify's Product External ID vs Pricebook Entry ID * @param String ObjectName - Shopify Entity's Name (Object name) * @param Map objectMap - Map of single record of shopify * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static SObject processFieldTypeAndMapping(List fieldsMappingList, String ObjectName, Map objectMap, List configurationList, String companyTimeZone){ new HIC_ShopifyUtility(configurationList); //system.debug('check field---> '+ objectMap.get('default_address')); //system.debug('check MapJason---> '+ objectMap); system.debug('check MapJson!!!---> ' + JSON.serializePretty(objectMap)); system.debug('configlist---> ' + configurationList); if(ObjectName != null && ObjectName == 'Account'){ Decimal numberOfPages; try { numberOfPages = configurationList[0].HIC_ShopifySync__Number_of_pages_for_Account__c; } catch (Exception e) { // Field not queried in parent SOQL, fetch it here String configName = configurationList[0].Name; HIC_ShopifySync__HIC_Configuration__c configRecord = [ SELECT HIC_ShopifySync__Number_of_pages_for_Account__c FROM HIC_ShopifySync__HIC_Configuration__c WHERE Name = :configName LIMIT 1 ]; numberOfPages = configRecord.HIC_ShopifySync__Number_of_pages_for_Account__c; } // ✅ Apply nulling logic based on numberOfPages /* if (numberOfPages != 1 && numberOfPages != 3) { if (objectMap.containsKey('tags')) { objectMap.put('tags', null); } }*/ /* if (numberOfPages != 2 && numberOfPages != 3) { if (objectMap.containsKey('sms_marketing_consent')) { objectMap.put('sms_marketing_consent', null); } if (objectMap.containsKey('email_marketing_consent')) { objectMap.put('email_marketing_consent', null); } }*/ } //String companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey; SObject sObjRecord = Schema.getGlobalDescribe().get(ObjectName).newSObject() ; //Object type Schema.sObjectType objectDef = Schema.getGlobalDescribe().get(ObjectName).getDescribe().getSObjectType(); //Get Field Of Object Map ObjectFieldsMap = objectDef.getDescribe().fields.getMap(); System.debug('objectMap---'+objectMap); //System.debug('objectMap!!!---> ' + JSON.serializePretty(objectMap)); /************ Update Account and Contact Shopify External ID Based on their recordtype (Bussiness Account/ Person Account) ********/ //^^^^^^^^^Add account and id check in first outher if rather in each inner if statement if(Schema.sObjectType.Account.fields.getMap().containsKey( 'ispersonaccount' )){ //check if person account is selected by admin if (configurationList[0].HIC_ShopifySync__Person_Account__c && ObjectName == 'Account' ){ if(!(String.valueOf(objectMap.get('id'))).contains('Person ')) objectMap.put('id','Person '+String.valueOf(objectMap.get('id'))); //check if person account is not selected by admin }else if(!configurationList[0].HIC_ShopifySync__Person_Account__c && (ObjectName == 'Account' || ObjectName == 'Contact')){ if(!(String.valueOf(objectMap.get('id'))).contains('Business ')) objectMap.put('id','Business '+String.valueOf(objectMap.get('id'))); } }else{ //check if person account is not enabled in the org if( (ObjectName == 'Account' || ObjectName == 'Contact') && objectMap.containsKey('id') && !(String.valueOf(objectMap.get('id'))).contains('Business ')){ objectMap.put('id','Business '+String.valueOf(objectMap.get('id'))); } } //^^^^remove this line no where used Boolean personAccountExists = false; /******************* END ********************************/ if(ObjectFieldsMap.containsKey('HIC_ShopifySync__Store__c')){ sObjRecord.put('HIC_ShopifySync__Store__c', store); } /************ "Don't Override" field mapping support ******************** * HIC_ShopifySync__Is_Override__c (default true = current behaviour, always sync the value). * When an admin unchecks it on a field mapping, that field should only ever be *filled* by * Shopify (new record, or field currently blank on the existing record) and must never * clobber a value someone already set/edited in Salesforce. * fm.isSet(...) is used (instead of direct field access) so this stays a no-op for any * fieldsMappingList that wasn't queried with this field - i.e. callers/objects not yet * migrated to this behaviour are completely unaffected. ***************************************************************************/ Set noOverrideFieldNames = new Set(); for(HIC_ShopifySync__HIC_Field_Mapping__c fm : fieldsMappingList){ if(fm.isSet('HIC_ShopifySync__Is_Override__c') && fm.HIC_ShopifySync__Is_Override__c == false && String.isNotBlank(fm.HIC_ShopifySync__SF_Field__c) && ObjectFieldsMap.containsKey(fm.HIC_ShopifySync__SF_Field__c)){ noOverrideFieldNames.add(fm.HIC_ShopifySync__SF_Field__c); } } SObject existingRecordForOverrideCheck = null; if(!noOverrideFieldNames.isEmpty() && ObjectFieldsMap.containsKey('HIC_ShopifySync__Shopify_Id__c') && objectMap.get('id') != null){ String shopifyIdValue = String.valueOf(objectMap.get('id')); String existingRecordQuery = 'SELECT Id, ' + String.join(new List(noOverrideFieldNames), ', ') + ' FROM ' + ObjectName + ' WHERE HIC_ShopifySync__Shopify_Id__c = :shopifyIdValue LIMIT 1'; List existingRecordList = Database.query(existingRecordQuery); if(!existingRecordList.isEmpty()){ existingRecordForOverrideCheck = existingRecordList[0]; } } /******************* END "Don't Override" setup ********************/ // Loop on all field Mapping defined by the user on the page for(HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj : fieldsMappingList){ System.debug('fieldMappingObj--'+fieldMappingObj); //Use for make Unique key i= i+1; //Update the Opportunity Close date base on User values if filled. if (configurationList[0].HIC_ShopifySync__Specify_Close_Date__c && ObjectName == 'Opportunity' && fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'CloseDate' ){ fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c = String.valueof(system.today() + integer.valueof(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, date.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); continue; } //Update OrderFulfillment's Order and Opportunity field mapping based on user selection of Order/Opportunity if (!configurationList[0].HIC_ShopifySync__Opportunity__c && ObjectName == 'HIC_ShopifySync__Order_Fulfillment__c' && fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'HIC_ShopifySync__Opportunity__c' ){ continue; } if (!configurationList[0].HIC_ShopifySync__Order__c && ObjectName == 'HIC_ShopifySync__Order_Fulfillment__c' && fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'HIC_ShopifySync__Order__c' ){ continue; } //Get Field detail based on User Fill Schema.SobjectField dynamicObjField = ObjectFieldsMap.get(fieldMappingObj.HIC_ShopifySync__SF_Field__c); //If Salesfroce Field deleted then return //^^^^^^this should be happening on 1st line of this method if(dynamicObjField == null ){ continue; } //Get Field detail based on User Fill Schema.DescribeFieldResult fieldResult = dynamicObjField.getDescribe(); //Get DataType of Saleforce Field String fieldType = fieldResult.getType().name().toLowerCase(); // "Don't Override": field already has a value on the existing Salesforce record -> leave it alone. if(existingRecordForOverrideCheck != null && noOverrideFieldNames.contains(fieldMappingObj.HIC_ShopifySync__SF_Field__c)){ Object existingFieldValue = existingRecordForOverrideCheck.get(fieldMappingObj.HIC_ShopifySync__SF_Field__c); if(existingFieldValue != null && String.valueOf(existingFieldValue) != ''){ continue; } } if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c != null){ //Check field Access if(fieldResult.isUpdateable() || fieldResult.isCreateable()){ // Mapped default values into the Salesforce Field. Which either comes from user or custom code if(fieldMappingObj.HIC_ShopifySync__Default_Value__c == true){ if(fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'RecordTypeId' && string.valueof(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null && string.valueof(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != '' ){ Map gd = Schema.getGlobalDescribe(); Schema.SObjectType sobjType = gd.get(ObjectName); Schema.DescribeSObjectResult describeResult = sobjType.getDescribe(); Map rtMapByIdForCon = describeResult.getRecordTypeInfosById(); if(rtMapByIdForCon.containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)) { Schema.RecordTypeInfo rtById = rtMapByIdForCon.get(String.valueof(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); if(rtById.isActive()){ }else{ continue; } }else{ continue; } } System.debug('fieldMappingObj'+fieldMappingObj.HIC_ShopifySync__SF_Field__c+'--'+fieldMappingObj); System.debug('fieldType--'+fieldType); if(fieldType == 'boolean'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Boolean.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); }else if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' ){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, double.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); }else if( fieldType == 'percent' ){ if(double.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) > 100) { sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, double.valueOf(100)); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, double.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); } }else if(fieldType == 'integer'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, integer.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); } else if(fieldType == 'date'){ if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c != null && fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c != 'null'){ fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c = String.valueof(system.today() + integer.valueof(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, date.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); } }else if(fieldType == 'datetime'){ Datetime dt = dateTime.valueOf(String.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c).replace('T',' ')); DateTime dtTimeTimeZone=new TimeZoneServiceNew().convertDateTimeToOtherTimeZone(dt, 'UTC',companyTimeZone); //dtTimeTimeZone=new TimeZoneServiceNew().convertDateTimeToOtherTimeZone(dtTimeTimeZone, 'UTC',companyTimeZone); sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, dtTimeTimeZone); } else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, checkFieldLengthAndReturnValue(fieldResult,String.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c), configurationList)); } continue; } //Mappped Field which are defined by Code eg. OrderItem-PricebookEntryId if(fieldMappingObj.HIC_ShopifySync__IsSFID__c == true ){ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, checkFieldLengthAndReturnValue(fieldResult,String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)), configurationList)); } continue; } /******************** Mapped Field which have nested field Mapping with Shopify's field *********************/ /**************SHOPIFY NESTED FIELD MAPPING ********************************/ if(fieldMappingObj.HIC_ShopifySync__Nested__c != null && fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c != null){ /*********************Check Salesfroce's Field DataType****************/ //Salesforce Field DataTyep = currency, double, decimal, percent if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent' ){ Double doublevalue = 0; //Check Multiple Field Mapping if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(shopifyField)){ object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(shopifyField); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += double.valueof(objectFieldValue); } } } }else{ String nestedvalue = String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)); if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && nestedvalue != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += double.valueof(objectFieldValue); } } } //percentage if(fieldType == 'percent' && doublevalue > 100){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, double.valueof(100)); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, doublevalue); } } // Saleforce Field DataType = integer else if(fieldType == 'integer'){ Integer doublevalue = 0; //Check Multiple Field Mapping if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(shopifyField)){ object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(shopifyField); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += Integer.valueof(Double.valueOf(objectFieldValue)); } } } }else{ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += Integer.valueof(Double.valueOf(objectFieldValue)); } } } sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, doublevalue); } // Saleforce Field DataType = LookUp else if(fieldType == 'reference') { String relationshipName = fieldResult.getRelationshipName(); SObject parentObj = fieldResult.getReferenceTo()[0].newSObject(); String parentObjectName = fieldResult.getReferenceTo()[0].getDescribe().getName(); //If Salefroce Field Lookup on Account then we must update its Shopify External ID if((parentObjectName == 'Account' || parentObjectName == 'Contact') && objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c ) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()) != null){ if(configurationList[0].HIC_ShopifySync__Person_Account__c){ if(String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase())).contains('Person')){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); }else{ parentObj.put('HIC_ShopifySync__Shopify_Id__c','Person '+String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); } }else{ if(String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase())).containsIgnoreCase('business')){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); }else{ parentObj.put('HIC_ShopifySync__Shopify_Id__c','Business '+String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); } } sObjRecord.putSObject(relationshipName, parentObj); } // Mapped Lookup fields else if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c ) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()) != null){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); sObjRecord.putSObject(relationshipName, parentObj); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else if(fieldType == 'boolean'){ if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c ) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()) != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != ''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Boolean.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()))); } }else //Salesforce DataType = Date if(fieldType == 'date') {// if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c ) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()) != null){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Date.valueOf((String)((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else //Salesforce DataType = Date if(fieldType == 'datetime') { if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c ) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.toLowerCase()) != null){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, DateTime.valueOf(String.valueOf(((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)).replace('T',' '))); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else{ //Salesforce Field DataType is String String stringvalue = ''; if(fieldType != 'boolean' && fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ //System.debug('shopifyField===='+shopifyField); //System.debug('objectMap===='+objectMap); //System.debug('fieldMappingObj===='+fieldMappingObj); //System.debug('objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c)===='+objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c)); //System.debug('((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c))===='+((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c))); //System.debug('((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(shopifyField)===='+((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(shopifyField)); if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)) != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(shopifyField) ){ Object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(shopifyField); if(objectFieldValue != null){ stringvalue += String.valueof(objectFieldValue)+' '; } } } }else{ String nestedvalue = String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)); if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Nested__c) && nestedvalue != null && ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ system.debug('nestesvalue-->>> '+fieldMappingObj.HIC_ShopifySync__Nested__c+' objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)===>> '+objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)); Object objectFieldValue = ((Map)objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c)).get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null && objectFieldValue != '' ){ stringvalue += String.valueof(objectFieldValue); } } } sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, checkFieldLengthAndReturnValue(fieldResult, stringvalue, configurationList)); // Insert Default Values into the Salesforce Field which are required in the Salesforce if((!fieldResult.isNillable() || ((ObjectName == 'Account'|| ObjectName == 'Personaccount' ) && (fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'LastName' ||fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'lastname' || fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'name' || fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'Name'))) && (stringvalue == '' || stringvalue == null)){ if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Double.valueof(1)); } else if(fieldType == 'integer'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Integer.valueof(1)); } else if(fieldType == 'String'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,'REQ'+string.valueof(system.now().getTime()+ i+1)); }else if(fieldType == 'date'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.today()); }else if(fieldType == 'datetime'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.now()); }else if(fieldType == 'email'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,'required@hic.com'); } } } continue; } /************** SHOPIFY NESTED FIELD MAPPING END ********************************/ /************************** SHOPIFY SINGLE FIELD MAPPING ***************************************/ if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent' ) { Double doublevalue = 0; //Check Shopify multiple Field Mapping if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ if(objectMap.containsKey(shopifyField)){ Object objectFieldValue = objectMap.get(shopifyField); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += Double.valueof(objectFieldValue); } } } }else{ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ Object objectFieldValue = objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null && objectFieldValue != ''){ doublevalue += Double.valueof(objectFieldValue); } } } //DataType = Percentage if(fieldType == 'percent' && doublevalue > 100){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Double.valueof(100)); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, doublevalue); } }else // Salesforce Field Data Type = Integer if(fieldType == 'integer'){ Integer doublevalue = 0; if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ if(objectMap.containsKey(shopifyField)){ Object objectFieldValue = objectMap.get(shopifyField); if(objectFieldValue != null && objectFieldValue != ''){ doublevalue += Integer.valueof(double.valueof(objectFieldValue)); } } } }else{ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ Object objectFieldValue = objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null && objectFieldValue != '' ){ doublevalue += Integer.valueof(double.valueof(objectFieldValue)); } } } sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, doublevalue); } else //Salesforce DataType = Boolean if(fieldType == 'boolean') { if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != ''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Boolean.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); } } else //Salesforce DataType = Date if(fieldType == 'date') { if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != ''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Date.valueOf((String)objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else //Salesforce DataType = Date if(fieldType == 'datetime') { if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != ''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, DateTime.valueOf(String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)).replace('T',' '))); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else //Salesforce DataType = LookUp if(fieldType == 'reference') { String relationshipName = fieldResult.getRelationshipName(); String parentObjectName = fieldResult.getReferenceTo()[0].getDescribe().getName(); SObject parentObj = fieldResult.getReferenceTo()[0].newSObject(); // Define Variant and Inventory Item lookup relationship if(parentObjectName == 'HIC_ShopifySync__Variant__c' && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null){ System.debug('ObjectName--'+ObjectName); if(ObjectName=='OrderItem' || ObjectName=='DraftOrderItem' || ObjectName=='OpportunityLineItem' || ObjectName == 'HIC_ShopifySync__Checkout_LineItem__c'){ parentObj.put('HIC_ShopifySync__Shopify_id__c',String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); }else{ parentObj.put('HIC_ShopifySync__Inventory_Item_Id__c',String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); } sObjRecord.putSObject(relationshipName, parentObj); } // Define Account's Shopify External ID else if((parentObjectName == 'Account' || parentObjectName == 'Contact') && objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null){ if(configurationList[0].HIC_ShopifySync__Person_Account__c){ if(String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)).contains('Person')){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); }else{ parentObj.put('HIC_ShopifySync__Shopify_Id__c','Person '+String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); } }else{ if(String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)).containsIgnoreCase('business')){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); }else{ parentObj.put('HIC_ShopifySync__Shopify_Id__c','Business '+String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); } } sObjRecord.putSObject(relationshipName, parentObj); }else if(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c) != null){ parentObj.put('HIC_ShopifySync__Shopify_Id__c',String.valueOf(objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c))); sObjRecord.putSObject(relationshipName, parentObj); }else{ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, null); } } else { // Salesforce Single field Mapping and DataType = string String stringvalue = ''; if(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.contains(',')){ for(String shopifyField : fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c.split(',')){ if(objectMap.containsKey(shopifyField)){ Object objectFieldValue = objectMap.get(shopifyField); if(objectFieldValue != null){ stringvalue += String.valueof(objectFieldValue)+' '; } } } }else{ if(objectMap.containsKey(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)){ Object objectFieldValue = objectMap.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); if(objectFieldValue != null){ stringvalue += JSON.serialize(objectFieldValue).removeEnd('"').removeStart('"'); } } } sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, checkFieldLengthAndReturnValue(fieldResult, stringvalue, configurationList)); } } } // Insert Default Values into the Salesforce Field which are required in the Salesforce if((!fieldResult.isNillable() || ((ObjectName == 'Account'|| ObjectName == 'Personaccount' ) && (fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'LastName' || fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'lastname' || fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'name' || fieldMappingObj.HIC_ShopifySync__SF_Field__c == 'Name' ))) && (sObjRecord.get(fieldMappingObj.HIC_ShopifySync__SF_Field__c) == null || sObjRecord.get(fieldMappingObj.HIC_ShopifySync__SF_Field__c) == '' )){ if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Double.valueof(1)); } else if(fieldType == 'integer'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Integer.valueof(1)); } else if(fieldType == 'String'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,'REQ'+string.valueof(system.now().getTime()+ i+1)) ; }else if(fieldType == 'date'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.today()); }else if(fieldType == 'datetime'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.now()); }else if(fieldType == 'email'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,string.valueof(i++)+ 'required@hic.com'); } } /************************** SHOPIFY SINGLE FIELD MAPPING END ***************************************/ } // Return Object with Salesfroce Field And Shopify Field Value base user configure field mapping on the page System.debug('sObjRecord---'+sObjRecord); return sObjRecord; } /**************************************checkFieldLengthAndReturnValue*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Use for Dynamic Field Mapping * Map Salesfoce field with Shopify Field * Map Shopify Field values into Salesforce based on Salesforce Field DataType * Retun Maped Salesforce and Shopify Field Values * ────────────────────────────────────────────────────────────────────────────────────────────── * @param Schema.DescribeFieldResult fieldResult - for get field length and more details * @param String body - Shopify Entity's field value * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static String checkFieldLengthAndReturnValue(Schema.DescribeFieldResult fieldResult, String body, List configurationList){ new HIC_ShopifyUtility(configurationList); if(fieldResult.getLength() > 0 && body != null && body != ''){ if( body.length() <= fieldResult.getLength()){ return body; }else{ return body.subString(0,fieldResult.getLength()); } }else{ return ''; } } /**************************************deleteCustomAppFromStore*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Delete Custom app form Shopify Store - When uninstall package from Salesforce * more details: https://shopify.dev/tutorials/make-paginated-requests-to-rest-admin-api * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Boolean deleteCustomAppFromStore(List configurationList){ //new HIC_ShopifyUtility(configurationList); for(HIC_ShopifySync__HIC_Configuration__c config : configurationList){ Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue = config.HIC_ShopifySync__Shopify_URL__c + '/admin/api_permissions/current.json'; req.setEndpoint(endPointValue); req.setClientCertificateName('Shopify'); req.setHeader('X-Shopify-Access-Token', config.HIC_ShopifySync__Private_Key_Password__c); req.setHeader('content-type', 'application/json'); req.setMethod('DELETE'); req.setTimeout(120000); try { HttpResponse res ; res = h.send(req); responseBody = res.getBody(); if(res.getStatusCode() == 200){ return true; } }catch(Exception e){ return false; } } return false; } /**************************************FetchCustomerJob*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Delete Custom app form Shopify Store - When uninstall package from Salesforce * more details: https://shopify.dev/tutorials/make-paginated-requests-to-rest-admin-api * ────────────────────────────────────────────────────────────────────────────────────────────── * @param List configurationList - ListofConfigurationSettings * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public without sharing class FetchCustomerJob implements Queueable, Database.AllowsCallouts { private final String configId; private final String customerId; private final String store; private final String originalPayload; public FetchCustomerJob(String configId, String customerId, String store, String originalPayload) { this.configId = configId; this.customerId = customerId; this.store = store; this.originalPayload = originalPayload; } public void execute(QueueableContext ctx) { try { List configList = [ SELECT Name, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__Private_Key_Password__c FROM HIC_ShopifySync__HIC_Configuration__c WHERE Id = :configId LIMIT 1 ]; if (configList.isEmpty()) { System.debug('No configuration found for Id: ' + configId); return; } HIC_ShopifySync__HIC_Configuration__c config = configList[0]; if (String.isBlank(config.HIC_ShopifySync__Shopify_URL__c) || String.isBlank(config.HIC_ShopifySync__Private_Key_Password__c)) { System.debug('Missing Shopify URL or Access Token for config: ' + configId); return; } Http http = new Http(); HttpRequest req1 = new HttpRequest(); String endpoint1 = config.HIC_ShopifySync__Shopify_URL__c + '/admin/customers/' + customerId + '.json'; req1.setEndpoint(endpoint1); req1.setHeader('X-Shopify-Access-Token', config.HIC_ShopifySync__Private_Key_Password__c); req1.setHeader('Content-Type', 'application/json'); req1.setMethod('GET'); HttpResponse res1 = http.send(req1); if (res1.getStatusCode() != 200) { System.debug('Shopify Customer Error: ' + res1.getStatusCode() + ' → ' + res1.getBody()); return; } Map resMap = (Map) JSON.deserializeUntyped(res1.getBody()); if (resMap == null || !resMap.containsKey('customer')) { System.debug('Unexpected Customer JSON: ' + res1.getBody()); return; } Map customerJson = (Map) resMap.get('customer'); Integer ordersCount = 0; if (customerJson.containsKey('orders_count')) { ordersCount = Integer.valueOf(String.valueOf(customerJson.get('orders_count'))); } System.debug('Shopify Orders Count = ' + ordersCount); List mappingList = [ SELECT Id, HIC_ShopifySync__Shopify_Fields__c, HIC_ShopifySync__Object_Name__c FROM HIC_ShopifySync__HIC_Field_Mapping__c WHERE HIC_ShopifySync__Object_Name__c IN ('Account', 'Contact', 'PersonAccount') AND HIC_ShopifySync__Shopify_Fields__c = 'metafields' AND HIC_ShopifySync__Store__c = :config.Name LIMIT 1 ]; String metafieldsPayload = null; if (!mappingList.isEmpty()) { HttpRequest req2 = new HttpRequest(); String endpoint2 = config.HIC_ShopifySync__Shopify_URL__c + '/admin/customers/' + customerId + '/metafields.json'; req2.setEndpoint(endpoint2); req2.setHeader('X-Shopify-Access-Token', config.HIC_ShopifySync__Private_Key_Password__c); req2.setHeader('Content-Type', 'application/json'); req2.setMethod('GET'); HttpResponse res2 = http.send(req2); if (res2.getStatusCode() == 200) { metafieldsPayload = res2.getBody(); } else { System.debug('Metafields API Error: ' + res2.getStatusCode() + ' → ' + res2.getBody()); } } if (metafieldsPayload != null) { try { Map metaJson = (Map) JSON.deserializeUntyped(metafieldsPayload); if (metaJson != null && metaJson.containsKey('metafields')) { List metafieldsList = (List) metaJson.get('metafields'); // Insert metafields list into customer JSON customerJson.put('metafields', metafieldsList); } } catch (Exception mergeEx) { System.debug('Error merging metafields: ' + mergeEx.getMessage()); } } String finalMergedPayload = JSON.serialize(customerJson); // Deserialize to modify email Map customerMap = (Map) JSON.deserializeUntyped(finalMergedPayload); // Normalize email to lowercase if (customerMap.containsKey('email') && customerMap.get('email') != null) { customerMap.put( 'email', String.valueOf(customerMap.get('email')).toLowerCase() ); } // Serialize back and overwrite SAME variable finalMergedPayload = JSON.serialize(customerMap); System.debug('Updated finalMergedPayload: ' + finalMergedPayload); System.enqueueJob( new RouteAfterCount( finalMergedPayload, store, ordersCount ) ); } catch (Exception e) { System.debug('FetchCustomerJob Error: ' + e.getMessage()); } } } // ------------------------------------------------------------ public without sharing class RouteAfterCount implements Queueable { private final String payload; private final String store; private final Integer ordersNow; public RouteAfterCount(String payload, String store, Integer ordersNow) { this.payload = payload; this.store = store; this.ordersNow = ordersNow; } public void execute(QueueableContext ctx) { try { // Fetch configuration List configList = [ SELECT HIC_ShopifySync__Enable_Lead__c, HIC_ShopifySync__Upsert_Customer_basis_on_Email__c, HIC_ShopifySync__Person_Account__c FROM HIC_ShopifySync__HIC_Configuration__c WHERE Name = :store LIMIT 1 ]; System.debug('payload-->>' + payload); Boolean enableLead = false; Boolean upsertCustomerOnEmail = false; if (!configList.isEmpty()) { enableLead = configList[0].HIC_ShopifySync__Enable_Lead__c; upsertCustomerOnEmail = configList[0].HIC_ShopifySync__Upsert_Customer_basis_on_Email__c; } else { System.debug('No configuration found for store: ' + store); } // ----------------------------------------- // Extract email from Shopify payload (ROOT LEVEL) // ----------------------------------------- Map parsed = (Map) JSON.deserializeUntyped(payload); String customerEmail = String.valueOf(parsed.get('email')); System.debug('Extracted Shopify Email ==>' + customerEmail); if (ordersNow == 0 && enableLead) { // Case 1.1 — DO NOT UPSERT ON EMAIL if (!upsertCustomerOnEmail) { System.debug('Lead creation because upsertCustomerOnEmail = FALSE'); HIC_ShopifySync.UpdateCustomerFromShopify.createLead(payload, store); } // Case 1.2 — UPSERT ON EMAIL = TRUE else { System.debug('upsertCustomerOnEmail = TRUE, Checking Contact by Email...'); List conLst = [ SELECT Id, Email FROM Contact WHERE Email = :customerEmail order by createddate DESC LIMIT 1 ]; System.debug('Contact Lookup Result ==>' + conLst); if (!conLst.isEmpty()) { System.debug('Contact exists. Calling createAccountContact()'); HIC_ShopifySync.UpdateCustomerFromShopify.createAccountContact(payload, store); } else { // CONTACT NOT FOUND → CREATE LEAD BRANCH System.debug('No Contact found. Creating Lead...'); HIC_ShopifySync.UpdateCustomerFromShopify.createLead(payload, store); } } } else if (ordersNow > 0 && enableLead) { System.debug('Existing Lead detected. Converting...'); HIC_ShopifySync.UpdateCustomerFromShopify.convertLead(payload, store); } else { System.debug('Lead disabled. Calling createAccountContact().'); HIC_ShopifySync.UpdateCustomerFromShopify.createAccountContact(payload, store); } } catch (Exception e) { System.debug('RouteAfterCount Error: ' + e.getMessage()); } } } /* * ADDED NEW METHOD FROM SHOPIFYCONTROLLER CLASS */ /******************************************************************************************** * Created Date:- 29/04/2024 * Modified Date :- 29/04/2024 * Description:- This method is used to count the records of the Shopify. * We have to pass the store name and the object names to count the number of records * at shopify side. * Object name:- locations, products, customers(Account)variants, orders, collects, * locations, draft_orders * * * **********************************************************************************************/ public static string getShopifyRecordCounts(String storeUrl, String objectName, String password){ String result = 'Error!'; try{ Http h = new Http(); HttpRequest req = new HttpRequest(); String endPointValue; if(objectName == 'orders'){ endPointValue = storeUrl + 'admin/' + objectName + '/count.json?status=any'; }else{ endPointValue = storeUrl + 'admin/' + objectName + '/count.json'; } req.setEndpoint(endPointValue); req.setMethod('GET'); req.setTimeout(120000); req.setHeader('X-Shopify-Access-Token', password); req.setHeader('content-type', 'application/json'); req.setMethod('GET'); HttpResponse res = h.send(req); if (res.getStatusCode() == 200) { result = res.getBody(); } }catch(Exception e){ result = '@@@ some Error Occured at line : ' +e.getLineNumber() +' with Error : ' +e.getMessage(); } return result; } /**************************************oauthLogin*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * METHOD TO FETCH THE ACCESS TOKEN * * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ /** * ROTATION-SAFE: this method no longer performs its own grant_type=refresh_token exchange. * * It used to. Under mandatory Refresh Token Rotation that exchange consumed the stored refresh token * and issued a replacement, but the replacement was persisted through ShopifyController.getCryptoKey() * — a CheckAccessibility-filtered dynamic query that returns null/empty whenever the running user * lacks FLS. In that case the old code logged 'No refresh token found' and then STILL RETURNED the * access token as if everything had worked, discarding the only copy of the new refresh token. The * DML was also wrapped in a catch that only called System.debug. Either way the org was left holding * a dead token, with no error surfaced, and died on the next refresh days later. * * All rotation is now centralised in TokenService, which locks the row, persists fail-loud, and never * throws a rotated token away. The refreshToken/clientId/clientSecret arguments are retained for * signature compatibility but are no longer used to mint tokens. */ public static String oauthLogin(String refreshToken, String clientIdProduction, String clientSecretproduction ){ if (String.isBlank(refreshToken)) { return 'No access token found'; } try { String token = TokenService.getFreshAccessToken(null, false); return String.isNotBlank(token) ? token : 'No access token found'; } catch (TokenService.ReauthRequiredException e) { return 'INVALID_GRANT'; } catch (Exception e) { System.debug('HIC_ShopifyUtility.oauthLogin delegated refresh failed: ' + e.getMessage()); return 'No access token found'; } } public class readToken { public string access_token { get; set; } public string instance_url { get; set; } } /**************************************CheckshopifycertificateandRemotesite*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Verfiy RemoteSite Setting exist or not * @param String Urltype - certificate/RemoteSite based on value check existance * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Boolean CheckshopifycertificateandRemotesite(String Urltype, String AccessToken, String SFdomainUrl) { Boolean exist = false; HttpRequest req = new HttpRequest(); req.setHeader( 'Authorization', 'Bearer ' + AccessToken ); req.setHeader('Content-Type', 'application/json'); String query; if (Urltype == 'certificate') { query = 'select+id,+DeveloperName+from+Certificate+where+DeveloperName=+\'Shopify\'+and+ExpirationDate+>=+today'; system.debug('@ this is the certificate block :: '+query); } else { query = 'select+id,+EndpointUrl+from+Remotesitesetting+where+EndpointUrl=+\'' + SFdomainUrl + '\''; } String domainUrl = URL.getOrgDomainUrl().toExternalForm(); req.setEndpoint( domainUrl + '/services/data/v58.0/tooling/query/?q=' + query ); req.setMethod('GET'); req.setTimeout(120000); try{ Http h = new Http(); HttpResponse response; String CertificateResponse; system.debug('@@@ this is the request ::: ' + req); if (!Test.isRunningTest()) { response = h.send(req); CertificateResponse = response.getBody().trim(); system.debug('This is the certificate response:::: ' + CertificateResponse); } else { CertificateResponse = '{"size":1,"totalSize":1,"done":true,"queryLocator":null,"entityTypeName":"Certificate","records":[{"attributes":{"type":"Certificate","url":"/services/data/v58.0/tooling/sobjects/Certificate/0P12v000006b5K9CAI"},"Id":"0P12v000006b5K9CAI","DeveloperName":"Shopify"}]}'; } Map mapofcertificate = (Map) JSON.deserializeUntyped(CertificateResponse); if ( !mapofcertificate.isempty() && mapofcertificate != null && mapofcertificate.containskey('size') ) { if (Integer.valueof(mapofcertificate.get('size')) > 0) { exist = true; } } }catch(Exception e){ exist = false; } return exist; } /**************************************checkCreds*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Verify Shopify Credetials via callout into the Shopify * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Boolean checkCreds(String shopifyUrl, String password){ try{ Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String endPointValue = shopifyUrl + '/admin/shop.json'; req.setEndpoint(endPointValue); //Adding certificate to HTTP Requests req.setClientCertificateName('Shopify'); req.setHeader('X-Shopify-Access-Token', password); req.setHeader('content-type', 'application/json'); req.setMethod('GET'); req.setTimeout(120000); HttpResponse res ; res = h.send(req); responseBody = res.getBody(); if(res.getStatusCode() == 200){ return True; } }catch(Exception e){ return false; } return false; } /**************************************CheckingRemotesiteExistence*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Verfiy RemoteSite Setting exist or not * @param String SFdomainUrl - RemoteSite based on value check existance * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static boolean CheckingRemotesiteExistence(String SFdomainUrl, String accessToken, String OrgURl){ boolean exist = false; try{ HttpRequest req = new HttpRequest(); req.setHeader('Authorization', 'Bearer ' + accessToken); req.setHeader('Content-Type', 'application/json'); String query='select+id,+EndpointUrl+from+Remotesitesetting+where+EndpointUrl=+\''+SFdomainUrl+'\''; req.setEndpoint(OrgURl+'/services/data/v58.0/tooling/query/?q='+query); req.setMethod('GET'); req.setTimeout(120000); Http h = new Http(); HttpResponse response; String RemotesitesettingResponse; if(!Test.isRunningTest()){ response = h.send(req); RemotesitesettingResponse = response.getBody().trim(); }else{ RemotesitesettingResponse = '{"size":0,"totalSize":1,"done":true,"queryLocator":null,"entityTypeName":"Certificate","records":[{"attributes":{"type":"Certificate","url":"/services/data/v58.0/tooling/sobjects/Certificate/0P12v000006b5K9CAI"},"Id":"0P12v000006b5K9CAI","DeveloperName":"Shopify"}]}'; } if(RemotesitesettingResponse == null || RemotesitesettingResponse =='') return false; Map mapofRemoteSitesettings = (Map) JSON.deserializeUntyped(RemotesitesettingResponse); if(!mapofRemoteSitesettings.isempty() && mapofRemoteSitesettings != null && mapofRemoteSitesettings.containskey('size')){ if(Integer.valueof(mapofRemoteSitesettings.get('size')) > 0){ exist = true; } } return exist; }catch(Exception e){ System.debug('Error '+ e.getMessage() + ' Line Number '+ e.getLineNumber()); return exist; } } /**************************************CheckingRemotesiteExistence*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * Verfiy RemoteSite Setting exist or not * @param String SFdomainUrl - RemoteSite based on value check existance * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static Boolean checkRemotesiteExists(String remoteSiteUrl, String domainUrl){ Boolean result = false; try{ HttpRequest req = new HttpRequest(); req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID()); //Get user Session ID req.setHeader('Content-Type', 'application/json'); String query='select+id,+EndpointUrl+from+Remotesitesetting+where+EndpointUrl=+\''+remoteSiteUrl+'\''; req.setEndpoint(domainUrl+'/services/data/v58.0/tooling/query/?q='+query); req.setMethod('GET'); req.setTimeout(120000); Http h = new Http(); HttpResponse response; String RemotesitesettingResponse; if(!Test.isRunningTest()){ response = h.send(req); RemotesitesettingResponse = response.getBody().trim(); }else{ RemotesitesettingResponse = '{"size":0,"totalSize":1,"done":true,"queryLocator":null,"entityTypeName":"Certificate","records":[{"attributes":{"type":"Certificate","url":"/services/data/v58.0/tooling/sobjects/Certificate/0P12v000006b5K9CAI"},"Id":"0P12v000006b5K9CAI","DeveloperName":"Shopify"}]}'; } if(RemotesitesettingResponse == null || RemotesitesettingResponse =='') return false; Map mapofRemoteSitesettings = (Map) JSON.deserializeUntyped(RemotesitesettingResponse); if(!mapofRemoteSitesettings.isempty() && mapofRemoteSitesettings != null && mapofRemoteSitesettings.containskey('size')){ if(Integer.valueof(mapofRemoteSitesettings.get('size')) > 0){ result = true; } } return result; }Catch(Exception e){ System.debug('Exception---- '+ e); return result; } } /**************************************checkAccesScope*************************************************/ /** * ─────────────────────────────────────────────────────────────────────────────────────────────┐ * check Shopify store access for the entity * ────────────────────────────────────────────────────────────────────────────────────────────── * ─────────────────────────────────────────────────────────────────────────────────────────────┘ */ public static String checkAccesScope(String shopifyUrl, String password){ Http h = new Http(); HttpRequest req = new HttpRequest(); String responseBody; String AccessResponse = ''; String endPointValue = shopifyUrl + '/admin/oauth/access_scopes.json'; 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){ map main = (map) JSON.deserializeUntyped(responseBody); if(!main.isempty() && main.containskey('access_scopes')){ List objectList = (list) main.get('access_scopes'); for(object accessobj : objectList){ map accessScopeMap = (map)accessobj ; if(!accessScopeMap.isEmpty() && accessScopeMap.containskey('handle') && accessScopeMap.get('handle') != null){ AccessResponse += accessScopeMap.get('handle')+ ','; } } }if(AccessResponse != null || AccessResponse != '' ){ AccessResponse.removeEnd(','); return AccessResponse; } } }catch(Exception e){ return null; } return null; } }