private bool IsFutureBooking(DateTime?pickupDate, CompanyMarketSettingsResponse marketSettings) { if (!pickupDate.HasValue) { return(false); } try { if (marketSettings.FutureBookingTimeThresholdInMinutes <= 0) { // market settings return(true); } var pickupInUserTimeZone = pickupDate.Value; var currentOffsettedTime = GetCurrentOffsetedTime(marketSettings.FutureBookingReservationProvider); var isConsideredFutureBooking = pickupInUserTimeZone - currentOffsettedTime > TimeSpan.FromMinutes(marketSettings.FutureBookingTimeThresholdInMinutes); _logger.LogMessage("Order is considered future booking? {0}", isConsideredFutureBooking); return(isConsideredFutureBooking); } catch (Exception ex) { _logger.LogMessage("Error occured while determining if order is future booking. Assuming true. " + "(Hint: MarketSettings.FutureBookingReservationProvider: {0})", marketSettings.FutureBookingReservationProvider); _logger.LogError(ex); return(true); } }
private CompanyMarketSettingsResponse GetCompanyMarketSettingsInternal(string companyId, double latitude, double longitude) { var response = new CompanyMarketSettingsResponse(); var userPosition = new MapCoordinate { Latitude = latitude, Longitude = longitude }; var markets = _marketRepository.Collection.FindAll().ToArray(); var marketOfTheUserPosition = markets.FirstOrDefault(x => x.Region.Contains(userPosition)); if (marketOfTheUserPosition != null) { response = GetMarketSettings(marketOfTheUserPosition); // Check if we have changed market var homeCompany = _networkRepository.FirstOrDefault(n => n.Id == companyId); if (homeCompany == null || // company not found in network !homeCompany.IsInNetwork || // company is not network enabled marketOfTheUserPosition.Name == homeCompany.Market) // company is in local market { response.Market = null; } } return(response); }
public CompanyMarketSettingsResponse GetCompanyMarketSettings(double latitude, double longitude) { CompanyMarketSettingsResponse response; if (_serverSettings.ServerData.Network.Enabled) { var homeCompanyKey = _serverSettings.ServerData.TaxiHail.ApplicationKey; var @params = new Dictionary <string, string> { { "companyId", homeCompanyKey }, { "latitude", latitude.ToString(CultureInfo.InvariantCulture) }, { "longitude", longitude.ToString(CultureInfo.InvariantCulture) } }; var queryString = BuildQueryString(@params); response = Client.Get("customer/roaming/marketsettings" + queryString) .Deserialize <CompanyMarketSettingsResponse>() .Result; } else { response = new CompanyMarketSettingsResponse(); } response.EnableFutureBooking = !response.Market.HasValue() ? !_serverSettings.ServerData.DisableFutureBooking : response.EnableFutureBooking; response.DisableOutOfAppPayment = !response.Market.HasValue() ? _serverSettings.GetPaymentSettings().CancelOrderOnUnpair : response.DisableOutOfAppPayment; response.ShowCallDriver = !response.Market.HasValue() ? _serverSettings.ServerData.ShowCallDriver : response.ShowCallDriver; return(response); }
public object Post(ValidateOrderRequest request) { if (_serverSettings.ServerData.IBS.FakeOrderStatusUpdate) { request.TestZone = "101"; } Func <string> getPickupZone = () => request.TestZone.HasValue() ? request.TestZone : _ibsServiceProvider.StaticData().GetZoneByCoordinate(request.Settings.ProviderId, request.PickupAddress.Latitude, request.PickupAddress.Longitude); Func <string> getDropoffZone = () => request.DropOffAddress != null ? _ibsServiceProvider.StaticData().GetZoneByCoordinate(request.Settings.ProviderId, request.DropOffAddress.Latitude, request.DropOffAddress.Longitude) : null; CompanyMarketSettingsResponse marketSettings = null; try { // Find market marketSettings = _taxiHailNetworkServiceClient.GetCompanyMarketSettings(request.PickupAddress.Latitude, request.PickupAddress.Longitude); } catch (Exception ex) { Log.Info("Unable to fetch market"); Log.Error(ex); } if (request.ForError) { var rule = _ruleCalculator.GetActiveDisableFor(request.PickupDate.HasValue, request.PickupDate ?? GetCurrentOffsetedTime(), getPickupZone, getDropoffZone, marketSettings.Market, new Position(request.PickupAddress.Latitude, request.PickupAddress.Longitude)); var hasError = rule != null; var message = rule != null ? rule.Message : null; var disableFutureBooking = marketSettings.EnableFutureBooking ? _ruleCalculator.GetDisableFutureBookingRule(marketSettings.Market) != null : true; Log.Debug(string.Format("Has Error : {0}, Message: {1}", hasError, message)); return(new OrderValidationResult { HasError = hasError, Message = message, AppliesToCurrentBooking = rule != null && rule.AppliesToCurrentBooking, AppliesToFutureBooking = rule != null && rule.AppliesToFutureBooking, DisableFutureBooking = disableFutureBooking }); } else { var rule = _ruleCalculator.GetActiveWarningFor(request.PickupDate.HasValue, request.PickupDate ?? GetCurrentOffsetedTime(), getPickupZone, getDropoffZone, marketSettings.Market, new Position(request.PickupAddress.Latitude, request.PickupAddress.Longitude)); var hasWarning = rule != null; var message = rule != null ? rule.Message : null; var disableFutureBooking = marketSettings.EnableFutureBooking ? _ruleCalculator.GetDisableFutureBookingRule(marketSettings.Market) != null : true; return(new OrderValidationResult { HasWarning = hasWarning, Message = message, AppliesToCurrentBooking = rule != null && rule.AppliesToCurrentBooking, AppliesToFutureBooking = rule != null && rule.AppliesToFutureBooking, DisableFutureBooking = disableFutureBooking }); } }
internal BestAvailableCompany FindBestAvailableCompany(CompanyMarketSettingsResponse marketSettings, double?latitude, double?longitude, bool isFutureBooking) { var market = marketSettings.Market.HasValue() ? marketSettings.Market : null; if (!market.HasValue() || !latitude.HasValue || !longitude.HasValue) { // Do nothing if in home market or if we don't have position _logger.LogMessage("FindBestAvailableCompany - We are in local market (or lat/lng is null), skip honeybadger/geo and call local ibs first"); return(new BestAvailableCompany()); } // we are in external market if (isFutureBooking) { if (marketSettings.FutureBookingReservationProvider.HasValueTrimmed()) { // future booking detected, we find the specified future booking company and return it var homeCompanyKey = _serverSettings.ServerData.TaxiHail.ApplicationKey; var fleets = _taxiHailNetworkServiceClient.GetMarketFleets(homeCompanyKey, market).ToArray(); var match = fleets.FirstOrDefault(f => f.CompanyKey == marketSettings.FutureBookingReservationProvider); if (match != null) { _logger.LogMessage("FindBestAvailableCompany - Future Booking in Market: {0}", match.CompanyKey); return(new BestAvailableCompany { CompanyKey = match.CompanyKey, CompanyName = match.CompanyName, FleetId = match.FleetId }); } _logger.LogMessage("FindBestAvailableCompany - Future Booking in Market: No company found with setting {0}", marketSettings.FutureBookingReservationProvider); } _logger.LogMessage("FindBestAvailableCompany - Future Booking in Market: FutureBookingReservationProvider has no value, searching for best company"); } // we have to find the best available company int? bestFleetId = null; const int searchExpendLimit = 10; var searchRadius = 2000; // In meters for (var i = 1; i < searchExpendLimit; i++) { var marketVehicles = GetAvailableVehiclesServiceClient(market) .GetAvailableVehicles(market, latitude.Value, longitude.Value, searchRadius, null, true) .ToArray(); if (marketVehicles.Any()) { // Group vehicles by fleet var vehiclesGroupedByFleet = marketVehicles.GroupBy(v => v.FleetId).Select(g => g.ToArray()).ToArray(); var result = vehiclesGroupedByFleet.FirstOrDefault() ?? new VehicleResponse[0]; // Take fleet with most number of available vehicles foreach (var response in vehiclesGroupedByFleet.Skip(1)) { if (response.Length > result.Length) { // this fleet has more vehicles result = response; continue; } if (response.Length == result.Length) { // two fleets have the same number of vehicles, take the one with the shortest ETA if (result.Where(x => x.Eta.HasValue).Min(x => x.Eta) > response.Where(x => x.Eta.HasValue).Min(x => x.Eta)) { result = response; } } } bestFleetId = result.First().FleetId; break; } // Nothing found, extend search radius (total radius after 10 iterations: 3375m) searchRadius += (i * 25); } // Nothing found if (!bestFleetId.HasValue) { return(new BestAvailableCompany()); } var companyKey = _serverSettings.ServerData.TaxiHail.ApplicationKey; var marketFleets = _taxiHailNetworkServiceClient.GetMarketFleets(companyKey, market) .SelectOrDefault(markets => markets.ToArray(), new NetworkFleetResponse[0]); // Fallback: If for some reason, we cannot find a match for the best fleet id in the fleets // that were setup for the market, we take the first one var bestFleet = marketFleets.FirstOrDefault(f => f.FleetId == bestFleetId.Value) ?? marketFleets.FirstOrDefault(); // Nothing found if (bestFleet == null) { return(new BestAvailableCompany()); } return(new BestAvailableCompany { CompanyKey = bestFleet.CompanyKey, CompanyName = bestFleet.CompanyName, FleetId = bestFleet.FleetId }); }