Exemplo n.º 1
0
        public PublishedFundingService(IPublishedFundingDataService publishedFundingDataService,
                                       IPublishingResiliencePolicies publishingResiliencePolicies,
                                       IPoliciesService policiesService,
                                       IOrganisationGroupGenerator organisationGroupGenerator,
                                       IPublishedFundingChangeDetectorService publishedFundingChangeDetectorService,
                                       IPublishedFundingDateService publishedFundingDateService,
                                       IMapper mapper,
                                       ILogger logger)
        {
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(publishingResiliencePolicies.PublishedFundingRepository, nameof(publishingResiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(publishedFundingChangeDetectorService, nameof(publishedFundingChangeDetectorService));
            Guard.ArgumentNotNull(publishedFundingDateService, nameof(publishedFundingDateService));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(mapper, nameof(mapper));

            _publishedFundingDataService           = publishedFundingDataService;
            _publishingResiliencePolicy            = publishingResiliencePolicies.PublishedFundingRepository;
            _policiesService                       = policiesService;
            _organisationGroupGenerator            = organisationGroupGenerator;
            _publishedFundingChangeDetectorService = publishedFundingChangeDetectorService;
            _publishedFundingDateService           = publishedFundingDateService;
            _logger = logger;
            _mapper = mapper;
        }
        public void SetUp()
        {
            _logger = Substitute.For <ILogger>();
            _publishedFundingRepository = Substitute.For <IPublishedFundingRepository>();
            _specificationService       = Substitute.For <ISpecificationService>();
            _policiesService            = Substitute.For <IPoliciesService>();
            _calculationsService        = Substitute.For <ICalculationsService>();

            _service = new PublishedProviderFundingStructureService(
                _logger,
                _publishedFundingRepository,
                _specificationService,
                _policiesService,
                _calculationsService);
        }
        public PublishedProviderFundingStructureService(
            ILogger logger,
            IPublishedFundingRepository publishedFundingRepository,
            ISpecificationService specificationService,
            IPoliciesService policiesService,
            ICalculationsService calculationsService)
        {
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(publishedFundingRepository, nameof(publishedFundingRepository));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(calculationsService, nameof(calculationsService));

            _logger = logger;
            _publishedFundingRepository = publishedFundingRepository;
            _specificationService       = specificationService;
            _policiesService            = policiesService;
            _calculationsService        = calculationsService;
        }
Exemplo n.º 4
0
        public ProfileTotalsService(
            IPublishedFundingRepository publishedFunding,
            IPublishingResiliencePolicies resiliencePolicies,
            ISpecificationService specificationService,
            IPoliciesService policiesService,
            IProfilingService profilingService)
        {
            Guard.ArgumentNotNull(publishedFunding, nameof(publishedFunding));
            Guard.ArgumentNotNull(resiliencePolicies?.PublishedFundingRepository, nameof(resiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(profilingService, nameof(profilingService));

            _resilience           = resiliencePolicies.PublishedFundingRepository;
            _publishedFunding     = publishedFunding;
            _specificationService = specificationService;
            _policiesService      = policiesService;
            _profilingService     = profilingService;
        }
        public PublishIntegrityCheckService(IJobManagement jobManagement,
                                            ILogger logger,
                                            ISpecificationService specificationService,
                                            IProviderService providerService,
                                            IPublishedFundingContentsPersistanceService publishedFundingContentsPersistanceService,
                                            IPublishedProviderContentPersistanceService publishedProviderContentsPersistanceService,
                                            IPublishingResiliencePolicies publishingResiliencePolicies,
                                            IPublishedFundingDataService publishedFundingDataService,
                                            IPoliciesService policiesService,
                                            ICalculationsApiClient calculationsApiClient,
                                            IPublishedFundingService publishedFundingService,
                                            IPublishedProviderContentsGeneratorResolver publishedProviderContentsGeneratorResolver,
                                            IPublishedFundingVersionDataService publishedFundingVersionDataService) : base(jobManagement, logger)
        {
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(publishedFundingContentsPersistanceService, nameof(publishedFundingContentsPersistanceService));
            Guard.ArgumentNotNull(publishedProviderContentsPersistanceService, nameof(publishedProviderContentsPersistanceService));
            Guard.ArgumentNotNull(providerService, nameof(providerService));
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(publishingResiliencePolicies.PublishedFundingRepository, nameof(publishingResiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(calculationsApiClient, nameof(calculationsApiClient));
            Guard.ArgumentNotNull(publishingResiliencePolicies.CalculationsApiClient, nameof(publishingResiliencePolicies.CalculationsApiClient));
            Guard.ArgumentNotNull(publishedFundingService, nameof(publishedFundingService));
            Guard.ArgumentNotNull(publishedProviderContentsGeneratorResolver, nameof(publishedProviderContentsGeneratorResolver));
            Guard.ArgumentNotNull(publishedFundingVersionDataService, nameof(publishedFundingVersionDataService));

            _logger = logger;
            _calculationsApiClient       = calculationsApiClient;
            _calculationsApiClientPolicy = publishingResiliencePolicies.CalculationsApiClient;
            _specificationService        = specificationService;
            _publishedFundingContentsPersistanceService  = publishedFundingContentsPersistanceService;
            _publishedProviderContentsPersistanceService = publishedProviderContentsPersistanceService;
            _providerService             = providerService;
            _publishedFundingDataService = publishedFundingDataService;
            _publishingResiliencePolicy  = publishingResiliencePolicies.PublishedFundingRepository;
            _policiesService             = policiesService;
            _publishedProviderContentsGeneratorResolver = publishedProviderContentsGeneratorResolver;
            _publishedFundingVersionDataService         = publishedFundingVersionDataService;
        }
Exemplo n.º 6
0
        public PublishedProviderProfilingService(IPublishedFundingRepository publishedFundingRepository,
                                                 IPublishedProviderErrorDetection publishedProviderErrorDetection,
                                                 IProfilingService profilingService,
                                                 IPublishedProviderVersioningService publishedProviderVersioningService,
                                                 ISpecificationsApiClient specificationsApiClient,
                                                 IReProfilingRequestBuilder profilingRequestBuilder,
                                                 IProfilingApiClient profiling,
                                                 IPoliciesService policiesService,
                                                 IReProfilingResponseMapper reProfilingResponseMapper,
                                                 ILogger logger,
                                                 IPublishingResiliencePolicies publishingResiliencePolicies)
        {
            Guard.ArgumentNotNull(publishedFundingRepository, nameof(publishedFundingRepository));
            Guard.ArgumentNotNull(publishedProviderErrorDetection, nameof(publishedProviderErrorDetection));
            Guard.ArgumentNotNull(profilingService, nameof(profilingService));
            Guard.ArgumentNotNull(publishedProviderVersioningService, nameof(publishedProviderVersioningService));
            Guard.ArgumentNotNull(specificationsApiClient, nameof(specificationsApiClient));
            Guard.ArgumentNotNull(profilingRequestBuilder, nameof(profilingRequestBuilder));
            Guard.ArgumentNotNull(profiling, nameof(profiling));
            Guard.ArgumentNotNull(publishingResiliencePolicies?.PublishedFundingRepository, nameof(publishingResiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(publishingResiliencePolicies?.SpecificationsApiClient, nameof(publishingResiliencePolicies.SpecificationsApiClient));
            Guard.ArgumentNotNull(publishingResiliencePolicies?.ProfilingApiClient, nameof(publishingResiliencePolicies.ProfilingApiClient));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(reProfilingResponseMapper, nameof(reProfilingResponseMapper));

            _publishedFundingRepository      = publishedFundingRepository;
            _publishedProviderErrorDetection = publishedProviderErrorDetection;
            _profilingService = profilingService;
            _publishedProviderVersioningService = publishedProviderVersioningService;
            _specificationsApiClient            = specificationsApiClient;
            _profilingRequestBuilder            = profilingRequestBuilder;
            _profiling = profiling;
            _publishingResiliencePolicy    = publishingResiliencePolicies.PublishedFundingRepository;
            _specificationResiliencePolicy = publishingResiliencePolicies.SpecificationsApiClient;
            _profilingPolicy           = publishingResiliencePolicies.ProfilingApiClient;
            _logger                    = logger;
            _policiesService           = policiesService;
            _reProfilingResponseMapper = reProfilingResponseMapper;
        }
        public void SetUp()
        {
            _providers                   = Substitute.For <IProvidersApiClient>();
            _policiesService             = Substitute.For <IPoliciesService>();
            _publishedFundingDataService = Substitute.For <IPublishedFundingDataService>();
            _jobManagement               = Substitute.For <IJobManagement>();
            _logger = Substitute.For <ILogger>();
            _mapper = new MapperConfiguration(_ =>
            {
                _.AddProfile <PublishingServiceMappingProfile>();
            }).CreateMapper();

            _providerService = new ProviderService(_providers,
                                                   _policiesService,
                                                   _publishedFundingDataService,
                                                   new ResiliencePolicies
            {
                ProvidersApiClient = Policy.NoOpAsync()
            },
                                                   _mapper,
                                                   _jobManagement,
                                                   _logger);
        }
Exemplo n.º 8
0
        public ProviderService(IProvidersApiClient providersApiClient,
                               IPoliciesService policiesService,
                               IPublishedFundingDataService publishedFundingDataService,
                               IPublishingResiliencePolicies resiliencePolicies,
                               IMapper mapper,
                               IJobManagement jobManagement,
                               ILogger logger)
        {
            Guard.ArgumentNotNull(providersApiClient, nameof(providersApiClient));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(resiliencePolicies?.ProvidersApiClient, nameof(resiliencePolicies.ProvidersApiClient));
            Guard.ArgumentNotNull(jobManagement, nameof(jobManagement));
            Guard.ArgumentNotNull(mapper, nameof(mapper));
            Guard.ArgumentNotNull(logger, nameof(logger));

            _providersApiClient          = providersApiClient;
            _policiesService             = policiesService;
            _providersApiClientPolicy    = resiliencePolicies.ProvidersApiClient;
            _publishedFundingDataService = publishedFundingDataService;
            _jobManagement = jobManagement;
            _logger        = logger;
            _mapper        = mapper;
        }
Exemplo n.º 9
0
 public PoliciesController(WebApiPoliciesService policiesService)
 {
     this.policiesService = policiesService;
 }
Exemplo n.º 10
0
 public PoliciesController(IPoliciesService service)
     : base(service)
 {
 }
        public void Setup()
        {
            _publishedProviderId  = NewRandomString();
            _publishedProviderIds = new[] { _publishedProviderId };

            _publishedFundingStatusUpdateService = Substitute.For <IPublishedFundingStatusUpdateService>();
            _publishingResiliencePolicies        = new ResiliencePolicies
            {
                PublishedFundingRepository           = Policy.NoOpAsync(),
                CalculationsApiClient                = Policy.NoOpAsync(),
                SpecificationsApiClient              = Policy.NoOpAsync(),
                SpecificationsRepositoryPolicy       = Policy.NoOpAsync(),
                PublishedIndexSearchResiliencePolicy = Policy.NoOpAsync()
            };
            _specificationsApiClient           = Substitute.For <ISpecificationsApiClient>();
            _specificationService              = new SpecificationService(_specificationsApiClient, _publishingResiliencePolicies);
            _specificationFundingStatusService = Substitute.For <ISpecificationFundingStatusService>();
            _jobsRunning = Substitute.For <IJobsRunning>();
            _logger      = Substitute.For <ILogger>();
            _publishedFundingChangeDetectorService       = Substitute.For <IPublishedFundingChangeDetectorService>();
            _publishedFundingGenerator                   = Substitute.For <IPublishedFundingGenerator>();
            _publishedProviderContentsGeneratorResolver  = Substitute.For <IPublishedProviderContentsGeneratorResolver>();
            _publishedFundingContentsPersistanceService  = Substitute.For <IPublishedFundingContentsPersistanceService>();
            _publishedProviderContentsPersistanceService = Substitute.For <IPublishedProviderContentPersistanceService>();
            _publishedProviderStatusUpdateService        = Substitute.For <IPublishedProviderStatusUpdateService>();
            _publishedFundingSearchRepository            = Substitute.For <ISearchRepository <PublishedFundingIndex> >();
            _calculationsApiClient      = Substitute.For <ICalculationsApiClient>();
            _providerService            = Substitute.For <IProviderService>();
            _jobManagement              = Substitute.For <IJobManagement>();
            _prerequisiteCheckerLocator = Substitute.For <IPrerequisiteCheckerLocator>();
            _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.ReleaseAllProviders)
            .Returns(new PublishAllPrerequisiteChecker(_specificationFundingStatusService, _jobsRunning, _jobManagement, _logger));
            _prerequisiteCheckerLocator.GetPreReqChecker(PrerequisiteCheckerType.ReleaseBatchProviders)
            .Returns(new PublishBatchPrerequisiteChecker(_specificationFundingStatusService, _jobsRunning, _jobManagement, _logger));
            _generateCsvJobsLocator = Substitute.For <IGeneratePublishedFundingCsvJobsCreationLocator>();
            _mapper             = Substitute.For <IMapper>();
            _transactionFactory = new TransactionFactory(_logger, new TransactionResiliencePolicies {
                TransactionPolicy = Policy.NoOpAsync()
            });
            _publishedProviderVersionService = Substitute.For <IPublishedProviderVersionService>();
            _publishedFundingDataService     = Substitute.For <IPublishedFundingDataService>();
            _policiesService                       = Substitute.For <IPoliciesService>();
            _organisationGroupGenerator            = Substitute.For <IOrganisationGroupGenerator>();
            _publishedFundingChangeDetectorService = Substitute.For <IPublishedFundingChangeDetectorService>();
            _publishedFundingDateService           = Substitute.For <IPublishedFundingDateService>();
            _publishedFundingDataService           = Substitute.For <IPublishedFundingDataService>();
            _createPublishIntegrityJob             = Substitute.For <ICreatePublishIntegrityJob>();

            _publishedFundingService = new PublishedFundingService(_publishedFundingDataService,
                                                                   _publishingResiliencePolicies,
                                                                   _policiesService,
                                                                   _organisationGroupGenerator,
                                                                   _publishedFundingChangeDetectorService,
                                                                   _publishedFundingDateService,
                                                                   _mapper,
                                                                   _logger);

            _publishService = new PublishService(_publishedFundingStatusUpdateService,
                                                 _publishingResiliencePolicies,
                                                 _specificationService,
                                                 _prerequisiteCheckerLocator,
                                                 _publishedFundingChangeDetectorService,
                                                 _publishedFundingGenerator,
                                                 _publishedProviderContentsGeneratorResolver,
                                                 _publishedFundingContentsPersistanceService,
                                                 _publishedProviderContentsPersistanceService,
                                                 _publishedProviderStatusUpdateService,
                                                 _providerService,
                                                 _publishedFundingSearchRepository,
                                                 _calculationsApiClient,
                                                 _logger,
                                                 _jobManagement,
                                                 _generateCsvJobsLocator,
                                                 _transactionFactory,
                                                 _publishedProviderVersionService,
                                                 _publishedFundingService,
                                                 _publishedFundingDataService,
                                                 _policiesService,
                                                 _createPublishIntegrityJob
                                                 );
        }
Exemplo n.º 12
0
 public PoliciesController(IPoliciesService PoliciesService)
 {
     this._PoliciesService = PoliciesService;
 }
Exemplo n.º 13
0
 public AltranController(IClientsService clientsService, IPoliciesService policiesService)
 {
     _clientService   = clientsService;
     _policiesService = policiesService;
 }
Exemplo n.º 14
0
        public RefreshService(IPublishedProviderStatusUpdateService publishedProviderStatusUpdateService,
                              IPublishedFundingDataService publishedFundingDataService,
                              IPublishingResiliencePolicies publishingResiliencePolicies,
                              ISpecificationService specificationService,
                              IProviderService providerService,
                              ICalculationResultsService calculationResultsService,
                              IPublishedProviderDataGenerator publishedProviderDataGenerator,
                              IPublishedProviderDataPopulator publishedProviderDataPopulator,
                              ILogger logger,
                              ICalculationsApiClient calculationsApiClient,
                              IPrerequisiteCheckerLocator prerequisiteCheckerLocator,
                              IPublishProviderExclusionCheck providerExclusionCheck,
                              IFundingLineValueOverride fundingLineValueOverride,
                              IJobManagement jobManagement,
                              IPublishedProviderIndexerService publishedProviderIndexerService,
                              IVariationService variationService,
                              ITransactionFactory transactionFactory,
                              IPublishedProviderVersionService publishedProviderVersionService,
                              IPoliciesService policiesService,
                              IGeneratePublishedFundingCsvJobsCreationLocator generateCsvJobsLocator,
                              IReApplyCustomProfiles reApplyCustomProfiles,
                              IPublishingEngineOptions publishingEngineOptions,
                              IPublishedProviderErrorDetection detection,
                              IBatchProfilingService batchProfilingService) : base(jobManagement, logger)
        {
            Guard.ArgumentNotNull(generateCsvJobsLocator, nameof(generateCsvJobsLocator));
            Guard.ArgumentNotNull(publishedProviderStatusUpdateService, nameof(publishedProviderStatusUpdateService));
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(publishingResiliencePolicies, nameof(publishingResiliencePolicies));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(providerService, nameof(providerService));
            Guard.ArgumentNotNull(calculationResultsService, nameof(calculationResultsService));
            Guard.ArgumentNotNull(publishedProviderDataGenerator, nameof(publishedProviderDataGenerator));
            Guard.ArgumentNotNull(publishedProviderDataPopulator, nameof(publishedProviderDataPopulator));
            Guard.ArgumentNotNull(calculationsApiClient, nameof(calculationsApiClient));
            Guard.ArgumentNotNull(providerExclusionCheck, nameof(providerExclusionCheck));
            Guard.ArgumentNotNull(fundingLineValueOverride, nameof(fundingLineValueOverride));
            Guard.ArgumentNotNull(jobManagement, nameof(jobManagement));
            Guard.ArgumentNotNull(publishedProviderIndexerService, nameof(publishedProviderIndexerService));
            Guard.ArgumentNotNull(variationService, nameof(variationService));
            Guard.ArgumentNotNull(transactionFactory, nameof(transactionFactory));
            Guard.ArgumentNotNull(publishedProviderVersionService, nameof(publishedProviderVersionService));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(prerequisiteCheckerLocator, nameof(prerequisiteCheckerLocator));
            Guard.ArgumentNotNull(reApplyCustomProfiles, nameof(reApplyCustomProfiles));
            Guard.ArgumentNotNull(detection, nameof(detection));
            Guard.ArgumentNotNull(publishingResiliencePolicies.CalculationsApiClient, nameof(publishingResiliencePolicies.CalculationsApiClient));
            Guard.ArgumentNotNull(publishingResiliencePolicies.PublishedFundingRepository, nameof(publishingResiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(publishingEngineOptions, nameof(publishingEngineOptions));
            Guard.ArgumentNotNull(batchProfilingService, nameof(batchProfilingService));

            _publishedProviderStatusUpdateService = publishedProviderStatusUpdateService;
            _publishedFundingDataService          = publishedFundingDataService;
            _specificationService           = specificationService;
            _providerService                = providerService;
            _calculationResultsService      = calculationResultsService;
            _publishedProviderDataGenerator = publishedProviderDataGenerator;
            _publishedProviderDataPopulator = publishedProviderDataPopulator;
            _logger = logger;
            _calculationsApiClient      = calculationsApiClient;
            _prerequisiteCheckerLocator = prerequisiteCheckerLocator;
            _providerExclusionCheck     = providerExclusionCheck;
            _fundingLineValueOverride   = fundingLineValueOverride;
            _variationService           = variationService;
            _generateCsvJobsLocator     = generateCsvJobsLocator;
            _reApplyCustomProfiles      = reApplyCustomProfiles;
            _detection                       = detection;
            _batchProfilingService           = batchProfilingService;
            _publishedProviderIndexerService = publishedProviderIndexerService;

            _publishingResiliencePolicy  = publishingResiliencePolicies.PublishedFundingRepository;
            _calculationsApiClientPolicy = publishingResiliencePolicies.CalculationsApiClient;
            _jobManagement      = jobManagement;
            _transactionFactory = transactionFactory;
            _publishedProviderVersionService = publishedProviderVersionService;
            _policiesService         = policiesService;
            _publishingEngineOptions = publishingEngineOptions;
        }
        public ApplyCustomProfileRequestValidator(
            IPublishedFundingRepository publishedFunding,
            IPublishingResiliencePolicies resiliencePolicies,
            IPoliciesService policiesService)
        {
            Guard.ArgumentNotNull(publishedFunding, nameof(publishedFunding));
            Guard.ArgumentNotNull(resiliencePolicies?.PublishedFundingRepository, nameof(resiliencePolicies.PublishedFundingRepository));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));

            RuleFor(_ => _.FundingStreamId)
            .NotEmpty()
            .WithMessage("You must supply a funding stream id");

            RuleFor(_ => _.FundingPeriodId)
            .NotEmpty()
            .WithMessage("You must supply a funding period id");

            RuleFor(_ => _.FundingLineCode)
            .NotEmpty()
            .WithMessage("You must supply a funding line code");

            RuleFor(_ => _.ProviderId)
            .NotEmpty()
            .WithMessage("You must supply a provider id");

            RuleFor(_ => _.CustomProfileName)
            .NotEmpty()
            .WithMessage("You must supply a custom profile name");

            RuleFor(_ => _.ProfilePeriods)
            .NotEmpty()
            .WithMessage("You must supply at least one profile period");

            RuleFor(_ => _)
            .CustomAsync(async(request, ctx, ct) =>
            {
                string providerId      = request.ProviderId;
                string fundingPeriodId = request.FundingPeriodId;
                string fundingStreamId = request.FundingStreamId;
                string fundingLineCode = request.FundingLineCode;

                if (providerId.IsNotNullOrWhitespace() &&
                    fundingStreamId.IsNotNullOrWhitespace() &&
                    fundingPeriodId.IsNotNullOrWhitespace() &&
                    fundingLineCode.IsNotNullOrWhitespace())
                {
                    string id = $"publishedprovider-{providerId}-{fundingPeriodId}-{fundingStreamId}";

                    PublishedProvider publishedProvider = await resiliencePolicies.PublishedFundingRepository.ExecuteAsync(() =>
                                                                                                                           publishedFunding.GetPublishedProviderById(id, id));

                    if (publishedProvider == null)
                    {
                        ctx.AddFailure("Request", "No matching published provider located");
                    }
                    else if (publishedProvider.Current.FundingLines.All(_ => _.FundingLineCode != fundingLineCode))
                    {
                        ctx.AddFailure(nameof(request.FundingLineCode),
                                       $"Did not locate a funding line with code {fundingLineCode}");
                    }
                }

                //TODO: check whether the custom name is already in use on the provider??

                ProfilePeriod[] profilePeriods = (request.ProfilePeriods ?? Array.Empty <ProfilePeriod>()).ToArray();

                if (profilePeriods.GroupBy(_ => new
                {
                    _.Year,
                    _.Type,
                    _.TypeValue,
                    _.Occurrence,
                }).Any(_ => _.Count() > 1))
                {
                    ctx.AddFailure(nameof(DistributionPeriod.ProfilePeriods),
                                   "The profile periods must be for unique occurrences in a funding line");
                }

                if (profilePeriods.Any(_ => _.DistributionPeriodId == null || _.DistributionPeriodId.Trim().Length == 0))
                {
                    ctx.AddFailure(nameof(DistributionPeriod.ProfilePeriods),
                                   "The distribution id must be supplied for all profile periods");
                }
            });

            RuleFor(_ => _)
            .CustomAsync(async(request, ctx, ct) =>
            {
                string fundingPeriodId = request.FundingPeriodId;
                string fundingStreamId = request.FundingStreamId;
                string fundingLineCode = request.FundingLineCode;

                if (fundingStreamId.IsNotNullOrWhitespace() &&
                    fundingPeriodId.IsNotNullOrWhitespace())
                {
                    var fundingConfiguration = await policiesService.GetFundingConfiguration(fundingStreamId, fundingPeriodId);
                    if (fundingConfiguration == null || !fundingConfiguration.EnableUserEditableCustomProfiles)
                    {
                        ctx.AddFailure("Request", $"User not allowed to edit custom profiles for funding stream - '{fundingStreamId}' and funding period - '{fundingPeriodId}'");
                    }
                }
            });
        }
        public PublishService(IPublishedFundingStatusUpdateService publishedFundingStatusUpdateService,
                              IPublishingResiliencePolicies publishingResiliencePolicies,
                              ISpecificationService specificationService,
                              IPrerequisiteCheckerLocator prerequisiteCheckerLocator,
                              IPublishedFundingChangeDetectorService publishedFundingChangeDetectorService,
                              IPublishedFundingGenerator publishedFundingGenerator,
                              IPublishedProviderContentsGeneratorResolver publishedProviderContentsGeneratorResolver,
                              IPublishedFundingContentsPersistanceService publishedFundingContentsPersistanceService,
                              IPublishedProviderContentPersistanceService publishedProviderContentsPersistanceService,
                              IPublishedProviderStatusUpdateService publishedProviderStatusUpdateService,
                              IProviderService providerService,
                              ISearchRepository <PublishedFundingIndex> publishedFundingSearchRepository,
                              ICalculationsApiClient calculationsApiClient,
                              ILogger logger,
                              IJobManagement jobManagement,
                              IGeneratePublishedFundingCsvJobsCreationLocator generateCsvJobsLocator,
                              ITransactionFactory transactionFactory,
                              IPublishedProviderVersionService publishedProviderVersionService,
                              IPublishedFundingService publishedFundingService,
                              IPublishedFundingDataService publishedFundingDataService,
                              IPoliciesService policiesService,
                              ICreatePublishIntegrityJob createPublishIntegrityJob) : base(jobManagement, logger)
        {
            Guard.ArgumentNotNull(generateCsvJobsLocator, nameof(generateCsvJobsLocator));
            Guard.ArgumentNotNull(publishedFundingStatusUpdateService, nameof(publishedFundingStatusUpdateService));
            Guard.ArgumentNotNull(publishingResiliencePolicies, nameof(publishingResiliencePolicies));
            Guard.ArgumentNotNull(specificationService, nameof(specificationService));
            Guard.ArgumentNotNull(prerequisiteCheckerLocator, nameof(prerequisiteCheckerLocator));
            Guard.ArgumentNotNull(publishedFundingChangeDetectorService, nameof(publishedFundingChangeDetectorService));
            Guard.ArgumentNotNull(publishedFundingGenerator, nameof(publishedFundingGenerator));
            Guard.ArgumentNotNull(publishedFundingGenerator, nameof(publishedProviderContentsGeneratorResolver));
            Guard.ArgumentNotNull(publishedFundingContentsPersistanceService, nameof(publishedFundingContentsPersistanceService));
            Guard.ArgumentNotNull(publishedProviderContentsPersistanceService, nameof(publishedProviderContentsPersistanceService));
            Guard.ArgumentNotNull(publishedProviderStatusUpdateService, nameof(publishedProviderStatusUpdateService));
            Guard.ArgumentNotNull(publishedFundingSearchRepository, nameof(publishedFundingSearchRepository));
            Guard.ArgumentNotNull(providerService, nameof(providerService));
            Guard.ArgumentNotNull(publishedFundingService, nameof(publishedFundingService));
            Guard.ArgumentNotNull(calculationsApiClient, nameof(calculationsApiClient));
            Guard.ArgumentNotNull(publishingResiliencePolicies.CalculationsApiClient, nameof(publishingResiliencePolicies.CalculationsApiClient));
            Guard.ArgumentNotNull(logger, nameof(logger));
            Guard.ArgumentNotNull(jobManagement, nameof(jobManagement));
            Guard.ArgumentNotNull(publishingResiliencePolicies.PublishedIndexSearchResiliencePolicy, nameof(publishingResiliencePolicies.PublishedIndexSearchResiliencePolicy));
            Guard.ArgumentNotNull(transactionFactory, nameof(transactionFactory));
            Guard.ArgumentNotNull(publishedProviderVersionService, nameof(publishedProviderVersionService));
            Guard.ArgumentNotNull(publishedFundingDataService, nameof(publishedFundingDataService));
            Guard.ArgumentNotNull(policiesService, nameof(policiesService));
            Guard.ArgumentNotNull(createPublishIntegrityJob, nameof(createPublishIntegrityJob));

            _publishedFundingStatusUpdateService = publishedFundingStatusUpdateService;
            _publishedFundingDataService         = publishedFundingDataService;
            _specificationService       = specificationService;
            _prerequisiteCheckerLocator = prerequisiteCheckerLocator;
            _publishedFundingGenerator  = publishedFundingGenerator;
            _publishedProviderContentsGeneratorResolver  = publishedProviderContentsGeneratorResolver;
            _publishedFundingContentsPersistanceService  = publishedFundingContentsPersistanceService;
            _publishedProviderContentsPersistanceService = publishedProviderContentsPersistanceService;
            _publishedProviderStatusUpdateService        = publishedProviderStatusUpdateService;
            _publishedFundingSearchRepository            = publishedFundingSearchRepository;
            _logger = logger;
            _calculationsApiClient       = calculationsApiClient;
            _calculationsApiClientPolicy = publishingResiliencePolicies.CalculationsApiClient;
            _generateCsvJobsLocator      = generateCsvJobsLocator;
            _jobManagement = jobManagement;
            _publishedIndexSearchResiliencePolicy = publishingResiliencePolicies.PublishedIndexSearchResiliencePolicy;
            _transactionFactory = transactionFactory;
            _publishedProviderVersionService = publishedProviderVersionService;
            _providerService           = providerService;
            _publishedFundingService   = publishedFundingService;
            _policiesService           = policiesService;
            _createPublishIntegrityJob = createPublishIntegrityJob;
        }