public IHttpActionResult Comprar(string cnpjLoja, string cpfUsuario, int cartaoId, decimal valor, bool auto_capture = true)
        {
            cpfUsuario = cpfUsuario.Trim().Replace(".", "").Replace("-", "").PadLeft(11, '0');
            cnpjLoja   = cnpjLoja.Trim().Replace(".", "").Replace("-", "").Replace("/", "");

            var cartao  = cartaoServico.BuscarPorId(cartaoId);
            var usuario = usuarioServico.PrimeiroPor(u => u.Pessoa.Documentos.Any(d => d.Numero.Trim().Replace(".", "").Replace("-", "").Equals(cpfUsuario)));
            var loja    = lojaServico.PrimeiroPor(l => l.Cnpj.Trim().Replace(".", "").Replace("-", "").Replace("/", "").Equals(cnpjLoja));

            if (cartao == null)
            {
                throw new BusinessRuleException("Cartão não encontrado.");
            }
            if (usuario == null)
            {
                throw new BusinessRuleException("Usuário não encontrado.");
            }
            if (loja == null)
            {
                throw new BusinessRuleException("Loja não encontrada.");
            }

            var pedido = new Entidade.Pedido
            {
                Cartao   = cartao,
                Usuario  = usuario,
                Valor    = valor,
                Loja     = loja,
                Endereco = usuario?.Pessoa?.EnderecoResidencial
            };

            pedidoServico.ValidarESalvar(pedido);

            var response = _apiTransacaoEbanx.CompraDireta(pedido, auto_capture);

            pedidoServico.ModificaStatus(pedido.Id, StatusPedido.AguardandoPagamento, pedido.Usuario, codigoRetornoTransacao: response.payment?.hash);

            return(Ok(response));
        }
        public Resposta <PedidoModelView> Finalizar([FromBody] Pedido entity)
        {
            if (entity.ListaCompra != null)
            {
                entity.ListaCompra = _listaCompraServico.BuscarPorId(entity.ListaCompra.Id);
            }

            var pessoa = entity.Usuario.Pessoa;

            var senhaCartao = entity.Cartao.Senha;
            var pedido      = _pedidoServico.ValidarESalvar(entity);

            pedido.Cartao = pedido.Cartao == null ? pedido.Cartao : _cartaoServico.DescriptografarCartao(pedido.Cartao);

            string retornoApi;
            var    retorno = new RespostaTransacaoCartaoModelView();

            if (ConfigurationManager.AppSettings["API_REALIZA_TRANSACAO"] == "0")
            {
                retornoApi = "sucesso";
            }
            else
            {
                pedido.Cartao.Decrypted = false;
                pedido.Cartao           = _cartaoServico.DescriptografarCartao(pedido.Cartao);

                switch (ConfigurationManager.AppSettings["API_REALIZA_TRANSACAO_FORMA_PAGAMENTO"])
                {
                case "0":
                {
                    //MobSeg
                    var cpf = pessoa.Documentos.FirstOrDefault(x => x.Tipo == (int)TipoDocumento.Cpf)?.Numero;

                    retornoApi = _apiTransacaoCartao.RealizaTransacaoCartao(Convert.ToInt64(cpf?.Replace(".", "").Replace("-", "")), 0,
                                                                            pedido.Cartao?.NumeroSemMascara, pedido.Cartao?.Validade.Replace("/", ""), pedido.Cartao?.Cvv, pedido.ListaCompra.Total.ToString("######.00").Replace(",", "").Replace(".", ""));

                    retorno = new JavaScriptSerializer().Deserialize <RespostaTransacaoCartaoModelView>(retornoApi);
                }
                break;

                case "1":
                {
                    //PayZen
                    var retornoKeyValue = Aplicacao.apipayzen.ApiPayzenBase.CreatePayment(pedido);
                    retornoApi = retornoKeyValue.Value;
                    retorno    = new RespostaTransacaoCartaoModelView
                    {
                        CodigoResposta = retornoKeyValue.Key,
                        Mensagem       = retornoKeyValue.Value
                    };
                }
                break;

                case "2":
                {
                    //MeuVale
                    var cpf = pessoa.Documentos.FirstOrDefault(x => x.Tipo == (int)TipoDocumento.Cpf)?.Numero;

                    pedido.CodEstabelecimentoInfox = pedido.Loja.CodigoInfox;
                    var pedidoModel = new Aplicacao.ApiInfox.Models.PedidoCompraModelView
                    {
                        Cliente = new Aplicacao.ApiInfox.Models.ClienteModelView
                        {
                            Id         = pessoa.CodClienteInfox,
                            CodCliente = pessoa.CodClienteInfox,
                            Pessoa     = new Aplicacao.ApiInfox.Models.PessoaModelView
                            {
                                Cpf            = cpf?.Replace(".", "").Replace("-", ""),
                                DataNascimento = pessoa.DataNascimento
                            },
                            Cartao = new Aplicacao.ApiInfox.Models.CartaoModelView
                            {
                                NomeImpresso = pedido.Cartao?.NomeImpresso,
                                Numero       = pedido.Cartao?.NumeroSemMascara.ExtractLettersAndNumbers(),
                                Cvv          = pedido.Cartao?.Cvv,
                                Senha        = senhaCartao
                            }
                        },
                        ValorPedido        = pedido.Valor.ToString("F2").Replace(",", "").Replace(".", ""),
                        CodEstabelecimento = pedido.CodEstabelecimentoInfox
                    };
                    retornoApi = _apiTransacaoCartaoInfox.CompraAVista(new JavaScriptSerializer().Serialize(pedidoModel));

                    var responseJson = new JavaScriptSerializer().Deserialize <Aplicacao.ApiInfox.Models.ResponseModelView>(retornoApi);

                    pedido.NSURedeRXInfox = responseJson.NSU_RedeRX;

                    pedido.Cartao = _cartaoServico.Criptografar(_cartaoServico.BuscarPorId(pedido.Cartao.Id));
                    _pedidoServico.Salvar(pedido);

                    retorno = new RespostaTransacaoCartaoModelView
                    {
                        CodigoResposta = responseJson.CodResp,
                        Mensagem       = responseJson.StrResp
                    };

                    if (responseJson.Return > 0)
                    {
                        _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.PagamentoNaoAprovado, pedido.Usuario, responseJson.StrResp, responseJson.Return.ToString());

                        throw new BusinessRuleException($"Resultado: {responseJson.Return} - {responseJson.StrResp}");
                    }

                    retorno = new RespostaTransacaoCartaoModelView
                    {
                        CodigoResposta = responseJson.CodResp,
                        Mensagem       = responseJson.StrResp
                    };

                    _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.PagamentoAprovado, pedido.Usuario, retorno.Mensagem, retorno.CodigoResposta);

                    _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.AguardandoAvaliacao, pedido.Usuario, "Sua avaliação é muito importante para nós");

                    return(new Resposta <PedidoModelView>
                        {
                            Mensagem = responseJson.Return == 0 ? "Pagamento realizado com sucesso! Loja: " + pedido.Loja.Descricao + " Valor: R$ " + pedido.Valor.ToString("N2") : "Falha ao processar o pagamento com a operadora do cartão!",
                            ObjetoRetorno = new PedidoModelView(pedido),
                            TipoMensagem = responseJson.Return == 0 ? TipoModal.Success : TipoModal.Danger
                        });
                }

                case "3":
                {
                    //Ebanx
                    var retornoEbanx = _apiTransacaoEbanx.CompraDireta(pedido);
                    var retornoJson  = Newtonsoft.Json.JsonConvert.SerializeObject(retornoEbanx);

                    retornoApi = retornoJson;

                    pedido.Cartao = _cartaoServico.Criptografar(_cartaoServico.BuscarPorId(pedido.Cartao.Id));
                    _pedidoServico.Salvar(pedido);

                    retorno = new RespostaTransacaoCartaoModelView
                    {
                        CodigoResposta = retornoEbanx.Code,
                        Mensagem       = retornoEbanx.Message
                    };

                    if (retorno.CodigoResposta != "OK")
                    {
                        _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.PagamentoNaoAprovado, pedido.Usuario, retorno.Mensagem, retorno.CodigoResposta);
                        throw new BusinessRuleException($"Resultado: {retorno.CodigoResposta} - {retorno.Mensagem}");
                    }

                    _pedidoServico.ModificaStatus(pedido.Id, StatusPedido.AguardandoPagamento, pedido.Usuario, codigoRetornoTransacao: retornoEbanx.payment?.hash);

                    return(new Resposta <PedidoModelView>
                        {
                            Mensagem = retorno.CodigoResposta == "OK" ? "Pagamento solicitado com sucesso!" : "Falha ao processar o pagamento com a operadora do cartão!",
                            ObjetoRetorno = new PedidoModelView(pedido),
                            TipoMensagem = retorno.CodigoResposta == "OK" ? TipoModal.Success : TipoModal.Danger
                        });
                }

                default:
                    retornoApi = "sucesso";
                    break;
                }

                pedido.Cartao = _cartaoServico.Criptografar(_cartaoServico.BuscarPorId(pedido.Cartao.Id));
            }

            if (retornoApi.Contains("sucesso"))
            {
                _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.PagamentoAprovado, pedido.Usuario, retorno.Mensagem, retorno.CodigoResposta);

                _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.AguardandoConfirmacao, pedido.Usuario, retorno.Mensagem, retorno.CodigoResposta);
            }
            else
            {
                _pedidoServico.AtribuiStatus(pedido.Id, (int)StatusPedido.PagamentoNaoAprovado, pedido.Usuario, retorno.Mensagem, retorno.CodigoResposta);
            }

            var pedidoRetorno = _pedidoServico.BuscarPorId(pedido.Id);

            pedidoRetorno.ListaCompra = _listaCompraServico.AtribuiDescontoAListaCompra(pedidoRetorno.ListaCompra);

            pedidoRetorno.Cartao.Decrypted = false;
            pedidoRetorno.Cartao           = _cartaoServico.DescriptografarCartao(pedidoRetorno.Cartao);
            pedidoRetorno.AvaliacaoPedido  = new AvaliacaoPedido {
                ItensDeAcordoComAnuncio = false, NotaAplicativo = 0, NotaPedido = 0
            };

            return(new Resposta <PedidoModelView>
            {
                Mensagem = retornoApi.Contains("sucesso") ? "Compra realizada com sucesso!" : "Falha ao processar o pagamento com a operadora do cartão!",
                ObjetoRetorno = new PedidoModelView(pedidoRetorno),
                TipoMensagem = retornoApi.Contains("sucesso") ? TipoModal.Success : TipoModal.Danger
            });
        }