/// <summary> /// Fulfill the schedule entries /// </summary> /// <param name="activities"></param> public void ScheduleActivities(IEnumerable <ActivityPlanEntryDto> activities) { var scheduleTemplate = new ScheduleTemplateDto() { Name = "Automated Schedule Template", PersonalPlanId = PersonalPlan.Id, OptimizationModel = new ScheduleOptimizationType() { Classification = OptimizationModel.InteligentSchedule, Name = "Intelligent Automation Schedule" }, ScheduleActivities = new List <ScheduleEventDto>() }; // Timespan indicative var transientDateProgression = new DateTime(PersonalPlan.PlanStartsOn.Year, PersonalPlan.PlanStartsOn.Month, PersonalPlan.PlanStartsOn.Day, PersonalPlan.FreetimeStartsOn.Hours, PersonalPlan.FreetimeStartsOn.Minutes, 0); var dailyFreeTimeSpan = PersonalPlan.FreeTimeEndsOn - PersonalPlan.FreetimeStartsOn; foreach (var activity in activities) { var activityRemainingTime = activity.TimeAllocation; // Brake down full timespan activities (ex: [x,y]) while (activityRemainingTime >= dailyFreeTimeSpan) { scheduleTemplate.ScheduleActivities.Add(new ScheduleEventDto { Name = activity.Name, Description = activity.Description, StartsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, transientDateProgression.Hour, transientDateProgression.Minute, 0), EndsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, PersonalPlan.FreeTimeEndsOn.Hours, PersonalPlan.FreeTimeEndsOn.Minutes, 0), }); // Timespan already scheduled above var timespanScheduled = PersonalPlan.FreeTimeEndsOn.Subtract(transientDateProgression.TimeOfDay); // Subtract time allocation activityRemainingTime -= timespanScheduled; // Move on to the next day transientDateProgression = transientDateProgression.AddDays(1.0); // Overflow case so get back on the free time starts if (!activityRemainingTime.Equals(TimeSpan.Zero)) { transientDateProgression -= timespanScheduled; } } // Brake down partial timespan activities (ex: [x+2, y]) while (activityRemainingTime < dailyFreeTimeSpan && activityRemainingTime > TimeSpan.Zero) { // maximum timespan that can be added var feasibleTimeToAdd = PersonalPlan.FreeTimeEndsOn.Subtract(transientDateProgression.TimeOfDay); if (activityRemainingTime <= feasibleTimeToAdd) { scheduleTemplate.ScheduleActivities.Add(new ScheduleEventDto { Name = activity.Name, Description = activity.Description, StartsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, transientDateProgression.Hour, transientDateProgression.Minute, 0), EndsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, transientDateProgression.Add(activityRemainingTime).Hour, transientDateProgression.Add(activityRemainingTime).Minute, 0), }); transientDateProgression = transientDateProgression.Add(activityRemainingTime); activityRemainingTime -= activityRemainingTime; } else { scheduleTemplate.ScheduleActivities.Add(new ScheduleEventDto { Name = activity.Name, Description = activity.Description, StartsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, transientDateProgression.Hour, transientDateProgression.Minute, 0), EndsOn = new DateTime(PersonalPlan.PlanStartsOn.Year, transientDateProgression.Month, transientDateProgression.Day, feasibleTimeToAdd.Hours, feasibleTimeToAdd.Minutes, 0), }); transientDateProgression = transientDateProgression.Add(feasibleTimeToAdd); activityRemainingTime -= feasibleTimeToAdd; } // Move on to the next day at the start free time point if (transientDateProgression.TimeOfDay.Equals(PersonalPlan.FreeTimeEndsOn)) { transientDateProgression = transientDateProgression.AddDays(1.0).Subtract(dailyFreeTimeSpan); } } } _planningRepository.CreateScheduleTemplate(scheduleTemplate); }
public void CreateScheduleTemplate(ScheduleTemplateDto scheduleTemplate) { _dbContext.ScheduleTemplates.Add(scheduleTemplate); _dbContext.SaveChanges(); }