Пример #1
0
        public async Task <IActionResult> GetProviders([FromBody] SearchPublishedProvidersRequest request)
        {
            Guard.ArgumentNotNull(request, nameof(request));

            SearchRequestViewModel searchModel = new SearchRequestViewModel
            {
                SearchTerm      = request.SearchTerm,
                PageNumber      = request.PageNumber,
                Filters         = ExtractFilters(request),
                SearchMode      = request.SearchMode,
                ErrorToggle     = request.ErrorToggle,
                FacetCount      = request.FacetCount,
                IncludeFacets   = request.IncludeFacets,
                PageSize        = request.PageSize ?? 50,
                SearchFields    = request.SearchFields,
                FundingStreamId = request.FundingStreamId,
                FundingPeriodId = request.FundingPeriodId
            };

            PublishProviderSearchResultViewModel result = await _publishedProviderSearchService.PerformSearch(searchModel);

            if (result != null)
            {
                return(Ok(result));
            }

            return(new InternalServerErrorResult("Cannot find it"));
        }
        public async Task PerformSearch_GivenResultsWithoutErrors_ReturnsExpected()
        {
            int numberOfItems = 25;

            SearchResults <PublishedProviderSearchItem> searchResults = GenerateSearchResults(numberOfItems);

            _publishingClient
            .Setup(x => x.SearchPublishedProvider(It.IsAny <SearchModel>()))
            .ReturnsAsync(new ApiResponse <SearchResults <PublishedProviderSearchItem> >(HttpStatusCode.OK, searchResults));

            var providerStats = new ProviderFundingStreamStatusResponse {
                ProviderApprovedCount = 0, TotalFunding = 1234, ProviderDraftCount = numberOfItems
            };

            _publishingClient
            .Setup(x => x.GetProviderStatusCounts(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .ReturnsAsync(new ApiResponse <IEnumerable <ProviderFundingStreamStatusResponse> >(HttpStatusCode.OK, new []
            {
                providerStats
            }));

            FundingConfiguration config = new FundingConfiguration
            {
                ApprovalMode    = ApprovalMode.All,
                FundingStreamId = "stream",
                FundingPeriodId = "period",
                ProviderSource  = ProviderSource.CFS
            };

            _policiesApiClient
            .Setup(x => x.GetFundingConfiguration(It.IsAny <string>(), It.IsAny <string>()))
            .ReturnsAsync(new ApiResponse <FundingConfiguration>(HttpStatusCode.OK, config));

            _service = new PublishedProviderSearchService(_publishingClient.Object, _policiesApiClient.Object, _logger, _mapper);

            SearchRequestViewModel request = new SearchRequestViewModel {
                PageSize = 12
            };

            PublishProviderSearchResultViewModel result = await _service.PerformSearch(request);

            result.CanApprove.Should().BeTrue();
            result.Providers.Should().HaveCount(numberOfItems);
            result.TotalErrorResults.Should().Be(0);
            result.TotalProvidersToApprove.Should().Be(numberOfItems);
        }
        public async Task <PublishProviderSearchResultViewModel> PerformSearch(SearchRequestViewModel request)
        {
            Guard.ArgumentNotNull(request.PageSize, "PageSize");

            SearchModel requestOptions = new SearchModel
            {
                PageNumber    = request.PageNumber ?? 1,
                Top           = request.PageSize.Value,
                SearchTerm    = request.SearchTerm,
                IncludeFacets = request.IncludeFacets,
                Filters       = request.Filters,
                SearchMode    = Common.Models.Search.SearchMode.All,
                SearchFields  = request.SearchFields
            };

            if (request.PageNumber.HasValue && request.PageNumber.Value > 0)
            {
                requestOptions.PageNumber = request.PageNumber.Value;
            }

            var searchTask        = _publishingApiClient.SearchPublishedProvider(requestOptions);
            var fundingConfigTask = _policiesApiClient.GetFundingConfiguration(request.FundingStreamId, request.FundingPeriodId);

            ApiResponse <SearchResults <PublishedProviderSearchItem> > searchResponse = await searchTask;

            if (searchResponse == null)
            {
                _logger.Error("Find providers HTTP request failed");
                return(null);
            }

            PublishProviderSearchResultViewModel result = new PublishProviderSearchResultViewModel
            {
                TotalResults          = searchResponse.Content?.TotalCount ?? 0,
                TotalErrorResults     = searchResponse.Content?.TotalErrorCount ?? 0,
                CurrentPage           = requestOptions.PageNumber,
                Facets                = searchResponse.Content?.Facets?.Select(facet => _mapper.Map <SearchFacetViewModel>(facet)),
                Providers             = searchResponse.Content?.Results?.Select(provider => _mapper.Map <PublishedProviderSearchResultItemViewModel>(provider)),
                FilteredFundingAmount = searchResponse.Content?.Results?.Sum(x => x.FundingValue) ?? 0
            };

            int totalPages = (int)Math.Ceiling((double)result.TotalResults / (double)request.PageSize.Value);

            result.PagerState = new PagerState(requestOptions.PageNumber, totalPages, 4);

            int numberOfResultsInThisPage = result.Providers?.Count() ?? 0;

            if (numberOfResultsInThisPage > 0)
            {
                result.StartItemNumber = (result.PagerState.CurrentPage - 1) * request.PageSize.Value + 1;
                result.EndItemNumber   = result.StartItemNumber + numberOfResultsInThisPage - 1;
            }

            ApiResponse <FundingConfiguration> fundingConfigurationResponse = await fundingConfigTask;

            if (fundingConfigurationResponse.StatusCode != HttpStatusCode.OK)
            {
                _logger.Error($"Request failed to find funding configuration for stream {request.FundingStreamId} and period {request.FundingPeriodId}");
                return(null);
            }

            bool isBatchModeEnabled = fundingConfigurationResponse.Content.ApprovalMode == ApprovalMode.Batches;

            if (result.Providers != null && result.Providers.Any())
            {
                string[] providerTypes    = request.Filters.GetValueOrDefault("providerType") ?? new string[0];
                string[] localAuthorities = request.Filters.GetValueOrDefault("localAuthority") ?? new string[0];
                string[] fundingStatuses  = request.Filters.GetValueOrDefault("fundingStatus") ?? new string[0];
                ApiResponse <IEnumerable <ProviderFundingStreamStatusResponse> > providerStatusCounts =
                    await _publishingApiClient.GetProviderStatusCounts(
                        result.Providers.First().SpecificationId,
                        providerTypes.FirstOrDefault(),
                        localAuthorities.FirstOrDefault(),
                        fundingStatuses.FirstOrDefault()
                        );

                foreach (var providerStats in providerStatusCounts.Content)
                {
                    if (isBatchModeEnabled && providerStats.ProviderApprovedCount > 0)
                    {
                        result.CanPublish = true;
                    }

                    if (providerStats.ProviderDraftCount == 0 &&
                        providerStats.ProviderApprovedCount > 0 &&
                        providerStats.ProviderUpdatedCount == 0)
                    {
                        result.CanPublish = true;
                        result.TotalProvidersToPublish += providerStats.ProviderApprovedCount;
                    }

                    if (providerStats.ProviderDraftCount > 0 ||
                        providerStats.ProviderUpdatedCount > 0)
                    {
                        result.CanApprove = true;
                        result.TotalProvidersToApprove += providerStats.ProviderUpdatedCount;
                        result.TotalProvidersToApprove += providerStats.ProviderDraftCount;
                    }

                    if (providerStats.TotalFunding.HasValue)
                    {
                        result.TotalFundingAmount = +providerStats.TotalFunding.Value;
                    }
                }
            }

            return(result);
        }