/// <summary> /// Schedules the items. /// </summary> /// <param name="scheduleEdit">The schedule edit.</param> /// <param name="finalState">The final state.</param> public void ScheduleItems(ISupportScheduling scheduleEdit, Guid finalState) { using (new BypassPropertyCheckContext()) { if (scheduleEdit == null) { return; } if (scheduleEdit.ProcessingScheduling) { return; } if (!scheduleEdit.ScheduleBasedOnDate.HasValue && !scheduleEdit.ScheduleDisplayDate.HasValue) { return; } if (scheduleEdit.IsScheduleDateChangedForOnlyItem) { return; } var fp = TheDynamicTypeManager.GetEditableRoot<IFrequencyPattern>(Constants.FrequencyPatternProcessName, scheduleEdit.SchedulingFrequencyPatternId); if (fp == null) { return; } var supportStateEdit = scheduleEdit as ISupportStates; if (supportStateEdit == null) { return; } var isFinalState = finalState == supportStateEdit.CurrentStateGuid; if (!isFinalState && !scheduleEdit.IsNew) { return; } if (scheduleEdit.SchedulingEndOption == SchedulingEndOption.EndAfterOccurrences.ToString()) { if (scheduleEdit.SchedulingEndAfterOccurrencesIndex >= scheduleEdit.SchedulingEndAfterOccurrences) { return; } scheduleEdit.SchedulingEndAfterOccurrencesIndex++; } DateTime dateOfScheduleEdit = scheduleEdit.ScheduleBasedOnDate ?? scheduleEdit.ScheduleDisplayDate.Value; ICalendar calendar = null; var userCalendar = scheduleEdit.GetCalendar(); var tmpCalendar = userCalendar as ICalendar; if (tmpCalendar != null) { calendar = tmpCalendar; } if (userCalendar is int) { calendar = TheDynamicTypeManager.GetEditableRoot<ICalendar>(Constants.CalendarProcessName, (int)userCalendar); } if (userCalendar == null) { var calendars = TheDynamicTypeManager.GetInfoList<IInfoClass>(Constants.CalendarProcessName, pageSize: 1); if (calendars.Count > 0) { calendar = TheDynamicTypeManager.GetEditableRoot<ICalendar>(Constants.CalendarProcessName, calendars[0].Id); } } var filter = new FilterList { new FilterDescriptor( LogicalOperators.And, new MobileObservableCollection<IFilterDescriptor> { new FilterDescriptor( Constants.SchedulingSeriesGuid, FilterOperator.IsEqualTo, scheduleEdit.SchedulingSeriesGuid, typeof(string)), //ELMTDEV-2250 // new FilterDescriptor( // Constants.SchedulingSeriesItemNumber, // FilterOperator.IsGreaterThan, // scheduleEdit.SchedulingSeriesItemNumber, // typeof(int)), new FilterDescriptor( Constants.IdColumnName, FilterOperator.IsNotEqualTo, scheduleEdit.Id, typeof(int)), new FilterDescriptor( Constants.CurrentStateIdColumnName, FilterOperator.IsNotEqualTo, scheduleEdit.ScheduleStartStateId, typeof(int)) }) }; if (!string.IsNullOrEmpty(scheduleEdit.ScheduleFilter)) { var scheduleFilterList = FilterDescriptor.GetFilterList(scheduleEdit.ScheduleFilter); if (scheduleFilterList != null) { foreach (var filterDescriptor in scheduleFilterList) filter.Add(filterDescriptor); } } var sortList = new SortList { new SortDescriptor(Constants.SchedulingSeriesItemNumber, SortDirection.Ascending) }; var infoList = TheDynamicTypeManager.GetInfoList<IInfoClass>( scheduleEdit.ProcessName, pageSize: 100, filterDescriptors: filter, sortDescriptors: sortList); var lenght = isFinalState ? scheduleEdit.ScheduledItemsCount : scheduleEdit.ScheduledItemsCount - 1; _scheduledList.Clear(); _scheduledList.Add(dateOfScheduleEdit.Date); _previousScheduleDate = dateOfScheduleEdit.Date; for (var i = 0; i < lenght; i++) { CalculateAndSave(ref dateOfScheduleEdit, infoList.ElementAtOrDefault(i), scheduleEdit, fp, calendar); } } }
/// <summary> /// Calculates the and save. /// </summary> /// <param name="nextdate">The next date.</param> /// <param name="info">The information.</param> /// <param name="scheduleEdit">The schedule edit.</param> /// <param name="fp">The fp.</param> /// <param name="calendar">The calendar.</param> /// <exception cref="Cebos.Veyron.SharedTypes.VeyronException"></exception> private static void CalculateAndSave(ref DateTime nextdate, IInfoClass info, ISupportScheduling scheduleEdit, IFrequencyPattern fp, ICalendar calendar) { var edit = info == null ? TheDynamicTypeManager.NewEditableRoot<ISupportScheduling>(scheduleEdit.ProcessName) : TheDynamicTypeManager.GetEditableRoot<ISupportScheduling>(scheduleEdit.ProcessName, info.Id); if (!edit.IsNew && scheduleEdit.SchedulingSeriesItemNumber > edit.SchedulingSeriesItemNumber) return; scheduleEdit.CopyScheduledPropertiesTo(edit); nextdate = CalculateNextDate(nextdate, fp, calendar); if (scheduleEdit.SchedulingEndOption == SchedulingEndOption.EndByDate.ToString() && nextdate > scheduleEdit.SchedulingEndByDate) { return; } edit.ScheduleDisplayDate = fp.PatternType.Equals(FrequencyPatternType.Daily.ToString()) ? nextdate : CheckAdjustWorkingExceptions(ref nextdate, calendar, fp); //duplicated due to exceptions, go to next frequency while ((_scheduledList.Contains(((DateTime)edit.ScheduleDisplayDate).Date) || _previousScheduleDate > ((DateTime)edit.ScheduleDisplayDate).Date) && calendar != null) { nextdate = CalculateNextDate(nextdate, fp, calendar); if (scheduleEdit.SchedulingEndOption == SchedulingEndOption.EndByDate.ToString() && nextdate > scheduleEdit.SchedulingEndByDate) { return; } edit.ScheduleDisplayDate = fp.PatternType.Equals(FrequencyPatternType.Daily.ToString()) ? nextdate : CheckAdjustWorkingExceptions(ref nextdate, calendar, fp); } _scheduledList.Add(((DateTime)edit.ScheduleDisplayDate).Date); _previousScheduleDate = ((DateTime)edit.ScheduleDisplayDate).Date; edit.SchedulingSeriesGuid = scheduleEdit.SchedulingSeriesGuid; edit.SchedulingEndOption = scheduleEdit.SchedulingEndOption; edit.SchedulingEndAfterOccurrences = scheduleEdit.SchedulingEndAfterOccurrences; edit.SchedulingEndAfterOccurrencesIndex = scheduleEdit.SchedulingEndAfterOccurrencesIndex; edit.SchedulingEndByDate = scheduleEdit.SchedulingEndByDate; edit.ScheduledItemsCount = scheduleEdit.ScheduledItemsCount; edit.SchedulingFrequencyPatternId = scheduleEdit.SchedulingFrequencyPatternId; edit.ProcessingScheduling = true; var businessBase = edit as BusinessBase; if (businessBase != null && !businessBase.IsValid) { var allValidationErrors = businessBase.BrokenRulesCollection.Select(x => string.IsNullOrEmpty(x.Description) ? x.RuleName : x.Description).ToList(); var parent = edit.GetBaseEdit() as BusinessBase; if (parent != null && !parent.IsValid) allValidationErrors.AddRange(parent.BrokenRulesCollection.Select(x => string.IsNullOrEmpty(x.Description) ? x.RuleName : x.Description).ToList()); throw new VeyronException(string.Format(CultureInfo.InvariantCulture, "Scheduled process '{0}' is not valid and cannot be saved{1}{2}", edit.ProcessDisplayName, Environment.NewLine, string.Join(Environment.NewLine, allValidationErrors))); } var savedObject = (ISupportScheduling)((ISavable)edit).Save(); scheduleEdit.CopyScheduledPropertiesAfterEditableRootWasSaved(savedObject); }