Ejemplo n.º 1
0
        private CmtPairingResponse PairWithVehicleUsingRideLinq(RideLinqPairingMethod pairingMethod, OrderStatusDetail orderStatusDetail, string cardToken, int autoTipPercentage)
        {
            InitializeServiceClient();

            try
            {
                var accountDetail    = _accountDao.FindById(orderStatusDetail.AccountId);
                var creditCardDetail = _creditCardDao.FindByToken(cardToken);
                var orderDetail      = _orderDao.FindById(orderStatusDetail.OrderId);

                // send pairing request
                var cmtPaymentSettings = _serverPaymentSettings.CmtPaymentSettings;
                var pairingRequest     = new ManualRideLinqCoFPairingRequest
                {
                    AutoTipPercentage   = autoTipPercentage,
                    AutoCompletePayment = true,
                    CallbackUrl         = string.Empty,
                    CustomerId          = orderStatusDetail.AccountId.ToString(),
                    CustomerName        = accountDetail.Name,
                    DriverId            = orderStatusDetail.DriverInfos.DriverId,
                    Latitude            = orderStatusDetail.VehicleLatitude.GetValueOrDefault(),
                    Longitude           = orderStatusDetail.VehicleLongitude.GetValueOrDefault(),
                    CardOnFileId        = cardToken,
                    Market            = cmtPaymentSettings.Market,
                    TripRequestNumber = orderStatusDetail.IBSOrderId.GetValueOrDefault().ToString(),
                    LastFour          = creditCardDetail.Last4Digits,
                    TipIncentive      = orderDetail.TipIncentive,
                    ZipCode           = creditCardDetail.ZipCode,
                    Email             = accountDetail.Email,
                    CustomerIpAddress = orderDetail.OriginatingIpAddress,
                    BillingFullName   = creditCardDetail.NameOnCard,
                    SessionId         = orderDetail.KountSessionId
                };

                switch (pairingMethod)
                {
                case RideLinqPairingMethod.VehicleMedallion:
                    _logger.LogMessage("OrderPairingManager RideLinq with VehicleMedallion : " + (orderStatusDetail.VehicleNumber.HasValue() ? orderStatusDetail.VehicleNumber : "No vehicle number"));
                    pairingRequest.Medallion = orderStatusDetail.VehicleNumber;
                    break;

                case RideLinqPairingMethod.PairingCode:
                    _logger.LogMessage("OrderPairingManager RideLinq with PairingCode : " + (orderStatusDetail.RideLinqPairingCode.HasValue() ? orderStatusDetail.RideLinqPairingCode : "No code"));
                    pairingRequest.PairingCode = orderStatusDetail.RideLinqPairingCode;
                    break;

                case RideLinqPairingMethod.DeviceName:
                    throw new Exception("RideLinq PairingMethod DeviceName not supported on non Arro Servers.  Since we do not do the dispatcher, we have no idea of the device name and can't pair using this.");

                default:
                    throw new Exception("CmtPaymentSetting.PairingMethod not set and trying to use RideLinq pairing.");
                }

                _logger.LogMessage("Pairing request : " + pairingRequest.ToJson());
                _logger.LogMessage("PaymentSettings request : " + cmtPaymentSettings.ToJson());

                var response = _cmtMobileServiceClient.Post(pairingRequest);

                _logger.LogMessage("Pairing response : " + response.ToJson());

                // Wait for trip to be updated to check if pairing was successful
                var trip = _cmtTripInfoServiceHelper.WaitForTripInfo(response.PairingToken, response.TimeoutSeconds);

                response.ErrorCode = trip != null ? trip.ErrorCode : CmtErrorCodes.UnableToPair;

                return(response);
            }
            catch (Exception ex)
            {
                var aggregateException = ex as AggregateException;
                if (aggregateException == null)
                {
                    throw;
                }

                var webServiceException = aggregateException.InnerException as WebServiceException;
                if (webServiceException == null)
                {
                    throw;
                }

                var response = JsonConvert.DeserializeObject <AuthorizationResponse>(webServiceException.ResponseBody);

                _logger.LogMessage(string.Format("Error when trying to pair using RideLinQ. Code: {0} - {1}"), response.ResponseCode, response.ResponseMessage);

                throw;
            }
        }
        public object Post(ManualRideLinqPairingRequest request)
        {
            try
            {
                var accountId = new Guid(this.GetSession().UserAuthId);
                var account   = _accountDao.FindById(accountId);

                ValidateAppVersion(account);

                var currentRideLinq = _orderDao.GetCurrentManualRideLinq(request.PairingCode, account.Id);

                if (currentRideLinq != null)
                {
                    return(new ManualRideLinqResponse
                    {
                        Data = currentRideLinq,
                        IsSuccessful = true,
                        Message = "Ok"
                    });
                }

                var creditCard = account.DefaultCreditCard.HasValue
                    ? _creditCardDao.FindById(account.DefaultCreditCard.Value)
                    : null;

                if (creditCard == null)
                {
                    throw new HttpError(HttpStatusCode.BadRequest,
                                        ErrorCode.ManualRideLinq_NoCardOnFile.ToString(),
                                        _resources.Get("ManualRideLinq_NoCardOnFile", account.Language));
                }

                if (creditCard.IsDeactivated)
                {
                    throw new HttpError(HttpStatusCode.BadRequest,
                                        ErrorCode.ManualRideLinq_CardOnFileDeactivated.ToString(),
                                        _resources.Get("ManualRideLinq_CreditCardDisabled", account.Language));
                }

                // Send pairing request to CMT API
                var pairingRequest = new ManualRideLinqCoFPairingRequest
                {
                    AutoTipPercentage   = account.DefaultTipPercent ?? _serverSettings.ServerData.DefaultTipPercentage,
                    CustomerId          = accountId.ToString(),
                    CustomerName        = account.Name,
                    Latitude            = request.PickupAddress.Latitude,
                    Longitude           = request.PickupAddress.Longitude,
                    PairingCode         = request.PairingCode,
                    AutoCompletePayment = true,
                    CardOnFileId        = creditCard.Token,
                    LastFour            = creditCard.Last4Digits,
                    ZipCode             = creditCard.ZipCode,
                    Email             = account.Email,
                    CustomerIpAddress = RequestContext.IpAddress,
                    BillingFullName   = creditCard.NameOnCard,
                    SessionId         = request.KountSessionId
                };

                _logger.LogMessage("Pairing for manual RideLinq with Pairing Code {0}", request.PairingCode);

                var response = _cmtMobileServiceClient.Post(pairingRequest);

                _logger.LogMessage("Pairing result: {0}", response.ToJson());

                var trip = _cmtTripInfoServiceHelper.WaitForTripInfo(response.PairingToken, response.TimeoutSeconds);

                if (trip.HttpStatusCode == (int)HttpStatusCode.OK)
                {
                    var command = new CreateOrderForManualRideLinqPair
                    {
                        OrderId            = Guid.NewGuid(),
                        AccountId          = accountId,
                        UserAgent          = Request.UserAgent,
                        ClientVersion      = Request.Headers.Get("ClientVersion"),
                        PairingCode        = request.PairingCode,
                        PickupAddress      = request.PickupAddress,
                        PairingToken       = response.PairingToken,
                        PairingDate        = DateTime.Now,
                        ClientLanguageCode = request.ClientLanguageCode,
                        Distance           = trip.Distance,
                        StartTime          = trip.StartTime,
                        EndTime            = trip.EndTime,
                        Extra                = Math.Round(((double)trip.Extra / 100), 2),
                        Fare                 = Math.Round(((double)trip.Fare / 100), 2),
                        Tax                  = Math.Round(((double)trip.Tax / 100), 2),
                        Tip                  = Math.Round(((double)trip.Tip / 100), 2),
                        Toll                 = trip.TollHistory.Sum(toll => Math.Round(((double)toll.TollAmount / 100), 2)),
                        Surcharge            = Math.Round(((double)trip.Surcharge / 100), 2),
                        Total                = Math.Round(((double)trip.Total / 100), 2),
                        FareAtAlternateRate  = Math.Round(((double)trip.FareAtAlternateRate / 100), 2),
                        Medallion            = response.Medallion,
                        DeviceName           = response.DeviceName,
                        RateAtTripStart      = trip.RateAtTripStart,
                        RateAtTripEnd        = trip.RateAtTripEnd,
                        RateChangeTime       = trip.RateChangeTime,
                        TripId               = trip.TripId,
                        DriverId             = trip.DriverId,
                        LastFour             = trip.LastFour,
                        AccessFee            = Math.Round(((double)trip.AccessFee / 100), 2),
                        OriginatingIpAddress = request.CustomerIpAddress,
                        KountSessionId       = request.KountSessionId,
                        CreditCardId         = creditCard.CreditCardId,
                    };

                    _commandBus.Send(command);

                    var data = new OrderManualRideLinqDetail
                    {
                        OrderId             = command.OrderId,
                        Distance            = trip.Distance,
                        StartTime           = trip.StartTime,
                        EndTime             = trip.EndTime,
                        Extra               = command.Extra,
                        Fare                = command.Fare,
                        Tax                 = command.Tax,
                        Tip                 = command.Tip,
                        Toll                = command.Toll,
                        Surcharge           = command.Surcharge,
                        Total               = command.Total,
                        FareAtAlternateRate = command.FareAtAlternateRate,
                        Medallion           = response.Medallion,
                        DeviceName          = response.DeviceName,
                        RateAtTripStart     = command.RateAtTripStart,
                        RateAtTripEnd       = command.RateAtTripEnd,
                        RateChangeTime      = trip.RateChangeTime,
                        AccountId           = accountId,
                        PairingDate         = command.PairingDate,
                        PairingCode         = pairingRequest.PairingCode,
                        PairingToken        = trip.PairingToken,
                        DriverId            = trip.DriverId,
                        LastFour            = command.LastFour,
                        AccessFee           = command.AccessFee
                    };

                    return(new ManualRideLinqResponse
                    {
                        Data = data,
                        IsSuccessful = true,
                        Message = "Ok",
                        TripInfoHttpStatusCode = trip.HttpStatusCode,
                        ErrorCode = trip.ErrorCode.ToString()
                    });
                }
                else
                {
                    if (trip.HttpStatusCode == (int)HttpStatusCode.BadRequest)
                    {
                        switch (trip.ErrorCode)
                        {
                        case CmtErrorCodes.CreditCardDeclinedOnPreauthorization:
                            _notificationService.SendCmtPaymentFailedPush(accountId, _resources.Get("CreditCardDeclinedOnPreauthorizationErrorText", request.ClientLanguageCode));
                            break;

                        case CmtErrorCodes.UnablePreauthorizeCreditCard:
                            _notificationService.SendCmtPaymentFailedPush(accountId, _resources.Get("CreditCardUnableToPreathorizeErrorText", request.ClientLanguageCode));
                            break;

                        default:
                            _notificationService.SendCmtPaymentFailedPush(accountId, _resources.Get("TripUnableToPairErrorText", request.ClientLanguageCode));
                            break;
                        }
                    }

                    return(new ManualRideLinqResponse
                    {
                        IsSuccessful = false,
                        TripInfoHttpStatusCode = trip.HttpStatusCode,
                        ErrorCode = trip.ErrorCode != null?trip.ErrorCode.ToString() : null
                    });
                }
            }
            catch (WebServiceException ex)
            {
                _logger.LogMessage(
                    string.Format("A WebServiceException occured while trying to manually pair with CMT with pairing code: {0}",
                                  request.PairingCode));
                _logger.LogError(ex);

                ErrorResponse errorResponse = null;

                if (ex.ResponseBody != null)
                {
                    _logger.LogMessage("Error Response: {0}", ex.ResponseBody);

                    errorResponse = ex.ResponseBody.FromJson <ErrorResponse>();
                }

                return(new ManualRideLinqResponse
                {
                    IsSuccessful = false,
                    Message = errorResponse != null ? errorResponse.Message : ex.ErrorMessage,
                    ErrorCode = errorResponse != null?errorResponse.ResponseCode.ToString() : ex.ErrorCode
                });
            }
            catch (Exception ex)
            {
                _logger.LogMessage(string.Format("An error occured while trying to manually pair with CMT with pairing code: {0}", request.PairingCode));
                _logger.LogError(ex);

                return(new ManualRideLinqResponse
                {
                    IsSuccessful = false,
                    Message = ex.Message
                });
            }
        }