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;
}
}
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