示例#1
0
        public async Task <bool> RecordOutcome(Guid applicationId, bool?approveGateway, bool?approveModeration, OversightReviewStatus outcome, string userId, string userName, string internalComments, string externalComments)
        {
            _logger.LogInformation($"Recording an oversight outcome of {outcome} for application {applicationId}");

            var registrationDetails = await _applicationApiClient.GetRegistrationDetails(applicationId);

            var registerStatus = await _registerApiClient.GetOrganisationRegisterStatus(new GetOrganisationRegisterStatusRequest { UKPRN = registrationDetails.UKPRN });

            ValidateStatusAgainstExistingStatus(outcome, registerStatus, registrationDetails.UKPRN);

            var updateOutcomeCommand = new RecordOversightOutcomeCommand
            {
                ApplicationId     = applicationId,
                ApproveGateway    = approveGateway,
                ApproveModeration = approveModeration,
                OversightStatus   = outcome,
                UserId            = userId,
                UserName          = userName,
                InternalComments  = internalComments,
                ExternalComments  = externalComments
            };

            var updateOutcomeSuccess = await _applicationApiClient.RecordOutcome(updateOutcomeCommand);

            if (!updateOutcomeSuccess)
            {
                return(false);
            }

            if (outcome == OversightReviewStatus.Successful)
            {
                var request = BuildCreateOrganisationRequest(userName, registrationDetails);

                await _registerApiClient.CreateOrganisation(request);
            }

            if ((outcome == OversightReviewStatus.SuccessfulAlreadyActive ||
                 outcome == OversightReviewStatus.SuccessfulFitnessForFunding) && registerStatus.OrganisationId != null)
            {
                var updateOrganisationRequest = new UpdateOrganisationRequest
                {
                    ApplicationDeterminedDate = DateTime.UtcNow.Date,
                    LegalName          = registrationDetails.LegalName,
                    OrganisationId     = registerStatus.OrganisationId.Value,
                    Username           = userName,
                    CharityNumber      = registrationDetails.CharityNumber,
                    CompanyNumber      = registrationDetails.CompanyNumber,
                    OrganisationTypeId = registrationDetails.OrganisationTypeId,
                    ProviderTypeId     = registrationDetails.ProviderTypeId,
                    TradingName        = registrationDetails.TradingName,
                };

                _logger.LogInformation($"Updating organisation details for application {applicationId}");

                return(await _registerApiClient.UpdateOrganisation(updateOrganisationRequest));
            }

            return(true);
        }
        public async Task Record_oversight_InProgress_Is_Recorded_In_Relevant_Properties()
        {
            var command = new RecordOversightOutcomeCommand
            {
                ApplicationId    = Guid.NewGuid(),
                OversightStatus  = OversightReviewStatus.InProgress,
                UserName         = "******",
                UserId           = "testUser",
                InternalComments = "testInternalComments",
                ExternalComments = "testExternalComments"
            };

            var oversightReviewRepository = new Mock <IOversightReviewRepository>();

            oversightReviewRepository.Setup(x => x.Add(It.IsAny <OversightReview>()));
            oversightReviewRepository.Setup(x => x.GetByApplicationId(It.IsAny <Guid>())).ReturnsAsync(() => null);

            var repository = new Mock <IApplicationRepository>();

            repository.Setup(x => x.GetApplication(command.ApplicationId)).ReturnsAsync(() => new Domain.Entities.Apply
            {
                ApplicationId = command.ApplicationId, Status = ApplicationStatus.Submitted
            });
            repository.Setup(x => x.Update(It.IsAny <Domain.Entities.Apply>()));

            var logger  = new Mock <ILogger <RecordOversightOutcomeHandler> >();
            var handler = new RecordOversightOutcomeHandler(logger.Object, oversightReviewRepository.Object, repository.Object, Mock.Of <IAuditService>(), Mock.Of <IApplicationUpdatedEmailService>(), Mock.Of <IUnitOfWork>());

            var result = await handler.Handle(command, new CancellationToken());

            result.Should().BeTrue();

            oversightReviewRepository.Verify(
                x => x.Add(It.Is <OversightReview>(
                               r => r.ApplicationId == command.ApplicationId &&
                               r.InProgressDate.Value.Date == DateTime.UtcNow.Date &&
                               r.ApplicationDeterminedDate.Value.Date == DateTime.UtcNow.Date &&
                               r.InProgressUserId == command.UserId &&
                               r.InProgressUserName == command.UserName &&
                               r.InProgressInternalComments == command.InternalComments &&
                               r.InProgressExternalComments == command.ExternalComments &&
                               r.InternalComments == null &&
                               r.ExternalComments == null &&
                               r.Status == OversightReviewStatus.InProgress
                               )),
                Times.Once);

            repository.Verify(x => x.Update(It.Is <Domain.Entities.Apply>(apply =>
                                                                          apply.ApplicationId == command.ApplicationId && apply.ApplicationStatus == ApplicationStatus.InProgressOutcome)),
                              Times.Once);
        }
        public async Task Record_oversight_outcome_updates_oversight_status_and_determined_date(OversightReviewStatus oversightStatus)
        {
            var command = new RecordOversightOutcomeCommand
            {
                OversightStatus = oversightStatus,
                ApplicationId   = Guid.NewGuid(),
                UserId          = "User Id",
                UserName        = "******"
            };

            _mediator.Setup(x => x.Send(command, It.IsAny <CancellationToken>())).ReturnsAsync(true);

            var result = await _controller.RecordOversightOutcome(command);

            result.Should().NotBeNull();
            result.Value.Should().BeTrue();
        }
示例#4
0
        public async Task Record_oversight_outcome_updates_oversight_status_and_applies_correct_application_status(OversightReviewStatus oversightReviewStatus, string applicationStatus)
        {
            var command = new RecordOversightOutcomeCommand
            {
                ApplicationId    = Guid.NewGuid(),
                OversightStatus  = oversightReviewStatus,
                UserName         = "******",
                UserId           = "testUser",
                InternalComments = "testInternalComments",
                ExternalComments = "testExternalComments"
            };

            var oversightReviewRepository = new Mock <IOversightReviewRepository>();

            oversightReviewRepository.Setup(x => x.Add(It.IsAny <OversightReview>()));
            oversightReviewRepository.Setup(x => x.GetByApplicationId(It.IsAny <Guid>())).ReturnsAsync(() => null);

            var repository = new Mock <IApplicationRepository>();

            repository.Setup(x => x.GetApplication(command.ApplicationId)).ReturnsAsync(() => new Domain.Entities.Apply
            {
                ApplicationId = command.ApplicationId, Status = ApplicationStatus.Submitted
            });
            repository.Setup(x => x.Update(It.IsAny <Domain.Entities.Apply>()));

            var logger  = new Mock <ILogger <RecordOversightOutcomeHandler> >();
            var handler = new RecordOversightOutcomeHandler(logger.Object, oversightReviewRepository.Object, repository.Object, Mock.Of <IAuditService>());

            var result = await handler.Handle(command, new CancellationToken());

            result.Should().BeTrue();

            oversightReviewRepository.Verify(
                x => x.Add(It.Is <OversightReview>(
                               r => r.ApplicationId == command.ApplicationId &&
                               r.ApplicationDeterminedDate.Value.Date == DateTime.UtcNow.Date &&
                               r.InternalComments == command.InternalComments &&
                               r.ExternalComments == command.ExternalComments &&
                               r.Status == command.OversightStatus
                               )),
                Times.Once);

            repository.Verify(x => x.Update(It.Is <Domain.Entities.Apply>(apply =>
                                                                          apply.ApplicationId == command.ApplicationId && apply.ApplicationStatus == applicationStatus)),
                              Times.Once);
        }
示例#5
0
        public void Record_oversight_Throws_Exception_If_Already_Recorded_Unless_InProgress(OversightReviewStatus originalStatus, bool expectThrows)
        {
            var applicationId = Guid.NewGuid();

            var command = new RecordOversightOutcomeCommand
            {
                ApplicationId    = applicationId,
                OversightStatus  = OversightReviewStatus.Successful,
                UserName         = "******",
                UserId           = "testUser",
                InternalComments = "testInternalComments",
                ExternalComments = "testExternalComments"
            };

            var existingOversightReview = new OversightReview
            {
                Status = originalStatus
            };

            var oversightReviewRepository = new Mock <IOversightReviewRepository>();

            oversightReviewRepository.Setup(x => x.Update(It.IsAny <OversightReview>()));
            oversightReviewRepository.Setup(x => x.GetByApplicationId(It.IsAny <Guid>())).ReturnsAsync(() => existingOversightReview);

            var repository = new Mock <IApplicationRepository>();

            repository.Setup(x => x.GetApplication(command.ApplicationId)).ReturnsAsync(() => new Domain.Entities.Apply
            {
                ApplicationId = command.ApplicationId, Status = ApplicationStatus.Submitted
            });

            var logger  = new Mock <ILogger <RecordOversightOutcomeHandler> >();
            var handler = new RecordOversightOutcomeHandler(logger.Object, oversightReviewRepository.Object, repository.Object, Mock.Of <IAuditService>());

            if (expectThrows)
            {
                Assert.ThrowsAsync <InvalidOperationException>(async() => await handler.Handle(command, new CancellationToken()));
            }
            else
            {
                Assert.DoesNotThrowAsync(async() => await handler.Handle(command, new CancellationToken()));
            }
        }
示例#6
0
 private static CreateRoatpOrganisationRequest BuildCreateOrganisationRequest(RecordOversightOutcomeCommand updateOutcomeCommand, RoatpRegistrationDetails registrationDetails)
 {
     return(new CreateRoatpOrganisationRequest
     {
         ApplicationDeterminedDate = DateTime.UtcNow.Date,
         CharityNumber = registrationDetails.CharityNumber,
         CompanyNumber = registrationDetails.CompanyNumber,
         FinancialTrackRecord = true,
         LegalName = registrationDetails.LegalName,
         NonLevyContract = false,
         OrganisationTypeId = registrationDetails.OrganisationTypeId,
         ParentCompanyGuarantee = false,
         ProviderTypeId = registrationDetails.ProviderTypeId,
         SourceIsUKRLP = true,
         StatusDate = DateTime.Now,
         TradingName = registrationDetails.TradingName,
         Ukprn = registrationDetails.UKPRN,
         Username = updateOutcomeCommand.UserName
     });
 }
        public async Task Handler_sends_application_updated_email_for_all_status_changes(OversightReviewStatus newOversightReviewStatus)
        {
            var applicationId = Guid.NewGuid();

            var command = new RecordOversightOutcomeCommand
            {
                ApplicationId    = applicationId,
                OversightStatus  = newOversightReviewStatus,
                UserName         = "******",
                UserId           = "testUser",
                InternalComments = "testInternalComments",
                ExternalComments = "testExternalComments"
            };

            var existingOversightReview = new OversightReview
            {
                Status = OversightReviewStatus.InProgress
            };

            var oversightReviewRepository = new Mock <IOversightReviewRepository>();

            oversightReviewRepository.Setup(x => x.Update(It.IsAny <OversightReview>()));
            oversightReviewRepository.Setup(x => x.GetByApplicationId(It.IsAny <Guid>())).ReturnsAsync(() => existingOversightReview);

            var repository = new Mock <IApplicationRepository>();

            repository.Setup(x => x.GetApplication(command.ApplicationId)).ReturnsAsync(() => new Domain.Entities.Apply
            {
                ApplicationId = command.ApplicationId, Status = ApplicationStatus.Submitted
            });

            var applicationUpdatedEmailService = new Mock <IApplicationUpdatedEmailService>();
            var logger  = new Mock <ILogger <RecordOversightOutcomeHandler> >();
            var handler = new RecordOversightOutcomeHandler(logger.Object, oversightReviewRepository.Object, repository.Object, Mock.Of <IAuditService>(), applicationUpdatedEmailService.Object, Mock.Of <IUnitOfWork>());
            await handler.Handle(command, new CancellationToken());

            applicationUpdatedEmailService.Verify(x => x.SendEmail(It.Is <Guid>(id => id == command.ApplicationId)), Times.Once);
        }
 public async Task <ActionResult <bool> > RecordOversightOutcome([FromBody] RecordOversightOutcomeCommand command)
 {
     return(await _mediator.Send(command));
 }
        public async Task <bool> RecordOutcome(RecordOversightOutcomeCommand command)
        {
            var statusCode = await Post("Oversight/Outcome", command);

            return(await Task.FromResult(statusCode == HttpStatusCode.OK));
        }