private async Task <bool> IsSearchParametersValidAsync(SearchParametersViewModel viewModel)
        {
            var result = true;

            var routeIds = await _routePathService.GetRouteIdsAsync();

            if (viewModel.SelectedRouteId == null || routeIds.All(id => id != viewModel.SelectedRouteId))
            {
                ModelState.AddModelError("SelectedRouteId", "You must select a valid skill area");
                result = false;
            }

            var(isValid, formattedPostcode) = await _locationService.IsValidPostcodeAsync(viewModel.Postcode);

            if (string.IsNullOrWhiteSpace(viewModel.Postcode) || !isValid)
            {
                ModelState.AddModelError("Postcode", "You must enter a real postcode");
                result = false;
            }
            else
            {
                viewModel.Postcode = formattedPostcode;
            }

            return(result);
        }
Пример #2
0
        public When_ProviderProximity_Controller_RefineSearchResults_Is_Called()
        {
            var locationService = Substitute.For <ILocationService>();

            locationService.IsValidPostcodeAsync(Arg.Any <string>()).Returns((true, "CV1 2WT"));

            var opportunityProximityService = Substitute.For <IOpportunityProximityService>();

            _routeService = Substitute.For <IRoutePathService>();
            _routeService.GetRouteIdsAsync().Returns(new List <int> {
                1, 2
            });

            var opportunityService = Substitute.For <IOpportunityService>();

            var opportunityProximityController = new OpportunityProximityController(_routeService, opportunityProximityService, opportunityService,
                                                                                    locationService);

            var viewModel = new SearchParametersViewModel
            {
                Postcode           = "CV12WT",
                SelectedRouteId    = 1,
                CompanyNameWithAka = "CompanyName (AlsoKnownAs)"
            };

            _result = opportunityProximityController.RefineSearchResultsAsync(viewModel).GetAwaiter().GetResult();
        }
        public When_OpportunityProximity_Controller_RefineSearchResults_Is_Called_With_Invalid_Postcode()
        {
            const string requestPostcode = "CV1234";
            var          httpClient      = new TestPostcodesIoHttpClient().Get(requestPostcode);

            var routes = new List <SelectListItem>
            {
                new SelectListItem {
                    Text = "1", Value = "Route 1"
                }
            };

            var locationService = new LocationService(new LocationApiClient(httpClient, new MatchingConfiguration
            {
                PostcodeRetrieverBaseUrl = "https://api.postcodes.io"
            }));

            var opportunityProximityService = new OpportunityProximityService(Substitute.For <ISearchProvider>(), locationService);

            var routePathService = Substitute.For <IRoutePathService>();

            routePathService.GetRouteSelectListItemsAsync().Returns(routes);

            var opportunityService = Substitute.For <IOpportunityService>();

            _opportunityProximityController = new OpportunityProximityController(routePathService, opportunityProximityService, opportunityService, locationService);

            var viewModel = new SearchParametersViewModel
            {
                Postcode        = "CV1234",
                SelectedRouteId = 1
            };

            _result = _opportunityProximityController.RefineSearchResultsAsync(viewModel).GetAwaiter().GetResult();
        }
Пример #4
0
        public When_OpportunityProximity_Controller_RefineSearchResults_Is_Called_With_Unformatted_Postcode()
        {
            const string requestPostcode = "Cv 12 Wt";
            var          httpClient      = new TestPostcodesIoHttpClient().Get(requestPostcode);

            var locationService = new LocationService(new LocationApiClient(httpClient, new MatchingConfiguration
            {
                PostcodeRetrieverBaseUrl = "https://api.postcodes.io"
            }));

            var opportunityProximityService = new OpportunityProximityService(Substitute.For <ISearchProvider>(), locationService);

            _routeService = Substitute.For <IRoutePathService>();
            _routeService.GetRouteIdsAsync().Returns(new List <int> {
                1, 2
            });

            var opportunityService = Substitute.For <IOpportunityService>();

            var opportunityProximityController = new OpportunityProximityController(_routeService, opportunityProximityService, opportunityService, locationService);

            var viewModel = new SearchParametersViewModel
            {
                Postcode        = requestPostcode,
                SelectedRouteId = 1
            };

            _result = opportunityProximityController.RefineSearchResultsAsync(viewModel).GetAwaiter().GetResult();
        }
Пример #5
0
        public IActionResult SearchForCustomer(SearchParametersViewModel model)
        {
            if (model.City == null && model.Name == null)
            {
                ViewBag.Message = "At least one field is mandatory";
                return(View());
            }
            var result = _customerService.GetCustomersByCityOrName(model.Name, model.City);


            var resultViewModel = new List <SearchParametersViewModel>();

            foreach (var item in result)
            {
                var newItem = new SearchParametersViewModel();
                newItem.City       = item.City;
                newItem.CustomerId = item.CustomerId;
                newItem.Name       = item.Givenname + " " + item.Surname;
                newItem.NationalId = item.NationalId;
                newItem.Adress     = item.Streetaddress;
                resultViewModel.Add(newItem);
            }
            var jsonList = JsonConvert.SerializeObject(resultViewModel);

            HttpContext.Session.SetString("SearchResults", jsonList);

            return(View("SearchResults", resultViewModel.ToPagedList(1, pageSize)));
        }
        public async Task <IActionResult> Index(int?opportunityId = null)
        {
            var viewModel = new SearchParametersViewModel
            {
                OpportunityId   = opportunityId ?? 0,
                SelectedRouteId = null,
                Postcode        = null
            };

            return(View(nameof(Index), await GetSearchParametersViewModelAsync(viewModel)));
        }
        public async Task <IActionResult> RefineSearchResultsAsync(SearchParametersViewModel viewModel)
        {
            if (!ModelState.IsValid || !await IsSearchParametersValidAsync(viewModel))
            {
                return(View("Results", new OpportunityProximitySearchViewModel
                {
                    SearchParameters = await GetSearchParametersViewModelAsync(viewModel),
                    SearchResults = new OpportunityProximitySearchResultsViewModel(),
                    IsValidSearch = false
                }));
            }

            return(RedirectToRoute("GetOpportunityProviderResults", viewModel));
        }
Пример #8
0
 public IActionResult SelectCustomer(SearchParametersViewModel model)
 {
     if (ModelState.IsValid)
     {
         var customerModel = CreateCustomerViewModel(model.CustomerId);
         if (customerModel == null)
         {
             ViewBag.Message = "No customer found by that id number";
             return(View());
         }
         return(View("CustomerDetails", customerModel));
     }
     return(View());
 }
        public async Task <IActionResult> GetOpportunityProviderResultsAsync(SearchParametersViewModel searchParametersViewModel)
        {
            if (!ModelState.IsValid || !await IsSearchParametersValidAsync(searchParametersViewModel))
            {
                return(View("Results", new OpportunityProximitySearchViewModel
                {
                    SearchParameters = await GetSearchParametersViewModelAsync(searchParametersViewModel),
                    SearchResults = new OpportunityProximitySearchResultsViewModel(),
                    IsValidSearch = false
                }));
            }

            var resultsViewModel = await GetSearchResultsAsync(searchParametersViewModel);

            return(View("Results", resultsViewModel));
        }
        public async Task <IActionResult> FindProviders(SearchParametersViewModel viewModel)
        {
            if (!ModelState.IsValid || !await IsSearchParametersValidAsync(viewModel))
            {
                return(View(nameof(Index), await GetSearchParametersViewModelAsync(viewModel)));
            }

            return(RedirectToRoute("GetOpportunityProviderResults", new SearchParametersViewModel
            {
                SelectedRouteId = viewModel.SelectedRouteId,
                Postcode = viewModel.Postcode,
                OpportunityId = viewModel.OpportunityId,
                OpportunityItemId = viewModel.OpportunityItemId,
                CompanyNameWithAka = viewModel.CompanyNameWithAka
            }));
        }
Пример #11
0
        public When_OpportunityProximity_Controller_FindProviders_Is_Called_With_Invalid_Postcode()
        {
            const string requestPostcode = "cV12 34";
            var          httpClient      = new TestPostcodesIoHttpClient().Get(requestPostcode);

            var routes = new List <SelectListItem>
            {
                new SelectListItem {
                    Text = "1", Value = "Route 1"
                },
                new SelectListItem {
                    Text = "2", Value = "Route 2"
                }
            };

            var     config = new MapperConfiguration(c => c.AddMaps(typeof(SearchParametersViewModelMapper).Assembly));
            IMapper mapper = new Mapper(config);

            var locationService = new LocationService(
                new LocationApiClient(httpClient, new MatchingConfiguration
            {
                PostcodeRetrieverBaseUrl = "https://api.postcodes.io"
            }));

            var opportunityProximityService = new OpportunityProximityService(Substitute.For <ISearchProvider>(), locationService);

            var routePathService = Substitute.For <IRoutePathService>();

            routePathService.GetRouteSelectListItemsAsync().Returns(routes);

            var opportunityService = Substitute.For <IOpportunityService>();

            _opportunityProximityController = new OpportunityProximityController(routePathService, opportunityProximityService, opportunityService, locationService);

            var          selectedRouteId = routes.First().Text;
            const string postcode        = requestPostcode;

            var viewModel = new SearchParametersViewModel
            {
                RoutesSelectList = mapper.Map <SelectListItem[]>(routes),
                SelectedRouteId  = int.Parse(selectedRouteId),
                Postcode         = postcode
            };

            _result = _opportunityProximityController.FindProviders(viewModel).GetAwaiter().GetResult();
        }
        public async Task <JsonResult> CreateSearch([FromBody] SearchParametersViewModel searchCriteria)
        {
            if (ModelState.IsValid)
            {
                var search = new Search()
                {
                    Customer      = await _customerSevice.GetCustomer(searchCriteria.CustomerId),
                    Deposit       = searchCriteria.Deposit,
                    PropertyValue = searchCriteria.PropertyValue,
                    MortgageType  = (MortgageTypeIdentifier)searchCriteria.MortgageType
                };
                var searchId = await _searchService.CreateSearch(search);

                return(new JsonResult(new { searchId = searchId }));
            }
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return(new JsonResult(""));
        }
Пример #13
0
        public When_OpportunityProximity_Controller_FindProviders_Is_Called_For_Invalid_Postcode()
        {
            var locationService = Substitute.For <ILocationService>();

            locationService.IsValidPostcodeAsync(Arg.Any <string>()).Returns((false, null));

            var opportunityProximityService = Substitute.For <IOpportunityProximityService>();

            _routeService = Substitute.For <IRoutePathService>();
            _routeService.GetRouteIdsAsync().Returns(new List <int> {
                1, 2
            });

            var opportunityService = Substitute.For <IOpportunityService>();

            var opportunityProximityController = new OpportunityProximityController(_routeService, opportunityProximityService, opportunityService, locationService);

            const string postcode = "XYZ A12";

            var viewModel = new SearchParametersViewModel
            {
                RoutesSelectList = new List <SelectListItem>
                {
                    new SelectListItem {
                        Text = "1", Value = "Route 1"
                    },
                    new SelectListItem {
                        Text = "2", Value = "Route 2"
                    }
                },
                SelectedRouteId = 1,
                Postcode        = postcode
            };

            _result = opportunityProximityController.FindProviders(viewModel).GetAwaiter().GetResult();
        }
        private async Task <SearchParametersViewModel> GetSearchParametersViewModelAsync(SearchParametersViewModel viewModel)
        {
            if (viewModel.OpportunityId > 0 && string.IsNullOrEmpty(viewModel.CompanyNameWithAka))
            {
                viewModel.CompanyNameWithAka = await _opportunityService.GetCompanyNameWithAkaAsync(viewModel.OpportunityId);
            }

            var routes = await _routePathService.GetRouteSelectListItemsAsync();

            return(new SearchParametersViewModel
            {
                RoutesSelectList = routes,
                SelectedRouteId = viewModel.SelectedRouteId,
                Postcode = viewModel.Postcode?.Trim(),
                OpportunityId = viewModel.OpportunityId,
                OpportunityItemId = viewModel.OpportunityItemId,
                CompanyNameWithAka = viewModel.CompanyNameWithAka,
                PreviousPostcode = viewModel.PreviousPostcode,
                PreviousSelectedRouteId = viewModel.PreviousSelectedRouteId,
                HasUserChangedSearchParameters = viewModel.HasUserChangedSearchParameters
            });
        }
        private async Task <OpportunityProximitySearchViewModel> GetSearchResultsAsync(SearchParametersViewModel viewModel)
        {
            var searchResults = await _opportunityProximityService.SearchOpportunitiesByPostcodeProximityAsync(new OpportunityProximitySearchParametersDto
            {
                Postcode        = viewModel.Postcode,
                SelectedRouteId = viewModel.SelectedRouteId,
                SearchRadius    = SearchParametersViewModel.DefaultSearchRadius
            });

            var additionalResults = searchResults.Any()
                ? new List <OpportunityProximitySearchResultByRouteViewModelItem>()
                : await _opportunityProximityService.SearchOpportunitiesForOtherRoutesByPostcodeProximityAsync(new OpportunityProximitySearchParametersDto
            {
                Postcode        = viewModel.Postcode,
                SelectedRouteId = viewModel.SelectedRouteId,
                SearchRadius    = SearchParametersViewModel.ZeroResultsSearchRadius
            });

            var resultsViewModel = new OpportunityProximitySearchViewModel
            {
                SearchResults = new OpportunityProximitySearchResultsViewModel
                {
                    Results           = searchResults,
                    AdditionalResults = additionalResults
                },
                SearchParameters  = await GetSearchParametersViewModelAsync(viewModel),
                OpportunityId     = viewModel.OpportunityId,
                OpportunityItemId = viewModel.OpportunityItemId
            };

            if (searchResults.Any() &&
                viewModel.OpportunityId != 0 &&
                viewModel.OpportunityItemId != 0 &&
                !viewModel.HasUserChangedSearchParameters)
            {
                var opportunityItem =
                    await _opportunityService.GetOpportunityItemAsync(resultsViewModel.SearchParameters
                                                                      .OpportunityItemId);

                if (opportunityItem != null &&
                    opportunityItem.Postcode == resultsViewModel.SearchParameters.Postcode &&
                    opportunityItem.RouteId == resultsViewModel.SearchParameters.SelectedRouteId)
                {
                    await SetProviderIsSelectedAsync(resultsViewModel);
                }
            }

            if (!resultsViewModel.SearchParameters.HasUserChangedSearchParameters &&
                (resultsViewModel.SearchParameters.PreviousPostcode != null &&
                 resultsViewModel.SearchParameters.PreviousPostcode != viewModel.Postcode) ||
                (resultsViewModel.SearchParameters.PreviousSelectedRouteId != null &&
                 resultsViewModel.SearchParameters.PreviousSelectedRouteId != viewModel.SelectedRouteId))
            {
                //Set a flag to stop results being re-selected if user has changed search parameters
                resultsViewModel.SearchParameters.HasUserChangedSearchParameters = true;
            }

            resultsViewModel.SearchParameters.PreviousPostcode        = viewModel.Postcode;
            resultsViewModel.SearchParameters.PreviousSelectedRouteId = viewModel.SelectedRouteId;

            return(resultsViewModel);
        }
Пример #16
0
 public ActionResult SubmitSearch(SearchParametersViewModel param)
 {
     return(Redirect("/Collection/GetCollection/" + param.Quantity.ToString()));
 }