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

770 lines
51 KiB
OpenEdge ABL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* ─────────────────────────────────────────────────────────────────────────────────────────────────┐
* This Batch class is use for upsert Shopify's customer into the Salesfroce
* 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 <sumit@hicShopify.com>
* ──────────────────────────────────────────────────────────────────────────────────────────────────
*/
global with sharing class FetchAccounts implements Database.Batchable<Object>, Database.allowscallouts, Database.Stateful{
integer count = 0;
List<HIC_ShopifySync__HIC_Configuration__c> listOfConfiguration;
Boolean checkException;
String linkForNextPage = '';
Boolean isEnd = false;
String store = 'Default';
String updated_at_min = '';
String updated_at_max = '';
global FetchAccounts(String linkForNextPage,Boolean isEnd, String store){
this.linkForNextPage = linkForNextPage;
this.isEnd = isEnd;
checkException = false;
this.store = store;
}
global FetchAccounts(String linkForNextPage,Boolean isEnd, String store, String updated_at_min, String updated_at_max){
this.linkForNextPage = linkForNextPage;
this.isEnd = isEnd;
checkException = false;
this.store = store;
this.updated_at_min = updated_at_min;
this.updated_at_max = updated_at_max;
}
//Depreceated
global FetchAccounts(String linkForNextPage,Boolean isEnd){
this.linkForNextPage = linkForNextPage;
this.isEnd = isEnd;
checkException = false;
this.store = '123';
}
global Iterable<Object> start(Database.BatchableContext bc){
String customerResponse = '';
String JSONResponse = '';
String query = 'Select '+CheckAccessibility.isAccessible('HIC_ShopifySync__Chunk_Size__c,HIC_ShopifySync__Enable_Lead__c,HIC_ShopifySync__Upsert_Customer_basis_on_Email__c, HIC_ShopifySync__Draft_Order_Sync__c, id,HIC_ShopifySync__AccountContactBatchCompleted__c, name,HIC_ShopifySync__Inventory_Location__c,HIC_ShopifySync__ProductVariantBatchCompleted__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__Customer_Email_Domain__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 = new list<HIC_ShopifySync__HIC_Configuration__c>();
listOfConfiguration = Database.query(query);
system.debug('query ==> '+query);
System.debug('query 11 ---'+database.query(query));
system.debug('listOfConfiguration ==> '+listOfConfiguration);
Map<String,Object> main = new Map<String,Object>();
try{
// Get Shopif's Customer JSON Response
if(!Test.isRunningTest()){
if(String.isNotBlank(linkForNextPage) && !isEnd){
JSONResponse = HIC_ShopifyUtility.fetchAllDataWithLinkForNextPage('customers.json?limit='+listOfConfiguration[0].HIC_ShopifySync__Chunk_Size__c+'&page_info='+linkForNextPage, listOfConfiguration);
}else{
JSONResponse = HIC_ShopifyUtility.fetchAllDataWithLinkForNextPage('customers.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{
JSONResponse = 'not blank';
}
if(String.isNotBlank(JSONResponse)){
if(!Test.isRunningTest()){
main = (Map<String,Object>) JSON.deserializeUntyped(JSONResponse);
}else{
main.put('link',null);
main.put('response','{ "customers": [ { "id": 1073387929664, "email": "", "accepts_marketing": false, "created_at": "2019-01-10T00:12:13-12:00", "updated_at": "2019-01-10T00:12:13-12:00", "first_name": "", "last_name": "", "orders_count": 0, "state": "disabled", "total_spent": "0.00", "last_order_id": null, "note": "", "verified_email": true, "multipass_identifier": null, "tax_exempt": false, "phone": "9717626066", "tags": "", "last_order_name": null, "currency": "INR", "addresses": [ { "id": 1197969899584, "customer_id": 1073387929664, "first_name": "firstnameu", "last_name": "lastnamev", "company": "test", "address1": "address", "address2": "", "city": "", "province": "", "country": "India", "zip": "", "phone": "9717626066", "name": "firstnameu lastnamev", "province_code": null, "country_code": "IN", "country_name": "India", "default": true } ], "admin_graphql_api_id": "gid://shopify/Customer/1073387929664", "default_address": { "id": 1197969899584, "customer_id": 1073387929664, "first_name": "firstnameu", "last_name": "lastnamev", "company": "test", "address1": "address", "address2": "", "city": "", "province": "", "country": "India", "zip": "", "phone": "9717626066", "name": "firstnameu lastnamev", "province_code": null, "country_code": "IN", "country_name": "India", "default": true } } ] }');
}
if(!main.isEmpty() && main.containskey('response') && main.containskey('link') ){
if( main.get('response') != null)
customerResponse = String.valueof(main.get('response'));
if(main.get('link') != null && String.isNotBlank(customerResponse)){
linkForNextPage = String.valueof(main.get('link'));
}else{
isEnd = true;
}
}
}
if(!String.isNotBlank(customerResponse)){
checkException = true;
}
}catch(Exception e){
checkException = true;
}
if(!checkException){
Map<String, Object> meta = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
List<Object> objectList = (List<Object>) meta.get('customers');
for(Object obj : objectList){
Map<String, Object> metaForObj = (Map<String, Object>) obj;
Map <String, Object> objectListForObj;
if(!Test.isRunningTest()){
objectListForObj = (Map<String, Object>) metaForObj.get('default_address');
}
String name = (metaForObj.get('first_name')==null?'':String.valueOf(metaForObj.get('first_name')).trim()) + ' ' + (metaForObj.get('last_name')==null?'':String.valueOf(metaForObj.get('last_name')).trim());
String email = (metaForObj.get('email')==null?'':String.valueOf(metaForObj.get('email')).trim());
String phone = (metaForObj.get('phone')==null?'':String.valueOf(metaForObj.get('phone')).trim());
}
return objectList;
}else{
List<Object> objectList = new List<Object>();
return objectList;
}
}
global void execute(Database.BatchableContext bc, List<Object> scope){
count = count + 1;
/* ---------- pre-load e-mails when flag is on ---------- */
Set<String> scopeEmails = new Set<String>();
Boolean needEmailCheck =
!listofConfiguration.isEmpty() &&
listofConfiguration[0].HIC_ShopifySync__Enable_Lead__c &&
listofConfiguration[0].HIC_ShopifySync__Upsert_Customer_basis_on_Email__c;
if (needEmailCheck) {
for (Object o : scope) {
if (o == null) continue;
Map<String,Object> c = (Map<String,Object>) o;
if (c == null) continue;
Object emailVal = c.containsKey('email') ? c.get('email') : null;
String em = (emailVal == null) ? '' : String.valueOf(emailVal).trim();
if (String.isNotBlank(em)) {
scopeEmails.add(em.toLowerCase());
}
}
}
Map<String, Contact> emailToContact = new Map<String, Contact>();
if (!scopeEmails.isEmpty()) {
for (Contact con : [SELECT Id, AccountId, Email FROM Contact WHERE Email IN :scopeEmails LIMIT 1]) {
emailToContact.put(con.Email.toLowerCase(), con);
}
}
/* ---------- NEW: map e-mail → open Lead (Shopify_ID__c != null) ---------- */
Map<String, Lead> emailToLead = new Map<String, Lead>();
if (needEmailCheck && !scopeEmails.isEmpty()) {
for (Lead ld : [SELECT Id, Email, HIC_ShopifySync__Shopify_ID__c
FROM Lead
WHERE Email IN :scopeEmails
AND IsConverted = false
AND HIC_ShopifySync__Shopify_ID__c != null]) {
emailToLead.put(ld.Email.toLowerCase(), ld);
}
}
/* --------------------------------------------------------------------------- */
for (Object obj : scope) {
String JSONsingleobj = JSON.serialize(obj);
Map<String, Object> customerMap = (Map<String, Object>) obj;
system.debug('customerMap--->' + customerMap);
Boolean createLead = false;
Boolean leadJustConverted = false;
if (!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Enable_Lead__c) {
Integer ordersCount = customerMap.containsKey('orders_count')
? Integer.valueOf(customerMap.get('orders_count'))
: 0;
System.debug('[BATCH-DISPATCH] Customer ID: ' + customerMap.get('id') + ' | orders_count raw: ' + customerMap.get('orders_count') + ' | parsed: ' + ordersCount);
/* ----- original "create Lead" path (ordersCount < 1) ----- */
if (ordersCount < 1) {
if (needEmailCheck) {
String em = '';
if (customerMap.containsKey('email')) {
Object emailVal = customerMap.get('email');
if (emailVal != null) {
em = String.valueOf(emailVal).trim();
}
}
if (String.isNotBlank(em) &&
emailToContact.containsKey(em.toLowerCase())) {
createLead = false; // Contact already exists
} else {
createLead = true;
}
} else {
createLead = true;
}
} else {
/* ----- NEW: ordersCount > 0 – convert Lead if one exists ----- */
String em = '';
if (customerMap.containsKey('email')) {
Object emailVal = customerMap.get('email');
if (emailVal != null) {
em = String.valueOf(emailVal).trim();
}
}
if (String.isNotBlank(em)) {
Lead openLead = emailToLead.get(em.toLowerCase());
if (openLead != null) {
convertLeadAndStampIds(openLead); // helper below
leadJustConverted = true;
}
}
}
}
System.debug('[BATCH-DISPATCH] createLead=' + createLead + ' | leadJustConverted=' + leadJustConverted);
/* ---------- dispatch ---------- */
if (createLead) {
createLead(JSONsingleobj, store);
} else if (leadJustConverted) {
/* Lead was converted – nothing else to do for this row */
continue;
} else {
createAccountContact(JSONsingleobj, store);
}
}
}
/* ---------- helper: convert Lead and reuse existing Account/Contact ---------- */
private void convertLeadAndStampIds(Lead l) {
if (l == null || listOfConfiguration.isEmpty()) {
return;
}
// ====== B2B: Customer Email Domain path ======
Boolean isB2B = listOfConfiguration[0].HIC_ShopifySync__Customer_Email_Domain__c == true;
if (isB2B) {
// Resolve Account by email domain
String leadEmail = l.Email;
Id domainAccountId;
if (String.isNotBlank(leadEmail) && leadEmail.contains('@')) {
String domain = leadEmail.substringAfter('@').substringBefore('.');
List<Account> domainAccounts = [SELECT Id FROM Account WHERE Name = :domain LIMIT 1];
if (!domainAccounts.isEmpty()) {
domainAccountId = domainAccounts[0].Id;
} else {
Account domainAcc = new Account(Name = domain);
insert domainAcc;
domainAccountId = domainAcc.Id;
}
}
// Find existing Contact by Shopify ID
String shopifyIdToSearch = 'Business ' + l.HIC_ShopifySync__Shopify_ID__c;
List<Contact> existingCon = [
SELECT Id FROM Contact
WHERE HIC_ShopifySync__Shopify_Id__c = :shopifyIdToSearch
LIMIT 1
];
Database.LeadConvert lc = new Database.LeadConvert();
lc.setLeadId(l.Id);
lc.setConvertedStatus('Closed - Converted');
lc.setDoNotCreateOpportunity(true);
if (domainAccountId != null) {
lc.setAccountId(domainAccountId);
}
if (!existingCon.isEmpty()) {
lc.setContactId(existingCon[0].Id);
}
Database.LeadConvertResult r = Database.convertLead(lc, true);
// Stamp Shopify ID on Contact
if (r.isSuccess() && r.getContactId() != null) {
Contact con = new Contact(
Id = r.getContactId(),
HIC_ShopifySync__Shopify_Id__c = shopifyIdToSearch,
Email = l.Email
);
update con;
}
return;
}
// ====== End B2B path ======
String prefix = listOfConfiguration[0].HIC_ShopifySync__Person_Account__c
? 'Person '
: 'Business ';
String shopifyIdWithPrefix = prefix + l.HIC_ShopifySync__Shopify_ID__c;
// Find existing Account by Shopify ID
Account existingAcc;
List<Account> accList = [
SELECT Id
FROM Account
WHERE HIC_ShopifySync__Shopify_ID__c = :shopifyIdWithPrefix
LIMIT 1
];
if (!accList.isEmpty()) {
existingAcc = accList[0];
}
// Find existing Contact by Shopify ID
Contact existingCon2;
List<Contact> conList = [
SELECT Id
FROM Contact
WHERE HIC_ShopifySync__Shopify_ID__c = :shopifyIdWithPrefix
LIMIT 1
];
if (!conList.isEmpty()) {
existingCon2 = conList[0];
}
Database.LeadConvert lc = new Database.LeadConvert();
lc.setLeadId(l.Id);
lc.setConvertedStatus('Closed - Converted');
lc.setDoNotCreateOpportunity(true);
// Reuse existing Account if found
if (existingAcc != null) {
lc.setAccountId(existingAcc.Id);
}
// ⭐ CRITICAL FIX: Reuse existing Contact to avoid duplicate rule error
if (existingCon2 != null) {
lc.setContactId(existingCon2.Id);
}
Database.LeadConvertResult r = Database.convertLead(lc, true);
List<SObject> recordsToUpdate = new List<SObject>();
// Stamp Shopify ID on Account if newly created
if (existingAcc == null && r.getAccountId() != null) {
recordsToUpdate.add(new Account(
Id = r.getAccountId(),
HIC_ShopifySync__Shopify_ID__c = shopifyIdWithPrefix
));
}
// Stamp Shopify ID on Contact if newly created
if (existingCon2 == null && r.getContactId() != null) {
recordsToUpdate.add(new Contact(
Id = r.getContactId(),
HIC_ShopifySync__Shopify_ID__c = shopifyIdWithPrefix
));
}
if (!recordsToUpdate.isEmpty()) {
update recordsToUpdate;
}
}
global void finish(Database.BatchableContext bc){
if(!checkException && !isEnd && !test.isRunningTest()){
//Call batch again if got any exception on page
FetchAccounts callBatchAgain = new FetchAccounts(linkForNextPage,false,store,updated_at_min,updated_at_max);
Database.executeBatch(callBatchAgain,1);
}else if(checkException && !test.isRunningTest()){
if(String.isNotBlank(linkForNextPage)){
//Call batch again for next page of record pagination
FetchAccounts callBatchAgain = new FetchAccounts(linkForNextPage,false,store,updated_at_min,updated_at_max);
Database.executeBatch(callBatchAgain,1);
}
}else{
// Call next batch For Order and Opportunity
if(listofConfiguration[0].HIC_ShopifySync__Order__c || listofConfiguration[0].HIC_ShopifySync__Opportunity__c){
if(!test.isRunningTest()) {
HIC_ShopifyUtility.fetchOrderAndOpportunity(listOfConfiguration,store,updated_at_min,updated_at_max);
}
if(CheckAccessibility.isUpsertable('HIC_ShopifySync__AccountContactBatchCompleted__c','HIC_ShopifySync__HIC_Configuration__c')){
if(!listofConfiguration.isEmpty()){
listofConfiguration[0].HIC_ShopifySync__AccountContactBatchCompleted__c = true;
}
}
if(!listofConfiguration.isempty() && listofConfiguration != null ){
try{
update listofConfiguration;
}catch(exception e){
}
}
}else
// Call next batch For collection and collects
if(listofConfiguration[0].HIC_ShopifySync__Collection__c){
if(!test.isRunningTest()) {
HIC_ShopifyUtility.processCollections(listofConfiguration,store,updated_at_min,updated_at_max);
}
if(CheckAccessibility.isUpsertable('HIC_ShopifySync__AccountContactBatchCompleted__c','HIC_ShopifySync__HIC_Configuration__c')){
if(!listofConfiguration.isEmpty()){
listofConfiguration[0].HIC_ShopifySync__AccountContactBatchCompleted__c = true;
}
}
if(!listofConfiguration.isempty() && listofConfiguration != null ){
try{
update listofConfiguration;
}catch(exception e){
}
}
}else
//Call next batch for location inventory Item and level
if( listofConfiguration[0].HIC_ShopifySync__Inventory_Location__c){
HIC_ShopifyUtility.fetchLocations(listofConfiguration,store,updated_at_min,updated_at_max);
if(CheckAccessibility.isUpsertable('HIC_ShopifySync__AccountContactBatchCompleted__c','HIC_ShopifySync__HIC_Configuration__c')){
if(!listofConfiguration.isEmpty()){
listofConfiguration[0].HIC_ShopifySync__AccountContactBatchCompleted__c = true;
}
}
if(!listofConfiguration.isempty() && listofConfiguration != null ){
try{
update listofConfiguration;
}catch(exception e){
}
}
}else
// Call next batch for Draft order
if(listofConfiguration[0].HIC_ShopifySync__Draft_Order_Sync__c){
if(!test.isRunningTest()) {
HIC_ShopifyUtility.fetchDraftOrders(listofConfiguration,store,updated_at_min,updated_at_max);
}
if(CheckAccessibility.isUpsertable('HIC_ShopifySync__AccountContactBatchCompleted__c','HIC_ShopifySync__HIC_Configuration__c')){
if(!listofConfiguration.isEmpty()){
listofConfiguration[0].HIC_ShopifySync__AccountContactBatchCompleted__c = true;
}
}
if(!listofConfiguration.isempty() && listofConfiguration != null ){
try{
update listofConfiguration;
}catch(exception e){
}
}
}else{
// IF not available next batch then update the Configuration for track batch updates on page
if(CheckAccessibility.isUpsertable('HIC_ShopifySync__IsCurrencyChanged__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__AccountContactBatchCompleted__c,HIC_ShopifySync__OrderBatchCompleted__c','HIC_ShopifySync__HIC_Configuration__c')){
if(!listofConfiguration.isEmpty()){
listofConfiguration[0].HIC_ShopifySync__IsCurrencyChanged__c = false;
listofConfiguration[0].HIC_ShopifySync__Batch_Is_Processing__c = false;
listofConfiguration[0].HIC_ShopifySync__AccountContactBatchCompleted__c = true;
}
}
if(!listofConfiguration.isempty() && listofConfiguration != null ){
try{
update listofConfiguration;
EmailErrorCSV.SuccessMailSend();
}catch(exception e){
}
}
}
}
}
public static void createLead(String customerResponse, String store){
list<HIC_ShopifySync__HIC_Configuration__c> listofConfiguration = new list<HIC_ShopifySync__HIC_Configuration__c>();
String companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey;
String querys = 'Select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__DNCDAMissingAccounts__c,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__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__Enable_Lead__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__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';
listofConfiguration = database.query(querys);
list<HIC_ShopifySync__HIC_Field_Mapping__c> LeadFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
string query = '';
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')+' = \'Lead\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999';
LeadFieldsList = database.query(query);
Map<String, Object> MapofCustomer = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
if(!MapofCustomer.isEmpty() && MapofCustomer.containsKey('orders_count') && Integer.valueOf(MapofCustomer.get('orders_count')) < 1){
if(!MapofCustomer.isEmpty() && MapofCustomer.containskey('default_address')){
Map<String,Object> accMap = (Map<String,Object>)MapofCustomer.get('default_address');
if(!accMap.isEmpty() && accMap.containsKey('company') && (accMap.get('company') == null || accMap.get('company') == '' || accMap.get('company') == 'null')){
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)MapofCustomer.get('first_name')) ? '' : (String)MapofCustomer.get('first_name')) +
(String.isBlank((String)MapofCustomer.get('last_name')) ? '' : ' ' + (String)MapofCustomer.get('last_name'))
);
}
MapofCustomer.put('default_address', accMap);
// --------------------------------------------------------- End
}
}else if((MapofCustomer.containsKey('first_name') && MapofCustomer.get('first_name') != null) || (MapofCustomer.containsKey('last_name') && MapofCustomer.get('last_name') != null)){
MapofCustomer.put('default_address', new Map<String, Object>{'company' => (String)MapofCustomer.get('first_name') + MapofCustomer.get('last_name')});
}
}
String listType1 = 'List<' + 'Lead' + '>';
list<sobject> LeadListToupsert = (List<SObject>)Type.forName(listType1).newInstance();
list<HIC_ShopifySync__HIC_Field_Mapping__c> updatedLeadFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
if(updatedLeadFieldsList.isEmpty()){
System.debug('LeadFieldsList-->'+LeadFieldsList);
System.debug('updatedLeadFieldsList-->'+updatedLeadFieldsList);
LeadListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(LeadFieldsList,'Lead',MapofCustomer,listofConfiguration,companyTimeZone));
System.debug('LeadListToupsertif-->'+LeadListToupsert);
}else{
System.debug('updatedLeadFieldsList-->'+updatedLeadFieldsList);
LeadListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(updatedLeadFieldsList,'Lead',MapofCustomer,listofConfiguration,companyTimeZone));
System.debug('LeadListToupsertelse-->'+LeadListToupsert);
}
Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('Lead');
Map<String, SObjectField> fieldMap1 = objectType1.getDescribe().fields.getMap();
Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Shopify_Id__c');
if(!Test.isRunningTest()){
try{
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse,'Lead',LeadListToupsert,theField1,true,store);
}catch(Exception e){
System.debug('Exception '+ e.getMessage() + ' at' +e.getLineNumber());
}
}
}
public static void createAccountContact(String customerResponse, String store){
String companyTimeZone = [SELECT Id, TimeZoneSidKey FROM Organization Limit 1][0].TimeZoneSidKey;
list<HIC_ShopifySync__HIC_Configuration__c> listofConfiguration = new list<HIC_ShopifySync__HIC_Configuration__c>();
String querys = 'Select '+CheckAccessibility.isAccessible('id,name,HIC_ShopifySync__DNCDAMissingAccounts__c,HIC_ShopifySync__Default_Field_Mapping__c,HIC_ShopifySync__Batch_Is_Processing__c,HIC_ShopifySync__Specify_Close_Date__c, HIC_ShopifySync__Account_Contact__c, HIC_ShopifySync__Person_Account__c, HIC_ShopifySync__Default_Account__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__Enable_Lead__c, HIC_ShopifySync__Opportunity_Line_Item__c, HIC_ShopifySync__Order_Line_Item__c, HIC_ShopifySync__Order_Fulfillment__c, HIC_ShopifySync__Customer_Email_Domain__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';
listofConfiguration = database.query(querys);
// ====== B2B Store Path ======
if (!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Customer_Email_Domain__c == true) {
Map<String, Object> MapofCustomer = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
String email = '';
if (MapofCustomer.containsKey('email') && MapofCustomer.get('email') != null) {
email = String.valueOf(MapofCustomer.get('email')).trim();
}
if (String.isNotBlank(email) && email.contains('@')) {
String domain = email.substringAfter('@').substringBefore('.');
// Find or create Account by domain name
Id b2bAccountId;
List<Account> existingAccounts = [SELECT Id, Name FROM Account WHERE Name = :domain LIMIT 1];
if (!existingAccounts.isEmpty()) {
b2bAccountId = existingAccounts[0].Id;
} else {
Account acc = new Account(Name = domain);
insert acc;
b2bAccountId = acc.Id;
}
// Build Contact via field mapping
list<HIC_ShopifySync__HIC_Field_Mapping__c> ContactFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
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')+' = \'Contact\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999';
ContactFieldsList = database.query(query);
Map<String, Object> MapofCustomer1 = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
if (!(String.valueOf(MapofCustomer1.get('id'))).contains('Business ')) {
MapofCustomer1.put('id', 'Business ' + String.valueof(MapofCustomer1.get('id')));
}
MapofCustomer1.put('Accountid', MapofCustomer1.get('id'));
String listType1 = 'List<' + 'Contact' + '>';
list<sobject> ContactListToupsert = (List<SObject>)Type.forName(listType1).newInstance();
ContactListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(ContactFieldsList, 'Contact', MapofCustomer1, listofConfiguration, companyTimeZone));
// Override: clear external ID ref and set direct AccountId
if (!ContactListToupsert.isEmpty()) {
SObject con = ContactListToupsert[0];
con.putSObject('Account', null);
con.put('AccountId', b2bAccountId);
}
Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('Contact');
Map<String, SObjectField> fieldMap1 = objectType1.getDescribe().fields.getMap();
Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Shopify_Id__c');
try {
if (!Test.isRunningTest()) {
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse, 'Contact', ContactListToupsert, theField1, true, store);
}
} catch(Exception e) {
System.debug('Exception ' + e.getMessage() + ' at ' + e.getLineNumber());
}
}
return;
}
//Business Account is Enabled
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<HIC_ShopifySync__HIC_Field_Mapping__c> accountFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
string query = '';
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);
list<HIC_ShopifySync__HIC_Field_Mapping__c> updatedAccountFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
Map<String, Object> MapofCustomer = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
if(!MapofCustomer.isEmpty() && MapofCustomer.containskey('default_address')){
Map<String,Object> accMap = (Map<String,Object>)MapofCustomer.get('default_address');
if(!accMap.isEmpty() && accMap.containsKey('company') && (accMap.get('company') == null || accMap.get('company') == '' || accMap.get('company') == 'null')){
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)MapofCustomer.get('first_name')) ? '' : (String)MapofCustomer.get('first_name')) +
(String.isBlank((String)MapofCustomer.get('last_name')) ? '' : ' ' + (String)MapofCustomer.get('last_name'))
);
}
MapofCustomer.put('default_address', accMap);
// --------------------------------------------------------- End
}
}else if((MapofCustomer.containsKey('first_name') && MapofCustomer.get('first_name') != null) || (MapofCustomer.containsKey('last_name') && MapofCustomer.get('last_name') != null)){
MapofCustomer.put('default_address', new Map<String, Object>{'company' => (String)MapofCustomer.get('first_name') + MapofCustomer.get('last_name')});
}
String listType = 'List<' + 'Account' + '>';
list<sobject> accountListToupsert = (List<SObject>)Type.forName(listType).newInstance();
if(updatedAccountFieldsList.isEmpty()){
accountListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(accountFieldsList,'Account',MapofCustomer,listofConfiguration,companyTimeZone));
}else{
accountListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(updatedAccountFieldsList,'Account',MapofCustomer,listofConfiguration,companyTimeZone));
}
Map<String, Object> MapofCustomer1 = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
list<HIC_ShopifySync__HIC_Field_Mapping__c> ContactFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
query = '';
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')+' = \'Contact\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999';
ContactFieldsList = database.query(query);
MapofCustomer1.put('Accountid',String.valueof(MapofCustomer1.get('id')));
if(Schema.sObjectType.Account.fields.getMap().containsKey( 'ispersonaccount' )){
if(listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(MapofCustomer1.containsKey('Accountid') && !(String.valueOf(MapofCustomer1.get('Accountid'))).contains('Person ')){
MapofCustomer1.put('Accountid','Person '+String.valueof(MapofCustomer1.get('id')));
}else if(!MapofCustomer1.containsKey('Accountid')){
MapofCustomer1.put('Accountid','Person '+String.valueof(MapofCustomer1.get('id')));
}
}else if(!listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(MapofCustomer1.containsKey('Accountid') && !(String.valueOf(MapofCustomer1.get('Accountid'))).contains('Business ')){
MapofCustomer1.put('Accountid','Business '+String.valueof(MapofCustomer1.get('id')));
}else if(!MapofCustomer1.containsKey('Accountid')){
MapofCustomer1.put('Accountid','Business '+String.valueof(MapofCustomer1.get('id')));
}
}
}else{
if(MapofCustomer1.containsKey('Accountid') && !(String.valueOf(MapofCustomer1.get('Accountid'))).contains('Business ')){
MapofCustomer1.put('Accountid','Business '+String.valueof(MapofCustomer1.get('id')));
}else if(!MapofCustomer1.containsKey('Accountid')){
MapofCustomer1.put('Accountid','Business '+String.valueof(MapofCustomer1.get('id')));
}
}
if(Schema.sObjectType.Account.fields.getMap().containsKey( 'ispersonaccount' )){
if(listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(!(String.valueOf(MapofCustomer1.get('id'))).contains('Person ')){
MapofCustomer1.put('id','Person '+String.valueof(MapofCustomer1.get('id')));
}
}else if(!listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(!(String.valueOf(MapofCustomer1.get('id'))).contains('Business ')){
MapofCustomer1.put('id','Business '+String.valueof(MapofCustomer1.get('id')));
}
}
}else{
if(!(String.valueOf(MapofCustomer1.get('id'))).contains('Business '))
MapofCustomer1.put('id','Business '+String.valueof(MapofCustomer1.get('id')));
}
String listType1 = 'List<' + 'Contact' + '>';
list<sobject> ContactListToupsert = (List<SObject>)Type.forName(listType1).newInstance();
ContactListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(ContactFieldsList,'Contact',MapofCustomer1,listofConfiguration,companyTimeZone));
//if(accountListToupsert.Isempty()) return null;
Schema.SObjectType objectType = Schema.getGlobalDescribe().get('Account');
Map<String, SObjectField> fieldMap = objectType.getDescribe().fields.getMap();
Schema.SobjectField theField = fieldMap.get('HIC_ShopifySync__Shopify_Id__c');
try{
if(!Test.isRunningTest()){
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse,'Account',accountListToupsert,theField,true,store);
}
}catch(Exception e){
System.debug('Exception '+ e.getMessage() + ' at' +e.getLineNumber());
}
// if(ContactListToupsert.Isempty()) return null;
Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('Contact');
Map<String, SObjectField> fieldMap1 = objectType1.getDescribe().fields.getMap();
Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Shopify_Id__c');
try{
if(!Test.isRunningTest()){
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse,'Contact',ContactListToupsert,theField1,true,store);
// return null;
}
}catch(Exception e){
System.debug('Exception '+ e.getMessage() + ' at' +e.getLineNumber());
}
//Business Account & Contact is Enabled amd Default Account
}else 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 ){
Map<String, Object> MapofCustomer2 = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
list<HIC_ShopifySync__HIC_Field_Mapping__c> ContactFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>();
string query = '';
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')+' = \'Contact\' AND '+CheckAccessibility.isAccessible('HIC_ShopifySync__Store__c','HIC_ShopifySync__HIC_Field_Mapping__c')+' = \''+store+'\' LIMIT 49999';
ContactFieldsList = database.query(query);
if(Schema.sObjectType.Account.fields.getMap().containsKey( 'ispersonaccount' )){
if(listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(!(String.valueOf(MapofCustomer2.get('id'))).contains('Person ')){
MapofCustomer2.put('id','Person '+String.valueof(MapofCustomer2.get('id')));
}
}else if(!listofConfiguration[0].HIC_ShopifySync__Person_Account__c){
if(!(String.valueOf(MapofCustomer2.get('id'))).contains('Business ')){
MapofCustomer2.put('id','Business '+String.valueof(MapofCustomer2.get('id')));
}
}
}else{
if(!(String.valueOf(MapofCustomer2.get('id'))).contains('Business '))
MapofCustomer2.put('id','Business '+String.valueof(MapofCustomer2.get('id')));
}
String listType = 'List<' + 'Contact' + '>';
list<sobject> ContactListToupsert = (List<SObject>)Type.forName(listType).newInstance();
ContactListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(ContactFieldsList,'Contact',MapofCustomer2,listofConfiguration,companyTimeZone));
// if(ContactListToupsert.Isempty()) return null;
Schema.SObjectType objectType1 = Schema.getGlobalDescribe().get('Contact');
Map<String, SObjectField> fieldMap1 = objectType1.getDescribe().fields.getMap();
Schema.SobjectField theField1 = fieldMap1.get('HIC_ShopifySync__Shopify_Id__c');
if(!Test.isRunningTest()){
try{
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse,'Contact',ContactListToupsert,theField1,true,store);
}catch(Exception e){
System.debug('Exception '+ e.getMessage() + ' at' +e.getLineNumber());
}
}//return null;
//Person Account is Enabled
}else if(!listofConfiguration.isEmpty() && listofConfiguration[0].HIC_ShopifySync__Person_Account__c == true && listofConfiguration[0].HIC_ShopifySync__Default_Account__c == false ){
Map<String, Object> MapofCustomer = (Map<String, Object>) JSON.deserializeUntyped(customerResponse);
list<HIC_ShopifySync__HIC_Field_Mapping__c> PersonaccountFieldsList = new list<HIC_ShopifySync__HIC_Field_Mapping__c>([Select 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 from HIC_ShopifySync__HIC_Field_Mapping__c Where (HIC_ShopifySync__Object_Name__c = 'Account' OR HIC_ShopifySync__Object_Name__c = 'PersonAccount' ) And HIC_ShopifySync__SF_Field__c != 'name' And name !='Account-RecordTypeId' AND HIC_ShopifySync__Store__c =: store]);
String listType = 'List<' + 'Account' + '>';
list<sobject> PersonaccountListToupsert = (List<SObject>)Type.forName(listType).newInstance();
PersonaccountListToupsert.add(HIC_ShopifyUtility.processFieldTypeAndMapping(PersonaccountFieldsList,'Account',MapofCustomer,listofConfiguration,companyTimeZone));
try{
// if(PersonaccountListToupsert.Isempty()) return null;
Schema.SObjectType objectType = Schema.getGlobalDescribe().get('Account');
Map<String, SObjectField> fieldMap = objectType.getDescribe().fields.getMap();
Schema.SobjectField theField = fieldMap.get('HIC_ShopifySync__Shopify_Id__c');
EmailErrorCSV.makeCsvAndSendInEmail(customerResponse,'Account',PersonaccountListToupsert,theField,true,store);
}catch(Exception e){
System.debug('DML Error');
}
}
}
}