Activity Forums Salesforce® Discussions Salesforce Batch Apex - send Leads and opportunity records in one email along with two different tables.

  • Salesforce Batch Apex - send Leads and opportunity records in one email along with two different tables.

    Posted by Muhammad Jawwad on March 26, 2019 at 1:30 pm

    Actually, I write a batch class to send an email last month leads to the loan officer lookup relation with a contact object at the beginning of the new month in a table format. Now I wanna send lead and opportunity both in one email along with two different tables. I have tried too many time but I could not succeed. Help me how to send two objects data in an email. Here is my existing code

    global class testoppty implements Database.Batchable<sObject> {
        public String query = 'SELECT Loan_Officer_1a__c,Loan_Officer_1a__r.Email, Name, Phone, Starting_Credit_Score__c, ' 
                              +  'Status, Enrolled_On__c, Est_Re_Pull_Date__c, Realtor_Name__c ' 
                              +   ' FROM Lead';
        query = 'SELECT Loan_Officer_1__c,Loan_Officer_1__r.Email, Name, Starting_Credit_Score__c, ' 
                              +  ' StageName, Enrolled_On__c, Est_Re_Pull_Date__c, Realtor_ID__r.Name ' 
                              +   ' FROM Opportunity';
        public EmailTemplate templateId = [Select Id,HtmlValue,Subject from EmailTemplate where name = 'LoanOfficerRecord' LIMIT 1];
    
        global Database.QueryLocator start(Database.BatchableContext bc) {
    
            query += ' WHERE CreatedDate >= LAST_MONTH AND CreatedDate <= THIS_MONTH AND Loan_Officer_1a__c != null';
            return Database.getQueryLocator(query);
        }
    
        global void execute(Database.BatchableContext BC, list<Lead> allLeads) {
            Map<Id,List<Lead>> leadMap = new Map<Id,List<Lead>>();
            List<Messaging.SingleEmailMessage> mails = new List<Messaging.SingleEmailMEssage>();
            if(allLeads != null && allLeads.size() > 0){
                for(Lead l: allLeads){
                    if(!leadMap.containsKey(l.Loan_Officer_1a__c)){
                        leadMap.put(l.Loan_Officer_1a__c, new List<lead>());
                    }
                    leadMap.get(l.Loan_Officer_1a__c).add(l);
                }
            }
            if(leadMap.keySet().size() > 0){
                Map<Id,Contact> officers = new Map<Id,Contact>([SELECT Id,Email,Name FROM Contact WHERE Id IN: leadMap.keySet()]);
                for(Id i: leadMap.keySet()){
                    Contact con = officers.get(i);
                    System.debug(con);
                    if(String.isnOtBlank(con.Email)){
                        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
                        mail.setToAddresses(new String[]{con.EMail});
                        mail.setSubject(templateId.Subject);
                        String html = templateId.HtmlValue;
                        html = html.replace('||OfficerName||',con.Name);
                        String leadsTable = '<table cellpadding="3" cellspacing="3" width="100%" align="center" border="1" style="border-collapse:collapse;">'+
                            '<tr style="font-weight:bold;"><td>Name</td><td>Phone</td><td>Starting Credit Score</td><td>Status</td><td>Enrolled On</td><td>Est. Re Pull Date</td><td>Realtor Name</td></tr>';
                        for(Lead l: leadMap.get(i)){
                            leadsTable += '<tr><td>'+l.Name+'</td>'+
                                '<td>'+l.Phone+'</td><td>'+l.Starting_Credit_Score__c+'</td><td>'+l.Status+'</td><td>'+l.Enrolled_On__c+'</td>'+
                                '<td>'+l.Est_Re_Pull_Date__c+'</td><td>'+l.Realtor_Name__c+'</td></tr>';
                        }
                        leadsTable += '</table>';
                        html = html.replace('||Leads||',leadsTable);
                        html = html.replace('null',' ');
                        mail.setHTMLBody(html);
                        mails.add(mail);
                    }
                }
            }
            if(mails.size() > 0){
                Messaging.sendEmail(mails);
            }
        }
    
        global void finish(Database.BatchableContext BC) {
    
        }
       
    }

     

    • This discussion was modified 5 years, 9 months ago by  Muhammad Jawwad.
    • This discussion was modified 5 years, 8 months ago by  Forcetalks.
    • This discussion was modified 5 years, 6 months ago by  Forcetalks.
    • This discussion was modified 5 years, 6 months ago by  Forcetalks.
    Avnish Yadav replied 5 years, 7 months ago 2 Members · 1 Reply
  • 1 Reply
  • Avnish Yadav

    Member
    April 29, 2019 at 12:50 pm

    Hello Muhammad,

    I go through your code and find errors on implementation of the batch class:-

    You are querying two objects in Database.query() which not possible in salesforce.

    Solution -You can create an internal query if your Lead object and Opportunity object are related. (use carefully)

    Thanks.

Log In to reply.

Popular Salesforce Blogs

Popular Salesforce Videos