public void UpdatesGeneratedResultIfPreviousVersionFundingLineIsPresent()
        {
            uint templateLineId = NewRandomUint();

            FundingLine generatedResultFundingLine = NewFundingLine(fl => fl
                                                                    .WithTemplateLineId(templateLineId)
                                                                    .WithFundingLineType(FundingLineType.Payment));

            GeneratedProviderResult generatedProviderResult = NewGeneratedProviderResult(_ =>
                                                                                         _.WithFundlines(NewFundingLine(fl => fl
                                                                                                                        .WithTemplateLineId(templateLineId)
                                                                                                                        .WithFundingLineType(FundingLineType.Payment))));

            PublishedProviderVersion publishedProviderVersion = NewPublishedProviderVersion(_ =>
                                                                                            _.WithFundingLines(NewFundingLine(fl => fl.WithTemplateLineId(templateLineId)
                                                                                                                              .WithValue(98990M))));

            bool hasZeroedFundingLine = _fundingLineValueOverride.TryOverridePreviousFundingLineValues(publishedProviderVersion,
                                                                                                       generatedProviderResult);

            hasZeroedFundingLine
            .Should()
            .BeTrue();

            generatedResultFundingLine.Value
            .Should()
            .BeNull();
        }
Esempio n. 2
0
        private SchemaJsonFundingLine BuildSchemaJsonFundingLines(IEnumerable <FundingReferenceData> referenceData, IEnumerable <FundingCalculation> fundingCalculations, IEnumerable <FundingLine> fundingLines,
                                                                  Common.TemplateMetadata.Models.FundingLine templateFundingLine, string organisationGroupTypeIdentifier, string organisationGroupIdentifierValue)
        {
            FundingLine publishedFundingLine = fundingLines.Where(_ => _.TemplateLineId == templateFundingLine.TemplateLineId).FirstOrDefault();

            return(new SchemaJsonFundingLine
            {
                Name = templateFundingLine.Name,
                FundingLineCode = templateFundingLine.FundingLineCode,
                Value = publishedFundingLine.Value.DecimalAsObject(),
                TemplateLineId = templateFundingLine.TemplateLineId,
                Type = templateFundingLine.Type.ToString(),
                Calculations = templateFundingLine.Calculations?.Where(IsAggregationOrHasChildCalculations)?.Select(_ => BuildSchemaJsonCalculations(referenceData, fundingCalculations, _, organisationGroupTypeIdentifier, organisationGroupIdentifierValue)),
                DistributionPeriods = publishedFundingLine.DistributionPeriods?.Where(_ => _ != null).Select(distributionPeriod => new
                {
                    Value = distributionPeriod.Value.DecimalAsObject(),
                    distributionPeriod.DistributionPeriodId,
                    ProfilePeriods = distributionPeriod.ProfilePeriods?.Where(_ => _ != null).Select(profilePeriod => new
                    {
                        Type = profilePeriod.Type.ToString(),
                        profilePeriod.TypeValue,
                        profilePeriod.Year,
                        profilePeriod.Occurrence,
                        ProfiledValue = profilePeriod.ProfiledValue.DecimalAsObject(),
                        profilePeriod.DistributionPeriodId
                    }).ToArray()
                }).ToArray() ?? new dynamic[0],
                FundingLines = templateFundingLine.FundingLines?.Select(_ => BuildSchemaJsonFundingLines(referenceData, fundingCalculations, fundingLines, _, organisationGroupTypeIdentifier, organisationGroupIdentifierValue))
            });
        }
        private SchemaJsonFundingLine BuildSchemaJsonFundingLines(IEnumerable <FundingLine> fundingLines,
                                                                  TemplateFundingLine templateFundingLine)
        {
            FundingLine publishedFundingLine = fundingLines.FirstOrDefault(_ => _.TemplateLineId == templateFundingLine.TemplateLineId);

            return(new SchemaJsonFundingLine
            {
                Name = templateFundingLine.Name,
                FundingLineCode = templateFundingLine.FundingLineCode,
                Value = publishedFundingLine.Value.DecimalAsObject(),
                TemplateLineId = templateFundingLine.TemplateLineId,
                Type = templateFundingLine.Type.ToString(),
                DistributionPeriods = publishedFundingLine.DistributionPeriods?.Where(_ => _ != null).Select(distributionPeriod => new
                {
                    Value = distributionPeriod.Value.DecimalAsObject(),
                    distributionPeriod.DistributionPeriodId,
                    ProfilePeriods = distributionPeriod.ProfilePeriods?.Where(_ => _ != null).Select(profilePeriod => new
                    {
                        Type = profilePeriod.Type.ToString(),
                        profilePeriod.TypeValue,
                        profilePeriod.Year,
                        profilePeriod.Occurrence,
                        ProfiledValue = profilePeriod.ProfiledValue.DecimalAsObject(),
                        profilePeriod.DistributionPeriodId
                    }).ToArray()
                }).ToArray() ?? new dynamic[0]
            });
        }
        private static PublishedProviderFundingStructureItem RecursivelyAddFundingLines(
            IEnumerable <Common.TemplateMetadata.Models.FundingLine> fundingLines,
            List <TemplateMappingItem> templateMappingItems,
            int level,
            Common.TemplateMetadata.Models.FundingLine fundingLine,
            PublishedProviderVersion publishedProviderVersion)
        {
            level++;

            List <PublishedProviderFundingStructureItem> innerFundingStructureItems = new List <PublishedProviderFundingStructureItem>();

            // If funding line has calculations, recursively add them to list of inner FundingStructureItems
            if (fundingLine.Calculations != null && fundingLine.Calculations.Any())
            {
                foreach (Common.TemplateMetadata.Models.Calculation calculation in fundingLine.Calculations)
                {
                    innerFundingStructureItems.Add(
                        RecursivelyMapCalculationsToFundingStructureItem(
                            calculation,
                            level,
                            templateMappingItems,
                            publishedProviderVersion));
                }
            }

            // If funding line has more funding lines, recursively add them to list of inner FundingStructureItems
            if (fundingLine.FundingLines != null && fundingLine.FundingLines.Any())
            {
                foreach (Common.TemplateMetadata.Models.FundingLine line in fundingLines)
                {
                    innerFundingStructureItems.Add(RecursivelyAddFundingLines(
                                                       line.FundingLines,
                                                       templateMappingItems,
                                                       level,
                                                       line,
                                                       publishedProviderVersion));
                }
            }

            CalculateFunding.Models.Publishing.FundingLine publishedProviderFundingLine = publishedProviderVersion.FundingLines.FirstOrDefault(_ => _.TemplateLineId == fundingLine.TemplateLineId);
            string calculationValue = null;

            if (publishedProviderFundingLine != null)
            {
                calculationValue = publishedProviderFundingLine.Value.AsFormatCalculationType(CalculationValueFormat.Currency);
            }

            // Add FundingStructureItem
            PublishedProviderFundingStructureItem fundingStructureItem = MapToFundingStructureItem(
                level,
                fundingLine.Name,
                fundingLine.FundingLineCode,
                PublishedProviderFundingStructureType.FundingLine,
                null,
                null,
                innerFundingStructureItems.Any() ? innerFundingStructureItems : null,
                calculationValue);

            return(fundingStructureItem);
        }
Esempio n. 5
0
        private dynamic ToFundingLine(TemplateFundingLine fundingLine,
                                      IEnumerable <FundingLine> fundingLineValues)
        {
            FundingLine fundingLineValue = fundingLineValues.First(_ =>
                                                                   _.TemplateLineId == fundingLine.TemplateLineId);

            return(new
            {
                fundingLine.Name,
                fundingLine.FundingLineCode,
                Value = fundingLineValue.Value.DecimalAsObject(),
                fundingLine.TemplateLineId,
                Type = fundingLine.Type.ToString(),
                fundingLineValue.DistributionPeriods
            });
        }
Esempio n. 6
0
        private DistributionPeriod GetDistributionPeriod(string fundingLineCode,
                                                         string distributionPeriodId)
        {
            Guard.IsNullOrWhiteSpace(fundingLineCode, nameof(fundingLineCode));
            Guard.IsNullOrWhiteSpace(distributionPeriodId, nameof(distributionPeriodId));

            FundingLine fundingLine = FundingLines.SingleOrDefault(fl => fl.FundingLineCode == fundingLineCode);

            Guard.Ensure(fundingLine != null, $"Did not locate a funding line with code {fundingLineCode}");

            DistributionPeriod distributionPeriod = fundingLine.DistributionPeriods?
                                                    .SingleOrDefault(d => d.DistributionPeriodId == distributionPeriodId);

            Guard.Ensure(distributionPeriod != null, $"Distribution period {distributionPeriodId} not found for funding line {fundingLineCode}.");

            return(distributionPeriod);
        }
Esempio n. 7
0
        private List <PublishingModels.FundingLine> GenerateFundingLines(IEnumerable <AggregateFundingLine> fundingLineAggregates,
                                                                         IEnumerable <Common.TemplateMetadata.Models.FundingLine> fundingLineDefinitions)
        {
            List <PublishingModels.FundingLine> fundingLines = new List <PublishingModels.FundingLine>();

            foreach (AggregateFundingLine aggregateFundingLine in fundingLineAggregates)
            {
                if (aggregateFundingLine == null)
                {
                    throw new InvalidOperationException("Null aggregate funding line");
                }

                Common.TemplateMetadata.Models.FundingLine fundingLineDefinition = fundingLineDefinitions.FirstOrDefault(_
                                                                                                                         => _.TemplateLineId == aggregateFundingLine.TemplateLineId);
                if (fundingLineDefinition == null)
                {
                    throw new InvalidOperationException($"Unable to find funding line with TemplateLineId '{aggregateFundingLine.TemplateLineId}'");
                }

                PublishingModels.FundingLine fundingLine = new PublishingModels.FundingLine()
                {
                    FundingLineCode = fundingLineDefinition.FundingLineCode,
                    Name            = fundingLineDefinition.Name,
                    TemplateLineId  = fundingLineDefinition.TemplateLineId,
                    Type            = fundingLineDefinition.Type.AsMatchingEnum <FundingLineType>(),
                    Value           = aggregateFundingLine.Value ?? 0,
                };

                fundingLines.Add(fundingLine);

                fundingLine.DistributionPeriods = aggregateFundingLine.DistributionPeriods?.ToList();

                if (aggregateFundingLine.FundingLines.AnyWithNullCheck())
                {
                    fundingLines.AddRange(GenerateFundingLines(aggregateFundingLine.FundingLines, fundingLineDefinitions));
                }
            }

            return(fundingLines);
        }