示例#1
0
        public async Task <IActionResult> OnGetAsync(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            ProfileAvailability = await Context.ProfileAvailability.SingleOrDefaultAsync(m => m.ProAId == id);

            if (ProfileAvailability == null)
            {
                return(NotFound());
            }
            return(Page());
        }
示例#2
0
        public async Task <IActionResult> OnPostAsync(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            ProfileAvailability = await Context.ProfileAvailability.FindAsync(id);

            if (ProfileAvailability != null)
            {
                Context.ProfileAvailability.Remove(ProfileAvailability);
                await Context.SaveChangesAsync();
            }

            return(RedirectToPage("./Index"));
        }
        public static void LoadScheduleForProfile(Profile profile)
        {
            lock (ScheduleLock)
            {
                LoggingService.GetInstance().LogScheduling("Loading Schedules for Profile: " + profile.Name);
                try
                {
                    if (ProfileAvailabilities.Any(i => i.ProfileId == profile.ProfileId))
                    {
                        foreach (var availability in ProfileAvailabilities.Where(i => i.ProfileId == profile.ProfileId).ToList())
                        {
                            ProfileAvailabilities.Remove(availability);
                        }
                    }

                    var dateProperties = DateProperties;

                    var scheduleActiveRanges = new List <ScheduleActiveRange>();
                    foreach (var schedule in profile.Schedules.Where(i => i.IsActive && !i.MarkedForDeletion))
                    {
                        LoggingService.GetInstance().LogScheduling("Processing Schedule: " + schedule.DisplayName);
                        if (schedule.ScheduleRecurrence.StartDate.HasValue && schedule.ScheduleRecurrence.StartDate.Value.Date <= dateProperties.Today.Date)
                        {
                            var allDayStart = dateProperties.Today.Date;
                            var allDayEnd   = dateProperties.Today.Date.Add(new TimeSpan(23, 59, 59));
                            if (schedule.ScheduleRecurrence.PatternType == RecurrencePattern.OneTime && schedule.ScheduleRecurrence.EndDate.HasValue && schedule.ScheduleRecurrence.EndDate.Value.Date >= dateProperties.Today.Date)
                            {
                                LoggingService.GetInstance().LogScheduling("Found OneTime Schedule");
                                if (schedule.ScheduleRecurrence.IsAllDay)
                                {
                                    var scheduleActiveRange = new ScheduleActiveRange
                                    {
                                        IsAllDay         = true,
                                        IsClosed         = schedule.ClosedOnly,
                                        SchedulePriority = SchedulePriority.OneTime,
                                        Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                        StartDateTime    = allDayStart,
                                        EndDateTime      = allDayEnd
                                    };
                                    scheduleActiveRanges.Add(scheduleActiveRange);
                                    LoggingService.GetInstance().LogScheduling("Schedule Added...");
                                }
                                else
                                {
                                    if (schedule.ScheduleRecurrence.StartTime.HasValue && schedule.ScheduleRecurrence.EndTime.HasValue)
                                    {
                                        var startTime = schedule.ScheduleRecurrence.StartTime.Value;
                                        var endTime   = schedule.ScheduleRecurrence.EndTime.Value;
                                        var start     = dateProperties.Today.Date.Add(new TimeSpan(startTime.Hour, startTime.Minute, startTime.Second));
                                        var end       = dateProperties.Today.Date.Add(new TimeSpan(endTime.Hour, endTime.Minute, endTime.Second));

                                        var scheduleActiveRange = new ScheduleActiveRange
                                        {
                                            IsAllDay         = false,
                                            IsClosed         = schedule.ClosedOnly,
                                            SchedulePriority = SchedulePriority.OneTime,
                                            Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                            StartDateTime    = start,
                                            EndDateTime      = end
                                        };
                                        scheduleActiveRanges.Add(scheduleActiveRange);
                                        LoggingService.GetInstance().LogScheduling("Schedule Added...");
                                    }
                                }
                            }
                            if ((schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Yearly || schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Monthly) && (!schedule.ScheduleRecurrence.EndDate.HasValue || schedule.ScheduleRecurrence.EndDate.Value.Date >= dateProperties.Today.Date))
                            {
                                LoggingService.GetInstance().LogScheduling("Found Yearly or Monthly Schedule");
                                if ((schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Yearly && schedule.ScheduleRecurrence.Month == dateProperties.Month) || schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Monthly)
                                {
                                    var isApplicable = false;

                                    if (schedule.ScheduleRecurrence.IsRelative && schedule.ScheduleRecurrence.RelativeDayType != RelativeDayType.None)
                                    {
                                        if (schedule.ScheduleRecurrence.RelativeDayType == RelativeDayType.Day)
                                        {
                                            switch (schedule.ScheduleRecurrence.RelativeMonthlyType)
                                            {
                                            case RelativeMonthlyType.First:
                                                isApplicable = dateProperties.Date == 1;
                                                break;

                                            case RelativeMonthlyType.Second:
                                                isApplicable = dateProperties.Date == 2;
                                                break;

                                            case RelativeMonthlyType.Third:
                                                isApplicable = dateProperties.Date == 3;
                                                break;

                                            case RelativeMonthlyType.Fourth:
                                                isApplicable = dateProperties.Date == 4;
                                                break;

                                            case RelativeMonthlyType.Last:
                                                isApplicable = dateProperties.LastDayOfMonth;
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            if (schedule.ScheduleRecurrence.RelativeDayType == dateProperties.RelativeDay)
                                            {
                                                if (schedule.ScheduleRecurrence.RelativeMonthlyType == dateProperties.RelativeMonthly || (schedule.ScheduleRecurrence.RelativeMonthlyType == RelativeMonthlyType.Last && dateProperties.LastDayOccurenceOfMonth))
                                                {
                                                    isApplicable = true;
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        var dates = schedule.ScheduleRecurrence.Dates.Split('|');
                                        if (dates.Any(i => i == dateProperties.Date.ToString()))
                                        {
                                            isApplicable = true;
                                        }
                                    }

                                    if (isApplicable)
                                    {
                                        if (schedule.ScheduleRecurrence.IsAllDay)
                                        {
                                            var scheduleActiveRange = new ScheduleActiveRange
                                            {
                                                IsAllDay         = true,
                                                IsClosed         = schedule.ClosedOnly,
                                                SchedulePriority = schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Yearly ? SchedulePriority.Yearly : SchedulePriority.Monthly,
                                                Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                                StartDateTime    = allDayStart,
                                                EndDateTime      = allDayEnd
                                            };
                                            scheduleActiveRanges.Add(scheduleActiveRange);
                                            LoggingService.GetInstance().LogScheduling("Schedule Added...");
                                        }
                                        else if (schedule.ScheduleRecurrence.StartTime.HasValue && schedule.ScheduleRecurrence.EndTime.HasValue)
                                        {
                                            var startTime           = schedule.ScheduleRecurrence.StartTime.Value;
                                            var endTime             = schedule.ScheduleRecurrence.EndTime.Value;
                                            var start               = dateProperties.Today.Date.Add(new TimeSpan(startTime.Hour, startTime.Minute, startTime.Second));
                                            var end                 = startTime > endTime ? allDayEnd : dateProperties.Today.Date.Add(new TimeSpan(endTime.Hour, endTime.Minute, endTime.Second));
                                            var scheduleActiveRange = new ScheduleActiveRange
                                            {
                                                IsAllDay         = false,
                                                IsClosed         = schedule.ClosedOnly,
                                                SchedulePriority = schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Yearly ? SchedulePriority.Yearly : SchedulePriority.Monthly,
                                                Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                                StartDateTime    = start,
                                                EndDateTime      = end
                                            };
                                            scheduleActiveRanges.Add(scheduleActiveRange);
                                            LoggingService.GetInstance().LogScheduling("Schedule Added...");
                                        }
                                    }
                                }
                            }

                            if (schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Weekly && (!schedule.ScheduleRecurrence.EndDate.HasValue || schedule.ScheduleRecurrence.EndDate.Value.Date >= dateProperties.Today.Date))
                            {
                                LoggingService.GetInstance().LogScheduling("Found Weekly Schedule");

                                var      isApplicable    = false;
                                var      days            = schedule.ScheduleRecurrence.Days.Split('|');
                                var      isAllDay        = schedule.ScheduleRecurrence.IsAllDay;
                                TimeSpan?endTimeOverride = null;
                                if (schedule.ScheduleRecurrence.IsDaySpan && schedule.ScheduleRecurrence.WeeklyStartTime.HasValue && schedule.ScheduleRecurrence.WeeklyEndTime.HasValue)
                                {
                                    var weekStartTime = schedule.ScheduleRecurrence.WeeklyStartTime.Value.TimeOfDay;
                                    var weekEndTime   = schedule.ScheduleRecurrence.WeeklyEndTime.Value.TimeOfDay;
                                    var firstDay      = days.First();
                                    var lastDay       = days.Last();
                                    if (firstDay == lastDay)
                                    {
                                        if (weekEndTime < weekStartTime && firstDay == dateProperties.Day.ToString())
                                        {
                                            endTimeOverride = weekEndTime;
                                        }
                                        isApplicable = true;
                                    }
                                    else
                                    {
                                        int firstInt;
                                        int lastInt;
                                        if (int.TryParse(firstDay, out firstInt) && int.TryParse(lastDay, out lastInt))
                                        {
                                            var range = new List <int>();
                                            if (firstInt < lastInt)
                                            {
                                                var range1 = new int[(lastInt - firstInt) + 1];
                                                var f      = 0;
                                                for (var i = firstInt; i <= lastInt; i++)
                                                {
                                                    range1[f] = i;
                                                    f++;
                                                }
                                                range.AddRange(range1);
                                            }
                                            else
                                            {
                                                var range1 = new int[7 - firstInt];
                                                var f      = 0;
                                                for (var i = firstInt; i < 7; i++)
                                                {
                                                    range1[f] = i;
                                                    f++;
                                                }
                                                range.AddRange(range1);
                                                var range2 = new int[lastInt];
                                                var l      = 0;
                                                for (var i = lastInt; i > 0; i--)
                                                {
                                                    range2[l] = i;
                                                    l++;
                                                }
                                                range.AddRange(range2);
                                            }
                                            if (range.Contains(dateProperties.Day))
                                            {
                                                isApplicable = true;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (days.Any(i => i == dateProperties.Day.ToString()))
                                    {
                                        isApplicable = true;
                                    }
                                }

                                if (isApplicable)
                                {
                                    DateTime startDateTime;
                                    DateTime endDateTime;

                                    if (!isAllDay && schedule.ScheduleRecurrence.StartTime.HasValue && schedule.ScheduleRecurrence.EndTime.HasValue)
                                    {
                                        var startTime = schedule.ScheduleRecurrence.StartTime.Value;
                                        var endTime   = schedule.ScheduleRecurrence.EndTime.Value;
                                        startDateTime = dateProperties.Today.Date.Add(new TimeSpan(startTime.Hour, startTime.Minute, startTime.Second));
                                        endDateTime   = startTime > endTime ? allDayEnd : dateProperties.Today.Date.Add(new TimeSpan(endTime.Hour, endTime.Minute, endTime.Second));
                                    }
                                    else
                                    {
                                        startDateTime = allDayStart;
                                        endDateTime   = allDayEnd;
                                    }
                                    if (endTimeOverride.HasValue)
                                    {
                                        endDateTime = dateProperties.Today.Date.Add(endTimeOverride.Value);
                                    }

                                    if (startDateTime < endDateTime)
                                    {
                                        var scheduleActiveRange = new ScheduleActiveRange
                                        {
                                            IsAllDay         = isAllDay,
                                            IsClosed         = schedule.ClosedOnly,
                                            SchedulePriority = SchedulePriority.Weekly,
                                            Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                            StartDateTime    = startDateTime,
                                            EndDateTime      = endDateTime
                                        };
                                        scheduleActiveRanges.Add(scheduleActiveRange);
                                        LoggingService.GetInstance().LogScheduling("Schedule Added...");
                                    }
                                }
                            }
                            if (schedule.ScheduleRecurrence.PatternType == RecurrencePattern.Daily && (!schedule.ScheduleRecurrence.EndDate.HasValue || schedule.ScheduleRecurrence.EndDate.Value.Date >= dateProperties.Today.Date))
                            {
                                LoggingService.GetInstance().LogScheduling("Found Daily Schedule");
                                DateTime startDateTime;
                                DateTime endDateTime;

                                if (!schedule.ScheduleRecurrence.IsAllDay && schedule.ScheduleRecurrence.StartTime.HasValue && schedule.ScheduleRecurrence.EndTime.HasValue)
                                {
                                    var startTime = schedule.ScheduleRecurrence.StartTime.Value;
                                    var endTime   = schedule.ScheduleRecurrence.EndTime.Value;
                                    startDateTime = dateProperties.Today.Date.Add(new TimeSpan(startTime.Hour, startTime.Minute, startTime.Second));
                                    endDateTime   = startTime > endTime ? allDayEnd : dateProperties.Today.Date.Add(new TimeSpan(endTime.Hour, endTime.Minute, endTime.Second));
                                }
                                else
                                {
                                    startDateTime = allDayStart;
                                    endDateTime   = allDayEnd;
                                }

                                var scheduleActiveRange = new ScheduleActiveRange
                                {
                                    IsAllDay         = schedule.ScheduleRecurrence.IsAllDay,
                                    IsClosed         = schedule.ClosedOnly,
                                    SchedulePriority = SchedulePriority.Daily,
                                    Message          = !String.IsNullOrWhiteSpace(schedule.OverrideMessage) ? schedule.OverrideMessage : schedule.Description,
                                    StartDateTime    = startDateTime,
                                    EndDateTime      = endDateTime
                                };
                                scheduleActiveRanges.Add(scheduleActiveRange);
                                LoggingService.GetInstance().LogScheduling("Schedule Added...");
                            }
                        }
                    }

                    var profileAvailability = new ProfileAvailability
                    {
                        ProfileId            = profile.ProfileId,
                        ScheduleActiveRanges = scheduleActiveRanges,
                        LastUpdated          = DateTime.UtcNow.AddHours(ScheduleDateTimeOffset).Date
                    };
                    ProfileAvailabilities.Add(profileAvailability);
                    LoggingService.GetInstance().LogScheduling("Finished Loading Schedules for Profile...");
                }
                catch (Exception e)
                {
                    LoggingService.GetInstance().LogException(e);
                }
            }
        }