360 lines
23 KiB
OpenEdge ABL
360 lines
23 KiB
OpenEdge ABL
/**
|
|
* @description : Use for Generic Method
|
|
* @author : Satyam Mishra
|
|
* @group :
|
|
* @last modified on : 21-jan- 2025
|
|
* @last modified by : Satyam Mishra
|
|
**/
|
|
global with sharing class SyncShopifyBatch implements Database.Batchable<Object>, Database.allowscallouts, Database.Stateful{
|
|
|
|
Boolean checkException = false;
|
|
String linkForNextPage = '';
|
|
Boolean isRelatedUrl = false;
|
|
Boolean isEnd = false;
|
|
String store = 'Default';
|
|
String updated_at_min = '';
|
|
String updated_at_max = '';
|
|
String resourceName='';
|
|
String parentResource ='';
|
|
List<HIC_ShopifySync__HIC_Configuration__c> listOfConfiguration;
|
|
List<HIC_ShopifySync__Object_Mapping__c> relatedObjectMapping;
|
|
List<HIC_ShopifySync__Object_Mapping__c> objectMappingList;
|
|
List<String> listOfparentId = new List<String>();
|
|
String companyTimeZone;
|
|
|
|
global SyncShopifyBatch(String linkForNextPage,Boolean isEnd, String store, String updated_at_min, String updated_at_max,String resourceName, List<HIC_ShopifySync__Object_Mapping__c> objectMappingList){
|
|
|
|
this.linkForNextPage = linkForNextPage;
|
|
this.isEnd = isEnd;
|
|
this.objectMappingList =objectMappingList;
|
|
this.isRelatedUrl =false;
|
|
checkException = false;
|
|
this.store = store;
|
|
this.updated_at_min = updated_at_min;
|
|
this.updated_at_max = updated_at_max;
|
|
this.resourceName=resourceName;
|
|
this.companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey;
|
|
}
|
|
|
|
global SyncShopifyBatch(String linkForNextPage, Boolean isEnd, List<String> listOfparentId, String parentResource, String resourceName ,List<HIC_ShopifySync__Object_Mapping__c> relatedObjectMapping, String updated_at_min, String updated_at_max, String store){
|
|
|
|
this.resourceName =resourceName;
|
|
this.linkForNextPage = linkForNextPage;
|
|
this.isEnd = isEnd;
|
|
this.store = store;
|
|
this.isRelatedUrl = true;
|
|
this.parentResource = parentResource;
|
|
this.relatedObjectMapping = relatedObjectMapping;
|
|
//this.objectMappingList = relatedObjectMapping;
|
|
this.listOfparentId = listOfparentId;
|
|
this.companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey;
|
|
}
|
|
|
|
|
|
global Iterable<Object> start(Database.BatchableContext bc) {
|
|
String JSONResponseBody = '';
|
|
String JSONResponse = '';
|
|
String queryForConfig = 'Select ' + CheckAccessibility.isAccessible('HIC_ShopifySync__Chunk_Size__c,id,HIC_ShopifySync__AccountContactBatchCompleted__c,HIC_ShopifySync__Draft_Order_Sync__c,HIC_ShopifySync__Order_Sync__c,HIC_ShopifySync__Collection_Sync__c,HIC_ShopifySync__Inventory_Location_Sync__c, name,HIC_ShopifySync__Inventory_Location__c,HIC_ShopifySync__ProductVariantBatchCompleted__c,HIC_ShopifySync__Enable_Opportunity_for_SDO__c, HIC_ShopifySync__Enable_Draft_Order__c,HIC_ShopifySync__Collection__c, HIC_ShopifySync__Number_of_pages_for_Account__c,HIC_ShopifySync__OrderBatchCompleted__c, HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Default_Account__c,HIC_ShopifySync__InventoryBatchCompleted__c, 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__Account_Contact__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 1';
|
|
|
|
listOfConfiguration = Database.query(queryForConfig);
|
|
if (listOfConfiguration.isEmpty()) {
|
|
return new List<Object>();
|
|
}
|
|
|
|
Map<String, Object> main = new Map<String, Object>();
|
|
|
|
try {
|
|
if (String.isNotBlank(linkForNextPage) && !isEnd) {
|
|
if (!isRelatedUrl) {
|
|
if (resourceName == 'orders') {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(resourceName + '.json?status=any&limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + '&page_info=' + linkForNextPage, listOfConfiguration);
|
|
} else {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(resourceName + '.json?limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + '&page_info=' + linkForNextPage, listOfConfiguration);
|
|
}
|
|
} else {
|
|
if (resourceName == 'orders') {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(parentResource + '/' + listOfparentId[0] + '/' + resourceName + '.json?status=any&limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + '&page_info=' + linkForNextPage, listOfConfiguration);
|
|
} else {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(parentResource + '/' + listOfparentId[0] + '/' + resourceName + '.json?limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + '&page_info=' + linkForNextPage, listOfConfiguration);
|
|
}
|
|
}
|
|
} else {
|
|
if (!isRelatedUrl) {
|
|
if (resourceName == 'orders') {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(resourceName + '.json?status=any&limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + (updated_at_min != '' ? '&updated_at_min=' + updated_at_min : '') + (updated_at_max != '' ? '&updated_at_max=' + updated_at_max : ''), listOfConfiguration);
|
|
} else {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(resourceName + '.json?limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + (updated_at_min != '' ? '&updated_at_min=' + updated_at_min : '') + (updated_at_max != '' ? '&updated_at_max=' + updated_at_max : ''), listOfConfiguration);
|
|
}
|
|
} else {
|
|
if (resourceName == 'orders') {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(parentResource + '/' + listOfparentId[0] + '/' + resourceName + '.json?status=any&limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + (updated_at_min != '' ? '&updated_at_min=' + updated_at_min : '') + (updated_at_max != '' ? '&updated_at_max=' + updated_at_max : ''), listOfConfiguration);
|
|
listOfparentId.remove(0);
|
|
} else {
|
|
JSONResponse = SyncBatchUtility.fetchAllDataWithLinkForNextPage(parentResource + '/' + listOfparentId[0] + '/' + resourceName + '.json?limit=' + listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c + (updated_at_min != '' ? '&updated_at_min=' + updated_at_min : '') + (updated_at_max != '' ? '&updated_at_max=' + updated_at_max : ''), listOfConfiguration);
|
|
listOfparentId.remove(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (String.isNotBlank(JSONResponse)) {
|
|
main = (Map<String, Object>) JSON.deserializeUntyped(JSONResponse);
|
|
|
|
if (!main.isEmpty() && main.containsKey('response') && main.containsKey('link')) {
|
|
if (main.get('response') != null) {
|
|
JSONResponseBody = String.valueOf(main.get('response'));
|
|
}
|
|
if (main.get('link') != null) {
|
|
linkForNextPage = String.valueOf(main.get('link'));
|
|
} else {
|
|
isEnd = true;
|
|
}
|
|
} else {
|
|
isEnd = true;
|
|
}
|
|
} else {
|
|
isEnd = true;
|
|
}
|
|
|
|
if (String.isBlank(JSONResponseBody)) {
|
|
checkException = true;
|
|
}
|
|
} catch (Exception e) {
|
|
checkException = true;
|
|
System.debug('Exception: ' + e.getMessage());
|
|
}
|
|
|
|
if (!checkException) {
|
|
Map<String, Object> meta = (Map<String, Object>) JSON.deserializeUntyped(JSONResponseBody);
|
|
return (List<Object>) meta.get(resourceName);
|
|
} else {
|
|
return new List<Object>();
|
|
}
|
|
}
|
|
|
|
global void execute(Database.BatchableContext bc , List<Object> scope){
|
|
objectMappingList =[
|
|
SELECT Id, Name, HIC_ShopifySync__Resource__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Batch_Size__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c, HIC_ShopifySync__JSON_Nested__c,
|
|
(SELECT Id, Name, HIC_ShopifySync__Object_Mapping__c, HIC_ShopifySync__Resource__c, HIC_ShopifySync__JSON_Nested__c, HIC_ShopifySync__Default__c,HIC_ShopifySync__Store__c, HIC_ShopifySync__Preference__c, HIC_ShopifySync__sObject_Name__c
|
|
FROM HIC_ShopifySync__Object_Mappings__r LIMIT 200),
|
|
(Select Id, Default__c, Key__c, Value_Of__c FROM Data_Mappings__r LIMIT 200)
|
|
FROM HIC_ShopifySync__Object_Mapping__c
|
|
WHERE HIC_ShopifySync__Resource__c = :resourceName AND HIC_ShopifySync__Store__c = :store ORDER BY HIC_ShopifySync__Preference__c ];
|
|
|
|
if(!scope.isEmpty() && !objectMappingList.isEmpty()){
|
|
|
|
for (HIC_ShopifySync__Object_Mapping__c webhookObjToUpsert : objectMappingList) {
|
|
|
|
|
|
String fmQuery = GenericAPIWebUtility.generateFieldMappingQuery(webhookObjToUpsert.Id);
|
|
|
|
list<HIC_ShopifySync__HIC_Field_Mapping__c> listOfFiledMapping = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
|
|
listOfFiledMapping = database.query(fmQuery);
|
|
|
|
String listType = 'List<' +webhookObjToUpsert.HIC_ShopifySync__sObject_Name__c+ '>';
|
|
list<sobject> listOfSobjToUpsert = (List<SObject>)Type.forName(listType).newInstance();
|
|
for(Object JsonObject : scope){
|
|
Map<String, Object> JsonObjectMap = (Map<String, Object>) JsonObject;
|
|
|
|
if (webhookObjToUpsert.HIC_ShopifySync__JSON_Nested__c != null && webhookObjToUpsert.HIC_ShopifySync__JSON_Nested__c.contains('.')) {
|
|
String[] nestedKeys = webhookObjToUpsert.HIC_ShopifySync__JSON_Nested__c.split('\\.');
|
|
|
|
Object nestedValue = JsonObjectMap.get(nestedKeys[0]);
|
|
if (nestedValue instanceof Map<String, Object>) {
|
|
JsonObjectMap = (Map<String, Object>) nestedValue;
|
|
}
|
|
else if (nestedValue instanceof List<Object>) {
|
|
List<Object> nestedList = (List<Object>) nestedValue;
|
|
|
|
if (!nestedList.isEmpty() && nestedList[0] instanceof Map<String, Object>) {
|
|
JsonObjectMap = (Map<String, Object>) nestedList[0];
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
return; // Exit or handle the error
|
|
}
|
|
|
|
webhookObjToUpsert.HIC_ShopifySync__JSON_Nested__c = nestedKeys[1];
|
|
}
|
|
|
|
List<Object> jsonList = new List<Object>();
|
|
String requestBody=JSON.serialize(JsonObjectMap);
|
|
jsonList = GenericAPIWebUtility.processDataMapping(webhookObjToUpsert.HIC_ShopifySync__Json_Nested__c, webhookObjToUpsert.Data_Mappings__r, JsonObjectMap);
|
|
//Satyam needs to check
|
|
//List<Object> JSONList = GenericAPIWebUtility.filterAndImproveJSONBody(webhookObjToUpsert.HIC_ShopifySync__Default__c, webhookObjToUpsert.HIC_ShopifySync__Nested_Key__c, JsonObjectMap, webhookObjToUpsert.HIC_ShopifySync__Other_Relationship_Name__c, webhookObjToUpsert.HIC_ShopifySync__Other_Relationship_Key__c, requestBody, webhookObjToUpsert.HIC_ShopifySync__Relationship_field_Name__c, webhookObjToUpsert.HIC_ShopifySync__Relationship_Key__c);
|
|
for(object obj : JSONList){
|
|
|
|
//JsonObjectMap = (Map<String, Object>) obj;
|
|
Sobject sobjRecord = GenericAPIWebUtility.processFieldTypeAndMapping(listOfFiledMapping, String.valueOf(webhookObjToUpsert.HIC_ShopifySync__sObject_Name__c), (Map<String, Object>)obj ,companyTimeZone, store);
|
|
if(sobjRecord != null)
|
|
listOfSobjToUpsert.add(sobjRecord);
|
|
}
|
|
}
|
|
Schema.SObjectType SfObject = Schema.getGlobalDescribe().get(webhookObjToUpsert.HIC_ShopifySync__sObject_Name__c);
|
|
Map<String, SObjectField> sfFieldsMap = SfObject.getDescribe().fields.getMap();
|
|
Schema.SobjectField ShopifyId = sfFieldsMap.get('HIC_ShopifySync__Shopify_Id__c');
|
|
|
|
List<Database.upsertResult> updateResult = new List <Database.upsertResult>();
|
|
try{
|
|
if(CheckAccessibility.isUpsertable(String.valueOf(ShopifyId),webhookObjToUpsert.HIC_ShopifySync__sObject_Name__c)){
|
|
Map<Object, SObject> mapToRestricDuplicateRecord = new map<Object, SObject>();
|
|
for(SObject record: listOfSobjToUpsert) {
|
|
if(record.get('HIC_ShopifySync__Shopify_Id__c') !=null) {
|
|
|
|
mapToRestricDuplicateRecord.put(record.get('HIC_ShopifySync__Shopify_Id__c'),record );
|
|
|
|
if(webhookObjToUpsert.HIC_ShopifySync__Object_Mappings__r.size()>0){
|
|
|
|
listOfparentId.add(String.valueOf(record.get('HIC_ShopifySync__Shopify_Id__c')));
|
|
parentResource = webhookObjToUpsert.HIC_ShopifySync__Resource__c;
|
|
relatedObjectMapping = webhookObjToUpsert.HIC_ShopifySync__Object_Mappings__r;
|
|
}
|
|
}
|
|
}
|
|
updateResult = Database.upsert(mapToRestricDuplicateRecord.values(),ShopifyId, false);
|
|
SyncBatchUtility.updateErrorMassage(updateResult, webhookObjToUpsert.HIC_ShopifySync__sObject_Name__c, mapToRestricDuplicateRecord.values(), ShopifyId, false, store);
|
|
}
|
|
}catch(DmlException e) {
|
|
System.debug('The following exception has occurred: ' + e.getMessage());
|
|
}
|
|
//updateAllSfRecordFromShopifyUtility.upsertSFRecords( bodyMap, webhookObjToUpsert, requestBody, storeName );
|
|
}
|
|
}
|
|
}
|
|
|
|
global void finish(Database.BatchableContext bc) {
|
|
|
|
if (!listOfparentId.isEmpty() && isEnd) {
|
|
if (relatedObjectMapping != null && !relatedObjectMapping.isEmpty()) {
|
|
SyncShopifyBatch callBatchAgain = new SyncShopifyBatch(
|
|
linkForNextPage,
|
|
false,
|
|
listOfparentId,
|
|
parentResource,
|
|
String.valueOf(relatedObjectMapping[0].HIC_ShopifySync__Resource__c),
|
|
relatedObjectMapping,
|
|
updated_at_min,
|
|
updated_at_max,
|
|
store
|
|
);
|
|
Database.executeBatch(callBatchAgain, 50);
|
|
} else {
|
|
}
|
|
}
|
|
|
|
if (!checkException && !isEnd && listOfparentId.isEmpty()) {
|
|
// Call batch again if got any exception on page
|
|
if (objectMappingList != null && !objectMappingList.isEmpty()) {
|
|
SyncShopifyBatch callBatchAgain = new SyncShopifyBatch(
|
|
linkForNextPage,
|
|
false,
|
|
store,
|
|
updated_at_min,
|
|
updated_at_max,
|
|
resourceName,
|
|
objectMappingList
|
|
);
|
|
Database.executeBatch(callBatchAgain, integer.valueOf(objectMappingList[0].HIC_ShopifySync__Batch_Size__c));
|
|
} else {
|
|
System.debug('objectMappingList is null or empty line 261');
|
|
}
|
|
} else if (checkException && !isEnd && listOfparentId.isEmpty()) {
|
|
if (String.isNotBlank(linkForNextPage)) {
|
|
// Call batch again for next page of record pagination
|
|
if (objectMappingList != null && !objectMappingList.isEmpty()) {
|
|
SyncShopifyBatch callBatchAgain = new SyncShopifyBatch(
|
|
linkForNextPage,
|
|
false,
|
|
store,
|
|
updated_at_min,
|
|
updated_at_max,
|
|
resourceName,
|
|
objectMappingList
|
|
);
|
|
Database.executeBatch(callBatchAgain, integer.valueOf(objectMappingList[0].HIC_ShopifySync__Batch_Size__c));
|
|
} else {
|
|
System.debug('objectMappingList is null or empty line 278');
|
|
}
|
|
}
|
|
} else if (isEnd && listOfparentId.isEmpty()) {
|
|
if (listOfConfiguration != null && !listOfConfiguration.isEmpty()) {
|
|
HIC_ShopifySync__HIC_Configuration__c config = listOfConfiguration[0];
|
|
|
|
if (resourceName == 'products') {
|
|
config.HIC_ShopifySync__ProductVariantBatchCompleted__c = true;
|
|
update config;
|
|
SyncBatchUtility.fetchCustomer(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
|
|
} else if (resourceName == 'customers') {
|
|
config.HIC_ShopifySync__AccountContactBatchCompleted__c = true;
|
|
update config;
|
|
|
|
if (config.HIC_ShopifySync__Order_Sync__c || config.HIC_ShopifySync__Opportunity__c) {
|
|
SyncBatchUtility.fetchOrderAndOpportunity(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Collection_Sync__c) {
|
|
SyncBatchUtility.processCollect(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Inventory_Location_Sync__c && config.HIC_ShopifySync__Inventory_Location__c) {
|
|
SyncBatchUtility.fetchLocationsAndInventoryLevels(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Draft_Order_Sync__c || config.HIC_ShopifySync__Enable_Draft_Order__c || config.HIC_ShopifySync__Enable_Opportunity_for_SDO__c) {
|
|
SyncBatchUtility.fetchDraftorders(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (!config.HIC_ShopifySync__Order_Sync__c && config.HIC_ShopifySync__Opportunity__c && !config.HIC_ShopifySync__Draft_Order_Sync__c && !config.HIC_ShopifySync__Collection_Sync__c) {
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
}
|
|
|
|
} else if (resourceName == 'orders') {
|
|
config.HIC_ShopifySync__OrderBatchCompleted__c = true;
|
|
update config;
|
|
|
|
if (config.HIC_ShopifySync__Collection_Sync__c) {
|
|
SyncBatchUtility.processCollect(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Inventory_Location_Sync__c && config.HIC_ShopifySync__Inventory_Location__c) {
|
|
SyncBatchUtility.fetchLocationsAndInventoryLevels(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Draft_Order_Sync__c || config.HIC_ShopifySync__Enable_Draft_Order__c || config.HIC_ShopifySync__Enable_Opportunity_for_SDO__c) {
|
|
SyncBatchUtility.fetchDraftorders(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (!config.HIC_ShopifySync__Draft_Order_Sync__c && !config.HIC_ShopifySync__Collection_Sync__c) {
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
}
|
|
|
|
} else if (resourceName == 'collections') {
|
|
config.HIC_ShopifySync__CollectionsBatchCompleted__c = true;
|
|
update config;
|
|
|
|
if (config.HIC_ShopifySync__Inventory_Location_Sync__c && config.HIC_ShopifySync__Inventory_Location__c) {
|
|
SyncBatchUtility.fetchLocationsAndInventoryLevels(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (config.HIC_ShopifySync__Draft_Order_Sync__c || config.HIC_ShopifySync__Enable_Draft_Order__c || config.HIC_ShopifySync__Enable_Opportunity_for_SDO__c) {
|
|
SyncBatchUtility.fetchDraftorders(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (!config.HIC_ShopifySync__Draft_Order_Sync__c) {
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
}
|
|
|
|
} else if (resourceName == 'locations') {
|
|
config.HIC_ShopifySync__InventoryBatchCompleted__c = true;
|
|
update config;
|
|
|
|
if (config.HIC_ShopifySync__Draft_Order_Sync__c) {
|
|
SyncBatchUtility.fetchDraftorders(store, updated_at_min, updated_at_max, listOfConfiguration);
|
|
} else if (!config.HIC_ShopifySync__Draft_Order_Sync__c) {
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
}
|
|
|
|
} else if (resourceName == 'draft_orders') {
|
|
config.HIC_ShopifySync__DraftOrderBatchCompleted__c = true;
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
|
|
} else {
|
|
config.HIC_ShopifySync__Batch_Is_Processing__c = false;
|
|
update config;
|
|
}
|
|
} else {
|
|
System.debug('listOfConfiguration is null or empty');
|
|
}
|
|
}
|
|
}
|
|
} |