Beispiel #1
0
        public async Task ExecuteAsync(Guid packageId, CarePackageBrokerageDomain brokerageInfo)
        {
            var package = await _carePackageGateway
                          .GetPackageAsync(packageId, PackageFields.Details, true)
                          .EnsureExistsAsync($"Care package {packageId} not found");

            package.SupplierId = brokerageInfo.SupplierId;

            AddCoreCost(package, brokerageInfo);
            RemoveDetails(package, brokerageInfo.Details);

            foreach (var requestedDetail in brokerageInfo.Details)
            {
                if (requestedDetail.Id is null)
                {
                    AddDetail(package, requestedDetail);
                }
                else
                {
                    UpdateDetail(package, requestedDetail);
                }
            }

            // Change status of package to in-progress
            package.Status = PackageStatus.InProgress;

            await _databaseManager.SaveAsync();
        }
        public void ShouldUpdateCarePackageSupplier()
        {
            var brokerageInfo = new CarePackageBrokerageDomain
            {
                SupplierId = 2
            };

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            _package.SupplierId.Should().Be(2);
            VerifyDatabaseCalls();
        }
        public void ShouldCreateCarePackageDetails()
        {
            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = TestDataHelper.CreateCarePackageDetailDomainList(3, PackageDetailType.AdditionalNeed)
            };

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            VerifyPackageDetails(brokerageInfo);
            VerifyDatabaseCalls();
        }
        public void ShouldNotRemoveCoreCost()
        {
            FillPackageDetails();

            var brokerageInfo = new CarePackageBrokerageDomain { /* let's remove'em all */
            };

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            VerifyPackageDetails(brokerageInfo);
            VerifyDatabaseCalls();
        }
        public void ShouldCreateCoreCostWhenNoDetailsProvided()
        {
            var brokerageInfo = new CarePackageBrokerageDomain
            {
                CoreCost  = 12.34m,
                StartDate = DateTimeOffset.UtcNow.Date,
                EndDate   = DateTimeOffset.UtcNow.Date.AddDays(100)
            };

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            VerifyPackageDetails(brokerageInfo);
            VerifyDatabaseCalls();
        }
        public void ShouldFailOnMissingPackage()
        {
            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = TestDataHelper.CreateCarePackageDetailDomainList(1, PackageDetailType.AdditionalNeed)
            };

            _useCase
            .Invoking(useCase => useCase.ExecuteAsync(Guid.NewGuid(), brokerageInfo))
            .Should().Throw <ApiException>()
            .Where(ex => ex.StatusCode == StatusCodes.Status404NotFound);

            _dbManagerMock.Verify(mock => mock.SaveAsync(It.IsAny <string>()), Times.Never);
        }
        public void ShouldFailOnSecondCoreCostCreation()
        {
            FillPackageDetails();

            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = TestDataHelper.CreateCarePackageDetailDomainList(1, PackageDetailType.CoreCost)
            };

            _useCase
            .Invoking(useCase => useCase.ExecuteAsync(_package.Id, brokerageInfo))
            .Should().Throw <ApiException>()
            .Where(ex => ex.StatusCode == StatusCodes.Status400BadRequest);

            _dbManagerMock.Verify(mock => mock.SaveAsync(It.IsAny <string>()), Times.Never);
        }
        private void VerifyPackageDetails(CarePackageBrokerageDomain brokerageInfo)
        {
            _package.Details.Count.Should().Be(brokerageInfo.Details.Count + 1); // +1 for core cost detail

            var coreCostDetail = _package.Details.FirstOrDefault(d => d.Type is PackageDetailType.CoreCost);

            coreCostDetail.Should().NotBeNull();
            coreCostDetail?.Cost.Should().Be(brokerageInfo.CoreCost);
            coreCostDetail?.CostPeriod.Should().Be(PaymentPeriod.Weekly);
            coreCostDetail?.StartDate.Should().Be(brokerageInfo.StartDate);
            coreCostDetail?.EndDate.Should().Be(brokerageInfo.EndDate);

            foreach (var requestedDetail in brokerageInfo.Details)
            {
                _package.Details.Should().ContainEquivalentOf(requestedDetail, opt => opt.Excluding(d => d.Id));
            }
        }
        public void ShouldRemoveCarePackageDetails()
        {
            var existingDetails = FillPackageDetails();

            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = existingDetails.DeepCopy()
            };

            brokerageInfo.Details.RemoveAt(0);
            brokerageInfo.Details.RemoveAt(1);

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            VerifyPackageDetails(brokerageInfo);
            VerifyDatabaseCalls();
        }
        public void ShouldUpdateCarePackageDetails()
        {
            var existingDetails = FillPackageDetails();

            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = existingDetails.DeepCopy()
            };

            foreach (var detail in brokerageInfo.Details)
            {
                detail.Cost     += 10;
                detail.StartDate = detail.StartDate.AddDays(-10);
                detail.EndDate   = detail.EndDate?.AddDays(10) ?? DateTimeOffset.UtcNow.Date.AddDays(100);
            }

            _useCase.ExecuteAsync(_package.Id, brokerageInfo);

            VerifyPackageDetails(brokerageInfo);
            VerifyDatabaseCalls();
        }
        public void ShouldFailOnUnknownDetailUpdate()
        {
            var existingDetails = FillPackageDetails();

            var brokerageInfo = new CarePackageBrokerageDomain
            {
                Details = existingDetails.DeepCopy()
            };

            foreach (var detail in brokerageInfo.Details.Where(detail => detail.Type != PackageDetailType.CoreCost))
            {
                detail.Id = Guid.NewGuid();
            }

            _useCase
            .Invoking(useCase => useCase.ExecuteAsync(_package.Id, brokerageInfo))
            .Should().Throw <ApiException>()
            .Where(ex => ex.StatusCode == StatusCodes.Status400BadRequest);

            _dbManagerMock.Verify(mock => mock.SaveAsync(It.IsAny <string>()), Times.Never);
        }
Beispiel #12
0
        private static void AddCoreCost(CarePackage package, CarePackageBrokerageDomain brokerageInfo)
        {
            var coreCostDetail = package.Details.FirstOrDefault(d => d.Type is PackageDetailType.CoreCost);

            string subjective = package.PackageType == PackageType.ResidentialCare ? SubjectiveConstants.ResidentialCarePackageSubjectiveCode : SubjectiveConstants.NursingCarePackageSubjectiveCode;

            if (coreCostDetail is null)
            {
                coreCostDetail = new CarePackageDetail()
                {
                    Subjective = subjective
                };
                package.Details.Add(coreCostDetail);
            }

            coreCostDetail.Type       = PackageDetailType.CoreCost;
            coreCostDetail.Cost       = brokerageInfo.CoreCost;
            coreCostDetail.CostPeriod = PaymentPeriod.Weekly;
            coreCostDetail.StartDate  = brokerageInfo.StartDate;
            coreCostDetail.EndDate    = brokerageInfo.EndDate;
            coreCostDetail.Subjective = subjective;
        }
 public static CarePackageBrokerageCreationRequest ToCreationRequest(this CarePackageBrokerageDomain input)
 {
     return(_mapper.Map <CarePackageBrokerageCreationRequest>(input));
 }
 public static CarePackageBrokerageResponse ToResponse(this CarePackageBrokerageDomain input)
 {
     return(_mapper.Map <CarePackageBrokerageResponse>(input));
 }