Thursday, 24 May 2018

Salesforce - Empty Event Slot Manager

public class EmptyEventSlotManager {
    public static List<Event> freeslots=new List<Event>();
    public static void createSlots(Date p_startDate,Id p_userId){
        System.debug('---createSlots---');
        List<Event> busyslots=[SELECT ActivityDateTime,EndDateTime
                               FROM Event
                               WHERE ownerId=:p_userId
                               AND activitydate=:p_startDate
                               ORDER BY ActivityDateTime];
        System.debug('busyslots: '+busyslots.size());
        // 8 AM - 6 PM => 10 hrs x 60 = 480 minutes + last slot (2 hrs) = 10 hrs
        for(integer minute=0;minute<600;minute++){
            if(!isBusyslot(minute,busyslots)){
                freeslots.add(getSlot(minute,p_startDate,p_userId));
                minute+=119; // add two hours - 1, for next increment
            }
        }
        System.debug('freeslots: '+freeslots.size());
        insert freeslots;
    }
    public static boolean isBusyslot(Integer p_minute,List<Event> p_busyslots){
        boolean flag=false; 
        //check start_time
        for(Event e:p_busyslots){
            if(isWithinSlot(p_minute+480,e)){
                flag=true;
        System.debug('---isBusyslot---');
                break;
            }
        }
        //check end_time
        for(Event e:p_busyslots){
            for(integer i=1;i<=119;i++){
            if(isWithinSlot(p_minute+480+i,e)){
                flag=true;
        System.debug('---isBusyslot---');
                break;
            }
            }
        } 
        if(p_minute+480+119 > 600+480){
            flag=true;
        }
        return flag;
    }
    public static Event getSlot(Integer p_minute,Date p_startDate,Id p_userId){
        System.debug('---getSlot---');
        Date myDate = p_startDate;
        Time activity_start_myTime = Time.newInstance(0, (p_minute+480), 0, 0);  // + 8 AM
        Time activity_end_myTime = Time.newInstance(0, (p_minute+480+119), 0, 0); // + 8 AM + 2 hrs
        DateTime activity_start_dt = DateTime.newInstance(myDate, activity_start_myTime);       
        DateTime activity_end_dt = DateTime.newInstance(myDate, activity_end_myTime);
        //create event
        Event ev=new Event();
        ev.OwnerId=p_userId;
        ev.ActivityDate=p_startDate;
        ev.ActivityDateTime=activity_start_dt;
        ev.EndDateTime=activity_end_dt;
        ev.Subject='Free slot';
        return ev;
    }
    public static boolean isWithinSlot(integer p_mins,Event e){
        boolean flag=false;
        integer e_start_min=(e.ActivityDateTime.hour()*60)+e.ActivityDateTime.minute();
        integer e_end_min=(e.EndDateTime.hour()*60)+e.EndDateTime.minute();
        System.debug('p_mins: '+p_mins+' e_start_min: '+e_start_min+' e_end_min: '+e_end_min);
        //end time duration is less than 2hrs       
        //if((e_start_min+120)>e_end_min)
         //   e_end_min=e_start_min+120;
        // between start and end minutes
        if(p_mins>=e_start_min
           && p_mins<=e_end_min){
               flag=true;             
               System.debug('---isWithinSlot---');       
           }
        return flag;
    }
}

No comments:

Post a Comment