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