Trigger Framework:
===================
We can develop code by putting code in trigger and using handler classes. Why
should I go with Trigger Framework?
-> As we know while writing the code we need to follow all best practices. Trigger
framework helps you to confirm best practices
that salesforce does provide.
-> Assure order of execution.
-> It prevents the recursion.
Trigger Interface -
------------------
public Interface TrggerInterface {
void beforeInsert(List<sObject> newRecordList);
void afterInsert(List<sObject> newRecordList, Map<Id,sObject> newMapRecord);
void beforeUpdate(Map<Id,sObject> newMapRecord, Map<Id,sObject> oldMapRecord);
void afterUpdate(Map<Id,sObject> newMapRecord, Map<Id,sObject> oldMapRecord);
void beforeDelete(List<sObject> oldRecordList, Map<Id,sObject> oldMapRecord);
void afterDelete(List<sObject> oldRecordList);
void afterUndelete(List<sObject> newRecordList, Map<Id,sObject> newMapRecord);
}
Trigger Dispatcher -
--------------------
public class DispatcherTrigger {
public static void run(TrggerInterface handler, System.TriggerOperation
operationMethodType){
switch on operationMethodType{
when BEFORE_INSERT{
handler.beforeInsert(Trigger.new);
}
when AFTER_INSERT{
handler.afterInsert(Trigger.new, Trigger.newMap);
}
when BEFORE_UPDATE{
handler.beforeUpdate(Trigger.newMap, Trigger.oldMap);
}
when AFTER_UPDATE{
handler.afterUpdate(Trigger.newMap, Trigger.oldMap);
}
when BEFORE_DELETE{
handler.beforeDelete(Trigger.old, Trigger.oldMap);
}
when AFTER_DELETE{
handler.afterDelete(Trigger.old);
}
when AFTER_UNDELETE{
handler.afterUndelete(Trigger.new, Trigger.newMap);
}
}
}
}
Contact Helper :
--------------------
public class ContactHelper implements TrggerInterface{
public static void beforeInsert(List<sObject> newRecordList){
public static void afterInsert(List<sObject> newRecordList, Map<Id,sObject>
newMapRecord) {
List<Contact> conList = (List<Contact>)newRecordList;
ContactTriggerHandler.countContactForAccount(conList);
}
public static void beforeUpdate(Map<Id,sObject> newMapRecord, Map<Id,sObject>
oldMapRecord){
Map<Id,Contact> newMapContact = (Map<Id,Contact>) newMapRecord;
Map<Id,Contact> oldMapContact = (Map<Id,Contact>) oldMapRecord;
ContactTriggerHandler.generateContactSafeIdNumber(newMapContact,
oldMapContact);
}
public static void afterUpdate(Map<Id,sObject> newMapRecord, Map<Id,sObject>
oldMapRecord){
public static void beforeDelete(List<sObject> oldRecordList, Map<Id,sObject>
oldMapRecord){
public static void afterDelete(List<sObject> oldRecordList){
public static void afterUndelete(List<sObject> newRecordList, Map<Id,sObject>
newMapRecord){
}
}
Contact Handler
-------------------
public class ContactTriggerHandler {
public static final String CLASS_NAME = 'ContactTriggerHandler';
/* public static void contactIdsInsertingForAccount(List<Contact> conList){
Map<Id,List<String>> accMap = new Map<Id,List<String>>(); // A1
// accountId - {12345,12345,12345}
for(Integer i =1; i<=5; i++){
for(Contact conObj : conList){
if(accMap.containsKey(conObj.AccountId)){
accMap.get(conObj.AccountId).add(conObj.Id);
System.debug('accMap 1' + accMap);
}else{
List<String> conId = new List<String>();
conId.add(conObj.Id);
accMap.put(conObj.AccountId,conId); // A1 - c1,c2,c3
System.debug('accMap 2' + accMap);
}
}
}
if(accMap.size() > 0 && !accMap.isEmpty()){
List<Account> accList = new List<Account>();
for(Account accObj : [Select Id, Contact_Ids__c From Account Where Id
IN :accMap.keySet()]){
if(accObj.Contact_Ids__c != Null){
accObj.Contact_Ids__c = ',';
accObj.Contact_Ids__c = String.valueOf(accMap.get(accObj.Id));
accList.add(accObj);
System.debug('Contact_Ids 1' + accObj.Contact_Ids__c);
}else{
accObj.Contact_Ids__c += accMap.get(accObj.Id);
System.debug('Contact_Ids 2' + accObj.Contact_Ids__c);
accList.add(accObj);
}
}
if(accList.size() > 0 && !accList.isEmpty()){
update accList;
}
}
}
public static void preventDeleteContact(List<Contact> conList){
for(Contact con : conList){
if(con.Email != Null){
con.Email.addError('Contact can not be deleted.');
}
}
}*/
public static void preventIsPrimaryContactForAccount(List<Contact> conList){
try{
Set<String> accIdSet = new Set<String>();
for(Contact conObj : conList){
if(String.isNotBlank(conObj.AccountId) && conObj.IsPrimary__c ==
True){
accIdSet.add(conObj.AccountId);
}
}
if(accIdSet.size() > 0 && !accIdSet.isEmpty()){
Map<Id,Contact> conMap = new Map<Id,Contact>();
for(Contact con : [Select Id, Name, IsPrimary__c, AccountId From
Contact Where IsPrimary__c = True And AccountId IN :accIdSet]){
if(String.isNotBlank(con.Id)){
conMap.put(con.AccountId, con);
}
}
if(conMap.size() > 0 && !conMap.isEmpty()){
for(Contact con : conList){
if(con.AccountId != Null && con.IsPrimary__c == True &&
conMap.containsKey(con.AccountId)){
con.IsPrimary__c.addError(System.label.Duplicate_Is_Primary_Error);
}
}
}
}
}catch(System.Exception ex){
ErrorHandlingUtility.doHandleExceptions(ex, CLASS_NAME);
}
}
public static void generateContactSafeIdNumber(Map<Id,Contact> newMapCon,
Map<Id,Contact> oldMapCon){
GenerateContactSafeId__c conSafeId =
GenerateContactSafeId__c.getValues('Safe Id Number');
System.debug('conSafeId' + conSafeId);
Integer contactSafeId = Integer.valueOf(conSafeId.Contact_Safe_Id__c);
// GenerateContactSafeId__c{id =111, contact_safe_id=12233, lasy}
Map<Id, Contact> conMap = new Map<Id, Contact>();
for(Contact con :newMapCon.values()){
if(con.Email != Null && con.IsPrimary__c == True &&
con.Contact_Safe_Id__c == Null){
contactSafeId++;
con.Contact_Safe_Id__c = String.valueOf(contactSafeId);
conMap.put(con.Id, con);
}
}
conSafeId.Contact_Safe_Id__c = String.valueOf(contactSafeId);
update conSafeId;
public static void countContactForAccount(List<Contact> contactList){
Set<Id> accIdSet = new Set<Id>();
for(Contact con : contactList){
if(String.isNotBlank(con.Id) && con.AccountId != Null){
accIdSet.add(con.AccountId);
}
}
if(accIdSet.size() > 0 && !accIdSet.isEmpty()){
Map<Id, Account> accMap = new Map<Id, Account>();
for(AggregateResult result : [Select count(Id) conCount, AccountId From
Contact Where AccountId IN :accIdSet Group By AccountId]){
Account acc = new Account();
acc.No_of_Contacts__c = (Integer) result.get('conCount');
acc.Id = (Id) result.get('AccountId');
accMap.put(acc.Id, acc);
}
if(accMap.size() > 0 && !accMap.isEmpty()){
update accMap.values();
}
}
}
/*public static void countContactForAccountWhenDelete(List<Contact>
contactList){
Set<Id> accIdSet = new Set<Id>();
for(Contact con : contactList){
if(con.AccountId != Null){
accIdSet.add(con.AccountId);
}
}
if(accIdSet.size() > 0 && !accIdSet.isEmpty()){
Map<Id, Account> accMap = new Map<Id, Account>();
for(AggregateResult result : [Select count(Id) conCount, AccountId From
Contact Where Id Not In :contactList And AccountId IN :accIdSet Group By
AccountId]){
Account acc = new Account();
acc.No_of_Contacts__c = (Integer) result.get('conCount');
acc.Id = (Id) result.get('AccountId');
accMap.put(acc.Id, acc);
}
if(accMap.size() > 0 && !accMap.isEmpty()){
update accMap.values();
}
}
}
public static void whenContactInsert(List<Contact> contactList){
List<Contact> conList = new List<Contact>();
for(Contact con : contactList){
Contact conToBeCreated = new Contact();
conToBeCreated.FirstName = 'Test';
conToBeCreated.LastName = 'Second';
conList.add(conToBeCreated);
}
if(conList.size() > 0 && !conList.isEmpty()){
insert conList;
}
}*/