public async Task <bool> Handle(WithdrawApplicationCommand request, CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Performing Withdraw Application action for ApplicationId: {request.ApplicationId}");

            var oversightReview = new OversightReview
            {
                ApplicationId    = request.ApplicationId,
                Status           = OversightReviewStatus.Withdrawn,
                InternalComments = request.Comments,
                UserId           = request.UserId,
                UserName         = request.UserName
            };

            var result = await _gatewayRepository.WithdrawApplication(request.ApplicationId, request.Comments, request.UserId, request.UserName);

            try
            {
                if (result)
                {
                    await _applicationUpdatedEmailService.SendEmail(request.ApplicationId);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Unable to send withdraw confirmation email for application: {request.ApplicationId}");
            }

            _auditService.StartTracking(UserAction.WithdrawApplication, request.UserId, request.UserName);
            _auditService.AuditInsert(oversightReview);
            _oversightReviewRepository.Add(oversightReview);
            _auditService.Save();

            return(result);
        }
Exemple #2
0
        private void ApplyChanges(OversightReview oversightReview, RecordOversightOutcomeCommand request, bool isNew)
        {
            oversightReview.GatewayApproved    = request.ApproveGateway;
            oversightReview.ModerationApproved = request.ApproveModeration;
            oversightReview.Status             = request.OversightStatus;

            if (!isNew)
            {
                oversightReview.UpdatedOn = DateTime.UtcNow;
            }

            if (request.OversightStatus == OversightReviewStatus.InProgress)
            {
                oversightReview.InProgressDate             = DateTime.UtcNow;
                oversightReview.InProgressInternalComments = request.InternalComments;
                oversightReview.InProgressExternalComments = request.ExternalComments;
                oversightReview.InProgressUserId           = request.UserId;
                oversightReview.InProgressUserName         = request.UserName;
            }
            else
            {
                oversightReview.InternalComments = request.InternalComments;
                oversightReview.ExternalComments = request.ExternalComments;
                oversightReview.UserId           = request.UserId;
                oversightReview.UserName         = request.UserName;
            }
        }
        public void SetUp()
        {
            _oversightReview = new OversightReview
            {
                ApplicationId = _applicationId,
                Status        = OversightReviewStatus.Unsuccessful
            };

            _oversightReviewRepository = new Mock <IOversightReviewRepository>();
            _oversightReviewRepository.Setup(x => x.GetByApplicationId(_applicationId)).ReturnsAsync(() => _oversightReview);

            _command = new MakeAppealCommand
            {
                ApplicationId = _applicationId,
                HowFailedOnPolicyOrProcesses = "howFailedOnPolicyOrProcesses",
                HowFailedOnEvidenceSubmitted = "howFailedOnEvidenceSubmitted",
                UserId   = "userId",
                UserName = "******"
            };

            _appealRepository = new Mock <IAppealRepository>();
            _appealRepository.Setup(x => x.Add(It.IsAny <Appeal>()));

            _auditService = new Mock <IAuditService>();
            _auditService.Setup(x => x.StartTracking(UserAction.UploadAppealFile, _command.UserId, _command.UserName));
            _auditService.Setup(x => x.AuditInsert(It.IsAny <AppealFile>()));

            _handler = new MakeAppealCommandHandler(_oversightReviewRepository.Object, _appealRepository.Object, _auditService.Object);
        }
Exemple #4
0
        private void SaveChanges(OversightReview oversightReview, Domain.Entities.Apply application, bool isNew)
        {
            if (isNew)
            {
                _oversightReviewRepository.Add(oversightReview);
            }
            else
            {
                _oversightReviewRepository.Update(oversightReview);
            }

            switch (oversightReview.Status)
            {
            case OversightReviewStatus.InProgress:
                application.ApplicationStatus = ApplicationStatus.InProgressOutcome;
                break;

            case OversightReviewStatus.Successful:
            case OversightReviewStatus.SuccessfulAlreadyActive:
            case OversightReviewStatus.SuccessfulFitnessForFunding:
                application.ApplicationStatus = ApplicationStatus.Successful;
                break;

            case OversightReviewStatus.Unsuccessful:
                application.ApplicationStatus = application.GatewayReviewStatus == GatewayReviewStatus.Rejected
                        ? ApplicationStatus.Rejected :
                                                ApplicationStatus.Unsuccessful;
                break;
            }

            _applyRepository.Update(application);
        }
Exemple #5
0
        public async Task <Unit> Handle(RecordOversightGatewayRemovedOutcomeCommand request, CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Recording Oversight review status of Unsuccessful for gateway removed application Id {request.ApplicationId}");

            var application = await _applyRepository.GetApplication(request.ApplicationId);

            if (application == null)
            {
                throw new InvalidOperationException($"Application {request.ApplicationId} not found");
            }

            var oversightReview = new OversightReview
            {
                ApplicationId = request.ApplicationId,
                Status        = OversightReviewStatus.Removed,
                UserId        = request.UserId,
                UserName      = request.UserName,
            };

            _auditService.StartTracking(UserAction.RecordOversightGatewayRemovedOutcome, request.UserId, request.UserName);
            _auditService.AuditInsert(oversightReview);

            _oversightReviewRepository.Add(oversightReview);

            _auditService.Save();

            await _unitOfWork.Commit();

            await _applicationUpdatedEmailService.SendEmail(request.ApplicationId);

            return(Unit.Value);
        }
Exemple #6
0
        public void Setup()
        {
            var autoFixture = new Fixture();

            _query = autoFixture.Create <GetOversightReviewQuery>();

            _queryResult = autoFixture.Create <OversightReview>();

            _appealsQueries = new Mock <IOversightReviewQueries>();
            _appealsQueries.Setup(x => x.GetOversightReview(_query.ApplicationId)).ReturnsAsync(() => _queryResult);
            _handler = new GetOversightReviewQueryHandler(_appealsQueries.Object);
        }
        public void SetUp()
        {
            _fixture = new Fixture();

            _appealId = Guid.NewGuid();

            _oversightReview = new OversightReview
            {
                Id            = _oversightReviewId,
                ApplicationId = _applicationId,
                Status        = OversightReviewStatus.Unsuccessful
            };

            _appealUploads = new List <AppealUpload>
            {
                new AppealUpload
                {
                    Id            = Guid.NewGuid(),
                    ApplicationId = _applicationId
                },
                new AppealUpload
                {
                    Id            = Guid.NewGuid(),
                    ApplicationId = _applicationId
                }
            };

            _command = new CreateAppealCommand
            {
                ApplicationId     = _applicationId,
                OversightReviewId = _oversightReviewId,
                Message           = _fixture.Create <string>(),
                UserId            = _fixture.Create <string>(),
                UserName          = _fixture.Create <string>()
            };

            _oversightReviewRepository = new Mock <IOversightReviewRepository>();
            _oversightReviewRepository.Setup(x => x.GetById(_oversightReviewId))
            .ReturnsAsync(() => _oversightReview);

            _appealRepository = new Mock <IAppealRepository>();
            _appealRepository.Setup(x => x.Add(It.IsAny <Appeal>())).Callback <Appeal>(appeal => _appealId = appeal.Id);

            _appealUploadRepository = new Mock <IAppealUploadRepository>();
            _appealUploadRepository.Setup(x => x.GetByApplicationId(_applicationId)).ReturnsAsync(_appealUploads);

            _auditService = new Mock <IAuditService>();
            _auditService.Setup(x => x.StartTracking(UserAction.UploadAppealFile, _command.UserId, _command.UserName));
            _auditService.Setup(x => x.AuditInsert(It.IsAny <AppealUpload>()));

            _handler = new CreateAppealCommandHandler(_oversightReviewRepository.Object, _appealRepository.Object, _appealUploadRepository.Object, _auditService.Object);
        }
Exemple #8
0
        private void VerifyOversightReviewIsUnsuccessfulOrRemoved(OversightReview oversightReview)
        {
            var allowedStatuses = new[] { OversightReviewStatus.Unsuccessful, OversightReviewStatus.Removed };

            if (oversightReview is null)
            {
                throw new InvalidOperationException($"OversightReview for Application {oversightReview.ApplicationId} not found");
            }
            else if (!allowedStatuses.Contains(oversightReview.Status))
            {
                throw new InvalidOperationException($"OversightReview for Application {oversightReview.ApplicationId} has status {oversightReview.Status} and cannot be appealed");
            }
        }
        public async Task <bool> Handle(UpdateGatewayReviewStatusAndCommentCommand request, CancellationToken cancellationToken)
        {
            _auditService.StartTracking(UserAction.UpdateGatewayReviewStatus, request.UserId, request.UserName);

            var application = await _applyRepository.GetApplication(request.ApplicationId);

            if (application?.ApplyData == null)
            {
                throw new InvalidOperationException($"Application {request.ApplicationId} not found");
            }
            else if (application.ApplyData.GatewayReviewDetails == null)
            {
                application.ApplyData.GatewayReviewDetails = new ApplyGatewayDetails();
            }

            _auditService.AuditUpdate(application);

            application.ApplicationStatus   = request.GatewayReviewStatus == GatewayReviewStatus.Rejected ? ApplicationStatus.Rejected : ApplicationStatus.GatewayAssessed;
            application.GatewayReviewStatus = request.GatewayReviewStatus;

            application.ApplyData.GatewayReviewDetails.OutcomeDateTime     = DateTime.UtcNow;
            application.ApplyData.GatewayReviewDetails.Comments            = request.GatewayReviewComment;
            application.ApplyData.GatewayReviewDetails.ExternalComments    = request.GatewayReviewExternalComment;
            application.ApplyData.GatewayReviewDetails.SubcontractingLimit = request.SubcontractingLimit;

            var updatedSuccessfully = await _gatewayRepository.UpdateGatewayReviewStatusAndComment(application.ApplicationId, application.ApplyData, application.GatewayReviewStatus, request.UserId, request.UserName);


            if (updatedSuccessfully && request.GatewayReviewStatus == GatewayReviewStatus.Rejected)
            {
                var oversightReview = new OversightReview
                {
                    ApplicationId    = request.ApplicationId,
                    Status           = OversightReviewStatus.Rejected,
                    UserId           = request.UserId,
                    UserName         = request.UserName,
                    InternalComments = request.GatewayReviewComment,
                    ExternalComments = request.GatewayReviewExternalComment
                };

                _auditService.AuditInsert(oversightReview);
                _oversightReviewRepository.Add(oversightReview);

                await _applicationUpdatedEmailService.SendEmail(request.ApplicationId);
            }

            _auditService.Save();
            await _unitOfWork.Commit();

            return(updatedSuccessfully);
        }
Exemple #10
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()));
            }
        }
Exemple #11
0
        public async Task PersistAdd(OversightReview entity)
        {
            var transaction = _unitOfWork.GetTransaction();

            await transaction.Connection.ExecuteAsync(
                @"INSERT INTO [OversightReview]
                    ([Id],
                    [ApplicationId],
                    [GatewayApproved],
                    [ModerationApproved],
                    [Status],
                    [ApplicationDeterminedDate],
                    [InternalComments],
                    [ExternalComments],
                    [UserId],
                    [UserName],
                    [InProgressDate],
                    [InProgressUserId],
                    [InProgressUserName],
                    [InProgressInternalComments],
                    [InProgressExternalComments],
                    [CreatedOn])
                    VALUES (
                    @Id,
                    @ApplicationId,
                    @GatewayApproved,
                    @ModerationApproved,
                    @Status,
                    @ApplicationDeterminedDate,
                    @InternalComments,
                    @ExternalComments,
                    @UserId,
                    @UserName,
                    @InProgressDate,
                    @InProgressUserId,
                    @InProgressUserName,
                    @InProgressInternalComments,
                    @InProgressExternalComments,
                    @CreatedOn)",
                entity, transaction);
        }
Exemple #12
0
        private void SaveChanges(OversightReview oversightReview, Domain.Entities.Apply application, bool isNew)
        {
            if (isNew)
            {
                _oversightReviewRepository.Add(oversightReview);
            }
            else
            {
                _oversightReviewRepository.Update(oversightReview);
            }

            if (oversightReview.Status == OversightReviewStatus.InProgress)
            {
                return;
            }

            application.ApplicationStatus = oversightReview.Status == OversightReviewStatus.Unsuccessful
                ? ApplicationStatus.Rejected
                : ApplicationStatus.Approved;

            _applyRepository.Update(application);
        }
        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);
        }
Exemple #14
0
        public async Task PersistUpdate(OversightReview entity)
        {
            var transaction = _unitOfWork.GetTransaction();

            await transaction.Connection.ExecuteAsync(
                @"UPDATE [OversightReview]
                    SET [GatewayApproved] = @GatewayApproved,
                    [ModerationApproved] = @ModerationApproved,
                    [Status] = @Status,
                    [ApplicationDeterminedDate] = @ApplicationDeterminedDate,
                    [InternalComments] = @InternalComments,
                    [ExternalComments] = @ExternalComments,
                    [UserId] =  @UserId,
                    [UserName] =  @UserName,
                    [InProgressDate] = @InProgressDate,
                    [InProgressUserId] = @InProgressUserId,
                    [InProgressUserName] = @InProgressUserName,
                    [InProgressInternalComments] = @InProgressInternalComments,
                    [InProgressExternalComments] = @InProgressExternalComments,
                    [UpdatedOn] = @updatedOn
                    WHERE [Id] = @id",
                entity, transaction);
        }
Exemple #15
0
        private async Task <(OversightReview, bool)> GetExistingOrNewOversightReview(Guid applicationId)
        {
            var isNew           = false;
            var oversightReview = await _oversightReviewRepository.GetByApplicationId(applicationId);

            if (oversightReview == null)
            {
                isNew           = true;
                oversightReview = new OversightReview {
                    ApplicationId = applicationId
                };
                _auditService.AuditInsert(oversightReview);
            }
            else
            {
                if (oversightReview.Status != OversightReviewStatus.InProgress)
                {
                    throw new InvalidOperationException($"Unable to modify oversight review for application {applicationId} with a status of {oversightReview.Status}");
                }
                _auditService.AuditUpdate(oversightReview);
            }

            return(oversightReview, isNew);
        }
Exemple #16
0
 public void Add(OversightReview entity)
 {
     _unitOfWork.Register(() => PersistAdd(entity));
 }
Exemple #17
0
 public void Update(OversightReview entity)
 {
     _unitOfWork.Register(() => PersistUpdate(entity));
 }