Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 public void CreateScheduleTemplate(ScheduleTemplateDto scheduleTemplate)
 {
     _dbContext.ScheduleTemplates.Add(scheduleTemplate);
     _dbContext.SaveChanges();
 }