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 }); } }
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); }
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>()); }