Exemplo n.º 1
0
        /// <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);
                }
             }
        }
Exemplo n.º 2
0
        /// <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);
        }