public static void UpdateRetryTargetDate(IOrganizationService service, CustomJob job, CrmLog log)
        {
            DateTime?nextRecurrence;

            if (job.RetrySchedule == null)
            {
                log.Log("No retry schedule.");
                nextRecurrence = DateTime.UtcNow.AddMinutes(1);
            }
            else
            {
                log.Log($"Getting next retry occurrence for {job.RetrySchedule}.", LogLevel.Debug);
                var action = new GlobalActions.ldv_CustomJobGetNextRecurrenceDate(
                    new EntityReference(RecurrenceRule.EntityLogicalName, job.RetrySchedule.Value), service);
                nextRecurrence = action.Execute().NextTargetDate;
                log.Log($"Next retry occurrence: '{nextRecurrence}'.");
            }

            var targetDate = nextRecurrence > new DateTime(1900) ? nextRecurrence : null;

            log.Log($"Updating target date to '{targetDate}' UTC ...", LogLevel.Debug);
            service.Update(
                new CustomJob
            {
                Id         = job.Id,
                TargetDate = targetDate
            });
            log.Log($"Updated target date to '{targetDate}' UTC");
        }
Esempio n. 2
0
        protected override void ExecuteLogic()
        {
            var target = ((Entity)context.InputParameters["Target"]).ToEntity <CustomJob>();

            if (target.RecurrenceUpdatedTrigger == null)
            {
                log.Log("Recurrence update not triggered. Exiting ...");
                return;
            }

            var postImage = context.PostEntityImages.FirstOrDefault().Value?.ToEntity <CustomJob>();

            if (postImage == null)
            {
                throw new InvalidPluginExecutionException("A full post image must be registered on this plugin step.");
            }

            var customJob =
                new CustomJob
            {
                Id = target.Id
            };

            log.Log($"Loading related recurrences.", LogLevel.Debug);
            customJob.LoadRelation(CustomJob.RelationNames.Recurrences, service);

            if (customJob.Recurrences == null)
            {
                if (postImage.RecurrentJob == true)
                {
                    log.Log("Setting to non-recurrent ...", LogLevel.Debug);
                    service.Update(
                        new CustomJob
                    {
                        Id           = customJob.Id,
                        RecurrentJob = false
                    });
                    log.Log("Set to non-recurrent.");
                }

                log.Log($"No recurrences set. Exiting ...");
                return;
            }

            DateTime?targetDate = null;

            foreach (var recurrenceRule in customJob.Recurrences)
            {
                log.Log($"Getting next recurrence for {recurrenceRule.Id}.", LogLevel.Debug);
                var action         = new GlobalActions.ldv_CustomJobGetNextRecurrenceDate(recurrenceRule.ToEntityReference(), service);
                var nextRecurrence = action.Execute().NextTargetDate;
                log.Log($"Next recurrence: '{nextRecurrence}'.");

                if (nextRecurrence > new DateTime(1900) && (targetDate == null || nextRecurrence < targetDate))
                {
                    targetDate = nextRecurrence;
                }
            }

            if (targetDate == null)
            {
                log.Log("Updating latest run message and date.", LogLevel.Debug);
                service.Update(
                    new CustomJob
                {
                    Id = target.Id,
                    LatestRunMessage   = "Recurrence reached its cycle end.",
                    TargetDate         = null,
                    PreviousTargetDate = DateTime.UtcNow,
                    Status             = CustomJob.StatusEnum.Inactive,
                    StatusReason       = CustomJob.StatusReasonEnum.Success
                });
                log.Log("Updated.");

                return;
            }

            log.Log("Updating target date.", LogLevel.Debug);
            service.Update(
                new CustomJob
            {
                Id           = customJob.Id,
                RecurrentJob = customJob.Recurrences.Any(),
                TargetDate   = targetDate
            });
        }