Пример #1
0
        /// <summary>
        /// Checks the new override event has a valid date range. It cannot overlap existing override events.
        /// </summary>
        private bool ValidateNewOverrideEventAgainstExistingOverridingEvents <T>(IProductionEvents <OverrideEvent <T> > existingList, OverrideEventRequestArgument arg)
        {
            //Test if we override event within the range or we have overlapping overriding
            bool noOverlap = true;
            //Test if we have overlapping for the start date of the event
            //Note closest prior and closest subsequent include event at date itself
            var index = existingList.IndexOfClosestEventPriorToDate(arg.EndUTC);

            if (index >= 0)
            {
                existingList.GetStateAtIndex(index, out var startDate, out var evt);
                if (startDate != arg.EndUTC) //Ignore exact event time matches
                {
                    noOverlap = arg.StartUTC >= evt.EndDate;
                }
            }
            //Test if we have overlapping for the end date of the event
            index = existingList.IndexOfClosestEventSubsequentToDate(arg.StartUTC);
            if (index >= 0)
            {
                existingList.GetStateAtIndex(index, out var startDate, out _);
                if (startDate != arg.StartUTC)
                {
                    noOverlap = noOverlap && arg.EndUTC <= startDate;
                }
            }
            return(noOverlap);
        }
Пример #2
0
        public bool IsNextEventSuitable(int stamp, DateTime _time)
        {
            if (Stamp != stamp || Index < 0)
            {
                return(false);
            }

            int EventListCount = EventList.Count();

            int NewIndex = Index + 1;

            if (NewIndex < EventListCount)
            {
                DateTime NewEndDate;
                T        NewNextEvent;

                int NewNextEventIndex = NewIndex + 1;
                if (NewNextEventIndex < EventListCount)
                {
                    EventList.GetStateAtIndex(NewNextEventIndex, out NewEndDate, out NewNextEvent);
                }
                else
                {
                    NewNextEvent = default;
                    NewEndDate   = Consts.MAX_DATETIME_AS_UTC;
                }

                if (_time < NewEndDate)
                {
                    Index = NewIndex;

                    StartDate = EndDate;
                    EndDate   = NewEndDate;

                    ThisEvent = NextEvent;
                    NextEvent = NewNextEvent;

                    return(true);
                }
            }
            return(false);
        }