Пример #1
0
        public SchedulerEvent(SchedulerEvent obj) : this()
        {
            this.id           = obj.id;
            this.text         = obj.text;
            this.start_date   = obj.start_date;
            this.end_date     = obj.end_date;
            this.rec_type     = obj.rec_type;
            this.event_length = obj.event_length;
            this.event_pid    = obj.event_pid;

            if (string.IsNullOrEmpty(this.id))
            {
                this.id = "";
            }
            if (string.IsNullOrEmpty(this.text))
            {
                this.text = "";
            }
            if (string.IsNullOrEmpty(this.rec_type))
            {
                this.rec_type = "";
            }
            if (string.IsNullOrEmpty(this.event_pid))
            {
                this.event_pid = "";
            }

            if (this.event_length == default(long))
            {
                this.event_length = 0;
            }
        }
Пример #2
0
 public List <SchedulerEvent> GetOccurrences(SchedulerEvent item, DateTime from, DateTime to, int maxOccurrences = 300)
 {
     return(this.GetOccurrences(new List <SchedulerEvent> {
         item
     }, from, to, maxOccurrences));
 }
Пример #3
0
        protected SeriesInfo _GetOccurrences(SchedulerEvent ev, DateTime fromDate, DateTime toDate, int maxOccurrences)
        {
            var tmp = new SchedulerEvent(ev);

            var typeInfo = tmp._parsed_type;

            if (typeInfo.Type != RecurrenceType.RegularEvent && typeInfo.Type != RecurrenceType.DeletedInstance && tmp.event_length > 0)
            {
                var occurrences = new List <DateTime>();

                var seriesStart = tmp.start_date;

                var currDate = _CorrectSeriesStartDate(tmp.start_date, fromDate, ev);

                var end_date = tmp.end_date;
                if (typeInfo.NumberOfInstances > -1 && typeInfo.NumberOfInstances < maxOccurrences)
                {
                    maxOccurrences = typeInfo.NumberOfInstances;
                }
                while (currDate < end_date && currDate < toDate && occurrences.Count < maxOccurrences)
                {
                    var occEndDate = currDate.AddSeconds((double)tmp.event_length);
                    if (typeInfo.WeekDayOfMonthInterval != -1 && typeInfo.WeekDayOfMonth != -1)
                    {
                        var tmp_date = _GetNthWeekOfMonth(currDate, typeInfo.WeekDayOfMonthInterval, (DayOfWeek)typeInfo.WeekDayOfMonth);
                        occEndDate = tmp_date.AddSeconds((double)tmp.event_length);
                        if (_IsInTimeFrame(tmp_date, occEndDate, fromDate, toDate) && tmp_date >= seriesStart)
                        {
                            occurrences.Add(tmp_date);
                        }
                    }
                    else if (typeInfo.DaysOfWeek.Count == 0 && _IsInTimeFrame(currDate, occEndDate, fromDate, toDate) && currDate >= seriesStart)
                    {
                        occurrences.Add(currDate);
                    }
                    else if (typeInfo.DaysOfWeek.Count > 0)
                    {
                        foreach (var occurrenceWeekDay in typeInfo.DaysOfWeek)
                        {
                            int currentWeekDay      = (int)currDate.DayOfWeek;
                            var diff                = (7 - currentWeekDay + occurrenceWeekDay) % 7;
                            var occurrenceStartDate = currDate.AddDays(diff);

                            occEndDate = occurrenceStartDate.AddSeconds((double)tmp.event_length);
                            if (_IsInTimeFrame(occurrenceStartDate, occEndDate, fromDate, toDate) && occurrences.Count < maxOccurrences && occurrenceStartDate >= seriesStart)
                            {
                                occurrences.Add(occurrenceStartDate);
                            }
                        }
                    }
                    switch (typeInfo.Type)
                    {
                    case RecurrenceType.Daily:
                        currDate = currDate.AddDays(typeInfo.Interval);
                        break;

                    case RecurrenceType.Weekly:
                        currDate = currDate.AddDays(7 * typeInfo.Interval);
                        break;

                    case RecurrenceType.Monthly:
                        currDate = _GoToFirstMonthYearInstance(currDate, typeInfo.Interval, ev);
                        //currDate = currDate.AddMonths(typeInfo.Interval);
                        break;

                    case RecurrenceType.Yearly:
                        currDate = _GoToFirstMonthYearInstance(currDate, typeInfo.Interval, ev);
                        //currDate = currDate.AddYears(typeInfo.Interval);
                        break;

                    default:
                        break;
                    }
                }

                return(new SeriesInfo {
                    SchedulerEvent = tmp, Occurrences = occurrences
                });
            }
            else
            {
                if (tmp.start_date < toDate &&
                    tmp.end_date > fromDate)
                {
                    return new SeriesInfo {
                               SchedulerEvent = tmp, Occurrences = new List <DateTime>()
                               {
                                   tmp.start_date
                               }
                    }
                }
                ;
                else
                {
                    return(null);
                }
            }
        }
Пример #4
0
        protected DateTime _GoToFirstMonthYearInstance(DateTime startDate, int increment, SchedulerEvent seriesInstance, int currentCount = 0)
        {
            var overflowRule = this.OverflowInstances;

            if (currentCount == 0)
            {
                currentCount = 1;
            }
            else
            {
                currentCount++;
            }

            var typeInfo = seriesInstance._parsed_type;

            var maxCount = 12;

            if (currentCount > maxCount)
            {
                return(default(DateTime));
            }

            var resultDate = new DateTime(
                startDate.Year,
                startDate.Month,
                1,
                startDate.Hour,
                startDate.Minute,
                startDate.Second
                );

            resultDate = resultDate.AddMonths(increment * _getSeriesStep(typeInfo.Type));


            var originalDate = resultDate;

            if (typeInfo.WeekDayOfMonth == -1 || typeInfo.WeekDayOfMonthInterval == -1)
            {
                resultDate = resultDate.AddDays(seriesInstance.start_date.Day - 1);
            }
            else
            {
                resultDate = _GetNthWeekOfMonth(resultDate, typeInfo.WeekDayOfMonthInterval, (DayOfWeek)typeInfo.WeekDayOfMonth);
            }

            if (resultDate.Month != originalDate.Month && overflowRule != OverflowInstancesRule.Default)
            {
                if (overflowRule == OverflowInstancesRule.LastDay)
                {
                    resultDate = originalDate.AddMonths(1);
                    resultDate = resultDate.AddDays(-1);
                }
                else
                {
                    resultDate = _GoToFirstMonthYearInstance(originalDate, increment, seriesInstance, currentCount);
                }
            }

            return(resultDate);
        }
Пример #5
0
        protected DateTime _CorrectSeriesStartDate(DateTime eventStart, DateTime rangeStart, SchedulerEvent ev)
        {
            var resultDate = eventStart;
            var rule       = ev._parsed_type;

            switch (rule.Type)
            {
            case RecurrenceType.Monthly:
            case RecurrenceType.Yearly:
                var step  = _getSeriesStep(rule.Type);
                var delta = (int)Math.Ceiling((decimal)((rangeStart.Year * 12 + rangeStart.Month) - (eventStart.Year * 12 + eventStart.Month)) / (step));
                if (delta > 0)
                {
                    resultDate = new DateTime(resultDate.Year, resultDate.Month, 1, resultDate.Hour, resultDate.Minute, resultDate.Second);
                    resultDate = resultDate.AddMonths(delta * rule.Interval);
                }
                return(_GoToFirstMonthYearInstance(resultDate, 0, ev));
            }
            return(resultDate);
        }