• mr360Aj
  • NEWBIE
  • 20 Points
  • Member since 2023

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 9
    Questions
  • 2
    Replies
My requirement is update existing record and avoid duplicate email record.
  • September 28, 2023
  • Like
  • 0
test class : 
@isTest
public class TestGetZohoRecords {
    @isTest
    static void testGetActivity() {

        List<Lead> leadList = New List<Lead>();
        Lead ld = New Lead(firstName = 'Jon', lastName = 'Doe', company = 'test', email = 'test@test.com');
        leadList.add(ld);

        Test.startTest();
                
        Test.setMock(HttpCalloutMock.class, new ZohoCRMHttpMock());
        HttpResponse response = getZohoRecords.getActivity();
        
        insert leadList;
        
        System.assertEquals(200, response.getStatusCode());
        
        Test.stopTest();
    }
}

mockClass : 
@isTest
public class ZohoCRMHttpMock implements HttpCalloutMock {
    public HTTPResponse respond(HTTPRequest req) {
     
        HttpResponse res = new HttpResponse();
        res.setStatusCode(200);
        res.setBody('{"data": [{"id": "123", "Full_Name": "John Doe", "Last_Activity_Time": "2023-09-20T10:00:00Z"}]}');
        return res;
    }
}

User-added image

test lead records not populate in leadList.
  • September 27, 2023
  • Like
  • 0
System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out.

apex class : 
public class getZohoRecords {
    public static HttpResponse getActivity(){
        List<Lead> leadList = new List<Lead>();
        string accToken = 'XXXXXXXXXXXXXXXXX';
        Http http = new http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint('https://www.zohoapis.in/crm/v2/Leads?fields=Full_Name&fields=Email&fields=Last_Activity_Time');
        request.setHeader('Authorization', 'Bearer ' + accToken);
        request.setMethod('GET');
        HttpResponse response = http.send(request);
        if(response.getStatusCode() == 200) {
            system.debug(response.getBody());
            Map<String, Object> deserialized = (Map<String, Object>)JSON.deserializeUntyped(response.getBody());
            for(Object m2 : (List<Object>) deserialized.get('data')){
                Map<String, Object> leadFields = (Map<String, Object>)m2;
                String id = (String)leadFields.get('id');
                String fullName = (String)leadFields.get('Full_Name');
                String lastActivityTime = (String)leadFields.get('Last_Activity_Time');
                
                if(lastActivityTime != null){
                    Http https = new http();
                    HttpRequest requests = new HttpRequest();
                    
                    requests.setEndpoint('https://www.zohoapis.in/crm/v2/leads/'+id+'/activities');
                    requests.setHeader('Authorization', 'Bearer ' + accToken);
                    requests.setMethod('GET');
                    HttpResponse responses = https.send(requests);
                    if(responses.getStatusCode() == 200) {
                        system.debug(responses.getBody());
                        leadList = [Select id, Name From Lead WHERE Name = :fullName];
                        if(leadList.size() > 0){
                            Map<String, Object> deserializeds = (Map<String, Object>)JSON.deserializeUntyped(responses.getBody());
                            for(Object m21 : (List<Object>) deserializeds.get('data')){
                                Map<String, Object> leadField = (Map<String, Object>)m21;
                                String ActivityType = (String)leadField.get('Activity_Type');
                                if(ActivityType == 'Tasks'){
                                    Task tasks = new Task();
                                    tasks.whoId = leadList[0].id;
                                    tasks.Priority = (String)leadField.get('Priority');
                                    tasks.Status = (String)leadField.get('Status');
                                    tasks.Subject = (String)leadField.get('Subject');
                                    tasks.Description = (String)leadField.get('Description');
                                    
                                    string dueDate = (String)leadField.get('Due_Date');
                                    Date actDate = Date.valueOf(dueDate);
                                    tasks.ActivityDate = actDate;
                                    
                                    string crtDate = (String)leadField.get('Created_Time');
                                    Date dt = Date.valueOf(crtDate);
                                    tasks.CreatedDate = dt;
                                    
                                    Insert tasks;
                                    system.debug(tasks);
                                } else if(ActivityType == 'Events'){
                                    Event events = new Event();
                                    events.WhoId = leadList[0].id;
                                    events.subject = (String)leadField.get('Subject');
                                    events.IsAllDayEvent = (Boolean)leadField.get('All_day');
                                    events.Description = (String)leadField.get('Description'); 
                                    
                                    string startTime = (String)leadField.get('Start_DateTime');
                                    DateTime startTm = Datetime.valueOf(startTime.replace('T',' '));
                                    events.StartDateTime = startTm;
                                    
                                    string endTime = (String)leadField.get('End_DateTime');
                                    DateTime endTm = Datetime.valueOf(endTime.replace('T',' '));
                                    events.EndDateTime = endTm;
                                    
                                    string crtDate = (String)leadField.get('Created_Time');
                                    Date dt = Date.valueOf(crtDate);
                                    events.CreatedDate = dt;
                                    
                                    insert events;
                                    system.debug(events);
                                } else if(ActivityType == 'Calls'){
                                    Task calls = new Task();
                                    calls.whoId = leadList[0].id;
                                    calls.type = 'Call';
                                    calls.TaskSubtype = 'Call';
                                    calls.Description = (String)leadField.get('Description');
                                    calls.Subject = (String)leadField.get('Subject');
                                    calls.CallType = (String)leadField.get('Call_Type');
                                    if((String)leadField.get('Priority') == null){
                                        calls.Priority = 'Normal';
                                    }else{
                                        calls.Priority = (String)leadField.get('Priority');
                                    }
                                    if((String)leadField.get('Status') == null){
                                        calls.Status = 'Completed';
                                    }else{
                                        calls.status = (String)leadField.get('Status');   
                                    }
                                    
                                    string crtDate = (String)leadField.get('Created_Time');
                                    Date dt = Date.valueOf(crtDate);
                                    calls.CreatedDate = dt;
                                    
                                    Insert calls;
                                    system.debug(calls);
                                }
                            }
                        }
                    }else{
                        system.debug(responses.getStatusCode());
                        system.debug(responses);
                        system.debug('No Activity found in lead');
                    }
                }
            }
            
        } else if(response.getStatusCode() == 401){
            Http ht = new http();
            HttpRequest req = new HttpRequest();
        
            req.setEndpoint('https://accounts.zoho.in/oauth/v2/token?code=XXXXXXXXXX&cl----------');
            req.setMethod('POST');
            HttpResponse res = ht.send(req);
            Map<String, Object> results = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
            String token = '';
            String refreshtoken = '';
            if(res.getStatusCode() == 200){
                token = (String)results.get('access_token');
                refreshtoken = (String)results.get('refresh_token');
                system.debug(res);
                system.debug(token);
            }else{
                system.debug(res);
            }
        }else{
            system.debug(response);
        }
        return response;
    }
}
  • September 15, 2023
  • Like
  • 0
How to get lead activity from zoho crm in salesforce?
  • September 08, 2023
  • Like
  • 0
apex class : 
public class AttachmentImportController {
    public string csvRecords {get;set;}
    
    public void insertAttachmentRecords(){
        try{    
            List< AttachmentImportController.ObjectWrapper> objectRecords = (List< AttachmentImportController.ObjectWrapper>)JSON.deserialize(csvRecords, List< AttachmentImportController.ObjectWrapper>.class);
            List<ContentVersion> objectListToInsert = new List<ContentVersion>();
            csvRecords = '';
            Set<String> importIds = new Set<String>();
            Set<String> userEmail = new Set<String>(); 
            for(ObjectWrapper objRow : objectRecords){
                String iv = objRow.attachmentresource_id;
                if (!String.isEmpty(iv)) {
                    importIds.add(iv);
                }
                String em = objRow.email
                if(em.contains('.co.uk')){
                    em = em.replaceAll('.co.uk', '.com');
                }
                if (!String.isEmpty(em)) {
                    userEmail.add(em);
                }     
            }
                
            Map<String, Lead> importIdToLeadMap = new Map<String, Lead>();
            List<Lead> ldlist = [SELECT Id, import_id__c FROM Lead WHERE import_id__c IN :importIds];
            for (Lead ld : ldlist) {
                importIdToLeadMap.put(ld.import_id__c, ld);
            }
            Map<String, User> emailToUserMap = new Map<String, User>();
            List<User> uslist = [SELECT Id, email FROM User WHERE email IN :userEmail];
            for (User us : uslist) {
                emailToUserMap.put(us.email, us);
            }   
            
            for(ObjectWrapper objRow : objectRecords){
                ContentVersion newAttach = New ContentVersion();
                
                newAttach.PathOnClient = objRow.attachment_filename;
                string iv = objRow.attachmentresource_id;
                if(!String.isEmpty(iv) && importIdToLeadMap.containsKey(iv)){
                    newAttach.FirstPublishLocationId = importIdToLeadMap.get(iv).Id;
                }
                
                String em = objRow.email;
                if(em.contains('.co.uk')){
                    em = em.replaceAll('.co.uk', '.com');
                }
                if(!String.isEmpty(em) && emailToUserMap.containsKey(em)){
                    newAttach.OwnerId = emailToUserMap.get(em).Id;
                }
                
                String url = objRow.full_path;
                url = url.replace(' ', '%20');
                Pagereference pg = new Pagereference(url); 
                Blob file1 = pg.getContent();                        
                newAttach.VersionData = file1;
                
                objectListToInsert.add(newAttach);
    
            }
            
            objectRecords = null;
            insert objectListToInsert;
        }catch(exception e){
            system.debug(e.getMessage());
            system.debug(e.getLineNumber());
        }
    }
    
    public class ObjectWrapper{
                
        public String attachment_created {get;set;}
        public String attachment_filename {get;set;}
        public String email{get;set;}
        public String attachmentresource_id{get;set;} 
        public String full_path{get;set;}
    }
}
for(String csvLine : csvFileLines){
                       
                        List<String> csvRecordData = new List<String>();

                        for(String column : csvLine.split(',')){
                            column = column.replaceAll(':quotes:', '').replaceAll(':comma:', ',').replaceAll(':newLine:', '\n');
                            csvRecordData.add(column);
                        } 
                            
                        if(csvRecordData.size() > 10){
                            String iv = csvRecordData[9];
                            if (!String.isEmpty(iv) && importIdToLeadMap.containsKey(iv)) {
                                ContentVersion attach = New ContentVersion();
                                attach.Description = 'CreatedDate : ' + csvRecordData[1];
                                String em = csvRecordData[2];                           
                                if (!String.isEmpty(em) && emailToUserMap.containsKey(em)) {
                                    attach.OwnerId = emailToUserMap.get(em).Id;
                                }
                                attach.pathOnClient = csvRecordData[3];
                                String st = csvRecordData[3].substring(0, csvRecordData[3].lastIndexOf('.'));
                                attach.Title = st;
                                attach.firstPublishLocationId = importIdToLeadMap.get(iv).Id;
                                String url = csvRecordData[10];
                                url = url.replace(' ', '%20');
                                Pagereference pg = new Pagereference(url); 
                                Blob file1 = pg.getContent();
                                attach.VersionData = file1;
                                
                                   attachlist.add(attach);
                                pg =Null;
                             }
                          }
                        csvRecordData = null;
                    }
                    
csvFileLines = csvAsString.split('\n');
                    
                    for(Integer i=1; i < csvFileLines.size(); i++){
                        String csvLine = csvFileLines[i];
                    
                        List<String> csvRecordData = new List<String>();
                        
                        for(String column : csvLine.split(',')){
    
                            column = column.replaceAll(':quotes:', '');
                            column = column.replaceAll(':comma:', ',');
                            column = column.replaceAll(':newLine:', '\n');
    
                            csvRecordData.add(column);
                        }     
                        
                        IF(csvRecordData != Null){
                            
                            FeedItem cmnt = New FeedItem();       
   
                            cmnt.Body = csvRecordData[2].replaceAll('<br />', '\r\n');
                            
                            Datetime createDate = DateTime.valueOfGmt(csvRecordData[4]); 
                            cmnt.CreatedDate = createDate;
                               
                            String iv = csvRecordData[1];
                            if(!String.isEmpty(iv)){
                                Lead ld = Database.query('SELECT id, import_id__c FROM User WHERE import_id__c = :iv');
                                cmnt.ParentId = ld.Id;
                               }
                            
                            cmntlist.add(cmnt);
                            
                        }
                    }
I have a visualforce page where users upload a csv file to create lead records. This worked fine in 100 record, but when I try a 6000 records I got a heap size issue.
Apex Class : 
//To Import Lead, comment and attachment data
public class importDataFromCSVController {

    public transient blob csvFileBody{get;set;}
    public String csvAsString{get;set;}
    public String[] csvFileLines{get;set;}
    public List<Lead> leadlist{get;set;}
    public List<ContentVersion> attachlist{get;set;}
    public List<FeedItem> cmntlist{get;set;}
    public String csvSuccess{get;set;}
    
    public importDataFromCSVController(){
        csvFileLines = new String[]{};
        leadlist= New List<Lead>();
        attachlist= New List<ContentVersion>();
        cmntlist=New List<FeedItem>();
    }
        
    public void importCSVFile(){
        try{
            
            csvAsString = csvFileBody.toString();
            String csvLine = csvAsString;
            Integer startIndex;
            Integer endIndex;
            
            IF(csvAsString != Null){ 
                    
                  while(csvAsString.indexOf('"') > -1){
            
                    if(startIndex == null){
                         startIndex = csvAsString.indexOf('"');
                        csvAsString = csvAsString.substring(0, startIndex) + ':quotes:' + csvAsString.substring(startIndex+1, csvAsString.length());
                    }else{
                           if(endIndex == null){
                             endIndex = csvAsString.indexOf('"');
                            csvAsString = csvAsString.substring(0, endIndex) + ':quotes:' + csvAsString.substring(endIndex+1, csvAsString.length());
                          }
                       }
                            
                    if(startIndex != null && endIndex != null){
                           String sub = csvAsString.substring(startIndex, endIndex);
                        sub = sub.replaceAll(',', ':comma:');
                        sub = sub.replaceAll('\n', ':newLine:');
                           csvAsString = csvAsString.substring(0, startIndex) + sub + csvAsString.substring(endIndex, csvAsString.length());
                        startIndex = null;
                        endIndex = null;
                    }
                   }
                
                //upload lead records
                if(csvAsString.contains('lead_lastname')){
                    csvFileLines = csvAsString.split('\n');
                    for(Integer i=1; i < csvFileLines.size(); i++){
                        
                        String[] csvRecordData = csvFileLines[i].split(',');
                           system.debug('csvRecordData : ' + csvRecordData);
                        
                        IF(csvRecordData != Null){
                             
                            Lead ldObj = New Lead();
                            string ii = csvRecordData[0];
                            
                            List<Lead> ldList= Database.query('Select id,email,import_id__c From Lead Where import_id__c = :ii');
                            if(ldList.size() > 0){
                                continue;
                            }
                            ldObj.Import_Id__c = ii;
                            ldObj.FirstName = csvRecordData[6];
                            if(String.isEmpty(csvRecordData[7])){
                                ldObj.LastName = '[lastname]';
                            }else{
                                ldObj.LastName = csvRecordData[7]; 
                            }
                            ldObj.Company = csvRecordData[6] + ' ' + csvRecordData[7];
                           
                            ldObj.Email = csvRecordData[8];
                            ldObj.Phone = csvRecordData[9];
                            ldObj.Title = csvRecordData[11].replaceAll(':quotes:', '').replaceAll(':comma:', ',').replaceAll(':newLine:', '\n');
                            ldObj.Description = csvRecordData[12].replaceAll(':quotes:', '').replaceAll(':comma:', ',').replaceAll(':newLine:', '\n').replaceAll('<br />', '\r\n') + ' CreatedDate : ' + csvRecordData[1] + ' ConvertedDate : ' + csvRecordData[17];
                            ldObj.Status = csvRecordData[18];                    
                            if(csvRecordData.size() > 21 ){ldObj.project_budget__c = csvRecordData[21];}
                            if(csvRecordData.size() > 22 ){ldObj.your_interested__c = csvRecordData[22];}
                            if(csvRecordData.size() > 23 ){ldObj.your_find__c = csvRecordData[23];}
                            if(csvRecordData.size() > 24 ){ldObj.user_ip__c = csvRecordData[24];}
                            if(csvRecordData.size() > 26 ){ldObj.Landing_page_URL__c = csvRecordData[26];}
                            
                            if(csvRecordData[15] == 'no'){
                                  ldObj.IsConverted = False;
                            }else{
                                   ldObj.IsConverted = True; 
                            }
                            
                            String em = csvRecordData[16];
                            if(em.contains('.uk')){
                                em = em.replaceAll('.co.uk', '.com');
                            }
                            if(!String.isEmpty(em)){
                                User users = Database.query('SELECT id, email FROM User WHERE email = :em');
                                ldObj.OwnerId = users.Id;
                            }
                            leadlist.add(ldObj);
                                                      
                        }
                        
                    }
                    if(leadlist.size()>0){
                        insert leadlist;
                        system.debug(leadlist);
                        leadlist =NULL;
                    }
                    
                //upload attachment record
                }else if(csvAsString.contains('attachment_id')){
                    csvFileLines = csvAsString.split('\n');
                    for(Integer i=1; i < csvFileLines.size(); i++){
                    
                        String[] csvRecordData = csvFileLines[i].split(',');
                        
                        IF(csvRecordData != Null){
                              
                            ContentVersion attach = New ContentVersion();
                            
                            String iv = csvRecordData[9];
                            Lead ld = Database.query('SELECT id,import_id__c FROM Lead WHERE import_id__c = :iv');
                            system.debug(ld);
                            
                            attach.pathOnClient = csvRecordData[3].replaceAll(':quotes:', '').replaceAll(':comma:', ',').replaceAll(':newLine:', '\n');
                            attach.firstPublishLocationId = ld.id;
                            String st = csvRecordData[3].substring(0, csvRecordData[3].lastIndexOf('.'));
                            attach.Title = st;
                            
                            attach.Description = 'CreatedDate : ' + csvRecordData[1];
                            
                            String url = csvRecordData[10];
                            url = url.replace(' ', '%20');
                            Pagereference pg = new Pagereference(url); 
                            Blob file1 = pg.getContent();                        
                            attach.VersionData = file1;
                            
                            String em = csvRecordData[2];
                            if(em.contains('.uk')){
                                em = em.replaceAll('.co.uk', '.com');
                            }
                            if(!String.isEmpty(em)){
                                User users = Database.query('SELECT id, email FROM User WHERE email = :em');
                                attach.OwnerId = users.Id;
                                System.debug('User : ' + users);
                            }
                            
                            attachlist.add(attach);
                            pg =Null;
                        }
                    }
                    if(attachlist.size()>0){                    
                        insert attachlist;
                        system.debug(attachlist);
                        attachlist =NULL;
                    }
                    
                //upload comments
                   }else if(csvAsString.contains('comment_id')){
                    csvFileLines = csvAsString.split('\n');
                    system.debug(csvFileLines);
                    for(Integer i=1; i < csvFileLines.size(); i++){

                        String[] csvRecordData = csvFileLines[i].split(',');
                        IF(csvRecordData != Null){
                            
                            system.debug(csvRecordData);
                            FeedItem cmnt = New FeedItem();       
                            
                            String iv = csvRecordData[1];
                            Lead ld = Database.query('SELECT id,import_id__c FROM Lead WHERE import_id__c = :iv');
                            cmnt.ParentId = ld.Id;
                                
                            cmnt.Body = csvRecordData[2].replaceAll(':quotes:', '').replaceAll(':comma:', ',').replaceAll(':newLine:', '\n').replaceAll('<br />', '\r\n');
                            
                            Datetime createDate = DateTime.valueOfGmt(csvRecordData[4]); 
                            cmnt.CreatedDate = createDate;
                             
                            system.debug(cmnt);
                            cmntlist.add(cmnt);
                        
                        }
                         csvRecordData =Null;
                    }
                    if(cmntlist.size()>0){
                        insert cmntlist;
                        system.debug(cmntlist);
                        cmntlist =NULL;
                    }
                   }
            
            }
            csvSuccess = 'Records Successfully Imported';
            csvFileLines = Null;
        }catch (Exception e){
            ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured while importing data into Salesforce. ' + e.getMessage());
            ApexPages.addMessage(errorMessage);
            System.debug('Error : ' + e.getMessage());
            System.debug('Error Line : ' + e.getLineNumber());
            
            Error_Log__c err = New Error_Log__c();
            err.Error_Line__c = e.getLineNumber();
            err.Name = e.getTypeName();
            err.Error_Message__c = e.getMessage();
            err.Error_Location__c = e.getStackTraceString();
            
            Insert err;
        }finally {
               csvfileBody = null;
         }
    }
}

Visualforce Page :
<apex:page controller="importDataFromCSVController" sidebar="false" showHeader="false" >
    <apex:form >
        <apex:pagemessages />
        <apex:pageBlock >
            <apex:pageBlockSection columns="4">
                <apex:inputFile value="{!csvFileBody}"  filename="{!csvAsString}" />
                <apex:commandButton value="Import Leads into Salesforce" action="{!importCSVFile}"/>
            </apex:pageBlockSection>
        </apex:pageBlock>
        <apex:pageBlock >
            <apex:outputText value="{!csvSuccess}"></apex:outputText>
        </apex:pageBlock>
    </apex:form>
</apex:page>
One requirement I'm looking parsing(reading) contents and converting them into Salesforce records. Is there any webservice product that does the job? Any help/code snippets on this matter would be much appreciated..!!
My requirement is update existing record and avoid duplicate email record.
  • September 28, 2023
  • Like
  • 0