public When_ProviderProximityService_Is_Called_To_Search_Providers_By_Postcode_Proximity_With_Route_Filter() { var dto = new ProviderProximitySearchParametersDto { Postcode = Postcode, SearchRadius = SearchRadius, SelectedRoutes = new List <int> { 12 } }; _searchProvider = Substitute.For <ISearchProvider>(); _searchProvider .SearchProvidersByPostcodeProximityAsync(dto) .Returns(new SearchResultsBuilder().Build()); _locationService = Substitute.For <ILocationService>(); _locationService.GetGeoLocationDataAsync(Postcode) .Returns(new PostcodeLookupResultDto { Postcode = Postcode, Longitude = "1.2", Latitude = "1.2" }); var routePathService = Substitute.For <IRoutePathService>(); var datetimeProvider = Substitute.For <IDateTimeProvider>(); var fileWriter = Substitute.For <IFileWriter <ProviderProximityReportDto> >(); var service = new ProviderProximityService(_searchProvider, _locationService, routePathService, fileWriter, datetimeProvider); _result = service.SearchProvidersByPostcodeProximityAsync(dto).GetAwaiter().GetResult(); }
public When_ProviderProximity_Controller_Download_Provider_Spreadsheet_Is_Called() { var locationService = Substitute.For <ILocationService>(); _providerProximityService = Substitute.For <IProviderProximityService>(); var routePathService = Substitute.For <IRoutePathService>(); var postcode = "CV1 2WT"; var filters = "Digital-Analog"; _searchParameters = new ProviderProximitySearchParametersDto { Postcode = postcode, SelectedRouteNames = new List <string>(filters.Split('-')) }; _providerProximityService.GetProviderProximitySpreadsheetDataAsync( Arg.Any <ProviderProximitySearchParametersDto>()) .Returns( new FileDownloadDto { FileName = "test_file.xlsx", ContentType = "application/file", FileContent = new byte[] { 01, 02 } }); var providerProximityController = new ProviderProximityController(routePathService, _providerProximityService, locationService); _result = providerProximityController.DownloadProviderProximitySpreadsheetAsync(postcode, filters).GetAwaiter().GetResult(); }
public async Task <FileDownloadDto> GetProviderProximitySpreadsheetDataAsync(ProviderProximitySearchParametersDto searchParameters) { var data = await SearchProvidersByPostcodeProximityForReportAsync(searchParameters); var fileContent = _providerProximityReportWriter.WriteReport(data); var formattedDate = _dateTimeProvider.UtcNow().ToGmtStandardTime().ToString("ddMMMyyyy"); return(new FileDownloadDto { FileName = $"{searchParameters.Postcode}_searchresults_{formattedDate}.xlsx", ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", FileContent = fileContent }); }
public async Task <IActionResult> DownloadProviderProximitySpreadsheetAsync(string postcode, string filters) { var allFilters = string.IsNullOrWhiteSpace(filters) ? "" : WebUtility.UrlDecode(filters); var filtersList = allFilters.Split('-', StringSplitOptions.RemoveEmptyEntries); var searchParameters = new ProviderProximitySearchParametersDto { Postcode = postcode, SearchRadius = SearchParametersViewModel.DefaultSearchRadius, SelectedRouteNames = filtersList }; var downloadedFileInfo = await _providerProximityService.GetProviderProximitySpreadsheetDataAsync(searchParameters); return(File(downloadedFileInfo.FileContent, downloadedFileInfo.ContentType, downloadedFileInfo.FileName)); }
private async Task <ProviderProximityReportDto> SearchProvidersByPostcodeProximityForReportAsync(ProviderProximitySearchParametersDto searchParameters) { var geoLocationData = await _locationService.GetGeoLocationDataAsync(searchParameters.Postcode); searchParameters.Latitude = geoLocationData.Latitude; searchParameters.Longitude = geoLocationData.Longitude; var searchResults = await _searchProvider.SearchProvidersByPostcodeProximityForReportAsync(searchParameters); if (searchParameters.SelectedRouteNames != null && searchParameters.SelectedRouteNames.Count > 0 && searchResults != null) { var routes = await _routePathService.GetRouteDictionaryAsync(); var selectedRouteIds = searchParameters.SelectedRouteNames .Select(r => routes.FirstOrDefault(x => x.Value == r)) .Select(key => key.Key) .ToList(); var filteredProviders = searchResults.Providers .Where(s => s.Routes.Any(r => selectedRouteIds.Contains(r.RouteId))) .Select(s => new ProviderProximityReportItemDto { Distance = s.Distance, ProviderVenueTown = s.ProviderVenueTown, ProviderVenuePostcode = s.ProviderVenuePostcode, ProviderDisplayName = s.ProviderDisplayName, ProviderVenueName = s.ProviderVenueName, PrimaryContact = s.PrimaryContact, PrimaryContactEmail = s.PrimaryContactEmail, PrimaryContactPhone = s.PrimaryContactPhone, SecondaryContact = s.SecondaryContact, SecondaryContactEmail = s.SecondaryContactEmail, SecondaryContactPhone = s.SecondaryContactPhone, Routes = s.Routes .Where(rt => selectedRouteIds.Contains(rt.RouteId)) }) .ToList(); searchResults.Providers = filteredProviders; } searchResults ??= new ProviderProximityReportDto(); searchResults.SkillAreas = searchParameters.SelectedRouteNames; return(searchResults); }
public async Task <IList <ProviderProximitySearchResultViewModelItem> > SearchProvidersByPostcodeProximityAsync(ProviderProximitySearchParametersDto searchParameters) { var geoLocationData = await _locationService.GetGeoLocationDataAsync(searchParameters.Postcode); searchParameters.Latitude = geoLocationData.Latitude; searchParameters.Longitude = geoLocationData.Longitude; var searchResults = await _searchProvider.SearchProvidersByPostcodeProximityAsync(searchParameters); if (searchParameters.SelectedRoutes != null && searchParameters.SelectedRoutes.Count > 0 && searchResults != null) { var filteredResults = searchResults .Where(s => s.Routes.Any(r => searchParameters.SelectedRoutes.Contains(r.RouteId))) .Select(s => new ProviderProximitySearchResultViewModelItem { Latitude = s.Latitude, Distance = s.Distance, ProviderVenueTown = s.ProviderVenueTown, ProviderName = s.ProviderName, ProviderVenuePostcode = s.ProviderVenuePostcode, ProviderVenueId = s.ProviderVenueId, ProviderDisplayName = s.ProviderDisplayName, ProviderVenueName = s.ProviderVenueName, IsTLevelProvider = s.IsTLevelProvider, Longitude = s.Longitude, Routes = s.Routes .Where(rt => searchParameters.SelectedRoutes.Contains(rt.RouteId)) }) .ToList(); return(filteredResults); } return(searchResults ?? new List <ProviderProximitySearchResultViewModelItem>()); }
public async Task <ProviderProximityReportDto> SearchProvidersByPostcodeProximityForReportAsync(ProviderProximitySearchParametersDto searchParameters) { _logger.LogInformation($"Searching for providers within radius {searchParameters.SearchRadius} of postcode '{searchParameters.Postcode}'"); var employerLocation = GetSearchStartPoint(searchParameters.Latitude, searchParameters.Longitude); var searchRadiusInMeters = searchParameters.SearchRadius * MilesToMeters; var resultTemp = await(from provider in _matchingDbContext.Provider join providerVenue in _matchingDbContext.ProviderVenue on provider.Id equals providerVenue.ProviderId join providerQualification in _matchingDbContext.ProviderQualification on providerVenue.Id equals providerQualification.ProviderVenueId join routePathMapping in _matchingDbContext.QualificationRouteMapping on providerQualification.QualificationId equals routePathMapping.QualificationId join qualification in _matchingDbContext.Qualification on routePathMapping.QualificationId equals qualification.Id join route in _matchingDbContext.Route on routePathMapping.RouteId equals route.Id orderby providerVenue.Location.Distance(employerLocation) where providerVenue.Location.Distance(employerLocation) <= searchRadiusInMeters && provider.IsCdfProvider && provider.IsEnabledForReferral && providerVenue.IsEnabledForReferral && !providerVenue.IsRemoved select new { ProviderVenueId = providerVenue.Id, ProviderName = provider.Name, ProviderDisplayName = provider.DisplayName, provider.PrimaryContact, provider.PrimaryContactEmail, provider.PrimaryContactPhone, provider.SecondaryContact, provider.SecondaryContactEmail, provider.SecondaryContactPhone, ProviderVenueName = providerVenue.Name, Distance = providerVenue.Location.Distance(employerLocation) / MilesToMeters, ProviderVenuePostcode = providerVenue.Postcode, ProviderVenueTown = providerVenue.Town, Latitude = providerVenue.Latitude ?? 0, Longitude = providerVenue.Longitude ?? 0, provider.IsTLevelProvider, RouteName = route.Name, RouteId = route.Id, QualificationShortTitle = qualification.ShortTitle }).Distinct().ToListAsync(); var result = resultTemp.GroupBy(g => new { g.Distance, g.IsTLevelProvider, g.Latitude, g.Longitude, g.ProviderDisplayName, g.PrimaryContact, g.PrimaryContactEmail, g.PrimaryContactPhone, g.SecondaryContact, g.SecondaryContactEmail, g.SecondaryContactPhone, g.ProviderVenueId, g.ProviderVenueName, g.ProviderVenuePostcode, g.ProviderVenueTown }) .Select(grp => new ProviderProximityReportItemDto { Distance = grp.Key.Distance, ProviderVenueTown = grp.Key.ProviderVenueTown, ProviderVenuePostcode = grp.Key.ProviderVenuePostcode, ProviderDisplayName = grp.Key.ProviderDisplayName, ProviderVenueName = grp.Key.ProviderVenueName, PrimaryContact = grp.Key.PrimaryContact, PrimaryContactEmail = grp.Key.PrimaryContactEmail, PrimaryContactPhone = grp.Key.PrimaryContactPhone, SecondaryContact = grp.Key.SecondaryContact, SecondaryContactEmail = grp.Key.SecondaryContactEmail, SecondaryContactPhone = grp.Key.SecondaryContactPhone, Routes = grp.GroupBy(rt => new { rt.RouteName, rt.RouteId }) .Select(rt => new RouteAndQualificationsDto { RouteName = rt.Key.RouteName, RouteId = rt.Key.RouteId, QualificationShortTitles = rt.Select(q => q.QualificationShortTitle) .OrderBy(q => q) }).OrderBy(rt => rt.RouteName) }).OrderBy(r => r.Distance) .ThenBy(r => { if (r.ProviderVenueName == r.ProviderVenuePostcode) { return(r.ProviderDisplayName); } else { return(r.ProviderVenueName); } }) .ToList(); var dto = new ProviderProximityReportDto { Providers = result, Postcode = searchParameters.Postcode, //TODO: Get selected route names //SkillAreas = searchParameters.SelectedRoutes }; return(dto); }
public async Task <IList <ProviderProximitySearchResultViewModelItem> > SearchProvidersByPostcodeProximityAsync(ProviderProximitySearchParametersDto dto) { _logger.LogInformation($"Searching for providers within radius {dto.SearchRadius} of postcode '{dto.Postcode}'"); var employerLocation = GetSearchStartPoint(dto.Latitude, dto.Longitude); var searchRadiusInMeters = dto.SearchRadius * MilesToMeters; var resultTemp = await(from provider in _matchingDbContext.Provider join providerVenue in _matchingDbContext.ProviderVenue on provider.Id equals providerVenue.ProviderId join providerQualification in _matchingDbContext.ProviderQualification on providerVenue.Id equals providerQualification.ProviderVenueId join routePathMapping in _matchingDbContext.QualificationRouteMapping on providerQualification.QualificationId equals routePathMapping.QualificationId join qualification in _matchingDbContext.Qualification on routePathMapping.QualificationId equals qualification.Id join route in _matchingDbContext.Route on routePathMapping.RouteId equals route.Id orderby providerVenue.Location.Distance(employerLocation) where providerVenue.Location.Distance(employerLocation) <= searchRadiusInMeters && provider.IsCdfProvider && provider.IsEnabledForReferral && providerVenue.IsEnabledForReferral && !providerVenue.IsRemoved select new { ProviderVenueId = providerVenue.Id, ProviderName = provider.Name, ProviderDisplayName = provider.DisplayName, ProviderVenueName = providerVenue.Name, Distance = providerVenue.Location.Distance(employerLocation) / MilesToMeters, ProviderVenuePostcode = providerVenue.Postcode, ProviderVenueTown = providerVenue.Town, Latitude = providerVenue.Latitude ?? 0, Longitude = providerVenue.Longitude ?? 0, provider.IsTLevelProvider, RouteName = route.Name, RouteId = route.Id, QualificationShortTitle = qualification.ShortTitle }).Distinct().ToListAsync(); var result = resultTemp.GroupBy(g => new { g.Distance, g.IsTLevelProvider, g.Latitude, g.Longitude, g.ProviderDisplayName, g.ProviderName, g.ProviderVenueId, g.ProviderVenueName, g.ProviderVenuePostcode, g.ProviderVenueTown }) .Select(grp => new ProviderProximitySearchResultViewModelItem { Latitude = grp.Key.Latitude, Distance = grp.Key.Distance, ProviderVenueTown = grp.Key.ProviderVenueTown, ProviderName = grp.Key.ProviderName, ProviderVenuePostcode = grp.Key.ProviderVenuePostcode, ProviderVenueId = grp.Key.ProviderVenueId, ProviderDisplayName = grp.Key.ProviderDisplayName, ProviderVenueName = grp.Key.ProviderVenueName, IsTLevelProvider = grp.Key.IsTLevelProvider, Longitude = grp.Key.Longitude, Routes = grp.GroupBy(rt => new { rt.RouteName, rt.RouteId }) .Select(rt => new RouteAndQualificationsViewModel { RouteName = rt.Key.RouteName, RouteId = rt.Key.RouteId, QualificationShortTitles = rt.Select(q => q.QualificationShortTitle) .OrderBy(q => q) }).OrderBy(rt => rt.RouteName) }).OrderBy(r => r.Distance) .ThenBy(r => { if (r.ProviderVenueName == r.ProviderVenuePostcode) { return(r.ProviderDisplayName); } else { return(r.ProviderVenueName); } }) .ToList(); return(result); }