public void ShouldSaveWhenTraineeshipApplicationOrVacancyUpdated(bool updated)
        {
            // Arrange.
            var today    = DateTime.Today;
            var tomorrow = DateTime.Today.AddDays(1);

            var traineeshipApplicationDetail = new TraineeshipApplicationDetail
            {
                EntityId = Guid.NewGuid(),
                Vacancy  = new TraineeshipSummary
                {
                    ClosingDate = tomorrow
                }
            };

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

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

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

            _mockTraineeshipApplicationWriteRepository.Verify(mock => mock
                                                              .Save(traineeshipApplicationDetail), Times.Exactly(times));
        }
示例#2
0
        public void SetUp()
        {
            _traineeshipApplicationWriteRepository = new Mock <ITraineeshipApplicationWriteRepository>();
            _candidateReadRepository  = new Mock <ICandidateReadRepository>();
            _candidateWriteRepository = new Mock <ICandidateWriteRepository>();

            _candidateId = Guid.NewGuid();

            _strategy = new SaveTraineeshipApplicationStrategy(
                _traineeshipApplicationWriteRepository.Object,
                _candidateReadRepository.Object,
                _candidateWriteRepository.Object);

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

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

            _application = new Fixture()
                           .Build <TraineeshipApplicationDetail>()
                           .With(fixture => fixture.CandidateId, _candidateId)
                           .With(fixture => fixture.DateApplied, null)
                           .With(fixture => fixture.AdditionalQuestion1Answer, AdditionalQuestion1Answer)
                           .With(fixture => fixture.AdditionalQuestion2Answer, AdditionalQuestion2Answer)
                           .With(fixture => fixture.CandidateInformation, _newCandidateInformation)
                           .With(fixture => fixture.Vacancy, new Fixture()
                                 .Build <TraineeshipSummary>()
                                 .With(fixture => fixture.Id, VacancyId)
                                 .Create())
                           .Create();
        }
        public int CreateApplication(TraineeshipApplicationDetail traineeshipApplicationDetail)
        {
            var legacyCandidateId = GetLegacyCandidateId(traineeshipApplicationDetail.CandidateId);
            var request           = CreateRequest(traineeshipApplicationDetail, legacyCandidateId);

            return(InternalCreateApplication(traineeshipApplicationDetail.CandidateId, request));
        }
示例#4
0
        public TraineeshipApplicationDetail Build()
        {
            RegistrationBuilder = new RegistrationBuilder(_emailAddress);

            TraineeshipApplicationDetail = new TraineeshipApplicationDetail
            {
                CandidateId          = _candidateId,
                CandidateInformation = new ApplicationTemplate(),
                DateApplied          = DateTime.UtcNow.AddDays(-1),
                VacancyStatus        = VacancyStatuses.Live,
                Vacancy = new TraineeshipSummary
                {
                    Id          = _vacancyId,
                    ClosingDate = _closingDate
                }
            };

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

            TraineeshipApplicationDetail.CandidateDetails = RegistrationBuilder.Build();

            repo.Save(TraineeshipApplicationDetail);

            return(TraineeshipApplicationDetail);
        }
示例#5
0
 private void NotifyCandidate(TraineeshipApplicationDetail traineeshipApplicationDetail)
 {
     _communicationService.SendMessageToCandidate(traineeshipApplicationDetail.CandidateId, MessageTypes.TraineeshipApplicationSubmitted,
                                                  new[]
     {
         new CommunicationToken(CommunicationTokens.ApplicationId, traineeshipApplicationDetail.EntityId.ToString())
     });
 }
        private void SyncToCandidatesApplicationTemplate(TraineeshipApplicationDetail traineeshipApplicationDetail)
        {
            var candidate = _candidateReadRepository.Get(traineeshipApplicationDetail.CandidateId);

            candidate.ApplicationTemplate.Qualifications = traineeshipApplicationDetail.CandidateInformation.Qualifications;
            candidate.ApplicationTemplate.WorkExperience = traineeshipApplicationDetail.CandidateInformation.WorkExperience;

            _candidateWriteRepository.Save(candidate);
        }
        public TraineeshipApplicationDetail SaveApplication(TraineeshipApplicationDetail traineeshipApplicationDetail)
        {
            traineeshipApplicationDetail.DateApplied = DateTime.Now;
            var savedApplication = _traineeshipApplicationWriteRepository.Save(traineeshipApplicationDetail);

            SyncToCandidatesApplicationTemplate(savedApplication);

            return(savedApplication);
        }
        public void SubmitTraineeshipApplication(
            Guid candidateId, int vacancyId, TraineeshipApplicationDetail traineeshipApplicationDetail)
        {
            Condition.Requires(candidateId);

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

            var traineeshipDetails = _saveTraineeshipApplicationStrategy.SaveApplication(candidateId, vacancyId, traineeshipApplicationDetail);

            _submitTraineeshipApplicationStrategy.SubmitApplication(traineeshipDetails.EntityId);
        }
示例#9
0
        public TraineeshipApplicationDetail SaveApplication(
            Guid candidateId, int vacancyId, TraineeshipApplicationDetail traineeshipApplication)
        {
            // Set date applied when saving a traineeship application. Unlike apprenticeship applications, there are no intermediate states,
            // Draft, Submitting etc.
            traineeshipApplication.DateApplied = DateTime.UtcNow;

            var savedApplication = _traineeshipApplicationWriteRepository.Save(traineeshipApplication);

            SyncToCandidatesApplicationTemplate(candidateId, savedApplication);

            return(savedApplication);
        }
        public TraineeshipApplicationDetail Save(TraineeshipApplicationDetail entity)
        {
            _logger.Debug("Calling repository to save TraineeshipApplicationDetail Id={0}", entity.EntityId);

            var mongoEntity = _mapper.Map <TraineeshipApplicationDetail, MongoTraineeshipApplicationDetail>(entity);

            UpdateEntityTimestamps(mongoEntity);

            Collection.Save(mongoEntity);

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

            return(_mapper.Map <MongoTraineeshipApplicationDetail, TraineeshipApplicationDetail>(mongoEntity));
        }
示例#11
0
        private void SyncToCandidatesApplicationTemplate(Guid candidateId, TraineeshipApplicationDetail traineeshipApplication)
        {
            var candidate = _candidateReadRepository.Get(candidateId);

            candidate.ApplicationTemplate.Qualifications  = traineeshipApplication.CandidateInformation.Qualifications;
            candidate.ApplicationTemplate.WorkExperience  = traineeshipApplication.CandidateInformation.WorkExperience;
            candidate.ApplicationTemplate.TrainingCourses = traineeshipApplication.CandidateInformation.TrainingCourses;

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

            _candidateWriteRepository.Save(candidate);
        }
        private void PublishMessage(TraineeshipApplicationDetail traineeshipApplicationDetail)
        {
            try
            {
                var message = new SubmitTraineeshipApplicationRequest
                {
                    ApplicationId = traineeshipApplicationDetail.EntityId
                };

                _messageBus.PublishMessage(message);
            }
            catch
            {
                // Compensate for failure to enqueue application submission by deleting the application.
                _traineeshipApplicationWriteRepository.Delete(traineeshipApplicationDetail.EntityId);
                throw;
            }
        }
 private static CreateApplicationRequest CreateRequest(
     TraineeshipApplicationDetail traineeshipApplicationDetail, int legacyCandidateId)
 {
     return(new CreateApplicationRequest
     {
         Application = new Application
         {
             VacancyId = traineeshipApplicationDetail.Vacancy.Id,
             VacancyRef = null, // not required if VacancyId is supplied.
             CandidateId = legacyCandidateId,
             School = MapSchool(),
             EducationResults = MapQualifications(traineeshipApplicationDetail.CandidateInformation.Qualifications),
             WorkExperiences = MapWorkExperience(traineeshipApplicationDetail.CandidateInformation.WorkExperience),
             AdditionalQuestion1Answer = traineeshipApplicationDetail.AdditionalQuestion1Answer ?? string.Empty,
             AdditionalQuestion2Answer = traineeshipApplicationDetail.AdditionalQuestion2Answer ?? string.Empty
         }
     });
 }
        public void Update(TraineeshipApplicationDetail traineeeshipApplication, ApplicationStatusSummary applicationStatusSummary)
        {
            var originalLegacyApplicationId = traineeeshipApplication.LegacyApplicationId;
            var originalStatus        = traineeeshipApplication.Status;
            var originalVacancyStatus = traineeeshipApplication.VacancyStatus;
            var originalClosingDate   = traineeeshipApplication.Vacancy.ClosingDate;

            //todo: 1.6: remove this? we won't ever receive these updates while integrating with the legacy system for traineeships
            // invoked because the status of the apprenticeshipApplication / vacancy *may* have changed
            if (traineeeshipApplication.UpdateTraineeshipApplicationDetail(applicationStatusSummary))
            {
                // note, this flow will be extended to include a call to outbound communication later (when we do notifications)
                // note, may subsequently consolidate status updates for a candidate (when we do notifications) but may be done in another component
                const string format =
                    "Updating traineeship 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}'";

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

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

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

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

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

                _traineeshipApplicationWriteRepository.Save(traineeeshipApplication);
            }
        }
        public static bool UpdateTraineeshipApplicationDetail(this TraineeshipApplicationDetail traineeshipApplication, ApplicationStatusSummary applicationStatusSummary)
        {
            var updated = false;

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

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

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

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

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

            return(updated);
        }
示例#16
0
 public void UpdateLegacyApplicationId(TraineeshipApplicationDetail applicationDetail, int legacyApplicationId)
 {
     Collection.Update(Query.EQ("EntityId", applicationDetail.EntityId), new UpdateDocument {
         { "$set", new BsonDocument("LegacyApplicationId", legacyApplicationId) }
     });
 }
        private TraineeshipApplicationViewModel ConvertToTraineeshipApplicationViewModel(TraineeshipApplicationDetail application)
        {
            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 <TraineeshipApplicationDetail, TraineeshipApplicationViewModel>(application);

            viewModel.Vacancy = _mapper.Map <Vacancy, ApplicationVacancyViewModel>(vacancy);
            viewModel.Vacancy.EmployerName = employer.FullName;

            return(viewModel);
        }