Ejemplo n.º 1
0
        public async Task <ScheduledClassIndexViewModel> BuildIndexViewModel()
        {
            var allScheduledClasses = _scheduledClassReader.GetAllScheduledClasses();

            var indexViewModel = new ScheduledClassIndexViewModel()
            {
                ScheduledClassesCompleted = allScheduledClasses.Where(x => x.InstructorName != null),
                CancelledScheduledClasses = allScheduledClasses.Where(x => x.IsCancelled)
            };

            var timetable = _classTimetableReader.GetAllClassTimetables();

            var holidayDtos  = _holidayReader.GetAllHolidays();
            var holidayDates = holidayDtos.Where(x => x.HolidayDate > DateTime.UtcNow).Select(x => x.HolidayDate.Date);

            var plannerTimespan       = Int32.Parse(ConfigurationManager.AppSettings["ScheduledClassTimeSpanInDays"]);
            var earliestSlotStartHour = Int32.Parse(ConfigurationManager.AppSettings["GymOpeningHour"]);
            var latestSlotEndHour     = Int32.Parse(ConfigurationManager.AppSettings["GymClosingHour"]);

            var incompleteScheduledClassSlots = new List <ScheduledClassDto>();

            // loop through day from today until end of timespan
            foreach (var daysFromToday in Enumerable.Range(0, plannerTimespan))
            {
                var iterationDateTime = DateTime.UtcNow.AddDays(daysFromToday);

                // if day falls on holiday
                if (holidayDates.Contains(iterationDateTime.Date))
                {
                    continue;
                }

                foreach (var hourOfToday in Enumerable.Range(earliestSlotStartHour, latestSlotEndHour - earliestSlotStartHour))
                {
                    var isScheduledClassAlreadyCreated = allScheduledClasses.Any(x => x.ClassStartTime.Day == iterationDateTime.Day && x.ClassStartTime.Hour == hourOfToday);
                    if (isScheduledClassAlreadyCreated)
                    {
                        continue;
                    }

                    var timetabledSlot = timetable.FirstOrDefault(x => x.Weekday == iterationDateTime.DayOfWeek && x.StartHour == hourOfToday);
                    if (timetabledSlot == null)
                    {
                        continue;
                    }

                    var newScheduledClass = new ScheduledClassDto()
                    {
                        ClassStartTime = new DateTime(iterationDateTime.Year, iterationDateTime.Month, iterationDateTime.Day, timetabledSlot.StartHour, timetabledSlot.StartMinutes, 0),
                        ClassTypeName  = timetabledSlot.ClassTypeName
                    };

                    incompleteScheduledClassSlots.Add(newScheduledClass);
                }
            }

            indexViewModel.ScheduledClassesRequiringCompletion = incompleteScheduledClassSlots;

            return(await Task.FromResult(indexViewModel));
        }
        public async Task <IEnumerable <ClassTimetableRowViewModel> > BuildTimetableViewModel()
        {
            var timetables = _classTimetableReader.GetAllClassTimetables();

            var earliestSlotStartHour = Int32.Parse(ConfigurationManager.AppSettings["GymOpeningHour"]);
            var latestSlotEndHour     = Int32.Parse(ConfigurationManager.AppSettings["GymClosingHour"]);

            var timetableViewModel = new List <ClassTimetableRowViewModel>();

            for (int i = earliestSlotStartHour; i <= latestSlotEndHour; i++)
            {
                var row = new ClassTimetableRowViewModel()
                {
                    StartHour = i
                };

                // get the timetable slots across this week for this time only
                var weekOfClassesAtThisHour = timetables.Where(x => x.StartHour == i).Select(r => new ClassTimetableSlotViewModel()
                {
                    Day       = r.Weekday,
                    StartTime = new DateTime(2000, 1, 1, i, r.StartMinutes, 0),
                    EndTime   = new DateTime(2000, 1, 1, r.EndHour, r.EndMinutes, 0),
                    ClassName = r.ClassTypeName,
                    Id        = r.Id,
                    Colour    = _colourServices.GetRGBAModelFromColourEnum(r.Colour)
                }).ToList();

                foreach (var daySlot in weekOfClassesAtThisHour)
                {
                    switch (daySlot.Day)
                    {
                    case (DayOfWeek.Monday):
                        row.MondayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Tuesday):
                        row.TuesdayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Wednesday):
                        row.WednesdayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Thursday):
                        row.ThursdayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Friday):
                        row.FridayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Saturday):
                        row.SaturdayTimeSlot = daySlot;
                        break;

                    case (DayOfWeek.Sunday):
                        row.SundayTimeSlot = daySlot;
                        break;

                    default:
                        break;
                    }
                }

                timetableViewModel.Add(row);
            }

            return(await Task.FromResult(timetableViewModel.AsEnumerable()));
        }