Ejemplo n.º 1
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnProviderPayment_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                IdentifierValue           = "1003",
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.Provider,
                ProviderVersionId         = _providerVersionId
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Payment,
                                                                                                                  new List <Provider> {
                scopedProviders.Where(_ => _.TrustCode == "102").First()
            }
                                                                                                                  );

            group.Name
            .Should()
            .Be("Provider 3");

            group.Identifier
            .Should()
            .Be("1003");

            group.Identifiers
            .Should()
            .BeEmpty();
        }
Ejemplo n.º 2
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnAcadmeyTrustInformation_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                GroupTypeIdentifier       = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.AcademyTrustCode,
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.AcademyTrust
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Information,
                                                                                                                  scopedProviders);

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Academy Trust 1");

            group.Identifier
            .Should()
            .Be("101");

            group.Identifiers.Count()
            .Should()
            .Be(2);
        }
Ejemplo n.º 3
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnCountryInformation_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                GroupTypeIdentifier       = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.CountryCode,
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.Country
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Information,
                                                                                                                  scopedProviders.Where(_ => _.TrustStatus != TrustStatus.SupportedByAMultiAcademyTrust));

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Country 1");

            group.Identifier
            .Should()
            .Be("C1");

            group.Identifiers.Count()
            .Should()
            .Be(0);
        }
Ejemplo n.º 4
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnDfeEstablshmentNummberInformation_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                GroupTypeIdentifier = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.DfeEstablishmentNumber
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Information,
                                                                                                                  scopedProviders.Where(_ => _.TrustStatus != TrustStatus.SupportedByAMultiAcademyTrust));

            group.Name
            .Should()
            .Be("Dfe Establishment Number");

            group.Identifier
            .Should()
            .Be("Dfe Establishment Number");

            group.Identifiers
            .Should()
            .BeNull();
        }
Ejemplo n.º 5
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnMultiAcadmeyTrustPayment_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                IdentifierValue           = "106",
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.AcademyTrust,
                ProviderVersionId         = _providerVersionId
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Payment,
                                                                                                                  new List <Provider> {
                scopedProviders.Where(_ => _.TrustCode == "106" && _.ProviderType == "Academy trust").First()
            });

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Academy Trust 2");

            group.Identifier
            .Should()
            .Be("1008");

            group.Identifiers.Count()
            .Should()
            .Be(2);
        }
Ejemplo n.º 6
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnMultiAcademyTrustForContracting_ThenTargetOrganisationGroupReturned()
        {
            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                IdentifierValue           = "106",
                GroupTypeIdentifier       = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.UKPRN,
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.AcademyTrust,
                ProviderVersionId         = _providerVersionId,
            };

            AndCoreProviderListExistsWithStandardProviders();

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Contracting,
                                                                                                                  _scopedProviders.Where(_ => _.TrustCode == "106" && _.ProviderType == "Academy trust"));

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Academy Trust 2");

            group.Identifier
            .Should()
            .Be("1008");
        }
Ejemplo n.º 7
0
        public async Task <int> Generate(FeedOptions options)
        {
            IEnumerable <Provider> records = GetRecords(options.InputFilePath);

            foreach (Provider provider in records)
            {
                PublishedProviderVersion publishedProviderVersion = GetPublishedProviderVersion(provider);
                Common.TemplateMetadata.Models.TemplateMetadataContents templateMetadataContents = GetProviderTemplateMetadataContents();
                TemplateMapping         templateMapping         = GetTemplateMapping();
                GeneratedProviderResult generatedProviderResult = GetGeneratedProviderResult(provider);

                string generatedProviderDocumentContent = _publishedProviderContentsGenerator.GenerateContents(publishedProviderVersion, templateMetadataContents, templateMapping);
                PublishProviderDocument(options, publishedProviderVersion, generatedProviderDocumentContent);
            }

            int fundingIndex = 0;

            foreach (IGrouping <(string, string, string), Provider> groupingKey in records.GroupBy(provider => (provider.LACode, provider.MajorVersionNo, provider.AllocationID)))
            {
                OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
                {
                    OrganisationGroupTypeCode = GetOrganisationGroupTypeCode(groupingKey.Key.Item3),
                    IdentifierValue           = groupingKey.Key.Item1,
                    GroupTypeIdentifier       = CalculateFunding.Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.LACode,
                    ProviderVersionId         = options.ProviderVersion
                };
                IEnumerable <ProviderApiClient> apiClientProviders      = GetApiClientProviders(groupingKey);
                TargetOrganisationGroup         targetOrganisationGroup = null;

                try
                {
                    targetOrganisationGroup = await organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters, Common.ApiClient.Policies.Models.GroupingReason.Payment, apiClientProviders);
                }
                catch (Exception ex)
                {
                    string message = $"Could not find provider with ID:{organisationGroupLookupParameters.IdentifierValue} with error message {ex}";
                    _logger.Error(message);
                    Console.WriteLine(message);

                    continue;
                }

                PublishedFundingVersion publishedFundingVersion = GetPublishedFundingVersion(groupingKey, targetOrganisationGroup, fundingIndex);
                Common.TemplateMetadata.Models.TemplateMetadataContents templateMetadataContents = GetFundingTemplateMetadataContents();
                string generatedFundingDocumentContent = _publishedFundingContentsGenerator.GenerateContents(publishedFundingVersion, templateMetadataContents);

                PublishFundingDocument(options, publishedFundingVersion, generatedFundingDocumentContent);

                fundingIndex++;
            }

            _logger.Information("NAV Data generation completed.");

            return(1);
        }
Ejemplo n.º 8
0
        private async Task <TargetOrganisationGroup> ObtainTargetOrganisationGroupFromProviderData(string providerVersionId, OrganisationGroupingConfiguration grouping, IGrouping <string, Provider> providerGrouping)
        {
            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                IdentifierValue           = providerGrouping.Key,
                OrganisationGroupTypeCode = grouping.OrganisationGroupTypeCode,
                ProviderVersionId         = providerVersionId,
                GroupTypeIdentifier       = grouping.GroupTypeIdentifier
            };

            TargetOrganisationGroup targetOrganisationGroup = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters, grouping.GroupingReason, providerGrouping);

            return(targetOrganisationGroup);
        }
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnLocalAuthorityInformation_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                GroupTypeIdentifier       = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.LACode,
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.LocalAuthority
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters,
                                                                                                                  Common.ApiClient.Policies.Models.GroupingReason.Information,
                                                                                                                  scopedProviders.Where(_ => _.TrustStatus != TrustStatus.SupportedByAMultiAcademyTrust));

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Local Authority 1");

            group.Identifier
            .Should()
            .Be("101");

            group.Identifiers.Count()
            .Should()
            .Be(2);

            group.Identifiers.Any(_ => _.Type == Enums.OrganisationGroupTypeIdentifier.LACode)
            .Should()
            .Be(true);

            group.Identifiers.Any(_ => _.Type == Enums.OrganisationGroupTypeIdentifier.UKPRN)
            .Should()
            .Be(true);

            group.Identifiers.Should().ContainEquivalentOf(new OrganisationIdentifier()
            {
                Type  = Enums.OrganisationGroupTypeIdentifier.LACode,
                Value = "101"
            });


            group.Identifiers.Should().ContainEquivalentOf(new OrganisationIdentifier()
            {
                Type  = Enums.OrganisationGroupTypeIdentifier.UKPRN,
                Value = "LA101"
            });
        }
Ejemplo n.º 10
0
        public async Task WhenLookingUpTargetOrganisationGroupBasedOnLocalAuthorityPayment_ThenTargetOrganisationGroupReturned()
        {
            IEnumerable <Provider> scopedProviders = GenerateScopedProviders();

            OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
            {
                IdentifierValue           = "101",
                OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.LocalAuthority,
                ProviderVersionId         = _providerVersionId
            };

            TargetOrganisationGroup group = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(
                organisationGroupLookupParameters,
                Common.ApiClient.Policies.Models.GroupingReason.Payment,
                new List <Provider> {
                scopedProviders.Where(_ => _.TrustCode == "101").First()
            });

            group.Identifiers.Any();

            group.Name
            .Should()
            .Be("Provider 1");

            group.Identifier
            .Should()
            .Be("1001");

            group.Identifiers.Count()
            .Should()
            .Be(3);

            group.Identifiers.Any(_ => _.Type == Enums.OrganisationGroupTypeIdentifier.UKPRN)
            .Should()
            .Be(true);

            group.Identifiers.Any(_ => _.Type == Enums.OrganisationGroupTypeIdentifier.LACode)
            .Should()
            .Be(true);

            group.Identifiers.Any(_ => _.Type == Enums.OrganisationGroupTypeIdentifier.DfeNumber)
            .Should()
            .Be(true);
        }
Ejemplo n.º 11
0
        public async Task <int> Generate(FeedOptions options)
        {
            IEnumerable <Provider> records = GetRecords(options.InputFilePath);

            foreach (Provider provider in records)
            {
                PublishedProviderVersion publishedProviderVersion = GetPublishedProviderVersion(provider);
                Common.TemplateMetadata.Models.TemplateMetadataContents templateMetadataContents = GetProviderTemplateMetadataContents();
                TemplateMapping         templateMapping         = GetTemplateMapping();
                GeneratedProviderResult generatedProviderResult = GetGeneratedProviderResult(provider);

                string generatedProviderDocumentContent = _publishedProviderContentsGenerator.GenerateContents(publishedProviderVersion, templateMetadataContents, templateMapping);
                PublishProviderDocument(options, publishedProviderVersion, generatedProviderDocumentContent);
            }

            int fundingIndex = 0;

            foreach (IGrouping <string, Provider> laGroup in records.GroupBy(x => x.ProviderLaCode))
            {
                OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
                {
                    OrganisationGroupTypeCode = Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.LocalAuthority,
                    IdentifierValue           = laGroup.Key,
                    GroupTypeIdentifier       = Common.ApiClient.Policies.Models.OrganisationGroupTypeIdentifier.LACode,
                    ProviderVersionId         = options.ProviderVersion
                };
                IEnumerable <ProviderApiClient> apiClientProviders      = GetApiClientProviders(laGroup);
                TargetOrganisationGroup         targetOrganisationGroup = await organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters, Common.ApiClient.Policies.Models.GroupingReason.Payment, apiClientProviders);

                PublishedFundingVersion publishedFundingVersion = GetPublishedFundingVersion(laGroup, targetOrganisationGroup, fundingIndex);
                Common.TemplateMetadata.Models.TemplateMetadataContents templateMetadataContents = GetFundingTemplateMetadataContents();
                string generatedFundingDocumentContent = _publishedFundingContentsGenerator.GenerateContents(publishedFundingVersion, templateMetadataContents);

                PublishFundingDocument(options, publishedFundingVersion, generatedFundingDocumentContent);

                fundingIndex++;
            }

            _logger.Information("NAV Data generation completed.");

            return(1);
        }
Ejemplo n.º 12
0
        public async Task <IEnumerable <OrganisationGroupResult> > GenerateOrganisationGroup(FundingConfiguration fundingConfiguration, IEnumerable <Provider> scopedProviders, string providerVersionId)
        {
            Guard.ArgumentNotNull(fundingConfiguration, nameof(fundingConfiguration));
            Guard.ArgumentNotNull(scopedProviders, nameof(scopedProviders));
            Guard.IsNullOrWhiteSpace(providerVersionId, nameof(providerVersionId));

            List <OrganisationGroupResult> results = new List <OrganisationGroupResult>();

            foreach (OrganisationGroupingConfiguration grouping in fundingConfiguration.OrganisationGroupings)
            {
                // Get the provider attribute required to group
                Func <Provider, string> providerFilterAttribute = GetProviderFieldForGrouping(grouping.GroupTypeIdentifier, grouping.OrganisationGroupTypeCode, grouping.GroupingReason);

                // Filter providers based on provider type and subtypes
                IEnumerable <Provider> providersForGroup = grouping.ProviderTypeMatch.IsNullOrEmpty() ? scopedProviders : scopedProviders.Where(_ => ShouldIncludeProvider(_, grouping.ProviderTypeMatch));

                // Group providers by the fields and discard any providers with null values for that field
                IEnumerable <IGrouping <string, Provider> > groupedProviders = providersForGroup.GroupBy(providerFilterAttribute);

                // Common values for all groups
                Enums.OrganisationGroupTypeClassification organisationGroupTypeClassification = grouping.GroupingReason == GroupingReason.Payment ? Enums.OrganisationGroupTypeClassification.LegalEntity : Enums.OrganisationGroupTypeClassification.GeographicalBoundary;
                Enums.OrganisationGroupTypeCode           organisationGroupTypeCode           = grouping.OrganisationGroupTypeCode.AsMatchingEnum <Enums.OrganisationGroupTypeCode>();

                // Generate Organisation Group results based on the grouped providers
                foreach (IGrouping <string, Provider> providerGrouping in groupedProviders)
                {
                    // Ignore providers without the matching data in the key
                    if (string.IsNullOrWhiteSpace(providerGrouping.Key))
                    {
                        continue;
                    }

                    TargetOrganisationGroup targetOrganisationGroup = null;

                    OrganisationGroupLookupParameters organisationGroupLookupParameters = new OrganisationGroupLookupParameters
                    {
                        IdentifierValue           = providerGrouping.Key,
                        OrganisationGroupTypeCode = grouping.OrganisationGroupTypeCode,
                        ProviderVersionId         = providerVersionId,
                        GroupTypeIdentifier       = grouping.GroupTypeIdentifier
                    };

                    targetOrganisationGroup = await _organisationGroupTargetProviderLookup.GetTargetProviderDetails(organisationGroupLookupParameters, grouping.GroupingReason, providerGrouping);

                    if (targetOrganisationGroup == null)
                    {
                        // TODO: improve logging
                        throw new Exception($"Target Organisation Group could not be found for identifier '{providerGrouping.Key}'");
                    }

                    OrganisationGroupResult organisationGroupResult = new OrganisationGroupResult()
                    {
                        GroupTypeClassification = organisationGroupTypeClassification,
                        GroupTypeCode           = organisationGroupTypeCode,
                        GroupTypeIdentifier     = grouping.GroupTypeIdentifier.AsMatchingEnum <Enums.OrganisationGroupTypeIdentifier>(),
                        GroupReason             = grouping.GroupingReason.AsMatchingEnum <Enums.OrganisationGroupingReason>(),
                        IdentifierValue         = targetOrganisationGroup.Identifier,
                        Name           = targetOrganisationGroup.Name,
                        Identifiers    = targetOrganisationGroup.Identifiers,
                        SearchableName = GenerateSearchableName(targetOrganisationGroup.Name),
                        Providers      = providerGrouping,
                    };

                    results.Add(organisationGroupResult);
                }
            }

            return(results);
        }
Ejemplo n.º 13
0
        public async Task <IEnumerable <OrganisationGroupResult> > GenerateOrganisationGroup(
            FundingConfiguration fundingConfiguration,
            IEnumerable <Provider> scopedProviders,
            string providerVersionId,
            int?providerSnapshotId = null)
        {
            Guard.ArgumentNotNull(fundingConfiguration, nameof(fundingConfiguration));
            Guard.ArgumentNotNull(scopedProviders, nameof(scopedProviders));
            Guard.IsNullOrWhiteSpace(providerVersionId, nameof(providerVersionId));

            List <OrganisationGroupResult> results = new List <OrganisationGroupResult>();

            Dictionary <string, FdzPaymentOrganisation> paymentOrganisations = new Dictionary <string, FdzPaymentOrganisation>();

            if (fundingConfiguration.ProviderSource == ProviderSource.FDZ &&
                fundingConfiguration.OrganisationGroupings.Any(g => g.GroupingReason == GroupingReason.Payment ||
                                                               g.GroupingReason == GroupingReason.Contracting ||
                                                               g.GroupingReason == GroupingReason.Indicative))
            {
                if (!providerSnapshotId.HasValue)
                {
                    throw new InvalidOperationException("No provider snapshot ID provided, but it is required fto lookup Payment Organisations from FDZ");
                }

                ApiResponse <IEnumerable <FdzPaymentOrganisation> > paymentOrganisationsResponse = await _fundingDataZoneApiClient.GetAllOrganisations(providerSnapshotId.Value);

                if (paymentOrganisationsResponse.StatusCode == System.Net.HttpStatusCode.OK && paymentOrganisationsResponse.Content != null)
                {
                    foreach (FdzPaymentOrganisation fdzPaymentOrganisation in paymentOrganisationsResponse.Content)
                    {
                        if (paymentOrganisations.ContainsKey(fdzPaymentOrganisation.Ukprn))
                        {
                            throw new Exception($"The payment organisation group: '{fdzPaymentOrganisation.Ukprn}' needs to be unique for provider snapshot ID '{providerSnapshotId}'.");
                        }
                        else
                        {
                            paymentOrganisations.Add(fdzPaymentOrganisation.Ukprn, fdzPaymentOrganisation);
                        }
                    }
                }
                else
                {
                    throw new InvalidOperationException($"Unable to retreive payment organisations from provider snapshot ID of {providerSnapshotId}");
                }
            }

            foreach (OrganisationGroupingConfiguration grouping in fundingConfiguration.OrganisationGroupings)
            {
                // Get the provider attribute required to group
                Func <Provider, string> providerFilterAttribute = GetProviderFieldForGrouping(grouping.GroupTypeIdentifier, grouping.OrganisationGroupTypeCode, grouping.GroupingReason, fundingConfiguration.PaymentOrganisationSource);

                // Filter providers based on provider type and subtypes
                IEnumerable <Provider> providersForGroup = grouping.ProviderTypeMatch.IsNullOrEmpty() ? scopedProviders : scopedProviders.Where(_ => ShouldIncludeProvider(_, grouping.ProviderTypeMatch));

                // Filter providers based on provider status
                providersForGroup = grouping.ProviderStatus.IsNullOrEmpty() ? providersForGroup : providersForGroup.Where(_ => ShouldIncludeProvider(_, grouping.ProviderStatus));

                // Group providers by the fields and discard any providers with null values for that field
                IEnumerable <IGrouping <string, Provider> > groupedProviders = providersForGroup.GroupBy(providerFilterAttribute);

                // Common values for all groups
                Enums.OrganisationGroupTypeClassification organisationGroupTypeClassification = grouping.GroupingReason.IsForProviderPayment() ? Enums.OrganisationGroupTypeClassification.LegalEntity : Enums.OrganisationGroupTypeClassification.GeographicalBoundary;
                Enums.OrganisationGroupTypeCode           organisationGroupTypeCode           = grouping.OrganisationGroupTypeCode.AsMatchingEnum <Enums.OrganisationGroupTypeCode>();

                // Generate Organisation Group results based on the grouped providers
                foreach (IGrouping <string, Provider> providerGrouping in groupedProviders)
                {
                    // Ignore providers without the matching data in the key
                    if (string.IsNullOrWhiteSpace(providerGrouping.Key))
                    {
                        continue;
                    }

                    TargetOrganisationGroup targetOrganisationGroup = null;

                    if (fundingConfiguration.PaymentOrganisationSource == PaymentOrganisationSource.PaymentOrganisationFields &&
                        grouping.GroupingReason.IsForProviderPayment())
                    {
                        IEnumerable <OrganisationIdentifier> identifiers;

                        // lookup alternative identifier and name from FDZ's PaymentOrganisation table via FDZ service
                        if (fundingConfiguration.ProviderSource == ProviderSource.FDZ &&
                            paymentOrganisations.TryGetValue(providerGrouping.Key, out FdzPaymentOrganisation fdzPaymentOrganisation))
                        {
                            identifiers = GetIdentifiers(fdzPaymentOrganisation);
                        }
                        else
                        {
                            identifiers = new OrganisationIdentifier[0];
                        }

                        // Will use providerGrouping.Key as the identifier of the PaymentOrganisation
                        targetOrganisationGroup = new TargetOrganisationGroup()
                        {
                            Identifier  = providerGrouping.First().PaymentOrganisationIdentifier,
                            Name        = providerGrouping.First().PaymentOrganisationName,
                            Identifiers = identifiers,
                        };
                    }
                    else if (fundingConfiguration.PaymentOrganisationSource == PaymentOrganisationSource.PaymentOrganisationAsProvider ||
                             (fundingConfiguration.PaymentOrganisationSource == PaymentOrganisationSource.PaymentOrganisationFields &&
                              !grouping.GroupingReason.IsForProviderPayment())
                             )
                    {
                        targetOrganisationGroup = await ObtainTargetOrganisationGroupFromProviderData(fundingConfiguration, providerVersionId, grouping, providerGrouping, targetOrganisationGroup);
                    }


                    if (targetOrganisationGroup == null)
                    {
                        // TODO: improve logging
                        throw new Exception($"Target Organisation Group could not be found for identifier '{providerGrouping.Key}'");
                    }

                    OrganisationGroupResult organisationGroupResult = new OrganisationGroupResult()
                    {
                        GroupTypeClassification = organisationGroupTypeClassification,
                        GroupTypeCode           = organisationGroupTypeCode,
                        GroupTypeIdentifier     = grouping.GroupTypeIdentifier.AsMatchingEnum <Enums.OrganisationGroupTypeIdentifier>(),
                        GroupReason             = grouping.GroupingReason.AsMatchingEnum <Enums.OrganisationGroupingReason>(),
                        IdentifierValue         = targetOrganisationGroup.Identifier,
                        Name           = targetOrganisationGroup.Name,
                        Identifiers    = targetOrganisationGroup.Identifiers,
                        SearchableName = Sanitiser.SanitiseName(targetOrganisationGroup.Name),
                        Providers      = providerGrouping,
                    };

                    results.Add(organisationGroupResult);
                }
            }

            return(results);
        }
Ejemplo n.º 14
0
        private PublishedFundingVersion GetPublishedFundingVersion(IGrouping <string, Provider> laGroup, TargetOrganisationGroup targetOrganisationGroup, int fundingIndex)
        {
            Provider anyProvider = laGroup.FirstOrDefault();
            PublishedFundingVersion publishedFundingVersion = new PublishedFundingVersion
            {
                FundingId         = $"{anyProvider?.FundingStreamId}-{(PublishedFundingPeriodType)Enum.Parse(typeof(PublishedFundingPeriodType), anyProvider?.FundingStreamPeriodTypeId)}-{anyProvider?.FundingPeriodId}-{GroupingReason.Payment.ToString()}-{Common.ApiClient.Policies.Models.OrganisationGroupTypeCode.LocalAuthority.ToString()}-{targetOrganisationGroup?.Identifier}-{MajorVersion}_{MinorVersion}",
                SchemaVersion     = "1.0",
                TemplateVersion   = "1.0",
                MajorVersion      = MajorVersion,
                MinorVersion      = MinorVersion,
                ProviderFundings  = laGroup.Select(x => GetFundingId(x)),
                GroupingReason    = GroupingReason.Payment,
                FundingStreamId   = anyProvider?.FundingStreamId,
                FundingStreamName = anyProvider?.FundingStreamName,
                FundingPeriod     = new PublishedFundingPeriod
                {
                    Type      = (PublishedFundingPeriodType)Enum.Parse(typeof(PublishedFundingPeriodType), anyProvider?.FundingStreamPeriodTypeId),
                    Period    = anyProvider?.FundingPeriodId,
                    Name      = anyProvider?.FundingStreamPeriodTypeName,
                    StartDate = new DateTime(2000 + int.Parse(anyProvider?.FundingPeriodId.Substring(0, 2)), int.Parse(anyProvider?.FundingStreamPeriodTypeStartMonth), int.Parse(anyProvider?.FundingStreamPeriodTypeStartDay)),
                    EndDate   = new DateTime(2000 + int.Parse(anyProvider?.FundingPeriodId.Substring(2, 2)), int.Parse(anyProvider?.FundingStreamPeriodTypeEndMoth), int.Parse(anyProvider?.FundingStreamPeriodTypeEndDay))
                },
                OrganisationGroupTypeIdentifier = targetOrganisationGroup?.Identifier,
                OrganisationGroupName           = targetOrganisationGroup?.Name,
                OrganisationGroupIdentifiers    = targetOrganisationGroup?.Identifiers?.Select(x => new PublishedOrganisationGroupTypeIdentifier
                {
                    Value = x.Value,
                    Type  = Enum.GetName(typeof(OrganisationGroupTypeIdentifier), x.Type)
                }),
                OrganisationGroupTypeClassification = "LegalEntity",
                OrganisationGroupIdentifierValue    = targetOrganisationGroup?.Identifiers?.Where(x => x.Type == OrganisationGroupTypeIdentifier.UKPRN).FirstOrDefault()?.Value,
                OrganisationGroupSearchableName     = Sanitiser.SanitiseName(targetOrganisationGroup?.Name),
                FundingLines = new List <FundingLine>
                {
                    new FundingLine
                    {
                        TemplateLineId      = TemplateLineId,
                        Value               = decimal.ToInt64(laGroup.Sum(x => decimal.Parse(x.OctoberProfileValue) + decimal.Parse(x.AprilProfileValue))),
                        DistributionPeriods = laGroup
                                              .GroupBy(la => la.OctoberDistributionPeriod)
                                              .Select(dp => new DistributionPeriod {
                            DistributionPeriodId = dp.Key,
                            Value          = dp.Sum(p => decimal.Parse(p.OctoberProfileValue)),
                            ProfilePeriods = new List <ProfilePeriod>
                            {
                                new ProfilePeriod
                                {
                                    Type                 = ProfilePeriodType.CalendarMonth,
                                    TypeValue            = dp.FirstOrDefault()?.OctoberPeriod,
                                    Year                 = int.Parse(dp.FirstOrDefault()?.OctoberPeriodYear),
                                    Occurrence           = 1,
                                    ProfiledValue        = dp.Sum(p => decimal.Parse(p.OctoberProfileValue)),
                                    DistributionPeriodId = dp.Key
                                }
                            }
                        })
                                              .Concat(laGroup
                                                      .GroupBy(la => la.AprilDistributionPeriod)
                                                      .Select(dp => new DistributionPeriod {
                            DistributionPeriodId = dp.Key,
                            Value          = dp.Sum(p => decimal.Parse(p.AprilProfileValue)),
                            ProfilePeriods = new List <ProfilePeriod>
                            {
                                new ProfilePeriod
                                {
                                    Type                 = ProfilePeriodType.CalendarMonth,
                                    TypeValue            = dp.FirstOrDefault()?.AprilPeriod,
                                    Year                 = int.Parse(dp.FirstOrDefault()?.AprilPeriodYear),
                                    Occurrence           = 1,
                                    ProfiledValue        = dp.Sum(p => decimal.Parse(p.AprilProfileValue)),
                                    DistributionPeriodId = dp.Key
                                }
                            }
                        })
                                                      )
                    }
                },
                StatusChangedDate            = hardcodedStatusDate.AddMinutes(fundingIndex),
                ExternalPublicationDate      = hardcodedStatusDate.AddMinutes(fundingIndex),
                EarliestPaymentAvailableDate = hardcodedStatusDate.AddMinutes(fundingIndex)
            };

            if (publishedFundingVersion.FundingLines != null)
            {
                publishedFundingVersion.TotalFunding = publishedFundingVersion.FundingLines
                                                       .Where(fundingLine => fundingLine != null)
                                                       .Aggregate(
                    (decimal?)null,
                    (current, fundingLineTotal) => current.AddValueIfNotNull(fundingLineTotal.Value));
            }

            return(publishedFundingVersion);
        }