private void GivenTheOrganisationGroupsForTheFundingConfiguration(FundingConfiguration fundingConfiguration, IEnumerable <Provider> scopedProviders, string providerVersionId, IEnumerable <OrganisationGroupResult> organisationGroupResults) { _organisationGroupGenerator.GenerateOrganisationGroup( Arg.Is <FundingConfiguration>(f => f.Id == fundingConfiguration.Id), Arg.Is <IEnumerable <Common.ApiClient.Providers.Models.Provider> >(p => p.All(i => scopedProviders.Any(sp => sp.ProviderId == i.ProviderId))), providerVersionId) .Returns(organisationGroupResults); }
public async Task <PublishedFundingInput> GeneratePublishedFundingInput(IDictionary <string, PublishedProvider> publishedProvidersForFundingStream, IEnumerable <Provider> scopedProviders, Reference fundingStream, SpecificationSummary specification, IEnumerable <PublishedProvider> publishedProvidersInScope) { Guard.ArgumentNotNull(publishedProvidersForFundingStream, nameof(publishedProvidersForFundingStream)); Guard.ArgumentNotNull(scopedProviders, nameof(scopedProviders)); Guard.ArgumentNotNull(fundingStream, nameof(fundingStream)); Guard.ArgumentNotNull(specification, nameof(specification)); _logger.Information($"Fetching existing published funding"); // Get latest version of existing published funding IEnumerable <PublishedFunding> publishedFunding = await _publishingResiliencePolicy.ExecuteAsync(() => _publishedFundingDataService.GetCurrentPublishedFunding(fundingStream.Id, specification.FundingPeriod.Id)); _logger.Information($"Fetched {publishedFunding.Count()} existing published funding items"); _logger.Information($"Generating organisation groups"); FundingConfiguration fundingConfiguration = await _policiesService.GetFundingConfiguration(fundingStream.Id, specification.FundingPeriod.Id); TemplateMetadataContents templateMetadataContents = await ReadTemplateMetadataContents(fundingStream, specification); // Foreach group, determine the provider versions required to be latest IEnumerable <OrganisationGroupResult> organisationGroups = await _organisationGroupGenerator.GenerateOrganisationGroup(fundingConfiguration, _mapper.Map <IEnumerable <ApiProvider> >(scopedProviders), specification.ProviderVersionId, specification.ProviderSnapshotId); // filter out organisation groups which don't contain a provider which is in scope if (!publishedProvidersInScope.IsNullOrEmpty()) { HashSet <string> publishedProviderIdsInScope = new HashSet <string>(publishedProvidersInScope.DistinctBy(_ => _.Current.ProviderId).Select(_ => _.Current.ProviderId)); organisationGroups = organisationGroups.Where(_ => _.Providers.Any(provider => publishedProviderIdsInScope.Contains(provider.ProviderId))); } _logger.Information($"A total of {organisationGroups.Count()} were generated"); _logger.Information($"Generating organisation groups to save"); // Compare existing published provider versions with existing current PublishedFundingVersion IEnumerable <(PublishedFunding PublishedFunding, OrganisationGroupResult OrganisationGroupResult)> organisationGroupsToSave = _publishedFundingChangeDetectorService.GenerateOrganisationGroupsToSave(organisationGroups, publishedFunding, publishedProvidersForFundingStream); _logger.Information($"A total of {organisationGroupsToSave.Count()} organisation groups returned to save"); // Generate PublishedFundingVersion for new and updated PublishedFundings return(new PublishedFundingInput() { OrganisationGroupsToSave = organisationGroupsToSave, TemplateMetadataContents = templateMetadataContents, TemplateVersion = specification.TemplateIds[fundingStream.Id], FundingStream = fundingStream, FundingPeriod = await _policiesService.GetFundingPeriodByConfigurationId(specification.FundingPeriod.Id), PublishingDates = await _publishedFundingDateService.GetDatesForSpecification(specification.Id), SpecificationId = specification.Id, }); }