Пример #1
0
        public int CreateApplication(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
        {
            var legacyCandidateId = GetLegacyCandidateId(apprenticeshipApplicationDetail.CandidateId);
            var request           = CreateRequest(apprenticeshipApplicationDetail, legacyCandidateId);

            return(InternalCreateApplication(apprenticeshipApplicationDetail.CandidateId, request));
        }
Пример #2
0
            public void ShouldUpdateClosingDate(
                int oldClosingDateOffset,
                int newClosingDateOffset,
                bool expected)
            {
                // Arrange.
                var today = DateTime.Today;

                var detail = new ApprenticeshipApplicationDetail
                {
                    Vacancy = new ApprenticeshipSummary
                    {
                        ClosingDate = today.AddDays(oldClosingDateOffset)
                    }
                };

                var summary = new ApplicationStatusSummary
                {
                    ClosingDate = today.AddDays(newClosingDateOffset)
                };

                // Act.
                var actual = detail.UpdateApprenticeshipApplicationDetail(summary, _mockReadRepository.Object, _mockWriteRepository.Object);

                // Assert.
                actual.Should().Be(expected);
                detail.Vacancy.ClosingDate.Should().Be(summary.ClosingDate);
            }
        public ApprenticeshipApplicationDetail Build()
        {
            RegistrationBuilder = new RegistrationBuilder(_emailAddress);

            ApprenticeshipApplicationDetail = new ApprenticeshipApplicationDetail
            {
                CandidateId          = _candidateId,
                CandidateInformation = new ApplicationTemplate(),
                Status        = _applicationStatus,
                DateApplied   = _dateApplied,
                VacancyStatus = VacancyStatuses.Live,
                Vacancy       = new ApprenticeshipSummary
                {
                    Id          = _vacancyId,
                    Title       = "Vacancy " + _vacancyId,
                    ClosingDate = _expirationDate
                }
            };

            var repo = WebTestRegistry.Container.GetInstance <IApprenticeshipApplicationWriteRepository>();

            ApprenticeshipApplicationDetail.CandidateDetails = RegistrationBuilder.Build();

            repo.Save(ApprenticeshipApplicationDetail);

            return(ApprenticeshipApplicationDetail);
        }
Пример #4
0
        private ApprenticeshipApplicationDetail UnarchiveApplication(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
        {
            apprenticeshipApplicationDetail.IsArchived = false;
            _apprenticeshipApplicationWriteRepository.Save(apprenticeshipApplicationDetail);

            return(_apprenticeshipApplicationReadRepository.Get(apprenticeshipApplicationDetail.EntityId));
        }
        public void ShouldSendAlertWhenApprenticeshipApplicationOrVacancyUpdated(bool updated)
        {
            // Arrange.
            var today    = DateTime.Today;
            var tomorrow = DateTime.Today.AddDays(1);

            var apprenticeshipApplicationDetail = new ApprenticeshipApplicationDetail
            {
                EntityId = Guid.NewGuid(),
                Status   = ApplicationStatuses.Submitted,
                Vacancy  = new ApprenticeshipSummary
                {
                    ClosingDate = tomorrow
                }
            };

            var applicationStatusSummary = new ApplicationStatusSummary
            {
                ClosingDate = updated ? today : tomorrow
            };

            // Act.
            _strategy.Update(apprenticeshipApplicationDetail, applicationStatusSummary);

            // Assert.
            var times = updated ? 1 : 0;

            _mockApplicationStatusAlertStrategy.Verify(mock => mock
                                                       .Send(apprenticeshipApplicationDetail.Status, applicationStatusSummary), Times.Exactly(times));
        }
Пример #6
0
        public static bool UpdateApprenticeshipApplicationDetail(
            this ApprenticeshipApplicationDetail apprenticeshipApplication,
            ApplicationStatusSummary applicationStatusSummary,
            IApprenticeshipApplicationReadRepository apprenticeshipApplicationReadRepository,
            IApprenticeshipApplicationWriteRepository apprenticeshipApplicationWriteRepository)
        {
            var updated = false;

            if (applicationStatusSummary.IsLegacySystemUpdate())
            {
                // Only update application status etc. if update originated from Legacy system.
                if (apprenticeshipApplication.Status != applicationStatusSummary.ApplicationStatus)
                {
                    var ignoreOwnershipCheck = applicationStatusSummary.UpdateSource == ApplicationStatusSummary.Source.Raa;
                    updated = apprenticeshipApplicationWriteRepository.UpdateApplicationStatus(apprenticeshipApplication, applicationStatusSummary.ApplicationStatus, ignoreOwnershipCheck);

                    if (updated)
                    {
                        //Ensure passed in entity is up to date with any changes
                        var updatedApplication = apprenticeshipApplicationReadRepository.Get(apprenticeshipApplication.EntityId);
                        apprenticeshipApplication.Status               = updatedApplication.Status;
                        apprenticeshipApplication.IsArchived           = updatedApplication.IsArchived;
                        apprenticeshipApplication.DateUpdated          = updatedApplication.DateUpdated;
                        apprenticeshipApplication.SuccessfulDateTime   = updatedApplication.SuccessfulDateTime;
                        apprenticeshipApplication.UnsuccessfulDateTime = updatedApplication.UnsuccessfulDateTime;
                    }
                }

                if (apprenticeshipApplication.LegacyApplicationId != applicationStatusSummary.LegacyApplicationId)
                {
                    // Ensure the application is linked to the legacy application.
                    apprenticeshipApplication.LegacyApplicationId = applicationStatusSummary.LegacyApplicationId;
                    updated = true;
                }

                if (apprenticeshipApplication.UnsuccessfulReason != applicationStatusSummary.UnsuccessfulReason && apprenticeshipApplication.Status == ApplicationStatuses.Unsuccessful)
                {
                    apprenticeshipApplication.UnsuccessfulReason = applicationStatusSummary.UnsuccessfulReason;
                    updated = true;
                }
            }

            if (apprenticeshipApplication.VacancyStatus != applicationStatusSummary.VacancyStatus)
            {
                apprenticeshipApplication.VacancyStatus = applicationStatusSummary.VacancyStatus;
                updated = true;
            }

            if (apprenticeshipApplication.Vacancy.ClosingDate != applicationStatusSummary.ClosingDate)
            {
                apprenticeshipApplication.Vacancy.ClosingDate = applicationStatusSummary.ClosingDate;
                updated = true;
            }

            return(updated);
        }
        public void SaveApplication(Guid candidateId, int vacancyId, ApprenticeshipApplicationDetail apprenticeshipApplication)
        {
            Condition.Requires(apprenticeshipApplication);

            _logger.Debug(
                "Calling CandidateService to save the apprenticeship application of the user with Id={0} to the vacancy with Id={1}.",
                candidateId, vacancyId);

            _saveApplicationStrategy.SaveApplication(candidateId, vacancyId, apprenticeshipApplication);
        }
Пример #8
0
        public ApprenticeshipApplicationDetail Build()
        {
            var detail = new ApprenticeshipApplicationDetail
            {
                CandidateId = _candidateId,
                Vacancy     = new ApprenticeshipSummaryBuilder(_vacancyId).Build()
            };

            return(detail);
        }
        private void SyncToCandidatesApplicationTemplate(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
        {
            var candidate = _candidateReadRepository.Get(apprenticeshipApplicationDetail.CandidateId);

            candidate.ApplicationTemplate.AboutYou         = apprenticeshipApplicationDetail.CandidateInformation.AboutYou;
            candidate.ApplicationTemplate.EducationHistory = apprenticeshipApplicationDetail.CandidateInformation.EducationHistory;
            candidate.ApplicationTemplate.Qualifications   = apprenticeshipApplicationDetail.CandidateInformation.Qualifications;
            candidate.ApplicationTemplate.WorkExperience   = apprenticeshipApplicationDetail.CandidateInformation.WorkExperience;

            _candidateWriteRepository.Save(candidate);
        }
Пример #10
0
        public void Update(
            ApprenticeshipApplicationDetail apprenticeshipApplication,
            ApplicationStatusSummary applicationStatusSummary)
        {
            var originalLegacyApplicationId = apprenticeshipApplication.LegacyApplicationId;
            var originalStatus               = apprenticeshipApplication.Status;
            var originalVacancyStatus        = apprenticeshipApplication.VacancyStatus;
            var originalClosingDate          = apprenticeshipApplication.Vacancy.ClosingDate;
            var originalUnsuccessfulReason   = apprenticeshipApplication.UnsuccessfulReason;
            var originalUnSuccessfulDateTime = apprenticeshipApplication.UnsuccessfulDateTime;

            // invoked because the status of the apprenticeshipApplication / vacancy *may* have changed
            if (apprenticeshipApplication.UpdateApprenticeshipApplicationDetail(applicationStatusSummary, _apprenticeshipApplicationReadRepository, _apprenticeshipApplicationWriteRepository))
            {
                const string format =
                    "Updating apprenticeship application (id='{0}', vacancy id='{1}', candidate='{2})" +
                    " from legacy application id='{3}' to '{4}'," +
                    " application status='{5}' to '{6}'," +
                    " vacancy status='{7}' to '{8}'," +
                    " closing date='{9}' to '{10}'," +
                    " unsuccessful reason='{11}' to '{12}'";

                _logger.Info(
                    format,
                    apprenticeshipApplication.EntityId,                      // 0
                    apprenticeshipApplication.Vacancy.Id,                    // 1
                    apprenticeshipApplication.CandidateDetails.EmailAddress, // 2

                    originalLegacyApplicationId,                             // 3
                    applicationStatusSummary.LegacyApplicationId,            // 4

                    originalStatus,                                          // 5
                    applicationStatusSummary.ApplicationStatus,              // 6

                    originalVacancyStatus,                                   // 7
                    applicationStatusSummary.VacancyStatus,                  // 8

                    originalClosingDate,                                     // 9
                    applicationStatusSummary.ClosingDate,                    // 10

                    originalUnsuccessfulReason,                              // 11
                    applicationStatusSummary.UnsuccessfulReason,             //12

                    originalUnSuccessfulDateTime,                            //13
                    applicationStatusSummary.UnsuccessfulDateTime);          // 14

                _apprenticeshipApplicationWriteRepository.Save(apprenticeshipApplication);
                _applicationStatusAlertStrategy.Send(originalStatus, applicationStatusSummary);
            }
        }
        public ApprenticeshipApplicationDetail Save(ApprenticeshipApplicationDetail entity)
        {
            _logger.Debug("Calling repository to save ApprenticeshipApplicationDetail Id={0}, Status={1}", entity.EntityId, entity.Status);

            var mongoEntity = _mapper.Map <ApprenticeshipApplicationDetail, MongoApprenticeshipApplicationDetail>(entity);

            UpdateEntityTimestamps(mongoEntity);

            Collection.Save(mongoEntity);

            _logger.Debug("Saved ApprenticeshipApplicationDetail to repository with Id={0}", entity.EntityId);

            return(_mapper.Map <MongoApprenticeshipApplicationDetail, ApprenticeshipApplicationDetail>(mongoEntity));
        }
Пример #12
0
        private static School MapSchool(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
        {
            var educationHistory = apprenticeshipApplicationDetail.CandidateInformation.EducationHistory;

            if (educationHistory == null)
            {
                return(null);
            }

            return(new School
            {
                Name = educationHistory.Institution,
                Town = null,
                AttendedFrom = MapYearToDate(educationHistory.FromYear),
                AttendedTo = MapYearToDate(educationHistory.ToYear)
            });
        }
        public bool UpdateApplicationStatus(ApprenticeshipApplicationDetail entity, ApplicationStatuses updatedStatus, bool ignoreOwnershipCheck)
        {
            var applicationId = entity.EntityId;
            var now           = _dataTimeService.UtcNow;

            _logger.Info("Calling repository to try to update apprenticeship application status={1} for application with Id={0}", applicationId, updatedStatus);

            var idMatchQuery = Query <MongoApprenticeshipApplicationDetail> .EQ(e => e.Id, applicationId);

            //Only update if not owned by RAA (using the setting of DateLastViewed as a proxy for that ownership) or if ownership should be ignored
            //http://stackoverflow.com/questions/4057196/how-do-you-query-this-in-mongo-is-not-null
            var isNotOwnedByRaaQuery = Query <MongoApprenticeshipApplicationDetail> .EQ(e => e.DateLastViewed, null);

            var query = ignoreOwnershipCheck
                ? idMatchQuery
                : new QueryBuilder <MongoApprenticeshipApplicationDetail>().And(idMatchQuery, isNotOwnedByRaaQuery);

            var update = Update <MongoApprenticeshipApplicationDetail>
                         .Set(e => e.Status, updatedStatus)
                         .Set(e => e.IsArchived, false) // Application status has changed, ensure it appears on the candidate's dashboard.
                         .Set(e => e.DateUpdated, now);

            switch (updatedStatus)
            {
            case ApplicationStatuses.Successful:
                update = update.Set(e => e.SuccessfulDateTime, now);
                break;

            case ApplicationStatuses.Unsuccessful:
                update = update.Set(e => e.UnsuccessfulDateTime, now);
                break;
            }

            var result = Collection.Update(query, update);

            if (result.Ok)
            {
                _logger.Info("Called repository to update apprenticeship application status={1} for application with Id={0} successfully with code={2}. Documents affected={3}", applicationId, updatedStatus, result.Code, result.DocumentsAffected);
                return(result.DocumentsAffected == 1);
            }

            var message = $"Call to repository to update apprenticeship application status={updatedStatus} for application with Id={applicationId} failed! Exit code={result.Code}, error message={result.ErrorMessage}";

            _logger.Error(message);
            throw new Exception(message);
        }
        private void PublishMessage(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
        {
            try
            {
                var message = new SubmitApprenticeshipApplicationRequest
                {
                    ApplicationId = apprenticeshipApplicationDetail.EntityId
                };

                _messageBus.PublishMessage(message);
            }
            catch
            {
                apprenticeshipApplicationDetail.RevertStateToDraft();
                _apprenticeshipApplicationWriteRepository.Save(apprenticeshipApplicationDetail);
                throw;
            }
        }
        private void SyncToCandidateApplicationTemplate(Guid candidateId, ApprenticeshipApplicationDetail apprenticeshipApplication)
        {
            var candidate = _candidateReadRepository.Get(candidateId);

            candidate.ApplicationTemplate.AboutYou         = apprenticeshipApplication.CandidateInformation.AboutYou;
            candidate.ApplicationTemplate.EducationHistory = apprenticeshipApplication.CandidateInformation.EducationHistory;
            candidate.ApplicationTemplate.Qualifications   = apprenticeshipApplication.CandidateInformation.Qualifications;
            candidate.ApplicationTemplate.WorkExperience   = apprenticeshipApplication.CandidateInformation.WorkExperience;
            candidate.ApplicationTemplate.TrainingCourses  = apprenticeshipApplication.CandidateInformation.TrainingCourses;

            if (!candidate.MonitoringInformation.DisabilityStatus.HasValue &&
                apprenticeshipApplication.CandidateInformation.DisabilityStatus.HasValue)
            {
                candidate.MonitoringInformation.DisabilityStatus = apprenticeshipApplication.CandidateInformation.DisabilityStatus;
            }

            _candidateWriteRepository.Save(candidate);
        }
        internal static bool UpdateApprenticeshipApplicationDetail(this ApprenticeshipApplicationDetail apprenticeshipApplication, ApplicationStatusSummary applicationStatusSummary)
        {
            var updated = false;

            if (applicationStatusSummary.IsLegacySystemUpdate())
            {
                // Only update application status etc. if update originated from Legacy system.
                if (apprenticeshipApplication.Status != applicationStatusSummary.ApplicationStatus)
                {
                    apprenticeshipApplication.Status = applicationStatusSummary.ApplicationStatus;

                    // Application status has changed, ensure it appears on the candidate's dashboard.
                    apprenticeshipApplication.IsArchived = false;
                    updated = true;
                }

                if (apprenticeshipApplication.LegacyApplicationId != applicationStatusSummary.LegacyApplicationId)
                {
                    // Ensure the application is linked to the legacy application.
                    apprenticeshipApplication.LegacyApplicationId = applicationStatusSummary.LegacyApplicationId;
                    updated = true;
                }

                if (apprenticeshipApplication.UnsuccessfulReason != applicationStatusSummary.UnsuccessfulReason)
                {
                    apprenticeshipApplication.UnsuccessfulReason = applicationStatusSummary.UnsuccessfulReason;
                    updated = true;
                }
            }

            if (apprenticeshipApplication.VacancyStatus != applicationStatusSummary.VacancyStatus)
            {
                apprenticeshipApplication.VacancyStatus = applicationStatusSummary.VacancyStatus;
                updated = true;
            }

            if (apprenticeshipApplication.Vacancy.ClosingDate != applicationStatusSummary.ClosingDate)
            {
                apprenticeshipApplication.Vacancy.ClosingDate = applicationStatusSummary.ClosingDate;
                updated = true;
            }

            return(updated);
        }
Пример #17
0
            public void ShouldUpdateApplicationStatus(
                ApplicationStatuses oldStatus,
                ApplicationStatuses newStatus,
                ApplicationStatusSummary.Source source,
                bool expected)
            {
                // Arrange.
                var detail = new ApprenticeshipApplicationDetail
                {
                    Status     = oldStatus,
                    IsArchived = true
                };

                var summary = new ApplicationStatusSummary
                {
                    ApplicationId     = Guid.Empty,
                    ApplicationStatus = newStatus
                };

                var ignoreOwnershipCheck = summary.UpdateSource == ApplicationStatusSummary.Source.Raa;

                _mockReadRepository.Setup(mock => mock.Get(detail.EntityId)).Returns(new ApprenticeshipApplicationDetail {
                    Status = newStatus
                });

                _mockWriteRepository.Setup(mock => mock
                                           .UpdateApplicationStatus(detail, newStatus, ignoreOwnershipCheck))
                .Returns(expected);

                // Act.
                var actual = detail.UpdateApprenticeshipApplicationDetail(summary, _mockReadRepository.Object, _mockWriteRepository.Object);

                // Assert.
                actual.Should().Be(expected);
                detail.IsArchived.Should().Be(!expected);
                detail.Status.Should().Be(summary.ApplicationStatus);

                _mockWriteRepository.Verify(mock => mock
                                            .UpdateApplicationStatus(detail, newStatus, ignoreOwnershipCheck),
                                            Times.Exactly(expected ? 1 : 0));
            }
Пример #18
0
        public void SetUp()
        {
            _apprenticeshipApplicationReadRepository  = new Mock <IApprenticeshipApplicationReadRepository>();
            _apprenticeshipApplicationWriteRepository = new Mock <IApprenticeshipApplicationWriteRepository>();
            _candidateReadRepository  = new Mock <ICandidateReadRepository>();
            _candidateWriteRepository = new Mock <ICandidateWriteRepository>();

            _candidateId = Guid.NewGuid();

            _strategy = new SaveApprenticeshipApplicationStrategy(
                _apprenticeshipApplicationReadRepository.Object,
                _apprenticeshipApplicationWriteRepository.Object,
                _candidateReadRepository.Object,
                _candidateWriteRepository.Object);

            _oldApplication = new Fixture()
                              .Build <ApprenticeshipApplicationDetail>()
                              .With(fixture => fixture.CandidateId, _candidateId)
                              .With(fixture => fixture.Status, ApplicationStatuses.Draft)
                              .Create();

            _newCandidateInformation = new Fixture()
                                       .Build <ApplicationTemplate>()
                                       .Create();

            _candidate = new Fixture()
                         .Build <Candidate>()
                         .Create();

            _newApplication = new Fixture()
                              .Build <ApprenticeshipApplicationDetail>()
                              .With(fixture => fixture.CandidateId, _candidateId)
                              .With(fixture => fixture.AdditionalQuestion1Answer, AdditionalQuestion1Answer)
                              .With(fixture => fixture.AdditionalQuestion2Answer, AdditionalQuestion2Answer)
                              .With(fixture => fixture.CandidateInformation, _newCandidateInformation)
                              .With(fixture => fixture.Vacancy, new Fixture()
                                    .Build <ApprenticeshipSummary>()
                                    .With(fixture => fixture.Id, VacancyId)
                                    .Create())
                              .Create();
        }
Пример #19
0
            public void ShouldUpdateLegacyApplicationId(int oldId, int newId, bool expected)
            {
                // Arrange.
                var detail = new ApprenticeshipApplicationDetail
                {
                    LegacyApplicationId = oldId
                };

                var summary = new ApplicationStatusSummary
                {
                    ApplicationId       = Guid.Empty,
                    LegacyApplicationId = newId
                };

                // Act.
                var actual = detail.UpdateApprenticeshipApplicationDetail(summary, _mockReadRepository.Object, _mockWriteRepository.Object);

                // Assert.
                actual.Should().Be(expected);
                detail.LegacyApplicationId.Should().Be(summary.LegacyApplicationId);
            }
Пример #20
0
 private static CreateApplicationRequest CreateRequest(
     ApprenticeshipApplicationDetail apprenticeshipApplicationDetail, int legacyCandidateId)
 {
     return(new CreateApplicationRequest
     {
         Application = new Application
         {
             VacancyId = apprenticeshipApplicationDetail.Vacancy.Id,
             VacancyRef = null, // not required if VacancyId is supplied.
             CandidateId = legacyCandidateId,
             School = MapSchool(apprenticeshipApplicationDetail),
             EducationResults = MapQualifications(apprenticeshipApplicationDetail.CandidateInformation.Qualifications),
             WorkExperiences = MapWorkExperience(apprenticeshipApplicationDetail.CandidateInformation.WorkExperience),
             AdditionalQuestion1Answer = apprenticeshipApplicationDetail.AdditionalQuestion1Answer ?? string.Empty,
             AdditionalQuestion2Answer = apprenticeshipApplicationDetail.AdditionalQuestion2Answer ?? string.Empty,
             Strengths = apprenticeshipApplicationDetail.CandidateInformation.AboutYou.Strengths ?? string.Empty,
             Improvements = apprenticeshipApplicationDetail.CandidateInformation.AboutYou.Improvements ?? string.Empty,
             HobbiesAndInterests = apprenticeshipApplicationDetail.CandidateInformation.AboutYou.HobbiesAndInterests ?? string.Empty,
             InterviewSupport = apprenticeshipApplicationDetail.CandidateInformation.AboutYou.Support ?? string.Empty
         }
     });
 }
Пример #21
0
            public void ShouldUpdateVacancyStatus(
                VacancyStatuses oldStatus,
                VacancyStatuses newStatus,
                bool expected)
            {
                // Arrange.
                var detail = new ApprenticeshipApplicationDetail
                {
                    VacancyStatus = oldStatus
                };

                var summary = new ApplicationStatusSummary
                {
                    VacancyStatus = newStatus
                };

                // Act.
                var actual = detail.UpdateApprenticeshipApplicationDetail(summary, _mockReadRepository.Object, _mockWriteRepository.Object);

                // Assert.
                actual.Should().Be(expected);
                detail.VacancyStatus.Should().Be(summary.VacancyStatus);
            }
Пример #22
0
            public void ShouldUpdateUnsuccessfulReason(string oldReason, string newReason, bool expected)
            {
                // Arrange.
                var detail = new ApprenticeshipApplicationDetail
                {
                    Status             = ApplicationStatuses.Unsuccessful,
                    UnsuccessfulReason = oldReason
                };

                var summary = new ApplicationStatusSummary
                {
                    ApplicationId      = Guid.Empty,
                    ApplicationStatus  = ApplicationStatuses.Unsuccessful,
                    UnsuccessfulReason = newReason
                };

                // Act.
                var actual = detail.UpdateApprenticeshipApplicationDetail(summary, _mockReadRepository.Object, _mockWriteRepository.Object);

                // Assert.
                actual.Should().Be(expected);
                detail.UnsuccessfulReason.Should().Be(summary.UnsuccessfulReason);
            }
 public void UpdateLegacyApplicationId(ApprenticeshipApplicationDetail applicationDetail, int legacyApplicationId)
 {
     Collection.Update(Query.EQ("EntityId", applicationDetail.EntityId), new UpdateDocument {
         { "$set", new BsonDocument("LegacyApplicationId", legacyApplicationId) }
     });
 }
 public void UpdateApplicationStatus(ApprenticeshipApplicationDetail applicationDetail, ApplicationStatuses newApplicationStatus)
 {
     Collection.Update(Query.EQ("EntityId", applicationDetail.EntityId), new UpdateDocument {
         { "$set", new BsonDocument("Status", newApplicationStatus) }
     });
 }
        private ApprenticeshipApplicationViewModel ConvertToApprenticeshipApplicationViewModel(ApprenticeshipApplicationDetail application, VacancyViewModel vacancyDetail)
        {
            var webSettings = _configurationService.Get <CommonWebConfiguration>();
            var domainUrl   = webSettings.SiteDomainName;
            var vacancy     = _vacancyPostingService.GetVacancy(application.Vacancy.Id);
            var vacancyOwnerRelationship = _providerService.GetVacancyOwnerRelationship(vacancy.VacancyOwnerRelationshipId, false);  // Closed vacancies can certainly have non-current vacancy parties
            var employer  = _employerService.GetEmployer(vacancyOwnerRelationship.EmployerId, false);
            var viewModel = _mapper.Map <ApprenticeshipApplicationDetail, ApprenticeshipApplicationViewModel>(application);

            viewModel.Vacancy = _mapper.Map <Vacancy, ApplicationVacancyViewModel>(vacancy);
            viewModel.Vacancy.EmployerName = employer.FullName;
            viewModel.NextStepsUrl         = string.Format($"https://{domainUrl}/nextsteps");
            viewModel.UnSuccessfulReason   = application.UnsuccessfulReason;
            viewModel.UnsuccessfulDateTime = application.UnsuccessfulDateTime;
            viewModel.ProviderName         = vacancyDetail.Provider.TradingName;
            viewModel.Contact = vacancyDetail.Contact;

            return(viewModel);
        }
        public void ShouldSetSuccessfulOutcome(ApplicationStatuses applicationStatus)
        {
            // Arrange.
            var       applicationId           = Guid.NewGuid();
            const int nextLegacyApplicationId = 2;
            string    feedback = "Does not have permission to work in the UK";

            var apprenticeshipApplicationDetail = new ApprenticeshipApplicationDetail
            {
                VacancyStatus = VacancyStatuses.Live,
                Vacancy       = new ApprenticeshipSummary
                {
                    ClosingDate = DateTime.Today.AddDays(90)
                }
            };

            _mockApprenticeshipApplicationReadRepository.Setup(mock =>
                                                               mock.Get(applicationId)).Returns(apprenticeshipApplicationDetail);

            var actualApplicationStatusSummary = default(ApplicationStatusSummary);

            _mockReferenceNumberRepository.Setup(mock =>
                                                 mock.GetNextLegacyApplicationId())
            .Returns(nextLegacyApplicationId);

            _mockApplicationStatusUpdateStrategy.Setup(mock =>
                                                       mock.Update(apprenticeshipApplicationDetail, It.IsAny <ApplicationStatusSummary>()))
            .Callback <ApprenticeshipApplicationDetail, ApplicationStatusSummary>(
                (aad, ass) =>
            {
                actualApplicationStatusSummary = ass;
            });

            // Act.
            switch (applicationStatus)
            {
            case ApplicationStatuses.Successful:
                _apprenticeshipApplicationService.SetSuccessfulDecision(applicationId);
                break;

            case ApplicationStatuses.Unsuccessful:
                _apprenticeshipApplicationService.SetUnsuccessfulDecision(applicationId, feedback);
                break;
            }

            // Assert.
            _mockApplicationStatusUpdateStrategy.Verify(mock => mock.Update(apprenticeshipApplicationDetail, It.IsAny <ApplicationStatusSummary>()), Times.Once);

            actualApplicationStatusSummary.Should().NotBeNull();

            if (applicationStatus == ApplicationStatuses.Unsuccessful)
            {
                actualApplicationStatusSummary.ShouldBeEquivalentTo(new ApplicationStatusSummary
                {
                    ApplicationId       = Guid.Empty,
                    ApplicationStatus   = applicationStatus,
                    LegacyApplicationId = nextLegacyApplicationId,
                    LegacyCandidateId   = 0,
                    LegacyVacancyId     = 0,
                    VacancyStatus       = apprenticeshipApplicationDetail.VacancyStatus,
                    ClosingDate         = apprenticeshipApplicationDetail.Vacancy.ClosingDate,
                    UpdateSource        = ApplicationStatusSummary.Source.Raa,
                    UnsuccessfulReason  = feedback
                });
            }
            else
            {
                actualApplicationStatusSummary.ShouldBeEquivalentTo(new ApplicationStatusSummary
                {
                    ApplicationId       = Guid.Empty,
                    ApplicationStatus   = applicationStatus,
                    LegacyApplicationId = nextLegacyApplicationId,
                    LegacyCandidateId   = 0,
                    LegacyVacancyId     = 0,
                    VacancyStatus       = apprenticeshipApplicationDetail.VacancyStatus,
                    ClosingDate         = apprenticeshipApplicationDetail.Vacancy.ClosingDate,
                    UpdateSource        = ApplicationStatusSummary.Source.Raa
                });
            }
        }
        private void HandleCustomException(SubmitApprenticeshipApplicationRequest request, CustomException ex, ApprenticeshipApplicationDetail apprenticeshipApplication)
        {
            switch (ex.Code)
            {
            case ApplicationsErrorCodes.ApplicationDuplicatedError:
                _logger.Info("Apprenticeship application has already been submitted to legacy system: Application Id: \"{0}\"", request.ApplicationId);
                SetApplicationStateSubmitted(apprenticeshipApplication);
                break;

            case CandidatesErrorCodes.CandidateStateError:
                _logger.Error("Legacy candidate is in an invalid state. Apprenticeship application cannot be processed: Application Id: \"{0}\"", request.ApplicationId);
                break;

            case CandidatesErrorCodes.CandidateNotFoundError:
                _logger.Error("Legacy candidate was not found. Apprenticeship application cannot be processed: Application Id: \"{0}\"", request.ApplicationId);
                break;

            case VacanciesErrorCodes.LegacyVacancyStateError:
                _logger.Info("Legacy vacancy was in an invalid state. Apprenticeship application cannot be processed: Application Id: \"{0}\"", request.ApplicationId);
                SetStateExpiredOrWithdrawn(apprenticeshipApplication);
                break;

            case CommonErrorCodes.EntityStateError:
                _logger.Error(string.Format("Apprenticeship application is in an invalid state: Application Id: \"{0}\"", request.ApplicationId), ex);
                break;

            default:
                _logger.Warn(string.Format("Submit apprenticeship application with Id = {0} request async process failed.", request.ApplicationId), ex);
                Requeue(request);
                break;
            }
        }
 private static void EnsureApplicationCanBeCreated(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail)
 {
     apprenticeshipApplicationDetail.AssertState("Create apprenticeship application", ApplicationStatuses.Submitting);
 }
 private void SetStateExpiredOrWithdrawn(ApprenticeshipApplicationDetail apprenticeshipApplication)
 {
     apprenticeshipApplication.SetStateExpiredOrWithdrawn();
     _apprenticeshipApplicationWriteRepository.Save(apprenticeshipApplication);
 }
 private void SetApplicationStateSubmitted(ApprenticeshipApplicationDetail apprenticeshipApplication)
 {
     apprenticeshipApplication.SetStateSubmitted();
     _apprenticeshipApplicationWriteRepository.Save(apprenticeshipApplication);
 }