public RouteScheduleSummary(RouteSchedule routeSchedule)
 {
     this.ID = routeSchedule.ID;
     this.RouteID = routeSchedule.RouteID;
     this.DayOfWeek = daysOfWeek[routeSchedule.DayOfWeek];
     this.StartTime = routeSchedule.StartTime.ToShortTimeString();
     this.EndTime = routeSchedule.EndTime.ToShortTimeString();
 }
 public RouteSchedule(RouteSchedule otherSchedule)
 {
     this.ID        = otherSchedule.ID;
     this.RouteID   = otherSchedule.RouteID;
     this.DayOfWeek = otherSchedule.DayOfWeek;
     this.StartTime = otherSchedule.StartTime;
     this.EndTime   = otherSchedule.EndTime;
     this.Route     = otherSchedule.Route;
 }
 public RouteSchedule(RouteSchedule otherSchedule)
 {
     this.ID = otherSchedule.ID;
     this.RouteID = otherSchedule.RouteID;
     this.DayOfWeek = otherSchedule.DayOfWeek;
     this.StartTime = otherSchedule.StartTime;
     this.EndTime = otherSchedule.EndTime;
     this.Route = otherSchedule.Route;
 }
        private static void ProcessEffectiveDay(DateTime scheduleDate, int day, IEnumerable<RouteSchedule> routeSchedules, IEnumerable<RouteScheduleOverride> routeScheduleOverrides, List<RouteSchedule> effectiveSchedules)
        {
            // Obtain any special schedules for the day
            var specialSchedules = FindOverrideSchedules(routeScheduleOverrides, scheduleDate);

            var todaysSchedules = FindTodaysSchedules(routeSchedules, scheduleDate);

            foreach(var routeSchedule in todaysSchedules)
            {
                var modifiedSchedules = ModifyRouteSchedule(routeSchedule, specialSchedules);
                if (modifiedSchedules != null)
                {
                    foreach(var schedule in modifiedSchedules)
                    {
                        schedule.DayOfWeek += ((day / 7) * 7);  // Adjust for additional weeks
                        effectiveSchedules.Add(schedule);
                    }
                }

            }

            if (specialSchedules != null)
            {
                // Add special route
                foreach (var specialRoute in specialSchedules)
                {
                    if (specialRoute.OverrideType != RouteScheduleOverride.OverrideRule.NoService)
                    {
                        var routeSchedule = new RouteSchedule(specialRoute);
                        routeSchedule.DayOfWeek += ((day / 7) * 7);  // Adjust for additional weeks
                        effectiveSchedules.Add(routeSchedule);
                    }
                }

            }

            // Add any new routes
            var addedSchedules = FindAddedSchedules(routeScheduleOverrides, scheduleDate);
            if (addedSchedules != null)
            {
                foreach (var addedRoute in addedSchedules)
                {
                    var routeSchedule = new RouteSchedule(addedRoute);
                    routeSchedule.DayOfWeek += ((day / 7) * 7);  // Adjust for additional weeks
                    effectiveSchedules.Add(routeSchedule);
                }
            }
        }
        /// <summary>
        /// Based on the possible overlap of the special schedule, the result could be 0, 1, 2, or 3 new schedule time slots.
        /// </summary>
        /// <param name="routeSchedule"></param>
        /// <param name="specialSchedules"></param>
        /// <param name="dayLabel"></param>
        /// <returns></returns>
        private static List<RouteSchedule> ModifyRouteScheduleForOverlap(RouteSchedule routeSchedule, IEnumerable<RouteScheduleOverride> specialSchedules)
        {
            var schedules = new List<RouteSchedule>();

            bool keepFixedRoute = true;

            foreach (var specialSchedule in specialSchedules)
            {
                if (!specialSchedule.OverriddenRouteID.HasValue ||   // Applies to all routes if null
                    (specialSchedule.OverriddenRouteID == routeSchedule.RouteID) )
                {
                    // This route is targeted
                    if (routeSchedule.StartTime.TimeOfDay >= specialSchedule.StartTime.TimeOfDay &&
                        routeSchedule.EndTime.TimeOfDay <= specialSchedule.EndTime.TimeOfDay)
                    {
                        // Exact overlap or completely contained - replace with new / cancel all
                        keepFixedRoute = false;
                    } else
                    {
                        // Check for any overlap
                        if (routeSchedule.StartTime.TimeOfDay < specialSchedule.EndTime.TimeOfDay &&
                            specialSchedule.StartTime.TimeOfDay < routeSchedule.EndTime.TimeOfDay)
                        {
                            // Have overlap
                            if (routeSchedule.StartTime.TimeOfDay < specialSchedule.StartTime.TimeOfDay)
                            {
                                // First part of orignal schedule is to be retained
                                var newSchedule = new RouteSchedule(routeSchedule);
                                newSchedule.EndTime = specialSchedule.StartTime;
                                schedules.Add(newSchedule);
                                keepFixedRoute = false;
                            }
                            if (routeSchedule.EndTime.TimeOfDay > specialSchedule.EndTime.TimeOfDay)
                            {
                                // End part of orignal schedule is to be retained
                                var newSchedule = new RouteSchedule(routeSchedule);
                                newSchedule.StartTime = specialSchedule.EndTime;
                                schedules.Add(newSchedule);
                                keepFixedRoute = false;
                            }
                            // Check for beginning or end aligned with special case
                            if ( (routeSchedule.StartTime == specialSchedule.StartTime) ||
                                 (routeSchedule.EndTime == specialSchedule.EndTime) )
                            {
                                keepFixedRoute = false;
                            }

                        }
                    }
                }
            }

            if (keepFixedRoute)
            {
                schedules.Add(new RouteSchedule(routeSchedule));
            }

            return schedules;
        }
        /// <summary>
        /// Apply Delete or Replace cases to fixed route
        /// </summary>
        /// <param name="routeSchedule"></param>
        /// <param name="specialSchedules"></param>
        /// <returns></returns>
        private static List<RouteSchedule> ModifyRouteSchedule(RouteSchedule routeSchedule, IEnumerable<RouteScheduleOverride> specialSchedules)
        {
            var schedules = new List<RouteSchedule>();

            if (specialSchedules != null)
            {
                schedules.AddRange(ModifyRouteScheduleForOverlap(routeSchedule, specialSchedules));

            } else
            {
                schedules.Add(new RouteSchedule(routeSchedule));
            }

            return schedules;
        }