/** * ─────────────────────────────────────────────────────────────────────────────────────────────────┐ * This batch class is handle webhook craete process into the Shopify platform. * Using Shopify API we are creating the webhooks into the Shopify. * As per the user requirement we are creating webhooks and delete as well. * We must create webhool for customer and product. * 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 * ────────────────────────────────────────────────────────────────────────────────────────────────── */ global with sharing class BatchForCreateWebhookMultiStore implements Database.Batchable, Database.AllowsCallouts, Database.Stateful{ //Providing Username and Password public static string USER_NAME; public static string PASSWORD; //Provide URL of the Shopify store to HTTP requests public static string shopifyUrl; String store = 'Default'; public static List configurationList = new List(); global BatchForCreateWebhookMultiStore(String store){ this.store = store; configurationList = [Select id, name, HIC_ShopifySync__Shopify_URL__c, HIC_ShopifySync__API_Key__c, HIC_ShopifySync__Private_Key_Password__c, HIC_ShopifySync__Opportunity__c, HIC_ShopifySync__Order__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c, HIC_ShopifySync__Person_Account__c,HIC_ShopifySync__Enable_Draft_Order__c from HIC_ShopifySync__HIC_Configuration__c where HIC_ShopifySync__Store__c =: store limit 1]; 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; } global BatchForCreateWebhookMultiStore(){ } List webhookListToPass = new List (); global Iterable start(Database.BatchableContext bc){ List webhookList; if(store != 'Default'){ List config = [Select id, HIC_ShopifySync__Shopify_Objects__c, HIC_ShopifySync__Opportunity_Sync__c, HIC_ShopifySync__Inventory_Location_Sync__c, HIC_ShopifySync__Draft_Order_Sync__c, HIC_ShopifySync__Order_Sync__c, HIC_ShopifySync__Customer_Sync__c, HIC_ShopifySync__Collection_Sync__c, HIC_ShopifySync__Product_Sync__c, HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Enable_Draft_Order__c,HIC_ShopifySync__Inventory_Location__c from HIC_ShopifySync__HIC_Configuration__c WHERE HIC_ShopifySync__Store__c=: store LIMIT 1]; Set selectedObjects = new Set (); for (HIC_ShopifySync__HIC_Configuration__c con : config){ if(con.HIC_ShopifySync__Order_Sync__c ){ selectedObjects.add('Order'); } if(con.HIC_ShopifySync__Draft_Order_Sync__c ){ selectedObjects.add('DraftOrder'); } if(con.HIC_ShopifySync__Customer_Sync__c){ selectedObjects.add('Customer'); } if(con.HIC_ShopifySync__Collection_Sync__c){ selectedObjects.add('HIC_ShopifySync__Collection__c'); } if(con.HIC_ShopifySync__Product_Sync__c){ selectedObjects.add('Product2'); } if(con.HIC_ShopifySync__Inventory_Location__c){ selectedObjects.add('HIC_ShopifySync__Inventory_Level__c'); selectedObjects.add('HIC_ShopifySync__Location__c'); } if(con.HIC_ShopifySync__Shopify_Objects__c != null && con.HIC_ShopifySync__Shopify_Objects__c != ''){ for(String shObject : con.HIC_ShopifySync__Shopify_Objects__c.split(',')){ selectedObjects.add(shObject); } } } webhookList = [Select HIC_ShopifySync__Store__c,HIC_ShopifySync__SF_URL_Mapping__c, HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__Topic__c,HIC_ShopifySync__Metafields_Namespace__c, HIC_ShopifySync__Webhook_Id__c from HIC_ShopifySync__HIC_Webhook__c where HIC_ShopifySync__Shopify_Object__c IN: selectedObjects AND HIC_ShopifySync__Store__c =: store LIMIT 500]; }else{ webhookList = [Select HIC_ShopifySync__Store__c,HIC_ShopifySync__SF_URL_Mapping__c, HIC_ShopifySync__Shopify_Object__c,HIC_ShopifySync__DML_Type__c,HIC_ShopifySync__Topic__c,HIC_ShopifySync__Metafields_Namespace__c, HIC_ShopifySync__Webhook_Id__c from HIC_ShopifySync__HIC_Webhook__c where HIC_ShopifySync__Store__c != 'Default' LIMIT 2000]; } return webhookList; } global void execute(Database.BatchableContext bc , List scope){ String orgId = UserInfo.getOrganizationId(); List confList; if(Schema.sObjectType.HIC_ShopifySync__HIC_Configuration__c.isAccessible() && Schema.sObjectType.HIC_ShopifySync__HIC_Configuration__c.fields.Salesforce_Site_URL__c.isAccessible() && Schema.sObjectType.HIC_ShopifySync__HIC_Configuration__c.fields.name.isAccessible()) confList = [Select id, HIC_ShopifySync__Shopify_Objects__c, HIC_ShopifySync__Opportunity_Sync__c, HIC_ShopifySync__Inventory_Location_Sync__c, HIC_ShopifySync__Draft_Order_Sync__c, HIC_ShopifySync__Order_Sync__c, HIC_ShopifySync__Customer_Sync__c, HIC_ShopifySync__Collection_Sync__c, HIC_ShopifySync__Product_Sync__c, HIC_ShopifySync__Salesforce_Site_URL__c,HIC_ShopifySync__Enable_Draft_Order__c,HIC_ShopifySync__Inventory_Location__c from HIC_ShopifySync__HIC_Configuration__c WHERE HIC_ShopifySync__Store__c =: scope[0].HIC_ShopifySync__Store__c LIMIT 1]; if(confList.isEmpty()) return; string webhookURL; if(!ShopifyController.isSiteSupportedOrg()){ system.debug('@@@ NON SITE confList[0].HIC_ShopifySync__Salesforce_Site_URL__c BEFORE: '+confList[0].HIC_ShopifySync__Salesforce_Site_URL__c); //webhookURL = confList[0].HIC_ShopifySync__Salesforce_Site_URL__c+'/api/webhook/shopify/'+Scope[0].HIC_ShopifySync__SF_URL_Mapping__c+'?objectname='+Scope[0].HIC_ShopifySync__Shopify_Object__c+'&DMLType='+Scope[0].HIC_ShopifySync__DML_Type__c+'&store='+scope[0].HIC_ShopifySync__Store__c+'&orgId='+orgId; webhookURL = confList[0].HIC_ShopifySync__Salesforce_Site_URL__c+'/api/webhook/shopify?objectname='+Scope[0].HIC_ShopifySync__Shopify_Object__c+'&DMLType='+Scope[0].HIC_ShopifySync__DML_Type__c+'&store='+scope[0].HIC_ShopifySync__Store__c+'&orgId='+orgId; }else{ system.debug('@@@ SITE confList[0].HIC_ShopifySync__Salesforce_Site_URL__c BEFORE: '+confList[0].HIC_ShopifySync__Salesforce_Site_URL__c); webhookURL = confList[0].HIC_ShopifySync__Salesforce_Site_URL__c+'/services/apexrest/HIC_ShopifySync/'+Scope[0].HIC_ShopifySync__SF_URL_Mapping__c+'?objectname='+Scope[0].HIC_ShopifySync__Shopify_Object__c+'&DMLType='+Scope[0].HIC_ShopifySync__DML_Type__c+'&store='+scope[0].HIC_ShopifySync__Store__c; } system.debug('@@@ webhookURL : '+webhookURL); //string webhookURL = confList[0].HIC_ShopifySync__Salesforce_Site_URL__c+'/services/apexrest/HIC_ShopifySync/'+Scope[0].HIC_ShopifySync__SF_URL_Mapping__c+'?objectname='+Scope[0].HIC_ShopifySync__Shopify_Object__c+'&DMLType='+Scope[0].HIC_ShopifySync__DML_Type__c+'&store='+scope[0].HIC_ShopifySync__Store__c+'&orgId='+orgId; Set selectedObjects = new Set (); if(store == 'Default'){ for (HIC_ShopifySync__HIC_Configuration__c con : confList){ if(con.HIC_ShopifySync__Order_Sync__c ){ selectedObjects.add('Order'); } if(con.HIC_ShopifySync__Draft_Order_Sync__c ){ selectedObjects.add('DraftOrder'); } if(con.HIC_ShopifySync__Customer_Sync__c){ selectedObjects.add('Customer'); } if(con.HIC_ShopifySync__Collection_Sync__c){ selectedObjects.add('HIC_ShopifySync__Collection__c'); } if(con.HIC_ShopifySync__Product_Sync__c){ selectedObjects.add('Product2'); } if(con.HIC_ShopifySync__Inventory_Location__c){ selectedObjects.add('HIC_ShopifySync__Inventory_Level__c'); selectedObjects.add('HIC_ShopifySync__Location__c'); } if(con.HIC_ShopifySync__Shopify_Objects__c != null && con.HIC_ShopifySync__Shopify_Objects__c != ''){ for(String shObject : con.HIC_ShopifySync__Shopify_Objects__c.split(',')){ selectedObjects.add(shObject); } } } if(!selectedObjects.contains(Scope[0].HIC_ShopifySync__Shopify_Object__c)) return; } webhookClass webhookObj = new webhookClass(); webhookClass.cls_webhook innerObj = new webhookClass.cls_webhook(); innerObj.topic = Scope[0].HIC_ShopifySync__Topic__c; innerObj.format = 'json'; innerObj.address = webhookURL; if(Scope[0].HIC_ShopifySync__Metafields_Namespace__c!=null && Scope[0].HIC_ShopifySync__Metafields_Namespace__c.trim() != ''){ innerObj.metafield_namespaces = (Object[])JSON.deserializeUntyped(Scope[0].HIC_ShopifySync__Metafields_Namespace__c); } webhookObj.webhook = innerObj; string webhookBody = JSON.serialize(webhookObj); system.debug('webhookbody-->'+json.serializepretty(webhookBody)); Map responseMap = HICWebhookUtility.processRequest('webhooks','POST',webhookBody,scope[0].HIC_ShopifySync__Store__c); if(responseMap.containsKey('Ok')){ webhookClass webhookResponseObj = (webhookClass)JSON.deserialize(responseMap.get('Ok'), webhookClass.class); Scope[0].Webhook_Id__c = webhookResponseObj.webhook.id; try{ update Scope[0]; //return 'Webhook created in Shopify'; }catch(Exception e){ system.debug('***Error in--'+e.getMessage()); } } } global void finish(Database.BatchableContext bc){ } }