Monday, February 27, 2017

Using Email Template from Apex and merge it with Apex variable

Requirement : Schedule Email Alert to Opportunity Owner in the early of the month if their Opportunities fulfill some criteria.

The email template is like below :

Hi Jane,

There some opportunities that need to be closed in this month with contract amount more than $50,000.Please update it and reply to this email.
Opportunity Owner Opportunity Name Amount Currency Amount Confidence Stage Link
Jane Jackson XYZ Canteen USD 60000.00 Upside Create Click here to Opportunity
Jane Jackson ABC Devices USD 3000000.00 Upside Create Click here to Opportunity

regards,
Sales Action Team

The highlight mean variable value.To achieve this template we can do html code in apex from scratch which will cost longer time and of course the code will not be so neat.Or we can create Email Template in Setup, and I choose Custom Email Template.

In the HTML Body,I generate template as above in HTML.

Actually it is very easy, you don't have to code from the scratch.You can just choose any tool to convert the above format to HTML like I for this link quite useful.Or in case, your target customer is using Microsoft Outlook and love the format very much, you can just compose the email and sent to yourself.Then when you view the email, right click and View Source.


1
2
3
4
5
<p>Hi&nbsp;<span>OPPORTUNITY_OWNER</span>,</p>
<p>There some opportunities that need to be closed in this month with contract amount more than $50,000.Please update it and reply to this email.</p>
<p>OPPORTUNITY_TABLE</p>
<p>regards,</p>
<p>Sales Action Team</p>

Notice that I replace Jane to OPPORTUNITY_OWNER and table with OPPORTUNITY_TABLE.We will generate those in Apex code so we will have dynamic template.

In the Apex,let say I already retrieved the Opportunity value and just want to replace the value the actual value like below :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
//set owner email
mail.setToAddresses(ownerEmail); 

mail.setSubject('ACTION REQUIRED:Please update your Opportunity ');

//retrieve template
EmailTemplate tempId=[SELECT Id,HTMLValue,Body,Name FROM EmailTemplate WHERE Name= 'Opportunity_Alert' LIMIT 1];
String emailBody = tempID.HTMLValue;
String style='<style>table {    border-collapse: collapse;font-family: arial, helvetica, sans-serif; font-size: x-small;}td, th {    border: 1px solid black;padding:5px;}</style>';
String table=style+'<table style="border-color: #000000; border-width: 1px; width: 100%; border-style: solid;" cellspacing="0" ><tbody><tr><th>Opportunity Owner</th><th>Opportunity Name</th><th>Amount Currency</th><th>Amount</th><th>Confidence</th><th>Stage</th><th>Link</th></tr>';
List<Opportunity> listToSend =mapOpportunity.get(keyMap);
for(Opportunity opp: opportunityList){
 ownerName=opp.Owner.Name;
 table+='<tr><td>'+opp.Owner.Name+'</td><td>'+opp.Name+'</td><td>'+opp.CurrencyIsoCode+'</td><td>'+opp.Amount+'</td><td>'+opp.Confidence__c+'</td><td>'+opp.StageName+'</td><td><a href="'+url+opp.Id+'">Click Here to Opportunity</a></td></tr>';
}

table+='</tbody></table>';
emailbody=emailBody.replace('OPPORTUNITY_OWNER',ownerName);
emailBody =emailBody.replace('OPPORTUNITY_TABLE',table);
mail.setHtmlBody(emailBody);

This is the steps that I did:

  1. Query the EmailTemplate
  2. Assign HTMLValue to emailBody string
  3. Generate table
  4. Find OPPORTUNITY_OWNER and OPPORTUNITY_TABLE with the html that I generate and make sure we assign back to emailBody
  5. Set to the email using setHTMLBody
See!It 's piece of cake.

Have a nice day.

Wednesday, February 22, 2017

Compiled formula is too big to execute (6,581 characters). Maximum size is 5,000 characters


Compiled formula is too big to execute (6,581 characters). Maximum size is 5,000 characters

Face the issue when compiling this formula :
IF (Country_Code__c ='GB' || Country_Code__c ='IE' || Country_Code__c ='ZA' || Country_Code__c ='KE' || Country_Code__c ='MA' || Country_Code__c ='TZ' || Codes__c ='BH' || Country_Code__c ='OM' || Country_Code__c ='AE' || Country_Code__c ='QA' || Country_Code__c ='SA','EMEA_REGION',null )
Requirement if the country field fall into certain code it will be labelled as 'EMEA_REGION' .

The formula is very simple but it still throws the exception because Country_Code__c is the formula field itself and it depend on how many times it being called.In this case,Country_Code__c is being called 11 so these will be pulled in formula compilation.

The issue can be solved by reducing the calling;
IF( CONTAINS("GB:IE:ZA:KE:MA:TZ:BH:OM:AE:QA:SA",Country_Code__c),"EMEA_REGION",null)
Also this is how we can check multiple value.