SyncMadeEasy/force-app/main/default/classes/GenericAPIWebUtility.cls

467 lines
25 KiB
OpenEdge ABL

/**
* @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<HIC_ShopifySync__HIC_Field_Mapping__c> fieldsMappingList, String ObjectName, Map<String, Object> 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<String, Schema.SobjectField> 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<String, Object> filterNestedJson = new Map<String, Object>();
// Handle list in nested map
if (objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c) instanceof List<Object>) {
List<Object> ObjList = (List<Object>) objectMap.get(fieldMappingObj.HIC_ShopifySync__Nested__c);
for (Object obj : ObjList) {
filterNestedJson = (Map<String, Object>) obj;
}
} else {
filterNestedJson = (Map<String, Object>) 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<Object> processDataMapping(String nested, List<HIC_ShopifySync__Data_Mapping__c> dataMappings, Map<String, Object> bodyMap){
List<Object> nestedList = new List<Object>();
if(nested != null && nested != ''){
Object nestedValue = bodyMap.get(nested);
if (nestedValue instanceof List<Object>) {
nestedList.addAll((List<Object>)nestedValue);
}else{
nestedList.add(nestedValue);
}
}else{
nestedList.add(bodyMap);
}
if(!dataMappings.isEmpty()){
for(Object record : nestedList){
Map<String, Object> bodyRecord = (Map<String, Object>)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<String , Object> jsonMap , String ShopifyFiled){
object objectFieldValue;
List<String> 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<Database.upsertResult> updateResult, String objectName, List<sObject> objectList, Schema.SobjectField externalIdField, boolean IsWebhook, String store){
String isbatch = 'F';
if(Iswebhook){
isbatch = 'T';
}
list<HIC_ShopifySync__Error_Mapping__c> listofErrormailfield = new List<HIC_ShopifySync__Error_Mapping__c>();
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<String,SObjectField> 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<HIC_ShopifySync__Error_Message__c> listoferrors = new list<HIC_ShopifySync__Error_Message__c>(); //List of errors message
list<HIC_ShopifySync__Shopify_Log__c> listofsuccesslog = new list<HIC_ShopifySync__Shopify_Log__c>(); //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<String, SObjectField> 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<String, SObjectField> 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);
}
}
}
}
}