public string Imprimir(Entidade.Pedido pedido)
        {
            var hash = pedido.ListaHistorico.FirstOrDefault(h => h.StatusPedido == Entidade.Uteis.StatusPedido.AguardandoPagamento)?.CodigoRetornoTransacao;
            var url  = $"{ApiEbanxBase.API_EBANX_URL.TrimEnd('/')}/print?hash={hash}&format=html";

            var response = new System.Net.WebClient().DownloadString(url);

            return(response);
        }
        public Models.DirectResponseModel CompraDireta(Entidade.Pedido pedido, bool auto_capture = true)
        {
            var usuario = pedido.Usuario.Pessoa;
            var cartao  = new Models.CreditCardModel
            {
                card_number   = pedido.Cartao.NumeroSemMascara,
                card_name     = pedido.Cartao.NomeImpresso ?? usuario.Nome.ToUpper(),
                card_due_date = pedido.Cartao.DataValidade?.ToString("MM/yyyy"),
                card_cvv      = pedido.Cartao.CvvSemMascara
            };

            if (!string.IsNullOrEmpty(pedido.Cartao.Token))
            {
                cartao = new Models.CreditCardModel {
                    token = pedido.Cartao.Token
                }
            }
            ;

            cartao.auto_capture = auto_capture;

            var endereco = usuario.EnderecoResidencial;
            var request  = new Models.DirectRequestModel
            {
                integration_key = API_EBANX_INTEGRATION_KEY,
                operation       = "request",
                mode            = "full",
                payment         = new Models.PaymentModel
                {
                    name                  = usuario.Nome,
                    email                 = usuario.Email,
                    document              = usuario.Cpf ?? pedido.Usuario.Pessoa.Cnpj,
                    address               = endereco?.Logradouro,
                    street_number         = endereco?.Numero,
                    city                  = endereco?.Cidade?.Descricao,
                    state                 = endereco?.Cidade?.Estado?.Sigla,
                    zipcode               = endereco?.Cep.ExtractNumbers().PadLeft(8, '0'),
                    country               = "br",
                    phone_number          = usuario.Celular,
                    payment_type_code     = "discover",
                    merchant_payment_code = pedido.Loja.Cnpj.ExtractNumbers().PadLeft(14, '0') + "_" + pedido.Id,
                    currency_code         = "BRL",
                    instalments           = 1,
                    amount_total          = pedido.Valor,
                    creditcard            = cartao
                }
            };

            var url  = $"/ws/direct";
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(request);

            var response = ApiEbanxBase.RequestApi(HttpVerbs.Post, url, json);

            return(Newtonsoft.Json.JsonConvert.DeserializeObject <Models.DirectResponseModel>(response));
        }
        public Models.CancelResponseModel Cancelar(Entidade.Pedido pedido)
        {
            var hash = pedido.ListaHistorico.FirstOrDefault(h => h.StatusPedido == Entidade.Uteis.StatusPedido.AguardandoPagamento)?.CodigoRetornoTransacao;

            var request = new Models.CancelRequestModel
            {
                integration_key = API_EBANX_INTEGRATION_KEY,
                hash            = hash
            };

            var url  = $"/ws/cancel";
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(request);

            var response = ApiEbanxBase.RequestApi(HttpVerbs.Post, url, json);

            return(Newtonsoft.Json.JsonConvert.DeserializeObject <Models.CancelResponseModel>(response));
        }
        public Models.RefundOrCancelResponseModel CancelarOuEstornar(Entidade.Pedido pedido, string motivo)
        {
            var hash    = pedido.ListaHistorico.FirstOrDefault(h => h.StatusPedido == Entidade.Uteis.StatusPedido.AguardandoPagamento)?.CodigoRetornoTransacao;
            var cnpj    = pedido.Loja.Cnpj.ExtractNumbers().PadLeft(14, '0');
            var request = new Models.RefundOrCancelRequestModel
            {
                integration_key      = API_EBANX_INTEGRATION_KEY,
                hash                 = hash,
                description          = motivo,
                merchant_refund_code = $"{cnpj}_{pedido.Id}_refund"
            };

            var url  = $"/ws/refundOrCancel";
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(request);

            var response = ApiEbanxBase.RequestApi(HttpVerbs.Post, url, json);

            return(Newtonsoft.Json.JsonConvert.DeserializeObject <Models.RefundOrCancelResponseModel>(response));
        }
        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));
        }