function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Hitesh KhannaHitesh Khanna 

hi can anyone help me in writing helper/handler code for the following trigger? I am new to trigger and facing problems in writng the class....This trigger is supposed to update a field on Account record page which will show the number of related contacts

trigger contactTrigger on Contact (before insert,after insert,before update,after update,after undelete,after delete)
{
    if(trigger.isAfter){
        List<Contact> contactList = new List<Contact>();
        Set<Id> accountIdSet= new Set<Id>();
        if(trigger.isDelete){
            contactList=Trigger.old;
        }else{
            contactList=Trigger.new;
        }
        
        for(Contact con :contactList){
            if(con.AccountId!=null){
                accountIdSet.add(Con.AccountId);
            }
            if(Trigger.isUpdate){
                 Contact oldContact  = (Contact)Trigger.oldMap.get(con.Id);
            if(oldContact.AccountId != con.AccountId){
                accountIdSet.add(oldContact.AccountId);
            }
            }
           
        }
      List<Account> accountList = [SELECT Id,Name,Number_Of_Contacts__c,(select Id,Name From Contacts)
                                   FROM Account 
                                  WHERE Id IN:accountIdSet];
        for(Account acc: accountList){
            List<Contact> relatedContacts = acc.Contacts;
            if(relatedContacts !=null){
                acc.Number_Of_Contacts__c = relatedContacts.size();
                
            }else{
                acc.Number_Of_Contacts__c=0;
            }
        }
        update accountList; 
     
    }
    
}
Best Answer chosen by Hitesh Khanna
CharuDuttCharuDutt
Hii Hitesh
Try Below Code
public class relatedContact {
    
     public static void insertRecord( list<Contact> lstCon){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : lstCon){
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
                }
            }
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
    public static void updateRecord( list<Contact> lstCon,Map<Id, Contact> oldLeads){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : lstCon){ 
            if(con.AccountId!=oldLeads.get(con.Id).AccountId){
                   setAccIds.add(con.AccountId);
                setAccIds.add(oldLeads.get(con.Id).AccountId);
                }
            }
        
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
        public static void DeleteRecord( list<Contact> oldLeads){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : oldLeads){ 
            
                   setAccIds.add(con.AccountId);
                
            }
        
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
   
}


Trigger

trigger NumberOfChild on Contact (After Insert,After Update,After Delete) {
 if(Trigger.isInsert){
         if(trigger.isAfter){
      relatedContact.insertRecord(trigger.new);
        }
    } 
   
    if(Trigger.isUpdate){
         if(trigger.isAfter){
              relatedContact.updateRecord(trigger.new,trigger.oldMap);
        }
    }
    if(Trigger.isDelete){
        if(trigger.isAfter){
      relatedContact.DeleteRecord(trigger.old);
        }
    }    
}
Test Class
@isTest
public class NumberOfChildTest {
@isTest
    public Static Void UnitTest(){
        Account Acc = new account();
        Acc.name ='test';
        insert Acc;
        
        Account Acc2 = new account();
        Acc2.name ='test2';
        insert Acc2;
        
        Contact Con = new Contact();
        Con.LastName = 'TestCon';
        Con.AccountId = Acc.Id;
        Insert Con;
        Con.AccountId = Acc2.Id;
        Update Con;
        Delete Con;
    }
}

Please Mark It As Best Answer If it Helps Thank You!

All Answers

Hitesh KhannaHitesh Khanna
No charu, I want helper class for this trigger. My trigger is working fine
CharuDuttCharuDutt
Hii Hitesh
Try Below Code
public class relatedContact {
    
     public static void insertRecord( list<Contact> lstCon){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : lstCon){
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
                }
            }
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
    public static void updateRecord( list<Contact> lstCon,Map<Id, Contact> oldLeads){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : lstCon){ 
            if(con.AccountId!=oldLeads.get(con.Id).AccountId){
                   setAccIds.add(con.AccountId);
                setAccIds.add(oldLeads.get(con.Id).AccountId);
                }
            }
        
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
        public static void DeleteRecord( list<Contact> oldLeads){
         List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
   
        for(Contact con : oldLeads){ 
            
                   setAccIds.add(con.AccountId);
                
            }
        
         for(Account acc :[Select id,Total_Contacts__c ,Description ,(Select id,name,Salary__c from contacts) from Account where Id in : setAccIds]){
      acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
     }
   
}


Trigger

trigger NumberOfChild on Contact (After Insert,After Update,After Delete) {
 if(Trigger.isInsert){
         if(trigger.isAfter){
      relatedContact.insertRecord(trigger.new);
        }
    } 
   
    if(Trigger.isUpdate){
         if(trigger.isAfter){
              relatedContact.updateRecord(trigger.new,trigger.oldMap);
        }
    }
    if(Trigger.isDelete){
        if(trigger.isAfter){
      relatedContact.DeleteRecord(trigger.old);
        }
    }    
}
Test Class
@isTest
public class NumberOfChildTest {
@isTest
    public Static Void UnitTest(){
        Account Acc = new account();
        Acc.name ='test';
        insert Acc;
        
        Account Acc2 = new account();
        Acc2.name ='test2';
        insert Acc2;
        
        Contact Con = new Contact();
        Con.LastName = 'TestCon';
        Con.AccountId = Acc.Id;
        Insert Con;
        Con.AccountId = Acc2.Id;
        Update Con;
        Delete Con;
    }
}

Please Mark It As Best Answer If it Helps Thank You!
This was selected as the best answer
Hitesh KhannaHitesh Khanna
Thanks @Charu its working