Skip to content

Instantly share code, notes, and snippets.

@patmcclellan
Created October 1, 2020 00:24
Show Gist options
  • Save patmcclellan/d366744ac69ac6e59a821e70a754a796 to your computer and use it in GitHub Desktop.
Save patmcclellan/d366744ac69ac6e59a821e70a754a796 to your computer and use it in GitHub Desktop.
Example of using Maps in Apex Trigger Handler
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