+ Start a Discussion
himanshu huske 7himanshu huske 7 

trigger_on Contact

Both Account and Contact has a picklist field Status_c with values Open,Close,InProgress 
account record has 3 child record in contact
if all 3 contact has picklist value = 'close', then account picklist value will get updated to 'close'.
SATHISH REDDY.SATHISH REDDY.
trigger AccountStatucUpdate on Contact (After insert, After update {
    Set<Id> accountIdList = new Set<Id>();
    List<Account> accUpdateList = new List<Account>();
    if (Trigger.isAfter) {   
        if (Trigger.isInsert) {
            for(Contact c : Trigger.new){
                if(c.statuc__c == 'Close' && c.accountId != null)
                    accountIdList.add(c.accountId);
            }
            if(!accountIdList.siEmpty())
            for(Account acc : [Select Id, Status__c, (select id, statuc__c from contacts != Close) FROM Account Where Id IN: accountIdList AND Status__c != 'Close']){
                if(acc.Contacts.isEmpty()){
                    acc.Status__c = 'Close';
                    accUpdateList.add(acc);
                }
            }
            if(!accUpdateList.isEmpty())
                update accUpdateList;
        }       
        else if (Trigger.isUpdate){
            for(Contact c : Trigger.new){
                if(c.statuc__c == 'Close' && c.accountId != null && trigger.OldMap.get(c.Id).Status__c != trigger.newMap.get(c.Id).Status__c)
                    accountIdList.add(c.accountId);
            }
            if(!accountIdList.siEmpty())
            for(Account acc : [Select Id, Status__c, (select id, statuc__c from contacts != Close) FROM Account Where Id IN: accountIdList AND Status__c != 'Close']){
                if(acc.Contacts.isEmpty()){
                    acc.Status__c = 'Close';
                    accUpdateList.add(acc);
                }
            }
            if(!accUpdateList.isEmpty())
                update accUpdateList;
        }
    }
}

The code should be something in the lines of this. However, the best way is to have this logic in a separate handler class and then invoke that class within this trigger. You can find many examples online something like this https://developer.salesforce.com/forums/?id=906F00000009EfuIAE

Please mark it as the best answer if this helps.

Cheers!
Sathish
Maharajan CMaharajan C
Hi,

Please try the below trigger

trigger AccountStatucUpdate on Contact (After insert, After update) {
    Set<Id> accIds = new Set<Id>();
    List<Account> accListtoUpdate = new List<Account>();
    if (Trigger.isInsert)
    {
        for(Contact con : Trigger.new)
        {
            if(con.AccountId != null && con.status__c == 'Close')
            {
                accIds.add(con.AccountId);
            }
        }
    }
    else if(Trigger.isUpdate)
    {
        for(Contact c : Trigger.new)
        {
            if(c.status__c == 'Close' && c.accountId != null && trigger.OldMap.get(c.Id).Status__c != trigger.newMap.get(c.Id).Status__c)
                { 
                    accIds.add(c.AccountId);
                }
        }
    }
    
    if(!accIds.IsEmpty())
    {
        List<Account> accList = [Select id,(select id, status__c from Contacts) from Account where id IN: accIds];
        
        for(Account acc : accList)
        {
            Integer unclosedCons = 0;
            for(Contact cont : acc.Contacts)
            {
                if(cont.status__c != 'Close')
                {
                    unclosedCons++;
                }
            }
            
            if(unclosedCons == 0)
            {
                acc.Status__c = 'Close';
                accListtoUpdate.add(acc);
            }
        }

    }
    
    if(!accListtoUpdate.isEmpty())
    update accListtoUpdate;

}


Thanks,
Maharajan.C
Bhargavi TunuguntlaBhargavi Tunuguntla
Hi
You can use the below code:
List<Id> AccIds=new List<Id>();
            for(COntact c: Trigger.new)
            {
                if(c.Status__c=='Close' && c.AccountId!=null)
                    AccIds.add(c.accountId);
            }
            List<Account> accList=new List<Account>([select id,name,status__c,(Select id from contacts where status__c!='Close') from account where status__c!='Close']);
            for(Account acc: accList)
            {
                if(acc.contacts.isEmpty())
                acc.status__c='Close';
            }
            update accList;

Thanks
Ajay K DubediAjay K Dubedi
Hi Himanshu huske,

You can use the below code:

<------ Apex class--->>>>>
public class ContactStatus {
    public static void statusUpdateContact(List<Contact> contactList){
        try{
        if(contactList.size() > 0){
            Integer count = 0;
            Set<Id> accIds = new Set<Id>();
            for(Contact con: contactList){
                if(con.AccountId != NULL){
                    accIds.add(con.AccountId);
                }
            }
            System.debug('subhasis'+accIds);
            List<Account> updateList = new List<Account>();
            List<Account> accountList = new List<Account>();
            accountList = [SELECT Id,Name,Acc_Satus__c,(SELECT Id,Con_Status__c FROM Contacts) FROM Account WHERE Id IN : accIds LIMIT 50000];
            System.debug('Name'+accountList);
            
            if(accountList.size() > 0){
                for(Account accObject : accountList){
                    System.debug('size'+accObject.Contacts.size());
                    if(accObject.Contacts.size() > 0){
                        for(Contact con: accObject.Contacts){
                            System.debug('satus'+con.Con_Status__c);
                            if(con.Con_Status__c == 'Closed'){
                                count += 1;
                                System.debug('count'+count);
                            }
                        }
                    }
                    if(accObject.Contacts.size() == count){
                        System.debug('subhasis');
                        accObject.Acc_Satus__c = 'Closed';
                        updateList.add(accObject);
                    }
                    count = 0;
                }
                if(updateList.size()>0)
                    update updateList; 
            }
        }
        }catch(Exception exp){
            System.debug('Exception Cause'+exp.getCause()+'Exception lineNumber'+exp.getLineNumber());
        }
    }
}



<<<---- Trigger------>>>>
 
trigger contactTrigger on Contact ( before update) {
    
    if(Trigger.isBefore && Trigger.isupdate){
        ContactStatus.statusUpdateContact(Trigger.new);
    }
}

I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.

Thanks,
Ajay Dubedi