コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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
                });
            }
        }
コード例 #5
0
        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
            });
        }