/// <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)); }
/// <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)); }
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)); }
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); }
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)); }
/// <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)); }
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)); }
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); }
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)); }
/// <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); }
internal virtual CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { return(new CampaignFireTimeConfig()); }