public void Run()
        {
            var sb = new StringBuilder("The following actions were taken to resolve issues with traineeship applications:");

            sb.AppendLine();

            var applicationsToCheck = _applicationDiagnosticsRepository.GetSubmittedApplicationsWithUnsetLegacyId().ToList();

            foreach (var application in applicationsToCheck)
            {
                var applicationStatusSummaries = _legacyApplicationStatusesProvider.GetCandidateApplicationStatuses(application.Candidate);
                var applicationDetail          = application.TraineeshipApplicationDetail;
                var applicationStatusSummary   = applicationStatusSummaries.SingleOrDefault(s => s.LegacyVacancyId == applicationDetail.Vacancy.Id);
                if (applicationStatusSummary == null)
                {
                    var message = new SubmitTraineeshipApplicationRequest
                    {
                        ApplicationId = applicationDetail.EntityId
                    };

                    _messageBus.PublishMessage(message);

                    _logger.Warn("Could not patch traineeship application id: {0} with legacy id as no matching application status summary was found. Re-queued instead", applicationDetail.EntityId);
                }
                else
                {
                    _applicationDiagnosticsRepository.UpdateLegacyApplicationId(applicationDetail, applicationStatusSummary.LegacyApplicationId);
                    _logger.Info("Patching traineeship application id: {0} with legacy id: {1}", applicationDetail.EntityId, applicationStatusSummary.LegacyApplicationId);
                }
            }
        }
        public IList <ApprenticeshipApplicationSummary> GetApplications(Guid candidateId)
        {
            try
            {
                // try to get the latest status of apps for the specified candidate from legacy
                var candidate = _candidateReadRepository.Get(candidateId);

                if (candidate.LegacyCandidateId != 0)
                {
                    //Verify candidate exists in legacy system otherwise this call will throw and exception and log an error
                    var submittedApplicationStatuses =
                        _legacyApplicationStatusesProvider.GetCandidateApplicationStatuses(candidate);

                    _applicationStatusUpdater.Update(candidate, submittedApplicationStatuses);
                }
            }
            catch (Exception ex)
            {
                // if fails just return apps with their current status
                var message = string.Format("Failed to update candidate's application statuses from legacy. CandidateId: {0}", candidateId);
                _logger.Error(message, ex);
            }

            return(_apprenticeshipApplicationReadRepository.GetForCandidate(candidateId));
        }
        public void ShouldNotGetAnyApplicationStatusesForCandidateWithNoSubmittedApplications()
        {
            // Arrange.
            var candidate = CreateCandidate();

            _candidateReadRepositoryMock.ResetCalls();
            _candidateReadRepositoryMock.Setup(cr => cr.Get(It.IsAny <Guid>())).Returns(candidate);

            // Act.
            var result = _legacyApplicationStatusesProvider
                         .GetCandidateApplicationStatuses(candidate)
                         .ToList();

            // Assert.
            result.Should().NotBeNull();
            result.Count().Should().Be(0);
        }