public async Task <Unit> Handle(CreateApplicationReviewCommand message, CancellationToken cancellationToken)
        {
            _logger.LogInformation("Submitting application for vacancyId: {vacancyReference} for candidateId: {candidateId}", message.Application.VacancyReference, message.Application.CandidateId);

            var vacancy = await _vacancyRepository.GetVacancyAsync(message.Application.VacancyReference);

            var existingReview = await _applicationReviewRepository.GetAsync(vacancy.VacancyReference.Value, message.Application.CandidateId);

            if (existingReview != null)
            {
                _logger.LogWarning("Application review already exists for vacancyReference:{vacancyReference} and candidateId:{candidateId}. Found applicationReviewId:{applicationReviewId}",
                                   vacancy.VacancyReference.Value, message.Application.CandidateId, existingReview.Id);
                return(Unit.Value);
            }

            var review = new ApplicationReview
            {
                Id = Guid.NewGuid(),
                VacancyReference = vacancy.VacancyReference.Value,
                Application      = message.Application,
                CandidateId      = message.Application.CandidateId,
                CreatedDate      = _timeProvider.Now,
                Status           = ApplicationReviewStatus.New,
                SubmittedDate    = message.Application.ApplicationDate
            };

            await _applicationReviewRepository.CreateAsync(review);

            await _messaging.PublishEvent(new ApplicationReviewCreatedEvent
            {
                VacancyReference = vacancy.VacancyReference.Value
            });

            return(Unit.Value);
        }
Exemple #2
0
        public async Task <IActionResult> OnGetAsync(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            LoanApplication = await Context.LoanApplications.FirstOrDefaultAsync(m => m.Id == id);

            if (LoanApplication == null)
            {
                return(NotFound());
            }

            var isAuthorized = await AuthorizationService.AuthorizeAsync(User, LoanApplication, LoanOperations.Review);

            if (!isAuthorized.Succeeded)
            {
                return(Forbid());
            }

            ApplicationReview = await Context.ApplicationReviews.FirstOrDefaultAsync(m => m.Application.Id == id);

            if (ApplicationReview == null)
            {
                ApplicationReview = new ApplicationReview
                {
                    ApplicationId = LoanApplication.Id
                };
            }

            return(Page());
        }
        public Task CreateAsync(ApplicationReview review)
        {
            var collection = GetCollection <ApplicationReview>();

            return(RetryPolicy.Execute(_ =>
                                       collection.InsertOneAsync(review),
                                       new Context(nameof(CreateAsync))));
        }
        private void Validate(ApplicationReview applicationReview)
        {
            var validationResult = _applicationReviewValidator.Validate(applicationReview);

            if (!validationResult.IsValid)
            {
                throw new ValidationException(validationResult.Errors);
            }
        }
        public Task UpdateAsync(ApplicationReview applicationReview)
        {
            var filter = Builders <ApplicationReview> .Filter.Eq(r => r.Id, applicationReview.Id);

            var collection = GetCollection <ApplicationReview>();

            return(RetryPolicy.Execute(_ =>
                                       collection.ReplaceOneAsync(filter, applicationReview),
                                       new Context(nameof(UpdateAsync))));
        }
Exemple #6
0
        public async Task OnPostApprovalAsync_ReturnsARedirectToPageResult_WhenModelStateIsValid()
        {
            // Arrange
            var authorizationService = new Mock <IAuthorizationService>();

            authorizationService.Setup(x => x.AuthorizeAsync(It.IsAny <ClaimsPrincipal>(), It.IsAny <object>(), It.IsAny <IEnumerable <IAuthorizationRequirement> >()))
            .ReturnsAsync(AuthorizationResult.Success());

            var store = new Mock <IUserStore <IdentityUser> >();
            var mgr   = new Mock <UserManager <IdentityUser> >(store.Object, null, null, null, null, null, null, null, null);

            var httpContext           = new DefaultHttpContext();
            var modelState            = new ModelStateDictionary();
            var actionContext         = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
            var modelMetadataProvider = new EmptyModelMetadataProvider();
            var viewData    = new ViewDataDictionary(modelMetadataProvider, modelState);
            var tempData    = new TempDataDictionary(httpContext, Mock.Of <ITempDataProvider>());
            var pageContext = new PageContext(actionContext)
            {
                ViewData = viewData
            };
            var loanId          = 1;
            var loanApplication = await AppDbContext.LoanApplications.AsNoTracking().FirstOrDefaultAsync(m => m.Id == loanId);

            var applicationReview = await AppDbContext.ApplicationReviews.FirstOrDefaultAsync(m => m.Application.Id == loanId);

            if (applicationReview == null)
            {
                applicationReview = new ApplicationReview
                {
                    ApplicationId = loanId
                };
            }
            var pageModel = new ReviewModel(AppDbContext, authorizationService.Object, mgr.Object)
            {
                PageContext       = pageContext,
                TempData          = tempData,
                Url               = new UrlHelper(actionContext),
                LoanApplication   = loanApplication,
                ApplicationReview = applicationReview
            };
            // Act
            // A new ModelStateDictionary is valid by default.
            var result = await pageModel.OnPostApprovalAsync();

            var approvalApplication = await AppDbContext.LoanApplications.FirstOrDefaultAsync(m => m.Id == loanId);

            // Assert
            Assert.IsType <RedirectToPageResult>(result);
            Assert.Equal(LoanStatus.AwaitingManagersApproval, approvalApplication.Status);
        }
Exemple #7
0
 public static ApplicationReviewViewModel ToViewModel(this ApplicationReview r)
 {
     return(new ApplicationReviewViewModel
     {
         Email = r.Application.Email,
         Name = r.Application.FullName,
         TrainingCourses = r.Application.TrainingCourses?.Select(c => new TrainingCoursesViewModel
         {
             Title = c.Title,
             FromDate = c.FromDate,
             Provider = c.Provider,
             ToDate = c.ToDate
         }).ToList() ?? new List <TrainingCoursesViewModel>(),
         Postcode = r.Application.Postcode,
         AddressLine1 = r.Application.AddressLine1,
         AddressLine2 = r.Application.AddressLine2,
         AddressLine3 = r.Application.AddressLine3,
         AddressLine4 = r.Application.AddressLine4,
         CandidateFeedback = r.CandidateFeedback,
         DisabilityStatus = r.Application.DisabilityStatus ?? ApplicationReviewDisabilityStatus.Unknown,
         EducationFromYear = r.Application.EducationFromYear,
         EducationInstitution = r.Application.EducationInstitution,
         EducationToYear = r.Application.EducationToYear,
         FriendlyId = r.GetFriendlyId(),
         HobbiesAndInterests = r.Application.HobbiesAndInterests,
         Improvements = r.Application.Improvements,
         Phone = r.Application.Phone,
         Qualifications = r.Application.Qualifications?.Select(q =>
                                                               new QualificationViewModel
         {
             Grade = q.Grade,
             IsPredicted = q.IsPredicted,
             QualificationType = q.QualificationType,
             Subject = q.Subject,
             Year = q.Year
         }).ToList() ?? new List <QualificationViewModel>(),
         Skills = r.Application.Skills ?? new List <string>(),
         Status = r.Status,
         Strengths = r.Application.Strengths,
         Support = r.Application.Support,
         WorkExperiences = r.Application.WorkExperiences?.Select(w => new WorkExperienceViewModel
         {
             FromDate = w.FromDate,
             ToDate = w.ToDate,
             Employer = w.Employer,
             Description = w.Description,
             JobTitle = w.JobTitle
         }).ToList() ?? new List <WorkExperienceViewModel>()
     });
 }
Exemple #8
0
        private VacancyApplication MapToVacancyApplication(ApplicationReview review)
        {
            var projection = new VacancyApplication
            {
                Status              = review.Status,
                SubmittedDate       = review.SubmittedDate,
                ApplicationReviewId = review.Id,
                IsWithdrawn         = review.IsWithdrawn,
                CandidateName       = null,
                DisabilityStatus    = ApplicationReviewDisabilityStatus.Unknown
            };

            if (review.IsWithdrawn == false)
            {
                projection.CandidateName    = review.Application.FullName;
                projection.DisabilityStatus = review.Application.DisabilityStatus ?? ApplicationReviewDisabilityStatus.Unknown;
            }

            return(projection);
        }
        private VacancyApplication MapToVacancyApplication(ApplicationReview review)
        {
            var projection = new VacancyApplication
            {
                CandidateId         = review.CandidateId,
                Status              = review.Status,
                SubmittedDate       = review.SubmittedDate,
                ApplicationReviewId = review.Id,
                IsWithdrawn         = review.IsWithdrawn,
                DisabilityStatus    = ApplicationReviewDisabilityStatus.Unknown
            };

            if (review.IsWithdrawn == false)
            {
                projection.FirstName        = review.Application.FirstName;
                projection.LastName         = review.Application.LastName;
                projection.DateOfBirth      = review.Application.BirthDate;
                projection.DisabilityStatus = review.Application.DisabilityStatus ?? ApplicationReviewDisabilityStatus.Unknown;
            }

            return(projection);
        }
 public static string GetFriendlyId(this ApplicationReview applicationReview)
 {
     return(GetFriendlyId(applicationReview.Id));
 }
Exemple #11
0
        public async Task OnPostApproveAsync_ReturnsARedirectToPageResult_WhenModelStateIsValid()
        {
            // Arrange
            var authorizationService = new Mock <IAuthorizationService>();

            authorizationService.Setup(x => x.AuthorizeAsync(It.IsAny <ClaimsPrincipal>(), It.IsAny <object>(), It.IsAny <IEnumerable <IAuthorizationRequirement> >()))
            .ReturnsAsync(AuthorizationResult.Success());

            var store       = new Mock <IUserStore <IdentityUser> >();
            var userManager = new Mock <UserManager <IdentityUser> >(store.Object, null, null, null, null, null, null, null, null);

            //Create test user
            var displayName   = "User name";
            var identity      = new GenericIdentity(displayName);
            var principleMock = new Mock <ClaimsPrincipal>(identity);

            principleMock.Setup(x => x.IsInRole(Constants.LoanManagersRole)).Returns(true);

            userManager.Setup(x => x.GetUserId(principleMock.Object)).Returns("test.user");
            // use default context with user
            var httpContext = new DefaultHttpContext()
            {
                User = principleMock.Object
            };
            //need these as well for the page context
            var modelState            = new ModelStateDictionary();
            var actionContext         = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
            var modelMetadataProvider = new EmptyModelMetadataProvider();
            var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
            // need page context for the page model
            var pageContext = new PageContext(actionContext)
            {
                ViewData = viewData
            };
            var loanId          = 1;
            var loanApplication = await AppDbContext.LoanApplications.AsNoTracking().FirstOrDefaultAsync(m => m.Id == loanId);

            var applicationReview = await AppDbContext.ApplicationReviews.FirstOrDefaultAsync(m => m.Application.Id == loanId);

            if (applicationReview == null)
            {
                applicationReview = new ApplicationReview
                {
                    ApplicationId = loanId
                };
            }
            var pageModel = new ReviewModel(AppDbContext, authorizationService.Object, userManager.Object)
            {
                PageContext       = pageContext,
                Url               = new UrlHelper(actionContext),
                LoanApplication   = loanApplication,
                ApplicationReview = applicationReview
            };
            // Act
            // A new ModelStateDictionary is valid by default.
            var result = await pageModel.OnPostApproveAsync();

            var approvalApplication = await AppDbContext.LoanApplications.FirstOrDefaultAsync(m => m.Id == loanId);

            // Assert
            Assert.IsType <RedirectToPageResult>(result);
            Assert.Equal(LoanStatus.Approved, approvalApplication.Status);
        }