public static List<Schedule> GetRecordingTimes(Schedule rec, int days) { var recordings = new List<Schedule>(); var recBLL = new ScheduleBLL(rec); DateTime dtDay = DateTime.Now; if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.Once) { recordings.Add(recBLL.Entity); return recordings; } if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.Daily) { for (int i = 0; i < days; ++i) { var recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.StartTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.StartTime.Hour, recBLL.Entity.StartTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(1); } recNew.EndTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.EndTime.Hour, recBLL.Entity.EndTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(-1); } recNew.Series = true; if (recNew.StartTime >= DateTime.Now) { if (recBLL.IsSerieIsCanceled(recNew.StartTime)) { recNew.Canceled = recNew.StartTime; } recordings.Add(recNew); } dtDay = dtDay.AddDays(1); } return recordings; } if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.WorkingDays) { for (int i = 0; i < days; ++i) { if (WeekEndTool.IsWorkingDay(dtDay.DayOfWeek)) { Schedule recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.StartTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.StartTime.Hour, recBLL.Entity.StartTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(1); } recNew.EndTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.EndTime.Hour, recBLL.Entity.EndTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(-1); } recNew.Series = true; if (recBLL.IsSerieIsCanceled(recNew.StartTime)) { recNew.Canceled = recNew.StartTime; } if (recNew.StartTime >= DateTime.Now) { recordings.Add(recNew); } } dtDay = dtDay.AddDays(1); } return recordings; } if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.Weekends) { IEnumerable<Program> progList = ProgramManagement.GetProgramsByChannelAndTitleAndStartEndTimes(recBLL.Entity.IdChannel, recBLL.Entity.ProgramName, dtDay, dtDay.AddDays(days)); foreach (Program prog in progList) { if ((recBLL.IsRecordingProgram(prog, false)) && (WeekEndTool.IsWeekend(prog.StartTime.DayOfWeek))) { Schedule recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.StartTime = prog.StartTime; recNew.EndTime = prog.EndTime; recNew.Series = true; if (recBLL.IsSerieIsCanceled(recNew.StartTime)) { recNew.Canceled = recNew.StartTime; } recordings.Add(recNew); } } return recordings; } if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.Weekly) { for (int i = 0; i < days; ++i) { if ((dtDay.DayOfWeek == recBLL.Entity.StartTime.DayOfWeek) && (dtDay.Date >= recBLL.Entity.StartTime.Date)) { Schedule recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.StartTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.StartTime.Hour, recBLL.Entity.StartTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(1); } recNew.EndTime = new DateTime(dtDay.Year, dtDay.Month, dtDay.Day, recBLL.Entity.EndTime.Hour, recBLL.Entity.EndTime.Minute, 0); if (recBLL.Entity.EndTime.Day > recBLL.Entity.StartTime.Day) { dtDay = dtDay.AddDays(-1); } recNew.Series = true; if (recBLL.IsSerieIsCanceled(recNew.StartTime)) { recNew.Canceled = recNew.StartTime; } if (recNew.StartTime >= DateTime.Now) { recordings.Add(recNew); } } dtDay = dtDay.AddDays(1); } return recordings; } IEnumerable<Program> programs; if (recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.WeeklyEveryTimeOnThisChannel) { //this.LogDebug("get {0} {1} EveryTimeOnThisChannel", rec.ProgramName, rec.ReferencedChannel().Name); programs = ProgramManagement.GetProgramsByChannelAndTitleAndStartEndTimes(recBLL.Entity.IdChannel, recBLL.Entity.ProgramName, dtDay, dtDay.AddDays(days)); foreach (Program prog in programs) { // dtDay.DayOfWeek == rec.startTime.DayOfWeek // this.LogDebug("BusinessLayer.cs Program prog in programs WeeklyEveryTimeOnThisChannel: {0} {1} prog.startTime.DayOfWeek == rec.startTime.DayOfWeek {2} == {3}", rec.ProgramName, rec.ReferencedChannel().Name, prog.startTime.DayOfWeek, rec.startTime.DayOfWeek); if (prog.StartTime.DayOfWeek == recBLL.Entity.StartTime.DayOfWeek && recBLL.IsRecordingProgram(prog, false)) { Schedule recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.IdChannel = prog.IdChannel; recNew.StartTime = prog.StartTime; recNew.EndTime = prog.EndTime; recNew.Series = true; if (recBLL.IsSerieIsCanceled(recNew.StartTime)) { recNew.Canceled = recNew.StartTime; } recordings.Add(recNew); //this.LogDebug("BusinessLayer.cs Added Recording WeeklyEveryTimeOnThisChannel: {0} {1} prog.startTime.DayOfWeek == rec.startTime.DayOfWeek {2} == {3}", rec.ProgramName, rec.ReferencedChannel().Name, prog.startTime.DayOfWeek, rec.startTime.DayOfWeek); } } return recordings; } programs = recBLL.Entity.ScheduleType == (int)ScheduleRecordingType.EveryTimeOnThisChannel ? ProgramManagement.GetProgramsByChannelAndTitleAndStartEndTimes(recBLL.Entity.IdChannel, recBLL.Entity.ProgramName, dtDay, dtDay.AddDays(days)) : ProgramManagement.GetProgramsByTitleAndStartEndTimes(recBLL.Entity.ProgramName, dtDay, dtDay.AddDays(days)); foreach (Program prog in programs) { if (recBLL.IsRecordingProgram(prog, false)) { Schedule recNew = ScheduleFactory.Clone(recBLL.Entity); recNew.ScheduleType = (int)ScheduleRecordingType.Once; recNew.IdChannel = prog.IdChannel; recNew.StartTime = prog.StartTime; recNew.EndTime = prog.EndTime; recNew.Series = true; if (recBLL.IsSerieIsCanceled(recBLL.GetSchedStartTimeForProg(prog), prog.IdChannel)) { recNew.Canceled = recNew.StartTime; } recordings.Add(recNew); } } return recordings; }
public static IList<Schedule> GetConflictingSchedules(Schedule sched, out List<Schedule> notViewableSchedules) { notViewableSchedules = new List<Schedule>(); sched.Channel = ChannelManagement.GetChannel(sched.IdChannel); Log.Debug("huha: GetConflictingSchedules: Schedule = " + sched.ToString()); Log.Debug("sched=" + sched.ProgramName); var conflicts = new List<Schedule>(); IEnumerable<Schedule> schedulesList = ListAllSchedules(); IList<Card> cards = CardManagement.ListAllCards(CardIncludeRelationEnum.None).ToList(); //SEB if (cards.Count == 0) { return conflicts; } Log.Info("huha GetConflictingSchedules: Cards.Count = {0}", cards.Count); List<Schedule>[] cardSchedules = new List<Schedule>[cards.Count]; for (int i = 0; i < cards.Count; i++) { cardSchedules[i] = new List<Schedule>(); } // GEMX: Assign all already scheduled timers to cards. Assume that even possibly overlapping schedulues are ok to the user, // as he decided to keep them before. That's why they are in the db foreach (Schedule schedule in schedulesList) { Log.Debug("existing schedule "+schedule.ProgramName+" s="+schedule.StartTime.ToString()+" id="+schedule.IdChannel.ToString()); List<Schedule> episodes = GetRecordingTimes(schedule); Log.Debug("episodes.count=" + episodes.Count.ToString()); foreach (Schedule episode in episodes) { if (DateTime.Now > episode.EndTime) { continue; } var episodeBLL = new ScheduleBLL(episode); if (episodeBLL.IsSerieIsCanceled(episode.StartTime)) { continue; } IList<Schedule> overlapping; Log.Debug("assigning schedules to card"); AssignSchedulesToCard(episode, cardSchedules, out overlapping, out notViewableSchedules); Log.Debug("ênd of assigning schedules to card"); } } List<Schedule> newEpisodes = GetRecordingTimes(sched); Log.Debug("newEpisodes.count=" + newEpisodes.Count.ToString()); foreach (Schedule newEpisode in newEpisodes) { if (DateTime.Now > newEpisode.EndTime) { continue; } var newEpisodeBLL = new ScheduleBLL(newEpisode); if (newEpisodeBLL.IsSerieIsCanceled(newEpisode.StartTime)) { continue; } IList<Schedule> overlapping; List<Schedule> notViewable; Log.Debug("assigning schedules to card"); if (!AssignSchedulesToCard(newEpisode, cardSchedules, out overlapping, out notViewable)) { Log.Info("GetConflictingSchedules: newEpisode can not be assigned to a card = " + newEpisode); conflicts.AddRange(overlapping); notViewableSchedules.AddRange(notViewable); } Log.Debug("ênd of assigning schedules to card"); } return conflicts; }