public SearchResults <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters> GetSuggestedApprenticeshipVacancies(
            ApprenticeshipSearchParameters searchParameters,
            IList <ApprenticeshipApplicationSummary> candidateApplications,
            int vacancyId)
        {
            var vacancy            = _vacancyDataProvider.GetVacancyDetails(vacancyId);
            var vacancySubCategory = _referenceDataService.GetSubCategoryByName(vacancy.SubCategory);

            if (vacancySubCategory == null)
            {
                return(null);
            }

            searchParameters.CategoryCode     = vacancySubCategory.ParentCategoryCodeName;
            searchParameters.SubCategoryCodes = new[] { vacancySubCategory.CodeName };

            var excludeVacancyIds = candidateApplications.Select(x => x.LegacyVacancyId).ToList();

            excludeVacancyIds.Add(vacancyId);
            searchParameters.ExcludeVacancyIds = excludeVacancyIds;

            if (searchParameters.Location != null)
            {
                if (searchParameters.Location.GeoPoint == null || (searchParameters.Location.GeoPoint.Latitude == 0 && searchParameters.Location.GeoPoint.Longitude == 0))
                {
                    var locations = _locationSearchService.FindLocation(searchParameters.Location.Name);
                    searchParameters.Location = locations != null?locations.FirstOrDefault() : null;
                }
            }

            if (searchParameters.Location == null)
            {
                searchParameters.Location = new Location
                {
                    Name     = vacancy.VacancyAddress.Postcode,
                    GeoPoint = new GeoPoint
                    {
                        Latitude  = vacancy.VacancyAddress.GeoPoint.Latitude,
                        Longitude = vacancy.VacancyAddress.GeoPoint.Longitude,
                    }
                };
            }

            var searchResults = _searchService.Search(searchParameters);

            if (searchResults.Total == 0)
            {
                //Widen search to category alone
                searchParameters.SubCategoryCodes = null;
                searchResults = _searchService.Search(searchParameters);
            }

            return(searchResults);
        }
示例#2
0
        public TraineeshipSearchResponseViewModel FindVacancies(TraineeshipSearchViewModel search)
        {
            _logger.Debug("Calling SearchProvider to find traineeship vacancies.");
            string vacancyReference;
            var    searchLocation     = _traineeshipSearchMapper.Map <TraineeshipSearchViewModel, Location>(search);
            var    isVacancyReference = VacancyHelper.TryGetVacancyReference(search.ReferenceNumber, out vacancyReference);

            try
            {
                var searchRequest = new TraineeshipSearchParameters
                {
                    Location     = searchLocation,
                    PageNumber   = search.PageNumber,
                    PageSize     = search.ResultsPerPage,
                    SearchRadius = search.WithinDistance,
                    SortType     = search.SortType
                };
                if (isVacancyReference)
                {
                    searchRequest.VacancyReference = vacancyReference;
                }

                var searchResults = _traineeshipSearchService.Search(searchRequest);

                if (searchResults.Total == 1)
                {
                    var exactMatchResponse = _traineeshipSearchMapper.Map <SearchResults <TraineeshipSearchResponse, TraineeshipSearchParameters>, TraineeshipSearchResponseViewModel>(searchResults);
                    exactMatchResponse.ExactMatchFound = true;
                    return(exactMatchResponse);
                }

                if (searchResults.Total > 1)
                {
                    _logger.Info($"{searchResults.Total} results found for Vacancy Reference Number {vacancyReference}");
                }
                var searchResponse =
                    _traineeshipSearchMapper.Map <SearchResults <TraineeshipSearchResponse, TraineeshipSearchParameters>, TraineeshipSearchResponseViewModel>(
                        searchResults);

                searchResponse.TotalHits     = searchResults.Total;
                searchResponse.PageSize      = search.ResultsPerPage;
                searchResponse.VacancySearch = search;

                return(searchResponse);
            }
            catch (CustomException ex)
            {
                // ReSharper disable once FormatStringProblem
                _logger.Error("Find traineeship vacancies failed. Check inner details for more info", ex);
                return(new TraineeshipSearchResponseViewModel(VacancySearchResultsPageMessages.VacancySearchFailed));
            }
            catch (Exception e)
            {
                _logger.Error("Find traineeship vacancies failed. Check inner details for more info", e);
                throw;
            }
        }
示例#3
0
        public TraineeshipSearchResponseViewModel FindVacancies(TraineeshipSearchViewModel search)
        {
            _logger.Debug("Calling SearchProvider to find traineeship vacancies.");

            var searchLocation = _traineeshipSearchMapper.Map <TraineeshipSearchViewModel, Location>(search);

            try
            {
                var searchRequest = new TraineeshipSearchParameters
                {
                    Location     = searchLocation,
                    PageNumber   = search.PageNumber,
                    PageSize     = search.ResultsPerPage,
                    SearchRadius = search.WithinDistance,
                    SortType     = search.SortType,
                };

                var searchResults = _traineeshipSearchService.Search(searchRequest);

                var searchResponse =
                    _traineeshipSearchMapper.Map <SearchResults <TraineeshipSearchResponse, TraineeshipSearchParameters>, TraineeshipSearchResponseViewModel>(
                        searchResults);

                searchResponse.TotalHits     = searchResults.Total;
                searchResponse.PageSize      = search.ResultsPerPage;
                searchResponse.VacancySearch = search;

                return(searchResponse);
            }
            catch (CustomException ex)
            {
                // ReSharper disable once FormatStringProblem
                _logger.Error("Find traineeship vacancies failed. Check inner details for more info", ex);
                return(new TraineeshipSearchResponseViewModel(VacancySearchResultsPageMessages.VacancySearchFailed));
            }
            catch (Exception e)
            {
                _logger.Error("Find traineeship vacancies failed. Check inner details for more info", e);
                throw;
            }
        }
示例#4
0
        public ApprenticeshipSearchResponseViewModel FindVacancies(ApprenticeshipSearchViewModel search)
        {
            _logger.Debug("Calling SearchProvider to find apprenticeship vacancies.");

            var searchLocation = _apprenticeshipSearchMapper.Map <ApprenticeshipSearchViewModel, Location>(search);

            try
            {
                string vacancyReference;
                var    isVacancyReference = VacancyHelper.TryGetVacancyReference(search.Keywords, out vacancyReference);

                if ((search.SearchField == ApprenticeshipSearchField.All.ToString() && isVacancyReference) || search.SearchField == ApprenticeshipSearchField.ReferenceNumber.ToString())
                {
                    if (isVacancyReference)
                    {
                        var searchParameters = new ApprenticeshipSearchParameters
                        {
                            VacancyReference = vacancyReference,
                            PageNumber       = 1,
                            PageSize         = 1
                        };

                        var searchResults = _apprenticeshipSearchService.Search(searchParameters);

                        //Expect only a single result. Any other number should be interpreted as no results
                        if (searchResults.Total == 1)
                        {
                            var exactMatchResponse = _apprenticeshipSearchMapper.Map <SearchResults <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters>, ApprenticeshipSearchResponseViewModel>(searchResults);
                            exactMatchResponse.ExactMatchFound = true;
                            return(exactMatchResponse);
                        }

                        if (searchResults.Total > 1)
                        {
                            _logger.Info("{0} results found for Vacancy Reference Number {1} parsed from {2}. Expected 0 or 1", searchResults.Total, vacancyReference, search.Keywords);
                        }
                    }

                    var response = new ApprenticeshipSearchResponseViewModel
                    {
                        Vacancies     = new List <ApprenticeshipVacancySummaryViewModel>(),
                        VacancySearch = search
                    };

                    return(response);
                }

                var results = ProcessNationalAndNonNationalSearches(search, searchLocation);

                var nationalResults    = results[ResultsKeys.National];
                var nonNationalResults = results[ResultsKeys.NonNational];
                var unfilteredResults  = results[ResultsKeys.Unfiltered];

                var nationalResponse = _apprenticeshipSearchMapper.Map <SearchResults <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters>, ApprenticeshipSearchResponseViewModel>(nationalResults);

                nationalResponse.VacancySearch = search;

                var nonNationalResponse = _apprenticeshipSearchMapper.Map <SearchResults <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters>, ApprenticeshipSearchResponseViewModel>(nonNationalResults);

                nonNationalResponse.VacancySearch = search;

                if (search.LocationType == ApprenticeshipLocationType.NonNational)
                {
                    nonNationalResponse.TotalLocalHits    = nonNationalResults.Total;
                    nonNationalResponse.TotalNationalHits = nationalResults.Total;
                    nonNationalResponse.PageSize          = search.ResultsPerPage;

                    if (nonNationalResults.Total == 0 && nationalResults.Total > 0)
                    {
                        nonNationalResponse.Vacancies = nationalResponse.Vacancies;

                        var vacancySearch = nonNationalResponse.VacancySearch;

                        if (vacancySearch.SearchAction == SearchAction.Search || vacancySearch.SortType == VacancySearchSortType.Distance)
                        {
                            vacancySearch.SortType = string.IsNullOrWhiteSpace(vacancySearch.Keywords) ? VacancySearchSortType.ClosingDate : VacancySearchSortType.Relevancy;
                        }

                        vacancySearch.LocationType = ApprenticeshipLocationType.National;
                        SetAggregationResults(nonNationalResponse, nationalResults.AggregationResults, unfilteredResults.AggregationResults);
                    }
                    else
                    {
                        SetAggregationResults(nonNationalResponse, nonNationalResults.AggregationResults, unfilteredResults.AggregationResults);
                    }

                    return(nonNationalResponse);
                }

                nationalResponse.TotalLocalHits    = nonNationalResults.Total;
                nationalResponse.TotalNationalHits = nationalResults.Total;
                nationalResponse.PageSize          = search.ResultsPerPage;

                if (nationalResults.Total == 0 && nonNationalResults.Total > 0)
                {
                    nationalResponse.Vacancies = nonNationalResponse.Vacancies;
                    SetAggregationResults(nonNationalResponse, nonNationalResults.AggregationResults, unfilteredResults.AggregationResults);
                }
                else
                {
                    SetAggregationResults(nonNationalResponse, nationalResults.AggregationResults, unfilteredResults.AggregationResults);
                }

                return(nationalResponse);
            }
            catch (CustomException ex)
            {
                _logger.Error("Find apprenticeship vacancies failed. Check inner details for more info", ex);
                return(new ApprenticeshipSearchResponseViewModel(VacancySearchResultsPageMessages.VacancySearchFailed));
            }
            catch (Exception e)
            {
                _logger.Error("Find apprenticeship vacancies failed. Check inner details for more info", e);
                throw;
            }
        }