public async Task GetCalculationResultSummariesDelegatesToCosmosUsingCustomSqlQuery()
        {
            string specificationId = NewRandomString();
            string providerId      = NewRandomString();
            ProviderCalculationResult resultOne   = NewProviderResultSummary();
            ProviderCalculationResult resultTwo   = NewProviderResultSummary();
            ProviderCalculationResult resultThree = NewProviderResultSummary();

            resultOne.ProviderId = providerId;

            string[] keys = new string[] { resultOne.ProviderId, resultTwo.ProviderId, resultThree.ProviderId };

            GivenTheSqlQueryResultsForSpecificationResults(specificationId, resultOne, resultTwo, resultThree);

            IEnumerable <ProviderCalculationResult> result = await WhenTheCalculationResultsAreQueriedBySpecificationIdAndProviderId(specificationId, providerId);

            result
            .Should()
            .BeOfType <IEnumerable <ProviderCalculationResult> >()
            .And
            .NotBeNull()
            .And
            .HaveCount(1);

            ProviderCalculationResult providerCalculationResult = result.FirstOrDefault();

            providerCalculationResult
            .Should()
            .BeEquivalentTo(resultOne);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Generate Funding Lines, Calculations and Reference Data for a funding stream for all in scope providers
        /// </summary>
        /// <param name="templateMetadata">Template Metadata</param>
        /// <param name="templateMapping">Template Mapping</param>
        /// <param name="scopedProviders">Scoped providers for a specification</param>
        /// <param name="calculationResults">Calculation Results</param>
        /// <returns>Dictionary of Generated Provider Results, keyed on ProviderId</returns>
        public IDictionary <string, GeneratedProviderResult> Generate(TemplateMetadataContents templateMetadata, Common.ApiClient.Calcs.Models.TemplateMapping templateMapping, IEnumerable <Provider> scopedProviders, IDictionary <string, ProviderCalculationResult> calculationResults)
        {
            Guard.ArgumentNotNull(templateMetadata, nameof(templateMetadata));
            Guard.ArgumentNotNull(templateMapping, nameof(templateMapping));
            Guard.ArgumentNotNull(calculationResults, nameof(calculationResults));

            ConcurrentDictionary <string, GeneratedProviderResult> results = new ConcurrentDictionary <string, GeneratedProviderResult>();

            TimeSpan loggingPeriod = TimeSpan.FromMinutes(5);

            using (new Timer(
                       _ => _logger.Information($"{results.Count}: Published Providers processed."),
                       null, loggingPeriod, loggingPeriod))

                Parallel.ForEach(scopedProviders, new ParallelOptions {
                    MaxDegreeOfParallelism = 15
                }, (provider) =>
                {
                    GeneratedProviderResult generatedProviderResult = new GeneratedProviderResult();

                    ProviderCalculationResult calculationResultsForProvider = null;
                    calculationResults.TryGetValue(provider.ProviderId, out calculationResultsForProvider);

                    if (calculationResultsForProvider != null)
                    {
                        GeneratorModels.FundingValue fundingValue = _fundingLineTotalAggregator.GenerateTotals(templateMetadata, templateMapping.TemplateMappingItems.ToDictionary(_ => _.TemplateId), calculationResultsForProvider.Results.ToDictionary(_ => _.Id));

                        // Get funding lines
                        IEnumerable <GeneratorModels.FundingLine> fundingLines = fundingValue.FundingLines?.Flatten(_ => _.FundingLines) ?? new GeneratorModels.FundingLine[0];

                        Dictionary <uint, GeneratorModels.FundingLine> uniqueFundingLine = new Dictionary <uint, GeneratorModels.FundingLine>();

                        generatedProviderResult.FundingLines = fundingLines.Where(_ => uniqueFundingLine.TryAdd(_.TemplateLineId, _)).Select(_ =>
                        {
                            return(_mapper.Map <FundingLine>(_));
                        }).ToList();

                        // Set total funding
                        generatedProviderResult.TotalFunding = generatedProviderResult.FundingLines
                                                               .Sum(p =>
                        {
                            return(p.Type == FundingLineType.Payment ? p.Value : 0);
                        });

                        Dictionary <uint, GeneratorModels.Calculation> uniqueCalculations = new Dictionary <uint, GeneratorModels.Calculation>();

                        // Get calculations
                        IEnumerable <GeneratorModels.Calculation> fundingCalculations = uniqueFundingLine.Values?.SelectMany(_ => _.Calculations.Flatten(calc => calc.Calculations)) ?? new GeneratorModels.Calculation[0];

                        generatedProviderResult.Calculations = fundingCalculations.Where(_ => uniqueCalculations.TryAdd(_.TemplateCalculationId, _)).Select(_ =>
                        {
                            return(_mapper.Map <FundingCalculation>(_));
                        }).ToList();

                        // Set Provider information
                        generatedProviderResult.Provider = _mapper.Map <Provider>(provider);

                        results.TryAdd(provider.ProviderId, generatedProviderResult);
                    }
                });

            return(results);
        }