Пример #1
0
        public async Task VoidTransactionAsync(HSPayment payment, HSOrder order, string userToken)
        {
            var transactionID = "";

            try
            {
                if (payment.Accepted == true)
                {
                    var transaction = payment.Transactions
                                      .Where(x => x.Type == "CreditCard")
                                      .OrderBy(x => x.DateExecuted)
                                      .LastOrDefault(t => t.Succeeded);
                    var retref = transaction?.xp?.CardConnectResponse?.retref;
                    if (retref != null)
                    {
                        transactionID = transaction.ID;
                        var userCurrency = await _hsExchangeRates.GetCurrencyForUser(userToken);

                        var response = await _cardConnect.VoidAuthorization(new CardConnectVoidRequest
                        {
                            currency = userCurrency.ToString(),
                            merchid  = GetMerchantID(userCurrency),
                            retref   = transaction.xp.CardConnectResponse.retref
                        });
                        await WithRetry().ExecuteAsync(() => _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, payment.ID, CardConnectMapper.Map(payment, response)));
                    }
                }
            }
            catch (CreditCardVoidException ex)
            {
                await _supportAlerts.VoidAuthorizationFailed(payment, transactionID, order, ex);
                await WithRetry().ExecuteAsync(() => _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, payment.ID, CardConnectMapper.Map(payment, ex.Response)));

                throw new OrderCloudIntegrationException(new ApiError
                {
                    ErrorCode = "Payment.FailedToVoidAuthorization",
                    Message   = ex.ApiError.Message
                });
            }
        }
Пример #2
0
        public void Setup()
        {
            _cardConnect = Substitute.For <IOrderCloudIntegrationsCardConnectService>();
            _cardConnect.VoidAuthorization(Arg.Is <CardConnectVoidRequest>(r => r.merchid == merchantID))
            .Returns(Task.FromResult(new CardConnectVoidResponse {
            }));
            _cardConnect.AuthWithoutCapture(Arg.Any <CardConnectAuthorizationRequest>())
            .Returns(Task.FromResult(new CardConnectAuthorizationResponse {
                authcode = "REVERS"
            }));

            _oc = Substitute.For <IOrderCloudClient>();
            _oc.Me.GetCreditCardAsync <CardConnectBuyerCreditCard>(creditCardID, userToken)
            .Returns(MockCreditCard());
            _oc.IntegrationEvents.GetWorksheetAsync <HSOrderWorksheet>(OrderDirection.Incoming, orderID)
            .Returns(Task.FromResult(new HSOrderWorksheet {
                Order = new HSOrder {
                    ID = orderID
                }
            }));
            _oc.Payments.CreateTransactionAsync <HSPayment>(OrderDirection.Incoming, orderID, Arg.Any <string>(), Arg.Any <PaymentTransaction>())
            .Returns(Task.FromResult(new HSPayment {
            }));
            _oc.Payments.PatchAsync <HSPayment>(OrderDirection.Incoming, orderID, Arg.Any <string>(), Arg.Any <PartialPayment>())
            .Returns(Task.FromResult(new HSPayment {
            }));

            _orderCalc = Substitute.For <IOrderCalcService>();
            _orderCalc.GetCreditCardTotal(Arg.Any <HSOrderWorksheet>())
            .Returns(ccTotal);

            _hsExchangeRates = Substitute.For <IHSExchangeRatesService>();
            _hsExchangeRates.GetCurrencyForUser(userToken)
            .Returns(Task.FromResult(currency));

            _supportAlerts = Substitute.For <ISupportAlertService>();
            _settings      = Substitute.For <AppSettings>();
            _settings.CardConnectSettings.CadMerchantID = merchantID;

            _sut = new CreditCardCommand(_cardConnect, _oc, _orderCalc, _hsExchangeRates, _supportAlerts, _settings);
        }
Пример #3
0
        public async Task should_handle_existing_voids_us()
        {
            // same as should_handle_existing_voids but handle usd merchant

            var paymentTotal = 30;             // credit card total is 38

            // Arrange
            var payment1transactions = new List <HSPaymentTransaction>()
            {
                new HSPaymentTransaction
                {
                    ID        = "authattempt1",
                    Succeeded = true,
                    Type      = "CreditCard",
                    xp        = new TransactionXP
                    {
                        CardConnectResponse = new CardConnectAuthorizationResponse
                        {
                            retref = "retref1"
                        }
                    }
                },
                new HSPaymentTransaction
                {
                    ID        = "voidattempt1",
                    Succeeded = true,
                    Type      = "CreditCardVoidAuthorization",
                    xp        = new TransactionXP
                    {
                        CardConnectResponse = new CardConnectAuthorizationResponse
                        {
                            retref = "retref2"
                        }
                    }
                },
                new HSPaymentTransaction
                {
                    ID        = "authattempt2",
                    Type      = "CreditCard",
                    Succeeded = true,
                    xp        = new TransactionXP
                    {
                        CardConnectResponse = new CardConnectAuthorizationResponse
                        {
                            retref = "retref3"
                        }
                    }
                }
            };

            _settings.CardConnectSettings.UsdMerchantID = merchantID;
            _settings.CardConnectSettings.CadMerchantID = "somethingelse";
            _hsExchangeRates.GetCurrencyForUser(userToken)
            .Returns(Task.FromResult(CurrencySymbol.USD));
            _oc.Payments.ListAsync <HSPayment>(OrderDirection.Incoming, orderID, filters: Arg.Is <object>(f => (string)f == "Type=CreditCard"))
            .Returns(PaymentMocks.PaymentList(MockCCPayment(paymentTotal, true, payment1transactions)));
            var payment = ValidIntegrationsPayment();

            // Act
            await _sut.AuthorizePayment(payment, userToken, merchantID);

            // Assert
            await _cardConnect.Received().VoidAuthorization(Arg.Is <CardConnectVoidRequest>(x => x.retref == "retref3" && x.merchid == merchantID && x.currency == "USD"));

            await _oc.Payments.Received().CreateTransactionAsync(OrderDirection.Incoming, orderID, paymentID, Arg.Is <PaymentTransaction>(x => x.Amount == paymentTotal));

            await _cardConnect.Received().AuthWithoutCapture(Arg.Any <CardConnectAuthorizationRequest>());

            await _oc.Payments.Received().PatchAsync <HSPayment>(OrderDirection.Incoming, orderID, paymentID, Arg.Is <PartialPayment>(p => p.Accepted == true && p.Amount == ccTotal));

            await _oc.Payments.Received().CreateTransactionAsync(OrderDirection.Incoming, orderID, paymentID, Arg.Any <PaymentTransaction>());
        }