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); }