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(); }
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); }
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 }); }
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); }
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); }