public Resposta <Pedido> EstornarPedido(int pedidoId)
        {
            var pedido = _pedidoServico.BuscarPorId(pedidoId);

            pedido.Cartao.Decrypted = false;
            pedido.Cartao           = _cartaoServico.DescriptografarCartao(pedido.Cartao);

            var pedidoModel = new Aplicacao.ApiInfox.Models.PedidoCompraModelView
            {
                Cliente = new Aplicacao.ApiInfox.Models.ClienteModelView
                {
                    Id         = pedido.Usuario.Pessoa.CodClienteInfox,
                    CodCliente = pedido.Usuario.Pessoa.CodClienteInfox,
                    Cartao     = new Aplicacao.ApiInfox.Models.CartaoModelView
                    {
                        Numero = pedido?.Cartao?.NumeroSemMascara.ExtractLettersAndNumbers(),
                    }
                },
                NSU_RedeRX         = pedido.NSURedeRXInfox,
                CodEstabelecimento = pedido.CodEstabelecimentoInfox
            };
            var retornoApi = _apiTransacaoCartaoInfox.DesfazCompraAVista(new JavaScriptSerializer().Serialize(pedidoModel));

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

            var retorno = new RespostaTransacaoCartaoModelView
            {
                CodigoResposta = responseJson.CodResp,
                Mensagem       = responseJson.Return == 0 ? $"Estorno realizado com sucesso. {responseJson.StrResp}" : responseJson.StrResp
            };

            return(new Resposta <Pedido>
            {
                Mensagem = responseJson.Return == 0 ? "Estorno realizado com sucesso!" : "Falha ao estornar!",
                ObjetoRetorno = pedido,
                TipoMensagem = responseJson.Return == 0 ? TipoModal.Success : TipoModal.Danger
            });
        }
        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
            });
        }
        public Resposta <Pedido> Finalizar([FromBody] Pedido entity)
        {
            entity.ListaCompra = _listaCompraServico.BuscarPorId(entity.ListaCompra.Id);

            var pedido = _pedidoServico.ValidarESalvar(entity);

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

            var    cpf = pedido.Usuario.Pessoa.Documentos.FirstOrDefault(x => x.Tipo == (int)TipoDocumento.Cpf)?.Numero;
            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
                    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;

                default:
                    retornoApi = "sucesso";
                    break;
                }

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

            if (retornoApiInfox.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);

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