public static IEnumerable <GetTrainingCourseProviderListItem> OrderByScoreAndDistance( this IEnumerable <GetTrainingCourseProviderListItem> source, DeliveryModeType requestDeliveryModes = DeliveryModeType.NotFound) { _filteredDeliveryMode = requestDeliveryModes; var returnList = new List <GetTrainingCourseProviderListItem>(); var getTrainingCourseProviderListItems = source.ToList(); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, GetProvidersUnderFiveMilesWithScoreGreaterThanOrEqualToSix)); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, GetProvidersWithinFiveToTenMilesWithScoreGreaterThanOrEqualToSix)); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, GetProvidersWithinTenMilesWithScoreLessThanSix)); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 10, 15))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 15, 20))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 20, 25))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 25, 30))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 30, 40))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 40, 50))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 50, 60))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 60, 70))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 70, 80))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 80, 90))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, item => GetProvidersBetweenTwoDistances(item, 90, 100))); returnList.AddRange(AddFilteredProviders(getTrainingCourseProviderListItems, returnList, GetProvidersOverOneHundredMiles)); return(returnList.ToList()); }
public static IEnumerable <GetTrainingCourseProviderListItem> OrderByProviderScore( this IEnumerable <GetTrainingCourseProviderListItem> source, List <DeliveryModeType> requestDeliveryModes = null) { _providerScores = new Dictionary <int, decimal>(); var getTrainingCourseProviderListItems = source.ToList(); AddFeedbackRateScore(getTrainingCourseProviderListItems); AddAchievementRateScore(getTrainingCourseProviderListItems); var scoredAndSortedProviders = _providerScores.Join(getTrainingCourseProviderListItems, achievementRateScore => achievementRateScore.Key, getTrainingCourseProviderListItem => getTrainingCourseProviderListItem.ProviderId, (achievementRateScore, getTrainingCourseProviderListItem) => new { achievementRateScore, getTrainingCourseProviderListItem }) .OrderByDescending(t => t.achievementRateScore.Value) .Select(c => { var getTrainingCourseProviderListItem = c.getTrainingCourseProviderListItem; getTrainingCourseProviderListItem.Score = c.achievementRateScore.Value; return(getTrainingCourseProviderListItem); }) .OrderByDescending(c => c.Score) .ThenByDescending(c => c.OverallAchievementRate) .ThenByDescending(c => c.OverallCohort) .ThenByDescending(c => c.EmployerFeedback.TotalEmployerResponses) .ThenByDescending(c => c.ApprenticeFeedback.TotalApprenticeResponses) .ThenBy(c => c.Name) .ToList(); _filteredDeliveryMode = DeliveryModeType.NotFound; if (requestDeliveryModes != null && requestDeliveryModes.Count(c => c != DeliveryModeType.National) == 1) //TODO need to exclude national { _filteredDeliveryMode = requestDeliveryModes.First(c => c != DeliveryModeType.National); } if (!getTrainingCourseProviderListItems.All(c => c.HasLocation) || getTrainingCourseProviderListItems.All(c => c.DeliveryModes.All(x => x.DeliveryModeType == DeliveryModeType.Workplace)) || _filteredDeliveryMode == DeliveryModeType.Workplace) { return(scoredAndSortedProviders); } return(scoredAndSortedProviders.OrderByScoreAndDistance(_filteredDeliveryMode)); }
public DeliveryModeViewModel Map(DeliveryMode source, DeliveryModeType deliveryModeType) { var viewModel = source ?? new DeliveryModeViewModel(); viewModel.DeliveryModeType = deliveryModeType; viewModel.IsAvailable = source != default; viewModel.FormattedDistanceInMiles = source != default && deliveryModeType != DeliveryModeType.Workplace ? source.DistanceInMiles.FormatDistance() == "1" ? ": 1 mile away" : $": {source.DistanceInMiles.FormatDistance()} miles away" : null; viewModel.NationalText = source != default && source.National && deliveryModeType == DeliveryModeType.Workplace ? "(national)" : null; viewModel.AddressFormatted = source != default ? BuildFormattedAddress(source) : ""; return(viewModel); }
public void Then_Maps_Delivery_Types_Returning_The_Smallest_Distance_Only_For_One_Type(string deliveryModeString, DeliveryModeType deliveryModeType, string sectorSubjectArea, GetProvidersListItem source) { source.AchievementRates = null; source.DeliveryTypes = new List <GetDeliveryTypeItem> { new GetDeliveryTypeItem { DeliveryModes = deliveryModeString, DistanceInMiles = 2.5m }, new GetDeliveryTypeItem { DeliveryModes = deliveryModeString, DistanceInMiles = 3.1m }, new GetDeliveryTypeItem { DeliveryModes = deliveryModeString, DistanceInMiles = 5.5m } }; var response = new GetTrainingCourseProviderListItem().Map(source, sectorSubjectArea, 1, new List <DeliveryModeType>(), new List <FeedbackRatingType>(), true); response.DeliveryModes.Count.Should().Be(1); response.DeliveryModes.FirstOrDefault(c => c.DeliveryModeType == deliveryModeType)?.DistanceInMiles.Should().Be(2.5m); response.DeliveryModes.FirstOrDefault().National.Should().BeFalse(); }