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();
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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>());
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }