public void SetVersion_GivenResultIsInUpdatedStatusAndPublished_IncreasesMajorResetsMinor()
        {
            //Arrange
            PublishedAllocationLineResultVersion allocationLineResultVersion = new PublishedAllocationLineResultVersion
            {
                Status = AllocationLineStatus.Published,
                Major  = 1,
                Minor  = 5
            };

            PublishedAllocationLineLogicalResultVersionService service = new PublishedAllocationLineLogicalResultVersionService();

            //Act
            service.SetVersion(allocationLineResultVersion);

            //Assert
            allocationLineResultVersion
            .Major
            .Should()
            .Be(2);

            allocationLineResultVersion
            .Minor
            .Should()
            .Be(0);
        }
        public void SetVersion_GivenNewlyHeldResult_IncreasesMinorVesionToOne()
        {
            //Arrange
            PublishedAllocationLineResultVersion allocationLineResultVersion = new PublishedAllocationLineResultVersion
            {
                Status = AllocationLineStatus.Held,
                Major  = 0,
                Minor  = 0
            };

            PublishedAllocationLineLogicalResultVersionService service = new PublishedAllocationLineLogicalResultVersionService();

            //Act
            service.SetVersion(allocationLineResultVersion);

            //Assert
            allocationLineResultVersion
            .Major
            .Should()
            .Be(0);

            allocationLineResultVersion
            .Minor
            .Should()
            .Be(1);
        }
        public void SetVersion_GivenResultIsInApprovedStatus_IncreasesMinorVesion()
        {
            //Arrange
            PublishedAllocationLineResultVersion allocationLineResultVersion = new PublishedAllocationLineResultVersion
            {
                Status = AllocationLineStatus.Approved,
                Major  = 0,
                Minor  = 5
            };

            PublishedAllocationLineLogicalResultVersionService service = new PublishedAllocationLineLogicalResultVersionService();

            //Act
            service.SetVersion(allocationLineResultVersion);

            //Assert
            allocationLineResultVersion
            .Major
            .Should()
            .Be(0);

            allocationLineResultVersion
            .Minor
            .Should()
            .Be(6);
        }
        public void GetPublishedProviderResultByVersionId_GivenVersionFoundButResultCanbnotBeFound_ReturnsNull()
        {
            //Arrange
            string id       = "id-1";
            string entityId = "entity-id-1";

            PublishedAllocationLineResultVersion version = new PublishedAllocationLineResultVersion
            {
                PublishedProviderResultId = entityId,
                FeedIndexId = id
            };

            IPublishedProviderResultsRepository publishedProviderResultsRepository = CreatePublishedProviderResultsRepository();

            publishedProviderResultsRepository
            .GetPublishedProviderResultVersionForFeedIndexId(Arg.Is(id))
            .Returns(version);

            publishedProviderResultsRepository
            .GetPublishedProviderResultForId(Arg.Is(entityId))
            .Returns((PublishedProviderResult)null);

            PublishedResultsService publishedResultsService = CreateResultsService(publishedProviderResultsRepository: publishedProviderResultsRepository);

            //Act
            PublishedProviderResult result = publishedResultsService.GetPublishedProviderResultByVersionId(id);

            //Assert
            result
            .Should()
            .BeNull();
        }
        public void SetVersion_GivenResultHasBeenSetToPublish_IncreasesMajorVesionandSetsMinorToZero()
        {
            //Arrange
            PublishedAllocationLineResultVersion allocationLineResultVersion = new PublishedAllocationLineResultVersion
            {
                Status = AllocationLineStatus.Published,
                Major  = 0,
                Minor  = 5
            };

            PublishedAllocationLineLogicalResultVersionService service = new PublishedAllocationLineLogicalResultVersionService();

            //Act
            service.SetVersion(allocationLineResultVersion);

            //Assert
            allocationLineResultVersion
            .Major
            .Should()
            .Be(1);

            allocationLineResultVersion
            .Minor
            .Should()
            .Be(0);
        }
        public void GetPublishedProviderResultVersionById_GivenVersionWasFound_ReturnsVersion()
        {
            //Arrange
            string feedIndexId = "id-1";

            PublishedAllocationLineResultVersion publishedAllocationLineResultVersion = new PublishedAllocationLineResultVersion();

            IPublishedProviderResultsRepository publishedProviderResultsRepository = CreatePublishedProviderResultsRepository();

            publishedProviderResultsRepository
            .GetPublishedProviderResultVersionForFeedIndexId(Arg.Is(feedIndexId))
            .Returns(publishedAllocationLineResultVersion);

            PublishedResultsService publishedResultsService = CreateResultsService(publishedProviderResultsRepository: publishedProviderResultsRepository);

            //Act
            PublishedAllocationLineResultVersion result = publishedResultsService.GetPublishedProviderResultVersionById(feedIndexId);

            //Assert
            result
            .Should()
            .NotBeNull();

            result
            .Should()
            .Be(publishedAllocationLineResultVersion);
        }
示例#7
0
        public void SetVersion(PublishedAllocationLineResultVersion allocationLineResultVersion)
        {
            Guard.ArgumentNotNull(allocationLineResultVersion, nameof(allocationLineResultVersion));

            int major = allocationLineResultVersion.Major;
            int minor = allocationLineResultVersion.Minor;

            AllocationLineStatus allocationLineStatus = allocationLineResultVersion.Status;

            if (allocationLineStatus == AllocationLineStatus.Published && major == 0)
            {
                major = 1;
                minor = 0;
            }
            else if (allocationLineStatus == AllocationLineStatus.Published && major > 0)
            {
                major += 1;
                minor  = 0;
            }
            else
            {
                minor += 1;
            }

            allocationLineResultVersion.Major = major;
            allocationLineResultVersion.Minor = minor;
        }
        public async Task GetPublishedProviderResultByAllocationResultId_GivenVersionAndFoundInHistory_ReturnsResult()
        {
            //Arrange
            string allocationResultId = "12345";

            int version = 5;

            PublishedProviderResult publishedProviderResult = new PublishedProviderResult
            {
                FundingStreamResult = new PublishedFundingStreamResult
                {
                    AllocationLineResult = new PublishedAllocationLineResult
                    {
                        Current = new PublishedAllocationLineResultVersion {
                            Version = 2
                        }
                    }
                }
            };

            PublishedAllocationLineResultVersion publishedAllocationLineResultVersion = new PublishedAllocationLineResultVersion
            {
                Version = 5
            };

            IPublishedProviderResultsRepository publishedProviderResultsRepository = CreatePublishedProviderResultsRepository();

            publishedProviderResultsRepository
            .GetPublishedProviderResultForIdInPublishedState(Arg.Is(allocationResultId))
            .Returns(publishedProviderResult);

            IVersionRepository <PublishedAllocationLineResultVersion> versionRepository = CreatePublishedProviderResultsVersionRepository();

            versionRepository
            .GetVersion(Arg.Is(allocationResultId), Arg.Is(version))
            .Returns(publishedAllocationLineResultVersion);

            PublishedResultsService service = CreateResultsService(publishedProviderResultsRepository: publishedProviderResultsRepository, publishedProviderResultsVersionRepository: versionRepository);

            //Act
            PublishedProviderResult result = await service.GetPublishedProviderResultByAllocationResultId(allocationResultId, version);

            //Assert
            result
            .Should()
            .NotBeNull();

            result
            .FundingStreamResult
            .AllocationLineResult
            .Current
            .Version
            .Should()
            .Be(5);
        }
        public void GetPublishedProviderResultByVersionId_GivenResultFound_ReturnsResult()
        {
            //Arrange
            string id       = "id-1";
            string entityId = "entity-id-1";

            PublishedAllocationLineResultVersion version = new PublishedAllocationLineResultVersion
            {
                PublishedProviderResultId = entityId,
                FeedIndexId = id
            };

            PublishedProviderResult publishedProviderResult = new PublishedProviderResult
            {
                FundingStreamResult = new PublishedFundingStreamResult
                {
                    AllocationLineResult = new PublishedAllocationLineResult()
                }
            };

            IPublishedProviderResultsRepository publishedProviderResultsRepository = CreatePublishedProviderResultsRepository();

            publishedProviderResultsRepository
            .GetPublishedProviderResultVersionForFeedIndexId(Arg.Is(id))
            .Returns(version);

            publishedProviderResultsRepository
            .GetPublishedProviderResultForId(Arg.Is(entityId))
            .Returns(publishedProviderResult);

            PublishedResultsService publishedResultsService = CreateResultsService(publishedProviderResultsRepository: publishedProviderResultsRepository);

            //Act
            PublishedProviderResult result = publishedResultsService.GetPublishedProviderResultByVersionId(id);

            //Assert
            result
            .Should()
            .NotBeNull();

            result
            .FundingStreamResult
            .AllocationLineResult
            .Current
            .Should()
            .Be(version);
        }
        private IEnumerable <PublishedFundingStreamResult> AssembleFundingStreamResults(ProviderResult providerResult, SpecificationCurrentVersion specificationCurrentVersion, Reference author, IEnumerable <FundingStream> allFundingStreams)
        {
            IList <PublishedFundingStreamResult> publishedFundingStreamResults = new List <PublishedFundingStreamResult>();

            Dictionary <string, PublishedAllocationLineDefinition> publishedAllocationLines = new Dictionary <string, PublishedAllocationLineDefinition>();

            foreach (Reference fundingStreamReference in specificationCurrentVersion.FundingStreams)
            {
                FundingStream fundingStream = allFundingStreams.FirstOrDefault(m => m.Id == fundingStreamReference.Id);

                if (fundingStream == null)
                {
                    throw new NonRetriableException($"Failed to find a funding stream for id: {fundingStreamReference.Id}");
                }

                PublishedFundingStreamDefinition publishedFundingStreamDefinition = _mapper.Map <PublishedFundingStreamDefinition>(fundingStream);

                List <PublishedProviderCalculationResult> publishedProviderCalculationResults = new List <PublishedProviderCalculationResult>(providerResult.CalculationResults.Count());

                foreach (CalculationResult calculationResult in providerResult.CalculationResults)
                {
                    (Policy policy, Policy parentPolicy, Calculation calculation) = FindPolicy(calculationResult.CalculationSpecification?.Id, specificationCurrentVersion.Policies);

                    if (calculation == null)
                    {
                        throw new NonRetriableException($"Calculation specification not found in specification. Calculation Spec Id ='{calculationResult?.CalculationSpecification?.Id}'");
                    }

                    if (calculation.CalculationType == CalculationType.Number && !calculation.IsPublic)
                    {
                        continue;
                    }

                    PublishedProviderCalculationResult publishedProviderCalculationResult = new PublishedProviderCalculationResult()
                    {
                        CalculationSpecification = calculationResult.CalculationSpecification,
                        AllocationLine           = calculationResult.AllocationLine,
                        IsPublic           = calculation.IsPublic,
                        CalculationType    = ConvertCalculationType(calculationResult.CalculationType),
                        Value              = calculationResult.Value,
                        CalculationVersion = calculationResult.Version
                    };

                    if (policy != null)
                    {
                        publishedProviderCalculationResult.Policy = new PolicySummary(policy.Id, policy.Name, policy.Description);
                    }

                    if (parentPolicy != null)
                    {
                        publishedProviderCalculationResult.ParentPolicy = new PolicySummary(parentPolicy.Id, parentPolicy.Name, parentPolicy.Description);
                    }

                    publishedProviderCalculationResults.Add(publishedProviderCalculationResult);
                }

                IEnumerable <IGrouping <string, CalculationResult> > allocationLineGroups = providerResult
                                                                                            .CalculationResults
                                                                                            .Where(c => c.CalculationType == Models.Calcs.CalculationType.Funding && c.Value.HasValue && c.AllocationLine != null && !string.IsNullOrWhiteSpace(c.AllocationLine.Id))
                                                                                            .GroupBy(m => m.AllocationLine.Id);

                foreach (IGrouping <string, CalculationResult> allocationLineResultGroup in allocationLineGroups)
                {
                    PublishedAllocationLineDefinition publishedAllocationLine;
                    if (!publishedAllocationLines.TryGetValue(allocationLineResultGroup.Key, out publishedAllocationLine))
                    {
                        AllocationLine allocationLine = fundingStream.AllocationLines.FirstOrDefault(m => m.Id == allocationLineResultGroup.Key);
                        if (allocationLine != null)
                        {
                            publishedAllocationLine = _mapper.Map <PublishedAllocationLineDefinition>(allocationLine);
                            publishedAllocationLines.Add(allocationLineResultGroup.Key, publishedAllocationLine);
                        }
                    }

                    if (publishedAllocationLine != null)
                    {
                        PublishedFundingStreamResult publishedFundingStreamResult = new PublishedFundingStreamResult
                        {
                            FundingStream = publishedFundingStreamDefinition,

                            FundingStreamPeriod = $"{fundingStream.Id}{specificationCurrentVersion.FundingPeriod.Id}",

                            DistributionPeriod = $"{fundingStream.PeriodType.Id}{specificationCurrentVersion.FundingPeriod.Id}"
                        };

                        PublishedAllocationLineResultVersion publishedAllocationLineResultVersion = new PublishedAllocationLineResultVersion
                        {
                            Author          = author,
                            Date            = DateTimeOffset.Now,
                            Status          = AllocationLineStatus.Held,
                            Value           = allocationLineResultGroup.Sum(m => m.Value),
                            Provider        = providerResult.Provider,
                            SpecificationId = specificationCurrentVersion.Id,
                            ProviderId      = providerResult.Provider.Id,
                            Calculations    = publishedProviderCalculationResults.Where(c => c.AllocationLine == null || string.Equals(c.AllocationLine.Id, publishedAllocationLine.Id, StringComparison.InvariantCultureIgnoreCase)),
                        };

                        publishedFundingStreamResult.AllocationLineResult = new PublishedAllocationLineResult
                        {
                            AllocationLine = publishedAllocationLine,
                            Current        = publishedAllocationLineResultVersion
                        };

                        publishedFundingStreamResults.Add(publishedFundingStreamResult);
                    }
                }
            }

            return(publishedFundingStreamResults);
        }