Wednesday, 23 May 2018

Salesforce - Update childs with same changes when they are made at parent events of records



trigger EventTrigger on Event (after insert,after update) {
    if(Trigger.isInsert){
        if(Trigger.isAfter){
            EventTriggerHelper.callFutureChildEventCreation(Trigger.New);
        }
    }
    if(Trigger.isUpdate){
        if(Trigger.isAfter){
            EventTriggerHelper.callFutureChildEventUpdation(Trigger.New);
        }
    }
}








public class EventTriggerHelper {
    public static void callFutureChildEventCreation (List<Event> newList){
        List<String> eligibleList = new List<String>();
        String devRecordTypeId = Schema.SObjectType.Event.getRecordTypeInfosByName().get('Campus Visit Meeting').getRecordTypeId();
        for(Event evt: newList){
            if(evt.recordTypeId == devRecordTypeId)
            {
                eligibleList.add(evt.Id);
            }
        }
        if(eligibleList.size() > 0)
        createChildEvents(eligibleList);
    }
    public static void callFutureChildEventUpdation (List<Event> newList){
        List<String> eligibleList = new List<String>();
        String devRecordTypeId = Schema.SObjectType.Event.getRecordTypeInfosByName().get('Campus Visit Meeting').getRecordTypeId();
        for(Event evt: newList)
        {
            if(evt.recordTypeId == devRecordTypeId
               && evt.Parent_Event__c == NULL)
            {
                eligibleList.add(evt.Id);
            }
        }
        if(eligibleList.size() > 0)
        updateChildEvents(eligibleList);
    }
    @future
    public static void createChildEvents(List<String> idsList){
        system.debug('EventTriggerHelper.createChildEvents');
        List<Event> eligibleList = new List<Event>();
        List<Event> newEvents = new List<Event>();
        String devRecordTypeId = Schema.SObjectType.Event.getRecordTypeInfosByName().get('Child Campus Visit Meetings').getRecordTypeId();
       
        String Query = getEventQuery();
        Query += ' WHERE Id IN : idsList';
        List<Event> newList = (List<Event>) Database.query(Query);
        for(Event evt: newList){
            if(evt.EventWhoIds != NULL
               && evt.EventWhoIds.size() > 0)
            {
                eligibleList.add(evt);
            }
        }
        if(eligibleList.size() == 0){
            system.debug('No Match');
            return;
        }
        system.debug(JSON.serializePretty(eligibleList));
        for(Event evt: eligibleList){
            for(String contactId: evt.EventWhoIds){
                if(contactId != evt.WhoId){
                    Event newEvt = evt.clone(false, //preserveId,
                                             true, //isDeepClone,
                                             true, //preserveReadonlyTimestamps,
                                             false); //preserveAutonumber);
                    newEvt.whoId = contactId;
                    newEvt.Parent_Event__c = evt.Id;
                    newEvt.RecordTypeId = devRecordTypeId;
                    newEvents.add(newEvt);
                }
            }
        }
        insert newEvents;
        system.debug(JSON.serializePretty(newEvents));
    }
    @future
    public static void updateChildEvents(List<String> idsList){
        system.debug('EventTriggerHelper.updateChildEvents');
        List<Event> eligibleList = new List<Event>();
        List<Event> newEvents = new List<Event>();
        Set<String> fieldNames = new Set<String>();
        Map<String, Schema.SObjectField> m = Schema.SObjectType.Event.fields.getMap();
        for(String fieldName: m.keySet()){
            Schema.SObjectField sfd = m.get(fieldName);
            schema.DescribeFieldResult dfr = sfd.getDescribe();
           // if(!dfr.isCalculated())
            if(!dfr.isCalculated()
               && dfr.isUpdateable()){
                fieldNames.add(fieldName);
            }
        }
       
        String devRecordTypeId = Schema.SObjectType.Event.getRecordTypeInfosByName().get('Child Campus Visit Meetings').getRecordTypeId();
       
        String Query = getEventQuery();
        Query += ' WHERE Id IN : idsList';
        List<Event> newList = (List<Event>) Database.query(Query);
       
        Query = getEventQuery();
        Query += ' WHERE Parent_Event__c IN : idsList';
        List<Event> newChildList = (List<Event>) Database.query(Query);
       
        Map<Id,List<Event>> childEventsMap = new Map<Id,List<Event>>();
        for(Event evt: newChildList){
            if(!childEventsMap.containsKey(evt.Parent_Event__c))
                childEventsMap.put(evt.Parent_Event__c,new List<Event> ());
            childEventsMap.get(evt.Parent_Event__c).add(evt);
        }
        System.debug('childEventsMap: '+childEventsMap);
       
        for(Event evt: newList){
            if(evt.EventWhoIds != NULL
               && evt.EventWhoIds.size() > 0
               && childEventsMap.get(evt.Id) != NULL)
            {
                eligibleList.add(evt);
            }
        }
        System.debug('eligibleList: '+eligibleList);
        if(eligibleList.size()>0)
        System.debug('childEventsMap.get(evt.Parent_Event__c): '+childEventsMap.get(eligibleList[0].Parent_Event__c));
        if(eligibleList.size() == 0){
            system.debug('No Match');
            return;
        }
        //system.debug(JSON.serializePretty(eligibleList));
        for(Event evt: eligibleList)
        {
           
           // for(Event cEvt: childEventsMap.get(evt.Parent_Event__c))
           for(Event cEvt: childEventsMap.get(evt.Id))
            {
                for(String fieldName: fieldNames)
                {
                    if(evt.get(fieldName) != NULL)
                    {
                         cEvt.put(fieldName,evt.get(fieldName));
                    }
                }
                newEvents.add(cEvt);
            }
        }
        update newEvents;
    }
    public static String getEventQuery(){
        String fields = '';
        for(String fieldName: Schema.SObjectType.Event.fields.getMap().keySet()){
            fields += fieldName;
            fields += ', ';
        }
        fields += 'EventWhoIds ' ;
        String Query = 'SELECT ';
        Query += fields;
        Query += ' FROM Event';
        return Query;
    }
}

1 comment: