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 7 years, 4 months ago by  Muhammad Jawwad.
    • This discussion was modified 7 years, 4 months ago by  Forcetalks.
    • This discussion was modified 7 years, 2 months ago by  Forcetalks.
    • This discussion was modified 7 years, 2 months ago by  Forcetalks.
    Avnish Yadav replied 7 years, 3 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

Skip to toolbar