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
IKZIKZ 

Trigger doesn't update a field

Whenever there is an active complaint linked to an account I would like to update Account.Active_Complaints__c checkbox. Objects are linked through a lookup Complaints__c.AccountName__c, but my trigger/class doesn't update the checkbox as expected. Any ideas please?
My trigger:
trigger ComplaintTrigger on Complaint__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) {

    if (TriggerSettings.getInstance().isEnabled(ComplaintTriggerHandler.class.getName())) {

        TriggerHandler.ITrigger handler = new ComplaintTriggerHandler(Trigger.oldMap, Trigger.newMap, Trigger.old, Trigger.new);

        if (Trigger.isBefore) {
            handler.bulkBefore();
            if (Trigger.isDelete) {
                for (SObject so : Trigger.old) {
                    handler.beforeDelete(so);
                }
            } else if (Trigger.isInsert) {
                for (SObject so : Trigger.new) {
                    handler.beforeInsert(so);
                } 
            } else if (Trigger.isUpdate) {
                for (SObject so : Trigger.old) {
                    handler.beforeUpdate(so, Trigger.newMap.get(so.Id));
                }
            }
            handler.beforePostProcessing();
        } else {
            handler.bulkAfter();
            if (Trigger.isDelete) {
                for (SObject so : Trigger.old) {
                    handler.afterDelete(so);
                }
            } else if (Trigger.isInsert) {
                for (SObject so : Trigger.new) {
                    handler.afterInsert(so);
                }
            } else if (Trigger.isUpdate) {
                for (SObject so : Trigger.old) {
                    handler.afterUpdate(so, Trigger.newMap.get(so.Id));
                }
            }
            handler.postProcessing();
        }
    }
}

and handler:
public with sharing class ComplaintTriggerHandler extends TriggerHandler implements TriggerHandler.ITrigger {
    public ComplaintTriggerHandler(Map<Id, SObject> oldMap, Map<Id, SObject> newMap, List<SObject> oldList, List<SObject> newList) {
        super(oldMap, newMap, oldList, newList);
    }

    public void bulkBefore() {
    }

    public void bulkAfter() {
        if (Trigger.isDelete) {
            ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount();
        }
    }

    public void beforeInsert(SObject so) {
    }

    public void beforeUpdate(SObject oldSo, SObject so) {
    }

    public void beforeDelete(SObject so) {
    }

    public void afterInsert(SObject so) {
        ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount();
    }

    public void afterUpdate(SObject oldSo, SObject so) {
        ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount();
    }

    public void afterDelete(SObject so) {
        ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount();
    }

    public void postProcessing() {
        ComplaintTriggerHelper.getInstance().updateAccounts();
    }
}

and helper:
public with sharing class ComplaintTriggerHelper {
    
    public List <Complaint__c> Complaints;
    private Map<Id, Boolean> accountsToUpdateMap;
    private static ComplaintTriggerHelper instance;

    public static ComplaintTriggerHelper getInstance() {
        if (instance ==null) {
            instance = new ComplaintTriggerHelper();
        }
        return instance;
    }
    
    private ComplaintTriggerHelper() {
        accountsToUpdateMap = new Map<Id, Boolean>();
        Complaints = new List<Complaint__c>();
    }

    public void setHasActiveComplaintsOnAccount() {

        Set<Id> parentIds = new Set<Id>();

        for (Complaint__c com : Complaints) {
            parentIds.add(com.AccountName__c);
        }

        for (Account accountToUpdate : [SELECT Id, Active_Complaints__c, (Select Id, AccountName__c from Complaints__r WHERE Status__c = 'Open' OR Status__c = 'Pending') FROM Account WHERE Id IN :parentIds]) {
            accountsToUpdateMap.put(accountToUpdate.Id, accountToUpdate.Complaints__r.size() > 0);
        }
    }

    public void updateAccounts() {
        List<Account> acc = new List<Account>();

        for (Id accId : accountsToUpdateMap.keySet()){
            acc.add(new Account(Id = accId, Active_Complaints__c = accountsToUpdateMap.get(accId)));
        }

        update acc;
    }


}

​​​​​​​​​​​​​​