public override async Task <(bool IsComplete, JobStatus?OverriddenJobStatus, DateTimeOffset?completionTime)> PerformAdditionalJobChecks(JobModel job, CancellationToken cancellationToken)
        {
            var outstandingJobs = await context.GetOutstandingOrTimedOutJobs(job, cancellationToken);

            var timeoutsPresent = outstandingJobs.Where(x =>
                                                        (x.JobStatus == JobStatus.TimedOut ||
                                                         x.JobStatus == JobStatus.DcTasksFailed) &&
                                                        x.EndTime > job.StartTime).ToList();

            if (timeoutsPresent.Any()) //fail fast
            {
                Logger.LogWarning($"{timeoutsPresent.Count} File Processing jobs {string.Join(" ,", timeoutsPresent.Select(j => j.DcJobId))} with TimedOut or DcTasksFailed and job EndTime after Period-End-Start Job Present. " +
                                  $"now updating job status to CompletedWithErrors, Period End Start JobId {job.DcJobId}");

                return(true, JobStatus.CompletedWithErrors, outstandingJobs.Max(x => x.EndTime));
            }

            var processingJobsPresent = outstandingJobs.Where(x => x.JobStatus == JobStatus.InProgress || x.DcJobSucceeded == null).ToList();

            if (processingJobsPresent.Any())
            {
                SendTelemetry(job, processingJobsPresent);

                var completionTimesForInProgressJobs = await context.GetAverageJobCompletionTimesForInProgressJobs(processingJobsPresent.Select(p => p.Ukprn).ToList(), cancellationToken);

                await CheckAndUpdateProcessingJobsIfRunningLongerThenAverageTime(processingJobsPresent, completionTimesForInProgressJobs, job.DcJobId, cancellationToken);

                return(false, null, null);
            }

            var jobsWithoutSubmissionSummariesPresent = context.DoSubmissionSummariesExistForJobs(outstandingJobs);

            if (jobsWithoutSubmissionSummariesPresent.Any())
            {
                Logger.LogDebug($"{jobsWithoutSubmissionSummariesPresent.Count} File Processing jobs without Submission Summaries Present during Period End Start job, Period End Start JobId {job.DcJobId}");

                SendTelemetry(job, null, jobsWithoutSubmissionSummariesPresent);

                return(false, null, null);
            }

            Logger.LogDebug($"No Outstanding Jobs or jobs Without Submission Summaries during Period End Start job, Now updating Period End Start job status to Completed, Period End Start JobId {job.DcJobId}");

            return(true, null, DateTimeOffset.UtcNow);
        }
        protected override async Task <(bool IsComplete, JobStatus?OverriddenJobStatus, DateTimeOffset?completionTime)> PerformAdditionalJobChecks(JobModel job, CancellationToken cancellationToken)
        {
            var outstandingJobs =
                await context.GetOutstandingOrTimedOutJobs(job.DcJobId, job.StartTime, cancellationToken);

            var timeoutsPresent = outstandingJobs.Any(x =>
                                                      (x.JobStatus == JobStatus.TimedOut ||
                                                       x.JobStatus == JobStatus.DcTasksFailed) &&
                                                      x.EndTime > job.StartTime);

            if (timeoutsPresent) //fail fast
            {
                return(true, JobStatus.CompletedWithErrors, outstandingJobs.Max(x => x.EndTime));
            }

            var processingJobsPresent = outstandingJobs.Any(x => x.JobStatus == JobStatus.InProgress || x.DcJobSucceeded == null);

            if (processingJobsPresent)
            {
                return(false, (JobStatus?)null, (DateTimeOffset?)null);
            }

            return(true, (JobStatus?)null, outstandingJobs.Max(x => x.EndTime));
        }