• uday uday chavan
  • NEWBIE
  • 20 Points
  • Member since 2021

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 10
    Questions
  • 9
    Replies
how write test class for this 

vf page contoller:
public with sharing class ChangePrimaryContactCtrl {
    private Id recordId; 
    public Opportunity optyRecord {get;set;}
    public List<OppConRoleWrapper> primaryContactWrapperList {get;set;}
    public Contact newConRecord     {get;set;}
    public Boolean showNewContactScreen {get;set;}
    public String index {get;set;}
    public String titleInputString  {get;set;}
    public ChangePrimaryContactCtrl() {
        recordId                    =   apexpages.currentpage().getparameters().get('id');
        primaryContactWrapperList   =   new List<OppConRoleWrapper> ();
        newConRecord                =   new Contact();
        showNewContactScreen        =   false;
        optyRecord                  =   new Opportunity();
        index                       =   '';
        titleInputString            =   '';
        if(String.isNotBlank(recordId) ) {
           
            queryAllContactRoles();
            
        }
    }
    public Pagereference doCancel() {
        Pagereference pgr = new Pagereference('/'+recordId);
        return pgr;
    }
    public void save() {
        Savepoint sp = Database.setSavepoint();
        if (String.isBlank(index)) {
            return;
        }
        Integer indexValue = Integer.valueOf(index);
        try {
            Contact con  = new Contact();
            if (!primaryContactWrapperList.isEmpty() && primaryContactWrapperList.size() > indexValue) {
                con = primaryContactWrapperList[indexValue].conRecrd;
            }
            // for (OppConRoleWrapper wrapper : primaryContactWrapperList) {
            //     if(wrapper.isSelected) {
            //         con = wrapper.conRecrd;
            //         break;
            //     }
            // }
            if(String.isBlank(con.id)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Please select atleast one contact.'));
                return ;
            }
            if (optyRecord.Primary_Contact__c == con.id) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO,'Please change the contact before saving. Click Back to exit.'));
                return ;
            }
            //Update the Opportunity
            update new Opportunity(Id=optyRecord.Id,Primary_contact__c = con.id);
            //update the Custom Account Role
            if(String.isNotBlank(optyRecord.Account_Role__c)) {
                update new Account_Role__c (Id=optyRecord.Account_Role__c,Primary_Contact__c = con.id);
            }
            
            queryAllContactRoles();
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM,'Primary Contact Updated'));  
        } catch (Exception ex) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Message: '+ex.getMessage() + ' at Line Number: '+ex.getLineNumber()));              
            Database.rollback(sp);
            return;
        }
    }
    public void CreateNewContact() {
        showNewContactScreen = true;
    }
    public void doCancelMakePrimary() {
        showNewContactScreen = false;
    }
    public void makePrimary() {
        Savepoint sp = Database.setSavepoint();
        try {
            
            if(String.isBlank(newConRecord.LastName)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Last Name cannot be blank.'));   
                return;
            }
            
            if(String.isBlank(newConRecord.Email)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Email cannot be blank.'));  
                return; 
            }
            newConRecord.AccountId = optyRecord.AccountId;
            newConRecord.Is_From_Change_Primary_Contact__c = true;
            insert newConRecord;

            //Update the Opportunity
            update new Opportunity(Id=optyRecord.Id,Primary_contact__c = newConRecord.id);
            //update the Custom Account Role
            if(String.isNotBlank(optyRecord.Account_Role__c)) {
                update new Account_Role__c (Id=optyRecord.Account_Role__c,Primary_Contact__c = newConRecord.id);
            }
            if (String.isNotBlank(titleInputString)) {
                List<AccountContactRelation> acrList = [SELECT id FROM AccountContactRelation WHERE AccountId = :optyRecord.AccountId AND ContactId = : newConRecord.id Order by CreatedDate DESC LIMIT 1];
                if (!acrList.isEmpty()) {
                    acrList[0].Title__c = titleInputString;    
                    update acrList;
                }
                
            }
            queryAllContactRoles();
            showNewContactScreen = false;
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM,'New Primary Contact Added & Updated.'));  
            newConRecord = new Contact();
            titleInputString = '';
        }catch(Exception ex) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Message: '+ex.getMessage() + ' at Line Number: '+ex.getLineNumber()));      
            Database.rollback(sp);
        }
    }
    public void queryAllContactRoles() {
        primaryContactWrapperList = new List<OppConRoleWrapper>();
        List<OppConRoleWrapper> tempWrapperList = new List<OppConRoleWrapper>();
        optyRecord   =   [SELECT id,Name,AccountId,Account.Name,CloseDate,Primary_Contact__c,Account_Role__c 
                                                FROM Opportunity WHERE ID = :recordId];
        List<Contact> listAllContactForAccount = [SELECT id,Phone,Email,Description,Name FROM Contact WHERE AccountId = :optyRecord.AccountId];
        
        if (!listAllContactForAccount.isEmpty()) {
            Map<Id,String> mapConIdToTitle = new Map<Id,String>();
            List<AccountContactRelation> listACR = [SELECT id,Title__c,ContactId,Contact.Phone,Contact.Email,Contact.Description,Contact.Name FROM AccountContactRelation WHERE ContactId IN :listAllContactForAccount ];
            for (AccountContactRelation acr : listACR) {
                OppConRoleWrapper wrap = new OppConRoleWrapper();
                wrap.isSelected = false;
                if(optyRecord.Primary_Contact__c == acr.ContactId) {
                    wrap.isSelected = true;
                }  
                Contact con = new Contact();
                con.Id      =   acr.ContactId;
                wrap.conName     =   acr.Contact.Name;
                con.Phone = acr.Contact.Phone;
                con.Email = acr.Contact.Email;
                con.Description = acr.Contact.Description;  
                wrap.conRecrd = con;
                wrap.title = acr.Title__c;
                tempWrapperList.add(wrap);
            }
            //sorting logic

            for(OppConRoleWrapper wrap :tempWrapperList) {
                if(wrap.isSelected) {
                    primaryContactWrapperList.add(wrap);
                    break;
                }
            }
            for (OppConRoleWrapper wrap :tempWrapperList) {
                if(!wrap.isSelected) {
                    primaryContactWrapperList.add(wrap);
                } 
            }
        }

    }
    public Class OppConRoleWrapper {
        public Boolean isSelected   {get;set;}
        public Contact conRecrd     {get;set;}
        public String title         {get;set;}
        public String conName       {get;set;}
    }

}
test class for this

 
here i am displaying account and their related contacts also if user want to update the contact and account he can update and also he can create the contact related to account but problem is if i preview the page the related contacts are showing all contact before i put account id in link
it is working fine when i put id but it is showing all contacts before i put something 
also i am creating contact on same page so how i can give condition so if create account details are filled the it will create new contact(Note:lastname of contact is mandatory field)

here is my handler code:

public with sharing class AccExtension {
    Account acc;
    String queryString;
    Public Contact Con{get;set;}
    public list<Contact> listofContacts{get;set;}
        
    public AccExtension(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
        Id accId = controller.getId();
        con = new Contact();
        listofContacts = new list<Contact>();
        queryString = 'select id';
        for(Schema.FieldSetMember fld :getfieldCon()) {
         queryString += ', ' + fld.getFieldPath();
        }
        queryString += ' from Contact where AccountId=:accId';
         
        listofContacts = Database.query(queryString);
        }
    
    
    public List<Schema.FieldSetMember> getfieldCon(){
        list<Schema.FieldSetMember> fsFieldsList = new list<Schema.FieldSetMember>();
        fsFieldsList = SObjectType.Contact.FieldSets.Contact_Info.getFields();
        return fsFieldsList;
    }
    
    
    
    public PageReference save(){
        update acc;
        update listofContacts;
        con.AccountId = acc.Id;
        insert con;
        return null;
    }
}

vf page

<apex:page standardController="Account" extensions="AccExtension" >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection columns="2" title="Account information" >
                <apex:outputField value="{!Account.Name}" />
                <apex:outputField value="{!Account.Type}" />
                <apex:outputField value="{!Account.AccountNumber}" />
            </apex:pageBlockSection>   
             <apex:pageBlockSection columns="2" title="Contact information" >   
                <apex:repeat value="{!Account.contacts}" var="c"  >
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                 </apex:repeat>s
                 </apex:pageBlockSection>
              <apex:pageBlockSection title="new contact" > 
                  <apex:repeat value="{!Account.contacts}" var="c"  >
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                 </apex:repeat>
                  <apex:inputField value="{!cont.LastName}" required="false" /><br/>
            <apex:commandButton value="Save" action="{!Save}" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>
here i am displaying account and their related contacts also if user want to update the contact and account he can update and also he can create the contact related to account but problem is if i preview the page the related contacts are showing all contact before i put account id in link
it is working fine when i put id but it is showing all contacts before i put something 
also i am creating contact on same page so how i can give condition so if create account details are filled the it will create new contact(Note:lastname of contact is mandatory field)

here is handler:

public with sharing class AccExtension {
    Account acc;
    String queryString;
    Public Contact Con{get;set;}
    public list<Contact> listofContacts{get;set;}
        
    public AccExtension(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
        Id accId = controller.getId();
        con = new Contact();
        listofContacts = new list<Contact>();
        queryString = 'select id';
        for(Schema.FieldSetMember fld :getfieldCon()) {
         queryString += ', ' + fld.getFieldPath();
        }
        queryString += ' from Contact where AccountId=:accId';
         
        listofContacts = Database.query(queryString);
        }
    
    
    public List<Schema.FieldSetMember> getfieldCon(){
        list<Schema.FieldSetMember> fsFieldsList = new list<Schema.FieldSetMember>();
        fsFieldsList = SObjectType.Contact.FieldSets.Contact_Info.getFields();
        return fsFieldsList;
    }
    
    
    
    public PageReference save(){
        update acc;
        update listofContacts;
        con.AccountId = acc.Id;
        insert con;
        return null;
    }
}

vf page

<apex:page standardController="Account" extensions="AccExtension" >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection columns="2" title="Account information" >
                <apex:outputField value="{!Account.Name}" />
                <apex:outputField value="{!Account.Type}" />
                <apex:outputField value="{!Account.AccountNumber}" />
            </apex:pageBlockSection>   
             <apex:pageBlockSection columns="2" title="Contact information" >   
                <apex:repeat value="{!Account.contacts}" var="c"  >
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                 </apex:repeat>s
                 </apex:pageBlockSection>
              <apex:pageBlockSection title="new contact" > 
                  <apex:repeat value="{!Account.contacts}" var="c"  >
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                 </apex:repeat>
                  <apex:inputField value="{!cont.LastName}" required="false" /><br/>
            <apex:commandButton value="Save" action="{!Save}" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

this is my vf page which show to values parent and their child which i created using fieldset
i want if user edit the values of field of parent or child then it should be updated
also i created controller if user add new child it is insert properly
but i how to update the values of child and parents


this is output of my page:
User-added image


Controller:
public with sharing class AccExtension {
    Account acc;
    Public Contact Con{get;set;}
        
    public AccExtension(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
        con = new Contact();
        }
    
    public List<Schema.FieldSetMember> getfieldCon(){
        list<Schema.FieldSetMember> fsFieldsList = new list<Schema.FieldSetMember>();
        fsFieldsList = SObjectType.Contact.FieldSets.Contact_Info.getFields();
        return fsFieldsList;
    }
    
    
    public PageReference save(){
        update acc;
        con.AccountId = acc.Id;
        insert con;
        return null;
    }
}

Visual force page
<apex:page standardController="Account" extensions="AccExtension" >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection title="Account information" >
              <apex:repeat value="{!$ObjectType.Account.FieldSets.AccountInfo}" var="f">
                  <apex:inputField value="{!Account[f]}"/>
                </apex:repeat>
                <apex:inlineEditSupport />
            </apex:pageBlockSection>
            <apex:pageBlockSection columns="2" title="Contact Information" >
                <apex:repeat value="{!Account.contacts}" var="c">
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                    <br/>
                </apex:repeat>
             </apex:pageBlockSection>
            <apex:pageBlockSection title="Create Contact">
                <apex:repeat value="{!fieldCon}" var="c">
                        <apex:inputField value="{!Con[c]}"/>
                 </apex:repeat>   
            </apex:pageBlockSection>
            <apex:commandButton action="{!Save}" value="Save" />
        </apex:pageBlock>
    </apex:form>
</apex:page>
this is my vf page which show to values parent and their child which i created using fieldset
i want if user edit the values of field of parent or child then it should be updated
also i created controller if user add new child it is insert properly
but i how to update the values of child and parents


this is output of my page:
User-added image


Controller:
public with sharing class AccExtension {
    Account acc;
    Public Contact Con{get;set;}
        
    public AccExtension(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
        con = new Contact();
        }
    
    public List<Schema.FieldSetMember> getfieldCon(){
        list<Schema.FieldSetMember> fsFieldsList = new list<Schema.FieldSetMember>();
        fsFieldsList = SObjectType.Contact.FieldSets.Contact_Info.getFields();
        return fsFieldsList;
    }
    
    
    public PageReference save(){
        update acc;
        con.AccountId = acc.Id;
        insert con;
        return null;
    }
}

Visual force page
<apex:page standardController="Account" extensions="AccExtension" >
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection title="Account information" >
              <apex:repeat value="{!$ObjectType.Account.FieldSets.AccountInfo}" var="f">
                  <apex:inputField value="{!Account[f]}"/>
                </apex:repeat>
                <apex:inlineEditSupport />
            </apex:pageBlockSection>
            <apex:pageBlockSection columns="2" title="Contact Information" >
                <apex:repeat value="{!Account.contacts}" var="c">
                    <apex:repeat value="{!$ObjectType.Contact.FieldSets.Contact_Info}" var="f">
                        <apex:inputField value="{!c[f]}"/>
                    </apex:repeat>
                    <br/>
                </apex:repeat>
             </apex:pageBlockSection>
            <apex:pageBlockSection title="Create Contact">
                <apex:repeat value="{!fieldCon}" var="c">
                        <apex:inputField value="{!Con[c]}"/>
                 </apex:repeat>   
            </apex:pageBlockSection>
            <apex:commandButton action="{!Save}" value="Save" />
        </apex:pageBlock>
    </apex:form>
</apex:page>

this is my code i want to give count of contacts associate with account but when i changed contacts account(lookup) it update new owner count value but not updating the value in old account count

this is my code
handler:
public class ContactRollupSummaryHandler {
    public static void afterInsert(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    public static void afterUpdate(list<Contact> contacts,Map<Id,Contact> oldMap){
        list<Contact> conlist = new list<Contact>();
        for(Contact c: contacts){
            if(c.AccountId != oldMap.get(c.Id).AccountId){
                conlist.add(c);
            }
        }
        if(conlist.size()>0){
            NumberofContacts(conlist);
        }
    }
    public static void afterDelete(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    public static void afterUndelete(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    
    
    public static void NumberofContacts(list<Contact> con){
        set<id> accIds = new set<id>();
        for(Contact c: con){
            if(c.AccountId != null){
            accIds.add(c.AccountId);
            } 
        }
        
        if(accIds.size()>0){
            list<Account> acclist = new list<Account>();
        for(Account ac: [SELECT id,Number_of_Contacts__c,(SELECT id from Contacts) from Account where id IN:accIds]){
            ac.Number_of_Contacts__c = ac.Contacts.size();
            acclist.add(ac);
        }
            if(acclist.size()>0){
                update acclist;
            }    
        
        }
    }

}

Trigger:
trigger ContactTrigger on Contact (after insert,after update,after delete, after undelete) {
    if(Trigger.isAfter && Trigger.isInsert){
       ContactRollupSummaryHandler.afterInsert(Trigger.new);
    }
    if(Trigger.isAfter && Trigger.isUpdate){
       ContactRollupSummaryHandler.afterUpdate(Trigger.new,Trigger.oldMap);
    }
    if(Trigger.isAfter && Trigger.isDelete){
       ContactRollupSummaryHandler.afterDelete(Trigger.old);
    }
    if(Trigger.isAfter && Trigger.isUndelete){
       ContactRollupSummaryHandler.afterUndelete(Trigger.new);
    }
    
}

Review the errors on this page.
WorkOrderTrigger: execution of AfterUpdate caused by: System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, WorkOrderTrigger: maximum trigger depth exceeded Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate: [] Class.WorkOrderTriggerHelper.CreateWorkOrderItemOnInsert: line 677, column 1 Class.WorkOrderTriggerHelper.OnAfterUpdateEvent: line 47, column 1 Trigger.WorkOrderTrigger: line 19, column 1

this my code it is working fine on after insert but getting error on after update


this is my code;
public static void CreateWorkOrderItemOnInsert(List<Work_Order__c> workOrder){
        list<Work_Order_Item__c> listWOI = new list<Work_Order_Item__c>();
        set<Id> accIds = new set<Id>();
        for(Work_Order__c woItem:workOrder){
            String[] s = woItem.Service_Type__c.split(';');
            if(s.size()>0){
            if(woItem.Status__c =='Completed' && s.contains('Waste Export') ){
                if(woItem.Account__r.Terminal__c == false){
                   accIds.add(woItem.Account__c); 
                }
                Work_Order_Item__c newWOI = new Work_Order_Item__c();
                newWOI.Work_Order__c = woItem.Id;
                newWOI.Quantity__c    = woItem.Total_Ordered_Quantity__c;
                newWOI.Received_Quantity__c = woItem.Total_Delivered_Quantity__c;
                newWOI.Unit_Price__c = woItem.Price__c;
                newWOI.Description__c = woItem.Notes__c;
                listWOI.add(newWOI);
            }
          }
        }
        if(accIds.size()>0){
            list<Account> accounts = new list<Account>();
            for(Account acc:[SELECT Id,Name,Terminal__c from Account where Id =:accIds]){
                if(acc.Terminal__c == false){
                    acc.Terminal__c = true;
                }
                accounts.add(acc);
            }
            if(accounts.size()>0){
                update accounts;
            }
        }
        if(listWOI.size()>0){
            Insert listWOI;
            }
    }


should i have to write another method for update what i have to change in that
Getting this Error: Invalid Data.
Review all error messages below to correct your data.
Apex trigger WorkOrderTrigger caused an unexpected exception, contact your administrator: WorkOrderTrigger: execution of AfterInsert caused by: System.NullPointerException: Attempt to de-reference a null object: Class.WorkOrderTriggerHelper.CreateWorkOrderItem: line 648, column 1

public static void CreateWorkOrderItem(List<Work_Order__c> workOrder){
        list<Work_Order_Item__c> listWOI = new list<Work_Order_Item__c>();
        for(Work_Order__c woItem:workOrder){
            String[] s = woItem.Service_Type__c.split(';');
            if(woItem.Status__c =='Completed' && s.contains('Waste Export') ){
this is 648 line                 woItem.Account__r.Terminal__c = true;
                Work_Order_Item__c newWOI = new Work_Order_Item__c();
                newWOI.Work_Order__c = woItem.Id;
                newWOI.Quantity__c    = woItem.Total_Ordered_Quantity__c;
                newWOI.Received_Quantity__c = woItem.Total_Delivered_Quantity__c;
                newWOI.Unit_Price__c = woItem.Price__c;
                newWOI.Description__c = woItem.Notes__c;
                listWOI.add(newWOI);
            }
        }
        Insert listWOI;
    }

after insert trigger i am using 
i am creating new record for work order item when condition are met also i am updating account related object terminal checkbox to true when condition are met i got this error
i am getting this errot
Challenge Not yet complete... here's what's wrong:
Closing a Maintenance Request of type 'Routine Maintenance' or 'Repair' did not create of a new Maintenance Request with the correct due date. The challenge is expecting the due date to be calculated using the maintenance cycle defined on the related equipment records. If multiple equipments are used in the maintenance request, choose the shortest maintenance cycle to define the service date.
Close errors

Trigger handler
public with sharing class MaintenanceRequestHelper {
    
    public static void updateWorkOrders(list<Case> Cases) {
        
        Map<Id,Case> caseLst = new Map<Id,Case>();
        for(Case c:Cases){
            if (c.IsClosed && (c.Type.equals('Repair') || c.Type.equals('Routine Maintenance'))){
                caseLst.put(c.Id,c);
            }
        }
        
        
        Map<Id, Integer> mapProduct = new Map<Id, Integer>(); 
           List<Case> CaseList = new List<Case>();
        
        List<Product2> listProduct = [select Id, Maintenance_Cycle__c from Product2];                                   
        for (Product2 p : listProduct) {
            if (p != null) {
                if(p.Maintenance_Cycle__c != null){
                    mapProduct.put(p.Id, Integer.valueOf(p.Maintenance_Cycle__c));
                }               
            }
        }

        for(Case a: caseLst.values()){
            Case newCase = new Case();
            newCase.Vehicle__c = a.Vehicle__c;
            newCase.Equipment__c = a.Equipment__c;
            newCase.Type = 'Routine Maintenance';
            newCase.Subject = String.isBlank(a.Subject) ? 'Routine Maintenance Request' : a.Subject;
            newCase.Date_Reported__c = Date.today();
            newCase.Status = 'New';
            newCase.Product__c = a.Product__c;
            newCase.AccountId = a.AccountId;
            newCase.ContactId = a.ContactId;
            newCase.AssetId = a.AssetId;
            newCase.Origin = a.Origin;
            newCase.Reason = a.Reason;
            newCase.Date_Due__c =  (mapProduct.get(a.Id) != null) ? (Date.today().addDays(Integer.valueOf(mapProduct.get(a.Id)))) : (Date.today());
            CaseList.add(newCase);
        }
        if(CaseList.size() > 0){
            insert CaseList;
        }
    }        
    
}

Trigger
trigger MaintenanceRequest on Case (before update, after update) {
    
    if(Trigger.isUpdate  && Trigger.isAfter){
        MaintenanceRequestHelper.updateWorkOrders(Trigger.new);
    }
}
public class OpportunityHandler {
    
    public void updateTextField(list<Opportunity> opps){
        for(Opportunity op:opps){
        String multipick = op.Contract_Type__c;
        String[] arr = multipick.split(';');
        if(multipick != null){
            op.Active_Contract_Type__c = arr[0];
            op.Contract_Types__c = multipick.replace(';',',');
        }
    }
    }
    
    public void newContract(list<Opportunity> opp){
        list<ContractOpp__c> con = new list<ContractOpp__c>();
        for(Opportunity opt:opp){
            String multip = opt.Contract_Type__c;
            String[] arr = multip.split(';');
            for(integer i=0; i<arr.size();i++){
                ContractOpp__c ct = new ContractOpp__c();
                ct.Name = arr[i];
                ct.Opportunity__c = opt.Id;
                con.add(ct);
            }
        }
        insert con;
    } 
}

Trigger

trigger opportunitypicklist on Opportunity (before insert,before update,after insert) {    
    OpportunityHandler obj = new OpportunityHandler();
    if(Trigger.isBefore && (Trigger.isInsert || Trigger.isUpdate)){
        obj.updateTextField(Trigger.new);
    }
    else if(Trigger.isAfter && Trigger.isInsert){
        obj.newContract(Trigger.new);
    }
}
how write test class for this 

vf page contoller:
public with sharing class ChangePrimaryContactCtrl {
    private Id recordId; 
    public Opportunity optyRecord {get;set;}
    public List<OppConRoleWrapper> primaryContactWrapperList {get;set;}
    public Contact newConRecord     {get;set;}
    public Boolean showNewContactScreen {get;set;}
    public String index {get;set;}
    public String titleInputString  {get;set;}
    public ChangePrimaryContactCtrl() {
        recordId                    =   apexpages.currentpage().getparameters().get('id');
        primaryContactWrapperList   =   new List<OppConRoleWrapper> ();
        newConRecord                =   new Contact();
        showNewContactScreen        =   false;
        optyRecord                  =   new Opportunity();
        index                       =   '';
        titleInputString            =   '';
        if(String.isNotBlank(recordId) ) {
           
            queryAllContactRoles();
            
        }
    }
    public Pagereference doCancel() {
        Pagereference pgr = new Pagereference('/'+recordId);
        return pgr;
    }
    public void save() {
        Savepoint sp = Database.setSavepoint();
        if (String.isBlank(index)) {
            return;
        }
        Integer indexValue = Integer.valueOf(index);
        try {
            Contact con  = new Contact();
            if (!primaryContactWrapperList.isEmpty() && primaryContactWrapperList.size() > indexValue) {
                con = primaryContactWrapperList[indexValue].conRecrd;
            }
            // for (OppConRoleWrapper wrapper : primaryContactWrapperList) {
            //     if(wrapper.isSelected) {
            //         con = wrapper.conRecrd;
            //         break;
            //     }
            // }
            if(String.isBlank(con.id)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Please select atleast one contact.'));
                return ;
            }
            if (optyRecord.Primary_Contact__c == con.id) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO,'Please change the contact before saving. Click Back to exit.'));
                return ;
            }
            //Update the Opportunity
            update new Opportunity(Id=optyRecord.Id,Primary_contact__c = con.id);
            //update the Custom Account Role
            if(String.isNotBlank(optyRecord.Account_Role__c)) {
                update new Account_Role__c (Id=optyRecord.Account_Role__c,Primary_Contact__c = con.id);
            }
            
            queryAllContactRoles();
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM,'Primary Contact Updated'));  
        } catch (Exception ex) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Message: '+ex.getMessage() + ' at Line Number: '+ex.getLineNumber()));              
            Database.rollback(sp);
            return;
        }
    }
    public void CreateNewContact() {
        showNewContactScreen = true;
    }
    public void doCancelMakePrimary() {
        showNewContactScreen = false;
    }
    public void makePrimary() {
        Savepoint sp = Database.setSavepoint();
        try {
            
            if(String.isBlank(newConRecord.LastName)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Last Name cannot be blank.'));   
                return;
            }
            
            if(String.isBlank(newConRecord.Email)) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Email cannot be blank.'));  
                return; 
            }
            newConRecord.AccountId = optyRecord.AccountId;
            newConRecord.Is_From_Change_Primary_Contact__c = true;
            insert newConRecord;

            //Update the Opportunity
            update new Opportunity(Id=optyRecord.Id,Primary_contact__c = newConRecord.id);
            //update the Custom Account Role
            if(String.isNotBlank(optyRecord.Account_Role__c)) {
                update new Account_Role__c (Id=optyRecord.Account_Role__c,Primary_Contact__c = newConRecord.id);
            }
            if (String.isNotBlank(titleInputString)) {
                List<AccountContactRelation> acrList = [SELECT id FROM AccountContactRelation WHERE AccountId = :optyRecord.AccountId AND ContactId = : newConRecord.id Order by CreatedDate DESC LIMIT 1];
                if (!acrList.isEmpty()) {
                    acrList[0].Title__c = titleInputString;    
                    update acrList;
                }
                
            }
            queryAllContactRoles();
            showNewContactScreen = false;
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM,'New Primary Contact Added & Updated.'));  
            newConRecord = new Contact();
            titleInputString = '';
        }catch(Exception ex) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,'Message: '+ex.getMessage() + ' at Line Number: '+ex.getLineNumber()));      
            Database.rollback(sp);
        }
    }
    public void queryAllContactRoles() {
        primaryContactWrapperList = new List<OppConRoleWrapper>();
        List<OppConRoleWrapper> tempWrapperList = new List<OppConRoleWrapper>();
        optyRecord   =   [SELECT id,Name,AccountId,Account.Name,CloseDate,Primary_Contact__c,Account_Role__c 
                                                FROM Opportunity WHERE ID = :recordId];
        List<Contact> listAllContactForAccount = [SELECT id,Phone,Email,Description,Name FROM Contact WHERE AccountId = :optyRecord.AccountId];
        
        if (!listAllContactForAccount.isEmpty()) {
            Map<Id,String> mapConIdToTitle = new Map<Id,String>();
            List<AccountContactRelation> listACR = [SELECT id,Title__c,ContactId,Contact.Phone,Contact.Email,Contact.Description,Contact.Name FROM AccountContactRelation WHERE ContactId IN :listAllContactForAccount ];
            for (AccountContactRelation acr : listACR) {
                OppConRoleWrapper wrap = new OppConRoleWrapper();
                wrap.isSelected = false;
                if(optyRecord.Primary_Contact__c == acr.ContactId) {
                    wrap.isSelected = true;
                }  
                Contact con = new Contact();
                con.Id      =   acr.ContactId;
                wrap.conName     =   acr.Contact.Name;
                con.Phone = acr.Contact.Phone;
                con.Email = acr.Contact.Email;
                con.Description = acr.Contact.Description;  
                wrap.conRecrd = con;
                wrap.title = acr.Title__c;
                tempWrapperList.add(wrap);
            }
            //sorting logic

            for(OppConRoleWrapper wrap :tempWrapperList) {
                if(wrap.isSelected) {
                    primaryContactWrapperList.add(wrap);
                    break;
                }
            }
            for (OppConRoleWrapper wrap :tempWrapperList) {
                if(!wrap.isSelected) {
                    primaryContactWrapperList.add(wrap);
                } 
            }
        }

    }
    public Class OppConRoleWrapper {
        public Boolean isSelected   {get;set;}
        public Contact conRecrd     {get;set;}
        public String title         {get;set;}
        public String conName       {get;set;}
    }

}
test class for this

 

this is my code i want to give count of contacts associate with account but when i changed contacts account(lookup) it update new owner count value but not updating the value in old account count

this is my code
handler:
public class ContactRollupSummaryHandler {
    public static void afterInsert(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    public static void afterUpdate(list<Contact> contacts,Map<Id,Contact> oldMap){
        list<Contact> conlist = new list<Contact>();
        for(Contact c: contacts){
            if(c.AccountId != oldMap.get(c.Id).AccountId){
                conlist.add(c);
            }
        }
        if(conlist.size()>0){
            NumberofContacts(conlist);
        }
    }
    public static void afterDelete(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    public static void afterUndelete(list<Contact> contacts){
        NumberofContacts(contacts);
    }
    
    
    public static void NumberofContacts(list<Contact> con){
        set<id> accIds = new set<id>();
        for(Contact c: con){
            if(c.AccountId != null){
            accIds.add(c.AccountId);
            } 
        }
        
        if(accIds.size()>0){
            list<Account> acclist = new list<Account>();
        for(Account ac: [SELECT id,Number_of_Contacts__c,(SELECT id from Contacts) from Account where id IN:accIds]){
            ac.Number_of_Contacts__c = ac.Contacts.size();
            acclist.add(ac);
        }
            if(acclist.size()>0){
                update acclist;
            }    
        
        }
    }

}

Trigger:
trigger ContactTrigger on Contact (after insert,after update,after delete, after undelete) {
    if(Trigger.isAfter && Trigger.isInsert){
       ContactRollupSummaryHandler.afterInsert(Trigger.new);
    }
    if(Trigger.isAfter && Trigger.isUpdate){
       ContactRollupSummaryHandler.afterUpdate(Trigger.new,Trigger.oldMap);
    }
    if(Trigger.isAfter && Trigger.isDelete){
       ContactRollupSummaryHandler.afterDelete(Trigger.old);
    }
    if(Trigger.isAfter && Trigger.isUndelete){
       ContactRollupSummaryHandler.afterUndelete(Trigger.new);
    }
    
}

Review the errors on this page.
WorkOrderTrigger: execution of AfterUpdate caused by: System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, WorkOrderTrigger: maximum trigger depth exceeded Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate Work_Order trigger event AfterUpdate: [] Class.WorkOrderTriggerHelper.CreateWorkOrderItemOnInsert: line 677, column 1 Class.WorkOrderTriggerHelper.OnAfterUpdateEvent: line 47, column 1 Trigger.WorkOrderTrigger: line 19, column 1

this my code it is working fine on after insert but getting error on after update


this is my code;
public static void CreateWorkOrderItemOnInsert(List<Work_Order__c> workOrder){
        list<Work_Order_Item__c> listWOI = new list<Work_Order_Item__c>();
        set<Id> accIds = new set<Id>();
        for(Work_Order__c woItem:workOrder){
            String[] s = woItem.Service_Type__c.split(';');
            if(s.size()>0){
            if(woItem.Status__c =='Completed' && s.contains('Waste Export') ){
                if(woItem.Account__r.Terminal__c == false){
                   accIds.add(woItem.Account__c); 
                }
                Work_Order_Item__c newWOI = new Work_Order_Item__c();
                newWOI.Work_Order__c = woItem.Id;
                newWOI.Quantity__c    = woItem.Total_Ordered_Quantity__c;
                newWOI.Received_Quantity__c = woItem.Total_Delivered_Quantity__c;
                newWOI.Unit_Price__c = woItem.Price__c;
                newWOI.Description__c = woItem.Notes__c;
                listWOI.add(newWOI);
            }
          }
        }
        if(accIds.size()>0){
            list<Account> accounts = new list<Account>();
            for(Account acc:[SELECT Id,Name,Terminal__c from Account where Id =:accIds]){
                if(acc.Terminal__c == false){
                    acc.Terminal__c = true;
                }
                accounts.add(acc);
            }
            if(accounts.size()>0){
                update accounts;
            }
        }
        if(listWOI.size()>0){
            Insert listWOI;
            }
    }


should i have to write another method for update what i have to change in that
Getting this Error: Invalid Data.
Review all error messages below to correct your data.
Apex trigger WorkOrderTrigger caused an unexpected exception, contact your administrator: WorkOrderTrigger: execution of AfterInsert caused by: System.NullPointerException: Attempt to de-reference a null object: Class.WorkOrderTriggerHelper.CreateWorkOrderItem: line 648, column 1

public static void CreateWorkOrderItem(List<Work_Order__c> workOrder){
        list<Work_Order_Item__c> listWOI = new list<Work_Order_Item__c>();
        for(Work_Order__c woItem:workOrder){
            String[] s = woItem.Service_Type__c.split(';');
            if(woItem.Status__c =='Completed' && s.contains('Waste Export') ){
this is 648 line                 woItem.Account__r.Terminal__c = true;
                Work_Order_Item__c newWOI = new Work_Order_Item__c();
                newWOI.Work_Order__c = woItem.Id;
                newWOI.Quantity__c    = woItem.Total_Ordered_Quantity__c;
                newWOI.Received_Quantity__c = woItem.Total_Delivered_Quantity__c;
                newWOI.Unit_Price__c = woItem.Price__c;
                newWOI.Description__c = woItem.Notes__c;
                listWOI.add(newWOI);
            }
        }
        Insert listWOI;
    }

after insert trigger i am using 
i am creating new record for work order item when condition are met also i am updating account related object terminal checkbox to true when condition are met i got this error
public class OpportunityHandler {
    
    public void updateTextField(list<Opportunity> opps){
        for(Opportunity op:opps){
        String multipick = op.Contract_Type__c;
        String[] arr = multipick.split(';');
        if(multipick != null){
            op.Active_Contract_Type__c = arr[0];
            op.Contract_Types__c = multipick.replace(';',',');
        }
    }
    }
    
    public void newContract(list<Opportunity> opp){
        list<ContractOpp__c> con = new list<ContractOpp__c>();
        for(Opportunity opt:opp){
            String multip = opt.Contract_Type__c;
            String[] arr = multip.split(';');
            for(integer i=0; i<arr.size();i++){
                ContractOpp__c ct = new ContractOpp__c();
                ct.Name = arr[i];
                ct.Opportunity__c = opt.Id;
                con.add(ct);
            }
        }
        insert con;
    } 
}

Trigger

trigger opportunitypicklist on Opportunity (before insert,before update,after insert) {    
    OpportunityHandler obj = new OpportunityHandler();
    if(Trigger.isBefore && (Trigger.isInsert || Trigger.isUpdate)){
        obj.updateTextField(Trigger.new);
    }
    else if(Trigger.isAfter && Trigger.isInsert){
        obj.newContract(Trigger.new);
    }
}