Exemplo n.º 1
0
        public async Task <Result <PaymentRequest> > ProcessPaymentRequest(int paymentRequestId)
        {
            var paymentRequest = await _paymentsData.Get(paymentRequestId);

            if (paymentRequest == null)
            {
                return new Result <PaymentRequest> {
                           Message = PaymentConstants.NotFound, Success = false
                }
            }
            ;

            if (paymentRequest.Status != PaymentStatus.Pending)
            {
                return(new Result <PaymentRequest> {
                    Entity = paymentRequest, Message = $"Cannot process payment because it is {paymentRequest.Status}.", Success = false
                });
            }

            if (paymentRequest.Amount > paymentRequest.Account.Balance)
            {
                ClosePaymentRequest(paymentRequest, PaymentConstants.NotEnoughFunds);
                if (await _paymentsData.Commit() > 0)
                {
                    return(new Result <PaymentRequest> {
                        Entity = paymentRequest, Message = PaymentConstants.NotEnoughFunds, Success = false
                    });
                }
            }
            else
            {
                paymentRequest.Status           = PaymentStatus.Processed;
                paymentRequest.Account.Balance -= paymentRequest.Amount;

                _paymentsData.Update(paymentRequest);

                if (await _paymentsData.Commit() > 0)
                {
                    return(new Result <PaymentRequest> {
                        Entity = paymentRequest, Message = "Payment request processed successfully.", Success = true
                    });
                }
            }

            return(new Result <PaymentRequest> {
                Entity = paymentRequest, Message = PaymentConstants.CouldNotBeSaved, Success = false
            });
        }