Beispiel #1
0
            /// <summary>
            /// Returns config for schedule next campaign job by default campaign fire period.
            /// Uses to local time convertion to include daylight offset and reverts next fire time to UTC.
            /// </summary>
            /// <param name="schema">Campaign schema.
            /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/>.</param>
            /// <param name="scheduledTimeParameters">Parameters for schedule new job for campaign.</param>
            /// <param name="previousStepCalculatedTime">Instance of <see cref="CampaignFireTimeConfig"/> that contains
            /// information for schedule next campaign job by previous calculation step.</param>
            /// <returns>Instance of <see cref="CampaignFireTimeConfig"/> that contains
            /// all needed information for schedule next campaign job by current step.</returns>
            internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                               CampaignScheduledTimeParameters scheduledTimeParameters,
                                                               CampaignFireTimeConfig previousStepCalculatedTime)
            {
                var fireTimeConfig = new CampaignFireTimeConfig {
                    Time = DateTime.MaxValue,
                    ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod
                };

                if (scheduledTimeParameters.CampaignStatusId != CampaignConsts.RunCampaignStatusId)
                {
                    fireTimeConfig.ScheduledAction = CampaignScheduledAction.Start;
                    fireTimeConfig.Time            = scheduledTimeParameters.CurrentTime;
                    return(fireTimeConfig);
                }
                var localStartDate       = TimeZoneInfo.ConvertTimeFromUtc(scheduledTimeParameters.StartDate, schema.TimeZoneOffset);
                var localBenchmarkTime   = TimeZoneInfo.ConvertTimeFromUtc(scheduledTimeParameters.BenchmarkTime, schema.TimeZoneOffset);
                var campaignLifeTime     = localBenchmarkTime - localStartDate;
                var toPreviousDefault    = (int)Math.Round(campaignLifeTime.TotalMinutes) % schema.DefaultCampaignFirePeriod;
                var nextLocalDefaultTime = toPreviousDefault == 0 && !scheduledTimeParameters.PreviousFireTime.HasValue
                                        ? localBenchmarkTime
                                        : localBenchmarkTime
                                           .AddMinutes(schema.DefaultCampaignFirePeriod - toPreviousDefault);

                fireTimeConfig.Time = ConvertToUtcByCampaignTimeZone(schema, nextLocalDefaultTime);
                return(CallNextStep(schema, scheduledTimeParameters, fireTimeConfig));
            }
Beispiel #2
0
 /// <summary>
 /// Calls next step in chain and returns result from this step.
 /// </summary>
 /// <param name="schema">Campaign schema.
 /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/></param>
 /// <param name="scheduledTimeParameters">Parameters which describes campaign state
 /// and includes parameters for calculates next fire time.</param>
 /// <param name="previousStepCalculatedTime"><see cref="CampaignFireTimeConfig"/> containes
 /// current step calculation result.</param>
 /// <returns>Returns <paramref name="previousStepCalculatedTime"/> when <see cref="NextCalculator"/>
 /// is not defined. And result of calculation from next step in otherwise.</returns>
 protected CampaignFireTimeConfig CallNextStep(CoreCampaignSchema schema,
                                               CampaignScheduledTimeParameters scheduledTimeParameters,
                                               CampaignFireTimeConfig previousStepCalculatedTime)
 {
     return(NextCalculator == null
                             ? previousStepCalculatedTime
                             : NextCalculator.Calculate(schema, scheduledTimeParameters, previousStepCalculatedTime));
 }
Beispiel #3
0
            internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                               CampaignScheduledTimeParameters scheduledTimeParameters,
                                                               CampaignFireTimeConfig previousStepCalculatedTime)
            {
                var timerElements = schema.FlowElements.OfType <CampaignTimerElement>();
                CampaignFireTimeConfig fireTimeConfig = GetTimedElementsNextFireTime(timerElements, scheduledTimeParameters);

                return(CallNextStepWithMinValue(schema, scheduledTimeParameters, previousStepCalculatedTime,
                                                fireTimeConfig));
            }
Beispiel #4
0
 private void DefinesTimeParameters(CoreCampaignSchema schema, DateTime?previousScheduledFireTime,
                                    CampaignScheduledTimeParameters scheduledParameters)
 {
     scheduledParameters.PreviousFireTime = previousScheduledFireTime
                                            ?? (scheduledParameters.PrevExecutedOn != default(DateTime)
                                 ? scheduledParameters.PrevExecutedOn
                                 : (DateTime?)null);
     scheduledParameters.CurrentTime   = CurrentTime;
     scheduledParameters.BenchmarkTime = scheduledParameters.PreviousFireTime ?? scheduledParameters.CurrentTime;
     schema.CampaignConfiguration["ScheduledUtcFireTime"] = RoundToSeconds(scheduledParameters.BenchmarkTime);
 }
Beispiel #5
0
            internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                               CampaignScheduledTimeParameters scheduledTimeParameters,
                                                               CampaignFireTimeConfig previousStepCalculatedTime)
            {
                var elements = schema.FlowElements
                               .Where(x => x.ElementType.HasFlag(CampaignSchemaElementType.Transition));
                var fireTimeConfig = GetTimedElementsNextFireTime(elements, scheduledTimeParameters);

                return(CallNextStepWithMinValue(schema, scheduledTimeParameters, previousStepCalculatedTime,
                                                fireTimeConfig));
            }
Beispiel #6
0
            /// <summary>
            /// Calls next step in chain with min value between <paramref name="previousStepCalculatedTime"/> and
            /// <paramref name="comparedCalculatedTime"/> and returns result from calculates next step.
            /// </summary>
            /// <param name="schema">Campaign schema.
            /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/></param>
            /// <param name="scheduledTimeParameters">Parameters which describes campaign state
            /// and includes parameters for calculates next fire time.</param>
            /// <param name="previousStepCalculatedTime"><see cref="CampaignFireTimeConfig"/> containes
            /// current step calculation result.</param>
            /// <param name="comparedCalculatedTime">This config should compare with
            /// <paramref name="previousStepCalculatedTime"/> and with minimum of this calls
            /// <see cref="CallNextStep(CoreCampaignSchema, CampaignScheduledTimeParameters, CampaignFireTimeConfig)"/>
            /// method.</param>
            /// <returns>Returns <paramref name="previousStepCalculatedTime"/> when <see cref="NextCalculator"/>
            /// is not defined. And result of calculation from next step in otherwise.</returns>
            protected CampaignFireTimeConfig CallNextStepWithMinValue(CoreCampaignSchema schema,
                                                                      CampaignScheduledTimeParameters scheduledTimeParameters,
                                                                      CampaignFireTimeConfig previousStepCalculatedTime,
                                                                      CampaignFireTimeConfig comparedCalculatedTime)
            {
                var minFireTime = comparedCalculatedTime.Time < previousStepCalculatedTime.Time &&
                                  comparedCalculatedTime.Time != default(DateTime)
                                        ? comparedCalculatedTime
                                        : previousStepCalculatedTime;

                return(CallNextStep(schema, scheduledTimeParameters, minFireTime));
            }
Beispiel #7
0
            internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                               CampaignScheduledTimeParameters scheduledTimeParameters,
                                                               CampaignFireTimeConfig previousStepCalculatedTime)
            {
                var fireTimeConfig = previousStepCalculatedTime;

                if (scheduledTimeParameters.ScheduledStopModeId == CampaignConsts.CampaingSpecifiedTimeModeId &&
                    previousStepCalculatedTime.Time >= scheduledTimeParameters.ScheduledStopDate)
                {
                    fireTimeConfig = new CampaignFireTimeConfig {
                        Time = new DateTime(scheduledTimeParameters.ScheduledStopDate.Ticks, DateTimeKind.Utc),
                        ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod,
                        ScheduledAction   = CampaignScheduledAction.ScheduledStop
                    };
                }
                return(CallNextStep(schema, scheduledTimeParameters, fireTimeConfig));
            }
Beispiel #8
0
        private CampaignScheduledTimeParameters GetScheduledParameters(Guid campaignId)
        {
            var scheduledParametersContainer = new CampaignScheduledTimeParameters();
            var campaignSelect = new Select(_userConnection)
                                 .Column("ScheduledStartDate")
                                 .Column("ScheduledStopDate")
                                 .Column("ScheduledStartModeId")
                                 .Column("ScheduledStopModeId")
                                 .Column("CampaignStatusId")
                                 .Column("StartDate")
                                 .Column("PrevExecutedOn")
                                 .From("Campaign")
                                 .Where("Id").IsEqual(Column.Parameter(campaignId)) as Select;

            campaignSelect.SpecifyNoLockHints();
            using (DBExecutor dbExecutor = _userConnection.EnsureDBConnection()) {
                using (IDataReader reader = campaignSelect.ExecuteReader(dbExecutor)) {
                    while (reader.Read())
                    {
                        scheduledParametersContainer.ScheduledStartDate
                            = reader.GetColumnValue <DateTime>("ScheduledStartDate");
                        scheduledParametersContainer.ScheduledStopDate
                            = reader.GetColumnValue <DateTime>("ScheduledStopDate");
                        scheduledParametersContainer.ScheduledStartModeId
                            = reader.GetColumnValue <Guid>("ScheduledStartModeId");
                        scheduledParametersContainer.ScheduledStopModeId
                            = reader.GetColumnValue <Guid>("ScheduledStopModeId");
                        scheduledParametersContainer.CampaignStatusId
                            = reader.GetColumnValue <Guid>("CampaignStatusId");
                        scheduledParametersContainer.StartDate
                            = reader.GetColumnValue <DateTime>("StartDate");
                        scheduledParametersContainer.PrevExecutedOn
                            = reader.GetColumnValue <DateTime>("PrevExecutedOn");
                    }
                }
            }
            return(scheduledParametersContainer);
        }
Beispiel #9
0
 internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                    CampaignScheduledTimeParameters scheduledTimeParameters,
                                                    CampaignFireTimeConfig previousStepCalculatedTime)
 {
     if (scheduledTimeParameters.CampaignStatusId == CampaignConsts.StoppingCampaignStatusId)
     {
         return(new CampaignFireTimeConfig {
             Time = scheduledTimeParameters.CurrentTime,
             ScheduledAction = CampaignScheduledAction.Stop,
             ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod
         });
     }
     if (scheduledTimeParameters.ScheduledStopModeId == CampaignConsts.CampaingSpecifiedTimeModeId &&
         scheduledTimeParameters.CurrentTime >= scheduledTimeParameters.ScheduledStopDate)
     {
         return(new CampaignFireTimeConfig {
             Time = scheduledTimeParameters.ScheduledStopDate,
             ScheduledAction = CampaignScheduledAction.ScheduledStop,
             ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod
         });
     }
     return(CallNextStep(schema, scheduledTimeParameters, previousStepCalculatedTime));
 }
Beispiel #10
0
            /// <summary>
            /// Calculates nearest time to benchmark time from conditional transition and timer elements.
            /// </summary>
            /// <param name="elements">List of elements which containes time for calculates next campaign run.</param>
            /// <param name="scheduledTimeParameters">Parameters which describes campaign state
            /// and includes parameters for calculates next fire time.</param>
            /// <returns>Returns instance of <see cref="CampaignFireTimeConfig"/>. It containes min
            /// time for next schedule job, when some element are contanies times, and otherwise returns
            /// config that containes <see cref="CampaignFireTimeConfig.Time"/> is equal
            /// <see cref="DateTime.MaxValue"/>.</returns>
            protected CampaignFireTimeConfig GetTimedElementsNextFireTime(IEnumerable <CampaignSchemaElement> elements,
                                                                          CampaignScheduledTimeParameters scheduledTimeParameters)
            {
                var fireTimeConfig = new CampaignFireTimeConfig {
                    Time = DateTime.MaxValue,
                    ExecutionStrategy = CampaignSchemaExecutionStrategy.Immediate
                };

                foreach (var element in elements)
                {
                    var elementFireTime = element.GetFireTime();
                    if (!elementFireTime.HasValue)
                    {
                        continue;
                    }
                    var elementExecutionDate = new DateTime(elementFireTime.Value.Ticks);
                    if (elementExecutionDate < fireTimeConfig.Time &&
                        elementExecutionDate > scheduledTimeParameters.BenchmarkTime)
                    {
                        fireTimeConfig.Time = elementExecutionDate;
                    }
                }
                return(fireTimeConfig);
            }
Beispiel #11
0
 internal virtual CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                   CampaignScheduledTimeParameters scheduledTimeParameters,
                                                   CampaignFireTimeConfig previousStepCalculatedTime)
 {
     return(new CampaignFireTimeConfig());
 }