public async Task <ResponseMessage> CapturarPagamento(Guid pedidoId)
        {
            var transacoes = await _pagamentoRepository.ObterTransacaoesPorPedidoId(pedidoId);

            var transacaoAutorizada = transacoes?.FirstOrDefault(t => t.Status == StatusTransacao.Autorizado);
            var validationResult    = new ValidationResult();

            if (transacaoAutorizada == null)
            {
                throw new DomainException($"Transação não encontrada para o pedido {pedidoId}");
            }

            var transacao = await _pagamentoFacade.CapturarPagamento(transacaoAutorizada);

            if (transacao.Status != StatusTransacao.Pago)
            {
                validationResult.Errors.Add(new ValidationFailure("Pagamento",
                                                                  $"Não foi possível capturar o pagamento do pedido {pedidoId}"));

                return(new ResponseMessage(validationResult));
            }

            transacao.PagamentoId = transacaoAutorizada.PagamentoId;
            _pagamentoRepository.AdicionarTransacao(transacao);

            if (!await _pagamentoRepository.UnitOfWork.Commit())
            {
                validationResult.Errors.Add(new ValidationFailure("Pagamento",
                                                                  $"Não foi possível persistir a captura do pagamento do pedido {pedidoId}"));

                return(new ResponseMessage(validationResult));
            }

            return(new ResponseMessage(validationResult));
        }
        public async Task <Transacao> RealizarPagamentoPedido(PagamentoPedido pagamentoPedido)
        {
            var pedido = new Pedido
            {
                Id    = pagamentoPedido.PedidoId,
                Valor = pagamentoPedido.Total
            };

            var pagamento = new Pagamento
            {
                Valor           = pagamentoPedido.Total,
                NomeCartao      = pagamentoPedido.NomeCartao,
                NumeroCartao    = pagamentoPedido.NumeroCartao,
                ExpiracaoCartao = pagamentoPedido.ExpiracaoCartao,
                CvvCartao       = pagamentoPedido.CvvCartao,
                PedidoId        = pagamentoPedido.PedidoId
            };

            var transacao = _pagamentoCartaoCreditoFacade.RealizarPagamento(pedido, pagamento);

            if (transacao.StatusTransacao == StatusTransacao.Pago)
            {
                pagamento.AdicionarEvento(
                    new PagamentoRealizadoEvent(
                        pedido.Id,
                        pagamentoPedido.ClienteId,
                        transacao.PagamentoId,
                        transacao.Id,
                        pedido.Valor
                        )
                    );

                _pagamentoRepository.Adicionar(pagamento);
                _pagamentoRepository.AdicionarTransacao(transacao);

                await _pagamentoRepository.UnitOfWork.Commit();

                return(transacao);
            }

            await _mediatorHandler.PublicarNotificacao(
                new DomainNotification("pagamento", "A operadora recusou o pagamento")
                );

            await _mediatorHandler.PublicarEvento(
                new PagamentoRecusadoEvent(
                    pedido.Id,
                    pagamentoPedido.ClienteId,
                    transacao.PagamentoId,
                    transacao.Id,
                    pedido.Valor
                    )
                );

            return(transacao);
        }