Esempio n. 1
0
        public async Task <ResponseMessage> CapturePayment(Guid orderId)
        {
            var transactions = await _paymentRepository.GetTransactionByOrderId(orderId);

            var authorizedTransaction = transactions?.FirstOrDefault(t => t.Status == TransactionStatus.Authorized);
            var validationResult      = new ValidationResult();

            if (authorizedTransaction == null)
            {
                throw new DomainException($"Transaction not found for the order {orderId}");
            }

            var transaction = await _paymentFacade.CapturePayment(authorizedTransaction);

            if (transaction.Status != TransactionStatus.Paid)
            {
                validationResult.Errors.Add(new ValidationFailure("Payment", $"An error occurred to process the payment for the order {orderId}"));
                return(new ResponseMessage(validationResult));
            }

            transaction.PaymentId = authorizedTransaction.PaymentId;
            _paymentRepository.AddTransaction(transaction);

            if (!await _paymentRepository.UnitOfWork.Commit())
            {
                validationResult.Errors.Add(new ValidationFailure("Payment", $"An error occurred to process the payment for the order {orderId}"));
            }

            return(new ResponseMessage(validationResult));
        }
Esempio n. 2
0
        public async Task <ResponseMessage> CapturePayment(Guid orderId)
        {
            var transactions = await _paymentRepository.GetTransactionsByOrderId(orderId);

            var transactionAuthorized = transactions?.FirstOrDefault(t => t.Status == StatusTransaction.Authorized);
            var validationResult      = new ValidationResult();

            if (transactionAuthorized == null)
            {
                throw new DomainException($"transaction not found - order {orderId}");
            }

            var transaction = await _paymentFacade.CapturePayment(transactionAuthorized);

            if (transaction.Status != StatusTransaction.Paid)
            {
                validationResult.Errors.Add(new ValidationFailure("Payment",
                                                                  $"Order payment could not be captured {orderId}"));

                return(new ResponseMessage(validationResult));
            }

            transaction.PaymentId = transactionAuthorized.PaymentId;
            _paymentRepository.AddTransaction(transaction);

            if (!await _paymentRepository.UnitOfWork.Commit())
            {
                validationResult.Errors.Add(new ValidationFailure("Payment",
                                                                  $"Order payment capture could not be persisted {orderId}"));

                return(new ResponseMessage(validationResult));
            }

            return(new ResponseMessage(validationResult));
        }
        public async Task <Transaction> MakeOrderPayment(PaymentOrder paymentOrder)
        {
            var order = new Order
            {
                Id    = paymentOrder.OrderId,
                Value = paymentOrder.Total
            };

            var payment = new Payment
            {
                Value          = paymentOrder.Total,
                CardName       = paymentOrder.CardName,
                CardNumber     = paymentOrder.CardNumber,
                ExpirationCard = paymentOrder.ExpirationCard,
                CvvCard        = paymentOrder.CvvCard,
                OrderId        = paymentOrder.OrderId
            };

            var transaction = _paymentCreditCardFacade.MakePayment(order, payment);

            if (transaction.StatusTransaction == StatusTransaction.Paid)
            {
                payment.AddEvent(new PaymentMadeEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value));

                _paymentRepository.Add(payment);
                _paymentRepository.AddTransaction(transaction);

                await _paymentRepository.UnitOfWork.Commit();

                return(transaction);
            }

            await _mediatorHandler.PublishNotification(new DomainNotification("payment", "Card operator refused the payment"));

            await _mediatorHandler.PublishEvent(new PaymentOrderRefusedEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value));

            return(transaction);
        }
Esempio n. 4
0
        public async Task <Transaction> Pay(OrderPayment orderPayment)
        {
            var order = new Order
            {
                Id    = orderPayment.OrderId,
                Total = orderPayment.Total
            };

            var payment = new Payment
            {
                Amount     = orderPayment.Total,
                CardName   = orderPayment.CardName,
                CardNumber = orderPayment.CardNumber,
                ExpiryDate = orderPayment.ExpiryDate,
                CvvCode    = orderPayment.CvvCode,
                OrderId    = orderPayment.OrderId
            };

            var transaction = _creditCardPaymentFacade.Pay(order, payment);

            if (transaction.TransactionStatus == TransactionStatus.Paid)
            {
                payment.AddEvent(new OrderPaymentConfirmedEvent(order.Id, orderPayment.CustomerId, transaction.PaymentId, transaction.Id, order.Total));

                _paymentRepository.Add(payment);
                _paymentRepository.AddTransaction(transaction);

                await _paymentRepository.UnitOfWork.Commit();

                return(transaction);
            }

            await _mediatorHandler.PublishNotification(new DomainNotification("Payment", "The provider has denied payment"));

            await _mediatorHandler.PublishEvent(new OrderPaymentRejectedEvent(order.Id, orderPayment.CustomerId, transaction.PaymentId, transaction.Id, order.Total));

            return(transaction);
        }