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 }));
        }
Ejemplo n.º 2
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
                    });
                }
            }
        }