internal static void SetStatus(IOrganizationService service, CustomJob.StatusReasonEnum status,
                                       Guid jobId, bool isTriggerRecurrence)
        {
            var job =
                new CustomJob
            {
                Id           = jobId,
                StatusReason = status
            };

            if (isTriggerRecurrence)
            {
                job.RecurrenceUpdatedTrigger = new Random().Next(111111, 99999999).ToString();
                job.TargetDate = new DateTime(2100, 1, 1);
            }

            service.Update(job);
        }
        internal static void Close(IOrganizationService service, CustomJob.StatusReasonEnum status, Guid jobId,
                                   bool isPropagate = false)
        {
            service.Update(
                new CustomJob
            {
                Id           = jobId,
                Status       = CustomJob.StatusEnum.Inactive,
                StatusReason = status
            });

            if (isPropagate)
            {
                var parent = service.Retrieve(CustomJob.EntityLogicalName, jobId, new ColumnSet(CustomJob.Fields.ParentJob))
                             .ToEntity <CustomJob>().ParentJob;

                if (parent != null)
                {
                    Close(service, status, parent.Value, true);
                }
            }
        }
        internal static CustomJob BuildSubJob(CustomJob parentJob, CustomJob.StatusReasonEnum status, string suffix)
        {
            var fieldExclusions =
                new[]
            {
                CustomJob.Fields.CustomJobId,
                CustomJob.Fields.Name,
                CustomJob.Fields.RecurrentJob,
                CustomJob.Fields.RunTrigger,
                CustomJob.Fields.RecurrenceUpdatedTrigger,
                CustomJob.Fields.ParentJob,
                CustomJob.Fields.DeleteOnSuccess,
                CustomJob.Fields.RetrySchedule,
                CustomJob.Fields.Status,
                CustomJob.Fields.StatusReason,
                CustomJob.Fields.LatestRunMessage,
                CustomJob.Fields.MarkForWaiting,
                CustomJob.Fields.PreviousTargetDate,
                CustomJob.Fields.ParentRecurrent
            };
            var extendingjob = new CustomJob();

            foreach (var key in parentJob.Attributes.Keys.Except(fieldExclusions))
            {
                extendingjob[key] = parentJob[key];
            }

            extendingjob.Name            = $"{parentJob.Name} | {suffix}";
            extendingjob.DeleteOnSuccess = parentJob.DeleteSubJobsOnSuccess;
            extendingjob.StatusReason    = status;
            extendingjob.ParentJob       = parentJob.Id;
            extendingjob.ParentRecurrent = parentJob.RecurrentJob;
            extendingjob.RetrySchedule   = parentJob.SubJobsRetrySchedule;
            extendingjob.MarkForWaiting  = false;

            return(extendingjob);
        }