/** * @description : Use for Generic Method * @author : Satyam Mishra * @group : * @last modified on : 21-jan- 2025 * @last modified by : Satyam Mishra **/ public class GenericAPIWebUtility { public static integer i = 0; public static String generateFieldMappingQuery(String ObjectMappingId){ // Select fields while respecting FLS String query = ''; query = 'SELECT ' + CheckAccessibility.isAccessible('HIC_ShopifySync__SF_Field__c,HIC_ShopifySync__Object_Name__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_Mapping__c', 'HIC_ShopifySync__HIC_Field_Mapping__c') + ' = \'' +ObjectMappingId+ '\' LIMIT 49999'; return query; } public static SObject processFieldTypeAndMapping(List fieldsMappingList, String ObjectName, Map objectMap, String companyTimeZone, String Store) { // SObject sObjRecord = Schema.getGlobalDescribe().get(ObjectName).newSObject(); SObject sObjRecord = (SObject)Type.forName(ObjectName).newInstance(); // Schema.sObjectType objectDef = Schema.getGlobalDescribe().get(ObjectName).getDescribe().getSObjectType(); Schema.sObjectType objectDef = ((SObject)Type.forName(ObjectName).newInstance()).getSObjectType(); Map ObjectFieldsMap = objectDef.getDescribe().fields.getMap(); // Check and set store if (ObjectFieldsMap.containsKey('HIC_ShopifySync__Store__c')) { sObjRecord.put('HIC_ShopifySync__Store__c', Store); } Integer i = 0; for (HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj : fieldsMappingList) { i = i + 1; Schema.SobjectField SfFileds = ObjectFieldsMap.get(fieldMappingObj.HIC_ShopifySync__SF_Field__c); if (SfFileds == null) { continue; } Schema.DescribeFieldResult fieldResult = SfFileds.getDescribe(); String fieldType = fieldResult.getType().name().toLowerCase(); if (fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c != null) { if (fieldResult.isUpdateable() || fieldResult.isCreateable()) { Object objectFieldValue; String Shopify_Fields = fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c; // Check nested objects if (objectMap != null && !objectMap.isEmpty() && fieldMappingObj.HIC_ShopifySync__Nested__c != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c) != null && objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c) != '') { Map filterNestedJson = new Map(); // Handle list in nested map if (objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c) instanceof List) { List ObjList = (List) objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c); for (Object obj : ObjList) { filterNestedJson = (Map) obj; } } else { filterNestedJson = (Map) objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c); } // Process multiple Shopify fields if (Shopify_Fields.contains(',')) { objectFieldValue = mergeShopifyField(filterNestedJson, Shopify_Fields); } else { objectFieldValue = filterNestedJson.get(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); } } else if(objectMap != null && !objectMap.isEmpty()){ if (Shopify_Fields.contains(',')) { objectFieldValue = mergeShopifyField(objectMap, Shopify_Fields); } else { objectFieldValue = objectMap.get(Shopify_Fields); } } // Default value check if (fieldMappingObj.HIC_ShopifySync__Default_Value__c == true) { defaultFieldMapping(sObjRecord, fieldMappingObj, fieldType, companyTimeZone, fieldResult); } // Check for non-nillable fields else if (!fieldResult.isNillable() && (objectFieldValue == null || objectFieldValue == '')) { missingRequiedFieldMapping(sObjRecord, fieldMappingObj, fieldType, fieldResult); } // Additional value processing for SFID else if (fieldMappingObj.HIC_ShopifySync__IsSFID__c) { additionalValue(fieldMappingObj, sObjRecord, objectFieldValue, fieldType); } // General field processing else { processFieldMapping(sObjRecord, fieldResult, objectFieldValue, fieldType, fieldMappingObj); } } } } // Final check for Shopify ID in the record if (sObjRecord.get('HIC_ShopifySync__Shopify_Id__c') != null && sObjRecord.get('HIC_ShopifySync__Shopify_Id__c') != '' && sObjRecord.get('HIC_ShopifySync__Shopify_Id__c') != 'null') { return sObjRecord; } else { system.debug('Record does not contain a valid Shopify ID, returning null'); return null; } } public static List processDataMapping(String nested, List dataMappings, Map bodyMap){ List nestedList = new List(); if(nested != null && nested != ''){ Object nestedValue = bodyMap.get(nested); if (nestedValue instanceof List) { nestedList.addAll((List)nestedValue); }else{ nestedList.add(nestedValue); } }else{ nestedList.add(bodyMap); } if(!dataMappings.isEmpty()){ for(Object record : nestedList){ Map bodyRecord = (Map)record; if(bodyRecord!=null && !bodyRecord.isEmpty()){ for(HIC_ShopifySync__Data_Mapping__c dataInfo : dataMappings){ if(dataInfo.Default__c){ bodyRecord.put(dataInfo.Key__c, dataInfo.HIC_ShopifySync__Value_Of__c); } else{ bodyRecord.put(dataInfo.Key__c, bodyMap.get(dataInfo.HIC_ShopifySync__Value_Of__c)); } } record = bodyRecord; } } } return nestedList; } public static Sobject additionalValue(HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj, Sobject sObjRecord, object objectFieldValue, String fieldType){ if(objectFieldValue !=null){ if(fieldType == 'String'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,string.valueof(objectFieldValue)+'d'); } } return sObjRecord; } public static SObject processFieldMapping(SObject sObjRecord, Schema.DescribeFieldResult fieldResult, object objectFieldValue, String fieldType, HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj){ if(fieldType == 'reference') { // Get the relationship name (e.g., Account) String relationshipName = fieldResult.getRelationshipName(); // Create the parent SObject (e.g., Account) dynamically SObject parentObj = fieldResult.getReferenceTo()[0].newSObject(); if(objectFieldValue != null && objectFieldValue != '') { // Set the Shopify ID in the parent SObject (e.g., Account) parentObj.put('HIC_ShopifySync__Shopify_Id__c', String.valueOf(objectFieldValue)); sObjRecord.putSObject(relationshipName, parentObj); } else if(fieldResult.isNillable()) { // Handle case where the field is not nullable parentObj.put('HIC_ShopifySync__Shopify_Id__c', 'null'); sObjRecord.putSObject(relationshipName, parentObj); // Using `null` directly instead of 'null' } } // Final debug statement to see the full sObjRecord else if(fieldType == 'String' || fieldType == 'url' || fieldType == 'textarea' || fieldType == 'picklist' || fieldType == 'phone' || fieldType == 'email'){ if(objectFieldValue != null && objectFieldValue != ''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,string.valueof(objectFieldValue)); }else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,'REQ'+string.valueof(system.now().getTime()+ i+1)); } } else if(fieldType == 'currency' || fieldType == 'double' || fieldType == 'decimal' || fieldType == 'percent' ) { if(objectFieldValue!=null && objectFieldValue!=''){ Double doublevalue = 0; doublevalue = Double.valueof(objectFieldValue); 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 if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Double.valueof(1)); } }else if(fieldType == 'integer') { if(objectFieldValue!=null && objectFieldValue!=''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Integer.valueof(objectFieldValue)); }else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c , Integer.valueof(1)); } } else if(fieldType == 'boolean') { if(objectFieldValue!=null && objectFieldValue!=''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, boolean.valueof(objectFieldValue)); }else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, false); } } else if(fieldType == 'date') { if(objectFieldValue!=null && objectFieldValue!='') sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Date.valueOf(String.valueOf(objectFieldValue))); else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.today()); } } else if(fieldType == 'datetime'){ if(objectFieldValue!=null && objectFieldValue!=''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, DateTime.valueOf(String.valueOf(objectFieldValue).replace('T',' '))); }else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,System.now()); } }else { if(objectFieldValue!=null && objectFieldValue!=''){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, string.valueof(objectFieldValue)); }else if(!fieldResult.isNillable()){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c,'REQ'+string.valueof(system.now().getTime()+ i+1)); } } return sObjRecord; } public static SObject missingRequiedFieldMapping(Sobject sObjRecord, HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj , String fieldType, Schema.DescribeFieldResult fieldResult ){ if(fieldType =='reference'){ try { Id convertedId = Id.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c); sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, convertedId); } catch (Exception e) { } //sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Id.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); } else 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'); } return sObjRecord; } public static SObject defaultFieldMapping(Sobject sObjRecord, HIC_ShopifySync__HIC_Field_Mapping__c fieldMappingObj , String fieldType, String companyTimeZone, Schema.DescribeFieldResult fieldResult ){ if(fieldType =='reference'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Id.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); } if(fieldType == 'boolean'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, Boolean.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); }else if(fieldType == 'string'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, String.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); }else if(fieldType == 'picklist'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, String.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); }else if(fieldType == 'textarea'){ sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, String.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'){ //sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, date.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); Date inputDate = date.today(); Date newDate=inputDate.addDays(Integer.valueOf(fieldMappingObj.HIC_ShopifySync__Shopify_Fields__c)); sObjRecord.put(fieldMappingObj.HIC_ShopifySync__SF_Field__c, newDate); } }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))); } return sObjRecord; } public static object mergeShopifyField(Map jsonMap , String ShopifyFiled){ object objectFieldValue; List ListOfShopifyFiled = ShopifyFiled.split(','); for(String str :ListOfShopifyFiled ){ if(objectFieldValue != null && objectFieldValue != '' && !jsonMap.isEmpty() && jsonMap.get(str) !=null && jsonMap.get(str) !=''){ objectFieldValue = (Object)(String.valueOf(objectFieldValue) + String.valueOf(jsonMap.get(str))); }else if(!jsonMap.isEmpty() && jsonMap.get(str) !=null && jsonMap.get(str) !=''){ objectFieldValue = jsonMap.get(str); } } return objectFieldValue; } public static String checkFieldLengthAndReturnValue(Schema.DescribeFieldResult fieldResult, String Jsonbody){ if(fieldResult.getLength() > 0 && Jsonbody != null && Jsonbody != ''&& fieldResult!=null){ if( Jsonbody.length() <= fieldResult.getLength()){ return Jsonbody; }else{ return Jsonbody.subString(0,fieldResult.getLength()); } }else{ return ''; } } public static void updateErrorMassage( List updateResult, String objectName, List objectList, Schema.SobjectField externalIdField, boolean IsWebhook, String store){ String isbatch = 'F'; if(Iswebhook){ isbatch = 'T'; } list listofErrormailfield = new List(); String ErrorfieldMappingquery = 'select ' +CheckAccessibility.isAccessible('name,HIC_ShopifySync__Shopify_Field__c','HIC_ShopifySync__Error_Mapping__c') +' from HIC_ShopifySync__Error_Mapping__c where '+ CheckAccessibility.isAccessible('name','HIC_ShopifySync__Error_Mapping__c') + ' = \''+ objectName +'\' limit 1'; ErrorfieldMappingquery =String.escapeSingleQuotes(ErrorfieldMappingquery).remove('\\'); listofErrormailfield = Database.query(ErrorfieldMappingquery); // Schema.SObjectType ObjectType = Schema.getGlobalDescribe().get(objectName); Schema.SObjectType ObjectType = ((SObject)Type.forName(objectName).newInstance()).getSObjectType(); Map fieldMap = ObjectType.getDescribe().fields.getmap(); Schema.SobjectField theField = null; //use for add in shopify External Id to make it unique if(!listofErrormailfield.isEmpty()){ theField = fieldMap.get(String.ValueOf(listofErrormailfield[0].HIC_ShopifySync__Shopify_Field__c)); } list listoferrors = new list(); //List of errors message list listofsuccesslog = new list(); //List of Shopify logs for(Integer index = 0 ; index < updateResult.size() ; index ++){ //If record successfully upsert if( !updateResult[index].isSuccess() ){ if(Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isAccessible() && (Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isCreateable()||Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isUpdateable()) ){ // Error Message Object HIC_ShopifySync__Error_Message__c errorobj = new HIC_ShopifySync__Error_Message__c(); errorobj.HIC_ShopifySync__Store__c = store; if(CheckAccessibility.isUpdateable('name','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()){ errorobj.name = objectName; } //Object Contact then modified Shopify's External ID if(theField != null ){ if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Important_Field__c','HIC_ShopifySync__Error_Message__c')) errorobj.HIC_ShopifySync__Important_Field__c = String.valueOf(objectList[index].get(theField)); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__shopify_id__c','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__shopify_id__c = string.valueof(objectList[index].get(externalIdField)+isbatch); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__error_id__c','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__error_id__c = string.valueof(objectName+objectList[index].get(externalIdField)+isbatch); } if(CheckAccessibility.isUpdateable('HIC_ShopifySync__delivered__c','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()) { errorobj.HIC_ShopifySync__delivered__c = false; } //Get Error message string errorMsg = ''; for(Database.Error error : updateResult[index].getErrors()){ if(error.getFields() != null && !error.getFields().isEmpty()){ errorMsg += String.join(error.getFields(), ' ') + ' | ' + error.getMessage() + ','; }else{ errorMsg += error.getMessage() + ','; } } sObjectType schemaType = Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c') ; Map fieldsMap = schemaType.getDescribe().fields.getMap(); if(CheckAccessibility.isUpdateable('HIC_ShopifySync__message__c','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()){ errorobj.HIC_ShopifySync__message__c = errorMsg.removeEnd(','); } errorobj.HIC_ShopifySync__Iswebhook__c = Iswebhook; if(!errorobj.HIC_ShopifySync__message__c.containsIgnoreCase('duplicate value found: HIC_ShopifySync__Shopify_Id__c duplicates value on record with id') && !errorobj.HIC_ShopifySync__message__c.containsIgnoreCase('unable to obtain exclusive access to this record')){ listoferrors.add(errorobj); } } } } //Upsert Error Messagge records if(!listoferrors.isEmpty()){ if(Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isAccessible() && Schema.sObjectType.HIC_ShopifySync__Error_Message__c.isCreateable()){ Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c'); Map fieldMap1 = objectType1.getDescribe().fields.getMap(); Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Error_id__c'); if(CheckAccessibility.isUpsertable('HIC_ShopifySync__Error_id__c','HIC_ShopifySync__Error_Message__c') && Schema.getGlobalDescribe().get('HIC_ShopifySync__Error_Message__c').getDescribe().isCreateable()){ database.upsert(listoferrors, theField1); } } } } }