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; } }
public List <SchedulerEvent> GetOccurrences(SchedulerEvent item, DateTime from, DateTime to, int maxOccurrences = 300) { return(this.GetOccurrences(new List <SchedulerEvent> { item }, from, to, maxOccurrences)); }
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); } } }
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); }
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); }