public async Task CallProcessTransactionAsyncWithNullTransactionOrNullBankUrlReturnsNull(
            TransactionRepresenter transaction, string bankUrl)
        {
            var result = await this._testClass.ProcessTransactionAsync(transaction, bankUrl).ConfigureAwait(false);

            Assert.IsNull(result);
        }
        /// <summary>
        /// Process a tranction through an acquirer
        /// </summary>
        /// <param name="transactionRepresenter"></param>
        /// <param name="bankURL"></param>
        /// <returns></returns>
        public async Task <BankResponseDto> ProcessTransactionAsync(TransactionRepresenter transactionRepresenter, string bankURL)
        {
            if (transactionRepresenter == null || bankURL == null)
            {
                return(null);
            }

            //Process transaction through acquirer
            var bankResponse = await _apiService.ProcessTransactionAsync(transactionRepresenter, bankURL)
                               .ConfigureAwait(false);

            var bankResponseData = await bankResponse.Content
                                   .ReadAsStringAsync()
                                   .ConfigureAwait(false);


            var json = JsonConvert.DeserializeObject <BankResponse>(bankResponseData);
            var transactionCreationRepresenter = new BankResponseDto
            {
                BankResponseID = json.BankResponseID,
                Status         = json.Status.ToString(),
                SubStatus      = json.SubStatus.ToString(),
            };

            return(transactionCreationRepresenter);
        }
示例#3
0
        public async Task <CardDetails> CreateCardDetailsAsync(TransactionRepresenter transactionRepresenter)
        {
            if (transactionRepresenter == null || transactionRepresenter.Card == null)
            {
                return(null);
            }

            var cardEntity = await this.GetCardDetailsByNumberAsync(transactionRepresenter.Card.CardNumber).ConfigureAwait(false);

            if (cardEntity == null)
            {
                cardEntity = new CardDetails()
                {
                    CardNumber  = transactionRepresenter.Card.CardNumber,
                    Cvv         = transactionRepresenter.Card.Cvv,
                    ExpiryMonth = transactionRepresenter.Card.ExpiryMonth,
                    ExpiryYear  = transactionRepresenter.Card.ExpiryYear,
                    HolderName  = transactionRepresenter.Card.HolderName,
                };

                await this.AddCardAsync(cardEntity).ConfigureAwait(false);
            }
            ;
            return(cardEntity);
        }
        /// <summary>
        /// A method used to validate a card from a transaction request
        /// </summary>
        /// <param name="transactionDto">The transaction object</param>
        /// <returns>Whether the provided card inside the transaction object is valid</returns>
        public static bool IsCreditCardInfoValid(TransactionRepresenter transactionDto)
        {
            if (transactionDto == null)
            {
                return(false);
            }
            var expiryConcatenated = $"{transactionDto.Card.ExpiryMonth}/{transactionDto.Card.ExpiryYear}";

            return(IsCreditCardInfoValid(transactionDto.Card.CardNumber, expiryConcatenated, transactionDto.Card.Cvv));
        }
示例#5
0
        public async Task <bool> ValidateAsync(TransactionRepresenter data)
        {
            this.SetTransactionData(data);
            this.CheckAmount();
            await this.CheckMerchantData().ConfigureAwait(false);

            await this.CheckCurrencyData().ConfigureAwait(false);

            await this.CheckBankData().ConfigureAwait(false);

            return(this.Errors.Any());
        }
示例#6
0
 private BankTransaction GetBankTransaction(TransactionRepresenter transaction)
 {
     return(new BankTransaction
     {
         TransactionAmount = transaction.Amount,
         CardNumber = transaction.Card.CardNumber,
         CardCvv = transaction.Card.Cvv,
         CardHolderName = transaction.Card.HolderName,
         CardExpiryMonth = transaction.Card.ExpiryMonth,
         CardExpiryYear = transaction.Card.ExpiryYear
     });
 }
示例#7
0
        public async Task <HttpResponseMessage> ProcessTransactionAsync(TransactionRepresenter transaction, string bankURL)
        {
            if (transaction == null || bankURL == null)
            {
                return(null);
            }

            var             url             = bankURL + ProcessTransactionControllerRoute;
            BankTransaction bankTransaction = GetBankTransaction(transaction);
            var             contentString   = JsonConvert.SerializeObject(bankTransaction);

            return(await _webRequestService.MakeAsyncRequest(url, contentString).ConfigureAwait(false));
        }
        public Task <TransactionCreationRepresenter> ProcessTransaction(TransactionRepresenter transactionRepresenter, string bankURL)
        {
            var TransactionCreationRepresenter = new TransactionCreationRepresenter
            {
                BankResponseID = Guid.NewGuid(),
                Status         = "Successful",
                SubStatus      = "Succesfull"
            };

            var t = Task.FromResult(TransactionCreationRepresenter);

            return(t);
        }
        public ActionResult <Transaction> ProcessTransaction(TransactionRepresenter transactionRepresenter)
        {
            var transaction = new Transaction();

            transaction.MerchantId  = transactionRepresenter.MerchantId;
            transaction.BankId      = transactionRepresenter.BankId;
            transaction.Currency    = transactionRepresenter.Currency;
            transaction.CardType    = transactionRepresenter.CardType;
            transaction.CardNumber  = transactionRepresenter.CardNumber;
            transaction.NameOnCard  = transactionRepresenter.NameOnCard;
            transaction.ExpiryMonth = transactionRepresenter.ExpiryMonth;
            transaction.ExpiryYear  = transactionRepresenter.ExpiryYear;
            transaction.CVV         = transactionRepresenter.CVV;
            transaction.Amount      = transactionRepresenter.Amount;

            var merchant = _context.Merchants.Find(transaction.MerchantId);
            var bank     = _context.Banks.Find(transaction.BankId);

            if (merchant is null)
            {
                return(NotFound("Merchant not found!"));
            }

            if (bank is null)
            {
                return(NotFound("Bank not found!"));
            }

            var mockBank = new MockBank();

            mockBank.CardType    = transaction.CardType;
            mockBank.CardNumber  = transaction.CardNumber;
            mockBank.NameOnCard  = transaction.NameOnCard;
            mockBank.ExpiryMonth = transaction.ExpiryMonth;
            mockBank.ExpiryYear  = transaction.ExpiryYear;
            mockBank.CVV         = transaction.CVV;
            mockBank.Amount      = transaction.Amount;

            var bankresponse = new BankResponse();

            bankresponse = MockBankController.ProcessTransaction(mockBank);

            transaction.BankResponseId = bankresponse.Id;
            transaction.BankResponse   = bankresponse.Response;
            transaction.Status         = bankresponse.Status;

            _context.Transactions.Add(transaction);
            _context.SaveChanges();

            return(transaction);
        }
        public void PostTransactionValidObjectPassedReturnsTransactionResponse()
        {
            var card = new CardDetails {
                CardNumber = "4242 4242 4242 4242", Cvv = "100", HolderName = "CHADTBONTHUYS", ExpiryMonth = "11", ExpiryYear = "19"
            };
            var _transaction = new TransactionRepresenter {
                Amount = 200, Currency = "GBP", Bank = "MockBank", Card = card, MerchantID = "1D620903-D485-4421-958F-8265C0B41844"
            };

            // Act
            var createdResponse = _transactionsController.ProcessTransaction(_transaction).Result as OkObjectResult;

            // Assert
            Assert.IsType <TransactionCreationRepresenter>(createdResponse.Value);
        }
示例#11
0
        public static async Task <HttpResponseMessage> ProcessTransactionAsync(TransactionRepresenter transaction, string bankURL)
        {
            var url = bankURL + "Transactions/transactions";

            var content = new Dictionary <string, string>
            {
                ["TransactionAmount"] = transaction.Amount.ToString(),
                ["cardNumber"]        = transaction.Card.CardNumber,
                ["CardCvv"]           = transaction.Card.Cvv,
                ["CardHolderName"]    = transaction.Card.HolderName,
                ["CardExpiryMonth"]   = transaction.Card.ExpiryMonth,
                ["CardExpiryYear"]    = transaction.Card.ExpiryYear
            };

            return(await WebRequestHelper.MakeAsyncRequest(url, content));
        }
        public void PostTransactionInvalidCurrencyReturnsBadRequest()
        {
            // Arrange
            var card = new CardDetails {
                CardNumber = "4242 4242 4242 4242", Cvv = "100", HolderName = "CHADTBONTHUYS", ExpiryMonth = "11", ExpiryYear = "19"
            };
            var _transaction = new TransactionRepresenter {
                Amount = 200, Currency = "AAA", Bank = "MockBank", Card = card, MerchantID = "1D620903-D485-4421-958F-8265C0B41844"
            };

            // Act
            var createdResponse = _transactionsController.ProcessTransaction(_transaction).Result;

            // Assert
            Assert.IsType <BadRequestObjectResult>(createdResponse);
        }
示例#13
0
        /// <summary>
        /// Process a tranction through an acquirer
        /// </summary>
        /// <param name="transactionRepresenter"></param>
        /// <param name="bankURL"></param>
        /// <returns></returns>
        public async Task <TransactionCreationRepresenter> ProcessTransaction(TransactionRepresenter transactionRepresenter, string bankURL)
        {
            //Process transaction through acquirer
            var bankResponse = await APIHelper.ProcessTransactionAsync(transactionRepresenter, bankURL);

            var bankResponseData = bankResponse.Content.ReadAsStringAsync().Result;

            var json = JsonConvert.DeserializeObject <BankResponse>(bankResponseData);
            var transactionCreationRepresenter = new TransactionCreationRepresenter
            {
                BankResponseID = json.BankResponseID,
                Status         = json.Status.ToString(),
                SubStatus      = json.SubStatus.ToString(),
            };

            return(transactionCreationRepresenter);
        }
        public async Task CanCallProcessTransactionAsync()
        {
            //Arrange
            TransactionRepresenter transactionRepresenter = SetExpectedTransaction();
            StringContent          expectedResponse       = SetExpectedResponse();
            var bankURL = "test-bank.com";

            _webRequestService
            .Setup(x => x.MakeAsyncRequest(bankURL, It.IsAny <string>()))
            .ReturnsAsync(new HttpResponseMessage {
                Content = expectedResponse
            });

            //Act
            var result = await _testClass.ProcessTransactionAsync(transactionRepresenter, bankURL);

            //Assert
            _webRequestService.Verify(
                x => x.MakeAsyncRequest(bankURL, It.IsAny <string>()),
                Times.AtMostOnce,
                "Method not called or called more than once");
        }
示例#15
0
 private static Transaction GetTransactionEntity(
     BankResponseDto bankResponse,
     TransactionRepresenter transactionRepresenter,
     TransactionDetails transactionDetails,
     CardDetails cardEntity)
 {
     return(new Transaction
     {
         Amount = transactionRepresenter.Amount,
         Card = cardEntity,
         CardDetailsID = cardEntity.CardDetailsID,
         Currency = transactionDetails.Currency,
         CurrencyId = transactionDetails.Currency.CurrencyId,
         Merchant = transactionDetails.Merchant,
         MerchantID = transactionDetails.Merchant.MerchantID,
         TransactionID = Guid.NewGuid(),
         Bank = transactionDetails.Bank,
         BankID = transactionDetails.Bank.BankID,
         BankReferenceID = bankResponse.BankResponseID,
         Status = bankResponse.Status,
         SubStatus = bankResponse.SubStatus
     });
 }
示例#16
0
        public async Task <IActionResult> ProcessTransaction([FromBody] TransactionRepresenter transaction)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (transaction == null)
            {
                return(BadRequest("Transaction data not found"));
            }

            if (await _transactionDetailsValidatorService.ValidateAsync(transaction).ConfigureAwait(false))
            {
                return(BadRequest(_transactionDetailsValidatorService.GetErrors()));
            }

            var creditCardValidationResult = CreditCardHelper.IsCreditCardInfoValid(transaction);

            if (!creditCardValidationResult)
            {
                return(BadRequest("Invalid Credit Card data"));
            }

            var transactionDetails = _transactionDetailsValidatorService.GetTransactionDetails();
            var cardEntity         = await _cardDetailsService.CreateCardDetailsAsync(transaction).ConfigureAwait(false);


            BankResponseDto bankResponse = await _bankService.ProcessTransactionAsync(transaction, transactionDetails.Bank.BankURL).ConfigureAwait(false);

            Transaction transactionEntity = GetTransactionEntity(bankResponse, transaction, transactionDetails, cardEntity);

            await _transactionService.CreateTransactionAsync(transactionEntity).ConfigureAwait(false);

            return(Ok(transactionEntity));
        }
示例#17
0
 private void SetTransactionData(TransactionRepresenter data)
 {
     this.TransactionRepresenter = data;
 }
        public async Task <IActionResult> ProcessTransaction(TransactionRepresenter transactionRepresenter)
        {
            #region Validation

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (transactionRepresenter.Amount <= 0)
            {
                return(BadRequest("Amount is invalid"));
            }

            bool isValid = Guid.TryParse(transactionRepresenter.MerchantID, out Guid merchantID);
            if (!isValid)
            {
                return(BadRequest("Merchant is invalid"));
            }

            var merchant = new Merchant();
            merchant = _merchantService.GetMerchant(Guid.Parse(transactionRepresenter.MerchantID));

            if (merchant is null)
            {
                return(BadRequest("Merchant is invalid"));
            }

            var currency = new Currency();
            currency = _currencyService.GetCurrencyByName(transactionRepresenter.Currency);

            if (currency is null)
            {
                return(BadRequest("Currency not supported"));
            }

            var bank = new Bank();
            bank = _bankService.GetBankByName(transactionRepresenter.Bank);

            if (bank is null)
            {
                return(BadRequest("Bank not supported"));
            }

            #endregion

            var cardEntity = new Data.Model.CardDetails();
            cardEntity = _cardDetailsService.GetCardDetailsByNumber(transactionRepresenter.Card.CardNumber);

            // Verify if the card exists and if it doesnt insert the card into the db
            if (cardEntity is null)
            {
                //TODO Add automapper to handle model mappings
                cardEntity = new CardDetails
                {
                    CardNumber  = transactionRepresenter.Card.CardNumber,
                    Cvv         = transactionRepresenter.Card.Cvv,
                    ExpiryMonth = transactionRepresenter.Card.ExpiryMonth,
                    ExpiryYear  = transactionRepresenter.Card.ExpiryYear,
                    HolderName  = transactionRepresenter.Card.HolderName
                };

                _cardDetailsService.AddCard(cardEntity);
            }
            ;

            //var expiryConcatenated = $" {transaction.Card.ExpiryMonth}/{transaction.Card.ExpiryYear}";
            //CreditCardHelper.IsCreditCardInfoValid(transaction.Card.CardNumber, expiryConcatenated, transaction.Card.Cvv);

            //TODO Fix Bug Leading zeros on Amount
            var transactionEntity = new Data.Model.Transaction
            {
                Amount        = transactionRepresenter.Amount,
                Card          = cardEntity,
                CardID        = cardEntity.CardDetailsID,
                Currency      = currency,
                CurrencyID    = currency.CurrencyId,
                Merchant      = merchant,
                MerchantID    = merchant.MerchantID,
                Status        = TransactionStatus.Created.ToString(),
                TransactionID = Guid.NewGuid(),
                Bank          = bank,
                BankID        = bank.BankID
            };

            _transactionService.CreateTransaction(transactionEntity);

            var createdTransaction = _bankService.ProcessTransaction(transactionRepresenter, bank.BankURL).Result;
            createdTransaction.TransactionID = transactionEntity.TransactionID;

            //Update the transactioon with the bank response
            transactionEntity.BankReferenceID = createdTransaction.BankResponseID;
            transactionEntity.Status          = createdTransaction.Status.ToString();
            transactionEntity.SubStatus       = createdTransaction.SubStatus.ToString();

            _transactionService.UpdateTransaction(transactionEntity);

            return(Ok(createdTransaction));
        }