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"); }
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 }); }