public TimeSchedules UpdateWokingInterval(int userId, int scheduleId, DayOfWeek startDay, TimeSpan startTime, DayOfWeek endDay, TimeSpan endTime) { Users user = GetUserById(userId); if (user == null) { throw new NoEntryFoundException(userId, typeof(Users).Name); } List <TimeSchedules> userSchedules = user.TheTimeScheduleForThisUser; TimeSchedules existing = userSchedules.Where(x => x.Id == scheduleId).SingleOrDefault(); if (existing == null) { throw new NoEntryFoundException(scheduleId, userId, typeof(TimeSchedules).Name); } existing.StartDay = startDay; existing.StartTime = startTime; existing.EndDay = endDay; existing.EndTime = endTime; List <TimeSchedules> overlapping = GetOverlappedSchedule(existing, userSchedules); if (overlapping.Count == 0) { TimeScheduleRepository.Update(existing); return(existing); } TimeSchedules newSchedule = SolveOverlappedSchedules(existing, overlapping); existing.StartDay = newSchedule.StartDay; existing.StartTime = newSchedule.StartTime; existing.EndDay = newSchedule.EndDay; existing.EndTime = newSchedule.EndTime; TimeScheduleRepository.Update(existing); foreach (var sch in overlapping) { TimeScheduleRepository.Remove(sch); } return(existing); }
private TimeSchedules SolveOverlappedSchedules(TimeSchedules currentSchedule, List <TimeSchedules> schedules) { int minRange = GetMinRange(currentSchedule); int maxRange = GetMaxRange(currentSchedule); if (maxRange < minRange) { maxRange += MinutesInOneWeek; } foreach (var sch in schedules) { int schMin = GetMinRange(sch); int schMax = GetMaxRange(sch); if (schMax < schMin) { schMax += MinutesInOneWeek; } if (schMin < minRange) { minRange = schMin; } if (schMax > maxRange) { maxRange = schMax; } } maxRange %= MinutesInOneWeek; TimeSchedules solvedSchedule = new TimeSchedules { StartDay = (DayOfWeek)(minRange / MinutesInOneDay), StartTime = TimeSpan.FromMinutes(minRange % MinutesInOneDay), EndDay = (DayOfWeek)(maxRange / MinutesInOneDay), EndTime = TimeSpan.FromMinutes(maxRange % MinutesInOneDay) }; return(solvedSchedule); }
public bool RemoveWorkingInterval(int userId, int scheduleId) { Users user = GetUserById(userId); if (user == null) { throw new NoEntryFoundException(userId, typeof(Users).Name); } TimeSchedules existing = TimeScheduleRepository.FindByIdAndUserId(scheduleId, user.Id); if (existing == null) { throw new NoEntryFoundException(scheduleId, userId, typeof(TimeSchedules).Name); } TimeScheduleRepository.Remove(existing); return(true); }
private List <TimeSchedules> GetOverlappedSchedule(TimeSchedules currentSchedule, List <TimeSchedules> schedules) { int minRange = GetMinRange(currentSchedule); int maxRange = GetMaxRange(currentSchedule); if (maxRange < minRange) { maxRange += MinutesInOneWeek; } List <TimeSchedules> overlapped = new List <TimeSchedules>(); foreach (var sch in schedules) { if (currentSchedule.Id == sch.Id) { continue; } int schMin = GetMinRange(sch); int schMax = GetMaxRange(sch); if (schMax < schMin) { schMax += MinutesInOneWeek; } bool predicate = minRange <= schMin && maxRange >= schMax || // goes out of the boundaries in boths way minRange >= schMin && maxRange <= schMax || // goes inside the boundaries both ways minRange >= schMin && minRange <= schMax || // left side goes inside maxRange >= schMin && maxRange <= schMax; // right side goes inside if (predicate) { overlapped.Add(sch); } } return(overlapped); }
public TimeSchedules AddWorkingInterval(int userId, DayOfWeek startDay, TimeSpan startTime, DayOfWeek endDay, TimeSpan endTime) { Users user = GetUserById(userId); if (user == null) { throw new NoEntryFoundException(userId, typeof(Users).Name); } TimeSchedules schedule = new TimeSchedules { UserId = user.Id, StartDay = startDay, StartTime = startTime, EndDay = endDay, EndTime = endTime }; List <TimeSchedules> overlapping = GetOverlappedSchedule(schedule, user.TheTimeScheduleForThisUser); if (overlapping.Count == 0) { TimeScheduleRepository.Add(schedule); return(schedule); } TimeSchedules newSchedule = SolveOverlappedSchedules(schedule, overlapping); newSchedule.UserId = user.Id; TimeScheduleRepository.Add(newSchedule); foreach (var sch in overlapping) { TimeScheduleRepository.Remove(sch); } return(newSchedule); }
private int GetMaxRange(TimeSchedules schedule) { return((int)schedule.EndDay * MinutesInOneDay + (int)schedule.EndTime.TotalMinutes); }
private int GetMinRange(TimeSchedules schedule) { return((int)schedule.StartDay * MinutesInOneDay + (int)schedule.StartTime.TotalMinutes); }