Beispiel #1
0
        public static bool IsValid(this CreditCard creditCard, PostPaymentRequest request)
        {
            if (creditCard.IssuingNetwork != request.IssuingNetwork)
            {
                return(false);
            }

            if (creditCard.CardNumber != request.CardNumber)
            {
                return(false);
            }

            if (!creditCard.ExpirationDate.HasValue && !request.ExpirationDate.HasValue)
            {
                return(false);
            }

            if (creditCard.ExpirationDate.Value.Year != request.ExpirationDate.Value.Year)
            {
                return(false);
            }

            if (creditCard.ExpirationDate.Value.Month != request.ExpirationDate.Value.Month)
            {
                return(false);
            }

            if (creditCard.Cvv != request.Cvv)
            {
                return(false);
            }

            return(true);
        }
        public async Task <HttpResponseMessage> PostPaymentAsync(PostPaymentRequest request)
        {
            var token = await IdentityServerHelper.GetRothschildHouseTokenAsync();

            client.SetBearerToken(token.AccessToken);

            return(await client.PostAsync(apiUrl.Controller("Transaction").Action("Payment").ToString(), request.GetStringContent()));
        }
Beispiel #3
0
        public static bool HasFounds(this CreditCard creditCard, PostPaymentRequest request)
        {
            if (creditCard.AvailableFounds <= request.Amount)
            {
                return(false);
            }

            return(true);
        }
        public async Task <IActionResult> PostPayment([FromBody] PostPaymentRequest request)
        {
            // todo: check if customer exists in database

            var creditCards = await DbContext.GetCreditCardByCardHolderName(request.CardHolderName).ToListAsync();

            var creditCard = default(CreditCard);

            if (creditCards.Count > 1)
            {
                creditCard = creditCards.FirstOrDefault(item => item.CardNumber == request.CardNumber);

                if (creditCard == null)
                {
                    return(BadRequest(string.Format("There isn't record for credit card with last 4 digits: {0}.", request.CardNumber)));
                }
            }
            else if (creditCards.Count == 1)
            {
                creditCard = creditCards.First();
            }
            else
            {
                return(BadRequest(string.Format("There isn't record for credit card with last 4 digits: {0}.", request.CardNumber)));
            }

            // todo: check credit card info in database

            if (!creditCard.IsValid(request))
            {
                return(BadRequest(string.Format("There is invalid data for credit card in this transaction.")));
            }

            // todo: check if customer has available credit (limit)

            if (!creditCard.HasFounds(request))
            {
                return(BadRequest(string.Format("There isn't founds to approve this transaction.")));
            }

            var txn = new PaymentTransaction
            {
                PaymentTransactionID = Guid.NewGuid(),
                CreditCardID         = creditCard.CreditCardID,
                ConfirmationID       = Guid.NewGuid(),
                Amount          = request.Amount,
                PaymentDateTime = DateTime.Now
            };

            DbContext.PaymentTransactions.Add(txn);

            creditCard.AvailableFounds -= request.Amount;

            await DbContext.SaveChangesAsync();

            return(Ok(new { txn.ConfirmationID, creditCard.Last4Digits }));
        }
        public async Task <IActionResult> Post([FromBody] PostPaymentRequest request)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var paymentId = Guid.NewGuid();

            try
            {
                var payment = _mapper.Map <Payment>(request);
                payment.Id         = paymentId;
                payment.CardNumber = _encryptionService.Encrypt(request.CardNumber);
                var bankRequest = _mapper.Map <BankRequest>(request);

                await _paymentRepository.AddPaymentAsync(payment);

                _logger.LogInformation($"POST - Starting request to bank for payment {payment.Id}");

                var bankResponse = await _bankRequestService.PostBankRequestAsync(bankRequest);

                payment.BankResponseId = bankResponse.Id;
                payment.PaymentStatus  = bankResponse.PaymentStatus;

                await _paymentRepository.UpdatePaymentAsync(payment);

                var postPaymentResponse = new PostPaymentResponse {
                    PaymentId = payment.Id
                };

                return(Ok(postPaymentResponse));
            }
            catch (Exception ex)
            {
                _logger.LogError($"POST - Failed due to exception ${ex.GetType()} with error ${ex.Message} for request ${paymentId}");
                return(StatusCode(500));
            }
        }
Beispiel #6
0
        private static (Transaction, Transaction) CreateTransactions(PostPaymentRequest postPaymentRequest)
        {
            var utcNow = DateTime.UtcNow;

            var debitTransaction = new Transaction
            {
                Amount             = postPaymentRequest.Amount * -1,
                TransactionTimeUtc = utcNow,
                Description        = postPaymentRequest.Description,
                MerchantName       = postPaymentRequest.MerchantName
            };

            var creditTransaction = new Transaction
            {
                //this needs tweaking... doesn't work for outbound transactions because it doesn't capture the account number to send it to
                Amount             = postPaymentRequest.Amount,
                TransactionTimeUtc = utcNow,
                Description        = postPaymentRequest.Description,
                MerchantName       = postPaymentRequest.MerchantName
            };

            return(debitTransaction, creditTransaction);
        }
 public async Task <HttpResponseMessage> PostPaymentAsync(TokenResponse token, PostPaymentRequest request)
 => new HttpResponseMessage(HttpStatusCode.OK)
 {
     Content = new StringContent(JsonConvert.SerializeObject(PaymentResponseMocks.SuccessPayment))
 };
Beispiel #8
0
        public async Task <IActionResult> PostPaymentAsync([FromBody] PostPaymentRequest request)
        {
            Logger?.LogDebug("'{0}' has been invoked", nameof(PostPaymentAsync));

            var creditCards = await DbContext.GetCreditCardByCardHolderName(request.CardHolderName).ToListAsync();

            var creditCard = default(CreditCard);

            var last4Digits = request.CardNumber.Substring(request.CardNumber.Length - 4);

            if (creditCards.Count > 1)
            {
                creditCard = creditCards.FirstOrDefault(item => item.CardNumber == request.CardNumber);
            }
            else if (creditCards.Count == 1)
            {
                creditCard = creditCards.First();
            }

            if (creditCard == null)
            {
                return(BadRequest(string.Format("There is not record for credit card with last 4 digits: {0}.", last4Digits)));
            }

            /* Check credit card information */

            if (!creditCard.IsValid(request))
            {
                return(BadRequest(string.Format("Invalid information for card payment.")));
            }

            /* Check if customer has available credit (limit) */

            if (!creditCard.HasFounds(request))
            {
                return(BadRequest(string.Format("There are no founds to approve the payment.")));
            }

            using (var txn = await DbContext.Database.BeginTransactionAsync())
            {
                try
                {
                    var paymentTxn = new PaymentTransaction
                    {
                        PaymentTransactionID = Guid.NewGuid(),
                        CreditCardID         = creditCard.CreditCardID,
                        ConfirmationID       = Guid.NewGuid(),
                        Amount          = request.Amount,
                        PaymentDateTime = DateTime.Now
                    };

                    DbContext.PaymentTransactions.Add(paymentTxn);

                    creditCard.AvailableFounds -= request.Amount;

                    await DbContext.SaveChangesAsync();

                    txn.Commit();

                    Logger?.LogInformation("The payment for card with last 4 digits: '{0}' was successfully. Confirmation #: {1}", last4Digits, paymentTxn.ConfirmationID);

                    var response = new PaymentResponse
                    {
                        ConfirmationID  = paymentTxn.ConfirmationID,
                        PaymentDateTime = paymentTxn.PaymentDateTime,
                        Last4Digits     = creditCard.Last4Digits
                    };

                    return(Ok(response));
                }
                catch (Exception ex)
                {
                    Logger?.LogCritical("There was an error on '{0}': {1}", nameof(PostPaymentAsync), ex);

                    txn.Rollback();

                    return(new ObjectResult(ex.Message)
                    {
                        StatusCode = (int)HttpStatusCode.InternalServerError
                    });
                }
            }
        }
 public async Task <HttpResponseMessage> PostPaymentAsync(PostPaymentRequest request)
 {
     return(await client.PostAsync(apiUrl.Controller("Transaction").Action("Payment").ToString(), request.GetStringContent()));
 }
Beispiel #10
0
        public async Task <IActionResult> PostPayment([FromBody] PostPaymentRequest postPaymentRequest)
        {
            _logger.LogInformation("incoming post payment request", postPaymentRequest);
            if (IsValid(postPaymentRequest))
            {
                var(debit, credit) = CreateTransactions(postPaymentRequest);

                var fromAccount = await GetAccount(postPaymentRequest.FromAccount);

                if (fromAccount == null)
                {
                    return(NotFound());
                }

                fromAccount.PostTransaction(debit);

                var interIntra = "";

                if (IsIntrabank(postPaymentRequest))
                {
                    _logger.LogInformation("intrabank payment request", postPaymentRequest);
                    var toAccount = await GetAccount(postPaymentRequest.ToAccount, false);

                    if (toAccount == null)
                    {
                        return(NotFound());
                    }

                    toAccount.PostTransaction(credit);
                    interIntra = "intra";
                }
                else
                {
                    _logger.LogInformation("outbound payment request", postPaymentRequest);
                    await AddToSettlementBatch(credit);

                    interIntra = "inter";
                }

                await _db.SaveChangesAsync();

                _logger.LogInformation($"Posted {interIntra}-bank transaction of ${credit.Amount} from {postPaymentRequest.FromAccount} to {postPaymentRequest.ToAccount}");

                /*await _cloudWatch.PutMetricDataAsync(new PutMetricDataRequest
                 * {
                 *  Namespace = "Payments",
                 *  MetricData = new List<MetricDatum>
                 *  {
                 *      new MetricDatum
                 *      {
                 *          MetricName = "TransferEvent",
                 *          Unit = StandardUnit.Count,
                 *          Value = 1,
                 *          TimestampUtc = DateTime.UtcNow,
                 *          Dimensions = new List<Dimension>
                 *          {
                 *              new Dimension { Name = "InterIntra", Value = interIntra }
                 *          }
                 *      },
                 *      new MetricDatum
                 *      {
                 *          MetricName = "TransferValue",
                 *          Unit = StandardUnit.None,
                 *          Value = (double) credit.Amount,
                 *          TimestampUtc = DateTime.UtcNow,
                 *          Dimensions = new List<Dimension>
                 *          {
                 *              new Dimension { Name = "InterIntra", Value = interIntra }
                 *          }
                 *      }
                 *  }
                 * });*/

                return(Ok());
            }

            return(UnprocessableEntity());
        }
Beispiel #11
0
 private bool IsValid(PostPaymentRequest postPaymentRequest)
 {
     return(postPaymentRequest.Amount > 0M && IsExistingAccount(postPaymentRequest.FromAccount));
 }
Beispiel #12
0
 private bool IsIntrabank(PostPaymentRequest postPaymentRequest)
 {
     return(postPaymentRequest.ToAccount.StartsWith(_config["BankPrefix"]));
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="httpClient"></param>
 /// <param name="request"></param>
 /// <returns></returns>
 public static async Task <HttpResponseMessage> PostPaymentAsync(this HttpClient httpClient, PostPaymentRequest request)
 {
     return(await httpClient.PostAsync("http://localhost:19000/api/v1/Transaction/Payment", GetStringContent(request)));
 }
        public async Task <HttpResponseMessage> PostPaymentAsync(TokenResponse token, PostPaymentRequest request)
        {
            using (var client = new HttpClient())
            {
                client.SetBearerToken(token.AccessToken);

                return(await client.PostAsync(
                           apiUrl.Controller("Transaction").Action("Payment").ToString(),
                           request.GetStringContent()
                           ));
            }
        }
Beispiel #15
0
 public async Task <IActionResult> PostPayment([FromBody] PostPaymentRequest request)
 {
     return(Ok());
 }