Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 private int GetMaxRange(TimeSchedules schedule)
 {
     return((int)schedule.EndDay * MinutesInOneDay + (int)schedule.EndTime.TotalMinutes);
 }
Beispiel #7
0
 private int GetMinRange(TimeSchedules schedule)
 {
     return((int)schedule.StartDay * MinutesInOneDay + (int)schedule.StartTime.TotalMinutes);
 }