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
Suman Humane 5Suman Humane 5 

trigger to prevent date overlap

Hi everyone,

I am trying to write a trigger for a requirement where a new record should not be created if the dates overlap. There are 2 objects Event1 (Campaign renamed) and Attendee. There is a junction object Event Attendee which allows an attendee to register for an Event. If an attendee is already registered for an event then he/she should not be able to register for any other event which falls on those dates or whose start or end dates overlap the already registered event dates. When I execute my trigger, I get an error for every event-attendee record instead of only for those which satisfies the condition. Please help me with the trigger.
This is the trigger:
trigger Eventdatesoverlapprevention on Event_Attendee__c (before insert,before update) {
    set<string> att = new set <string>();
    set<string> evnt = new set <string>();
    set<date> stdt = new set <date>();
    set<date> endt = new set <date>();
    //getting attendee, event, start and end dates in the event attendee records in the set defined above.
    for (event_attendee__c ea:trigger.new){
        
        stdt.add(ea.event_start_date__c);
        endt.add(ea.event_end_date__C);        
        att.add(ea.Attendee__c);
        evnt.add(ea.event1__C);          
    }
    //querying for attendees that are a part of the trigger.new list
    list <attendee__C> attendee = [Select id from attendee__c where id in:att];
    
    //querying for events (campaign is renamed to event1) that are a part of the trigger.new list
    list<campaign> event = [Select id from campaign where id in:evnt];
    
    // querying the list of event attendees where the attendees, events, start date and end date is present in the trigger.new list
    list<aggregateresult> evntovrlap1  = [SELECT count(id) from event_attendee__C 
                                          where attendee__c in: att and event1__C in: evnt and event_Start_Date__C in: stdt and event_End_Date__C in: endt];
    //querying the list of event attendees where the start date is higher than the start date in trigger.new list 
    //and end date is less than the end date in the trigger.new list.
    list<aggregateresult> evntovrlap2 = [SELECT count(id) from event_attendee__C 
                                         where attendee__c in: att and event1__C in: evnt and event_Start_Date__C >=: stdt and event_end_Date__C <=: endt];
    //querying the list of event attendees where the start date is less than the start date in trigger.new list 
    //and end date is higher than the end date in the trigger.new list.
    list<aggregateresult> evntovrlap3 = [SELECT count(id) from event_attendee__C 
                                         where attendee__c in: att and event1__C in: evnt and event_start_Date__C <=: stdt and event_end_Date__C >=: endt];
    
    //for every attendee record and for every event attendee record, if attendee record finds a match in the event attendee record 
    //and if the above counts are greater than 1 then, show an error message.
    for(attendee__c a : attendee){
        for(campaign e : event){
            for(event_attendee__c ea:trigger.new){
                If(a.id==ea.Attendee__c && e.Id == ea.Event1__c){
                    If(evntovrlap1.size()>0 || evntovrlap2.size()>0 || evntovrlap3.size()>0){
                        ea.adderror('Attendee is already registered for these dates');
                    }
                }
            }  
        }
    }
    
}