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