Created
October 1, 2020 00:24
-
-
Save patmcclellan/d366744ac69ac6e59a821e70a754a796 to your computer and use it in GitHub Desktop.
Example of using Maps in Apex Trigger Handler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public with sharing class AccountTriggerHandler { | |
public static void handleBeforeInsert(List<Account> newAccounts){ | |
for (Account a : newAccounts) { | |
if (a.Est_Annual_Sales__c >= 5000000) { | |
a.Priority__c = 'Highest'; | |
} else if (a.Est_Annual_Sales__c >= 3000000) { | |
a.Priority__c = 'High'; | |
} else if (a.Est_Annual_Sales__c >= 1000000) { | |
a.Priority__c = 'Standard'; | |
} else { | |
a.Priority__c = 'Low'; | |
} | |
} | |
//this is a before trigger, so our handler doesn't have to call DML | |
} | |
public static void handleAfterInsert(List<Account> newAccounts){ | |
//What if you needed a different email contact for each Opportunity? | |
//For example, the Staff_Email_Address__c needs to be the related Account's Owner's email | |
//First build a set of Account OwnerIds | |
Set<String> ownerIds = new Set<String>(); | |
for(Account a : newAccounts){ | |
ownerIds.add(a.OwnerId); | |
} | |
//now get a list of all those users, with their email addresses | |
List<User> userList = [SELECT Id, Email | |
FROM USER | |
WHERE Id IN :ownerIds]; | |
//build a map of those emails, indexed by the User id that looks like this: | |
//{'0053t000007tJldAAE':'[email protected]', '0053t000007tJlaAAE':'[email protected]'} | |
Map<String,String> userEmailsById = new Map<String,String>(); | |
for(User u : userList){ | |
userEmailsById.put(u.Id, u.Email); | |
} | |
List<Case> cases = new List<Case>(); | |
for (Account a : newAccounts) { | |
Case c = new Case(); | |
c.Status = 'New'; | |
c.Origin = 'New Account'; //Make sure you've added this as a picklist value for this field | |
c.Subject = 'Send Welcome Package'; | |
c.AccountId = a.Id; | |
c.Description = 'Please follow up with this new Account and send them a Welcome Package.'; | |
//Get the email address for the Account owner by pulling it out of the map, using the a.OwnerId key | |
c.Staff_Email_Address__c = userEmailsById.get(a.OwnerId); | |
cases.add(c); | |
} | |
if(cases.size() > 0){ | |
try{ | |
insert cases; | |
}catch(DmlException e){ | |
System.debug('could not insert cases: ' + e.getMessage()); | |
} | |
} | |
} | |
public static void handleAfterUpdate(List<Account> acctsForUpdate, Map<Id, Account> oldAcctMap){ | |
//First thing we do is query for all the opportunities on accounts involved in this trigger | |
//The SOQL query below uses a nested query, this let's us pull back each acccount with a list of its opportunities attached. | |
//We won't be covering nested queries in this class, but take a look and see if you can figure out how they work | |
Map<Id, Account> acctsWithOpps = new Map<Id, Account>( | |
[SELECT Id, (SELECT Id FROM Opportunities WHERE IsClosed = false) FROM Account WHERE Id IN :acctsForUpdate] | |
); | |
//Let's make a list to hold any opportunities we create for later insertion | |
List<Opportunity> newOpportunities = new List<Opportunity>(); | |
//Now we need to loop through the accounts in this trigger and see if their priority has been changed in the way we're looking for | |
for (Account updatedAcct : acctsForUpdate) { | |
//ok, so now we have the udpated Account record, but we also need to compare it to the old version to see what has changed | |
//We can use the oldAccountMap, pass it the Account Id, and we'll get the old version for comparison | |
Account oldAcct = oldAcctMap.get(updatedAcct.Id); | |
//ok, now we have the new and old versions of the same record and we can make our comparison | |
if ((oldAcct.Priority__c != 'Highest' && oldAcct.Priority__c != 'High') && (updatedAcct.Priority__c == 'Highest' || updatedAcct.Priority__c == 'High')) { | |
//we have a winner! now check and see if the account has any Open Opportunities | |
System.debug('Number of Opportunities on this Account' + acctsWithOpps.get(updatedAcct.Id).Opportunities.size()); | |
if (acctsWithOpps.get(updatedAcct.Id).Opportunities.size() == 0) { | |
//Ok, this account has no open opportunities, let's create one | |
Opportunity opp = new Opportunity(); | |
opp.Name = updatedAcct.Name + ' Opportunity'; | |
opp.StageName = 'Prospecting'; | |
opp.CloseDate = Date.today().addMonths(3); | |
opp.AccountId = updatedAcct.Id; | |
newOpportunities.add(opp); | |
} | |
} | |
} | |
//Finally, insert any new Opportunities | |
if (newOpportunities.size() > 0) { | |
insert newOpportunities; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment