/// <summary>
        /// Método que carrega os produtos, pois na consulta de pedidos da API Rest, os itens não carregam os dados mercadológicos
        /// </summary>
        private static void CarregarGrupoProdutos()
        {
            _logger.Info("Carregar Grupo Produtos...");

            IRestResponse response;

            // A cada importação, a lista de produtos é destruida para sempre pegar uma listagem nova


            var client  = new RestClient((URL_BASE + URL_GRUPOPRODUTO).Replace("[apikey]", _apiKey));
            var request = new RestRequest(Method.GET);

            response = client.Execute(request);

            // Contando os requests para logar. Isso vai ajudar a mensurar quantas requisições estão sendo feitas por execução
            qtdeRequest++;

            if (response.StatusCode == System.Net.HttpStatusCode.OK && JsonValue.Parse(response.Content)["retorno"].ContainsKey("gruposprodutos"))
            {
                var listGruposProdutosJson = (JsonArray)JsonValue.Parse(response.Content)["retorno"]["gruposprodutos"];

                foreach (var grupoProdutoAux in listGruposProdutosJson)
                {
                    var grupoProduto = new GrupoProduto {
                        Id      = grupoProdutoAux["id"],
                        nome    = (string)grupoProdutoAux["nome"],
                        idPai   = grupoProdutoAux["idPai"],
                        nomePai = grupoProdutoAux["nomePai"],
                    };

                    _gruposProduto.Add(grupoProduto);
                }
            }
            _logger.Info("Lista de Grupos Produtos carregada");
        }
        /// <summary>
        /// Método que extraí os dados necessários para a criação do arquivo
        /// </summary>
        /// <param name="pedido">Recebe um JSON dinamico de pedido</param>
        /// <returns>A string concatenada com os registros desse pedido</returns>
        private static string ExtrairRegistroFormatoSalescope(dynamic pedido)
        {
            // Inicializando os objetos
            dynamic cliente    = pedido["cliente"];
            dynamic notaFiscal = ((JsonObject)pedido).Keys.Contains("nota") ? pedido["nota"] : null;

            if (!((JsonObject)pedido).Keys.Contains("itens"))
            {
                return(null);
            }

            dynamic itens = pedido["itens"];

            // AS notas com status 3 = Cancelada, 5 = Rejeitada ou 10 = Denegada devem ser descartadas.
            var situacoesDescartadas = new List <string>()
            {
                "3", "5", "10"
            };

            if (notaFiscal != null && situacoesDescartadas.Contains(notaFiscal["situacao"]?.ToString().Replace("\"", "") ?? ""))
            {
                return(null);
            }

            // Ignorar clientes em branco
            if (cliente == null || string.IsNullOrWhiteSpace((string)cliente["cnpj"]))
            {
                if (notaFiscal == null)
                {
                    _logger.Error($"Cliente do pedido {(string)pedido["numero"]} não encontrado.");
                }
                else
                {
                    _logger.Error($"Cliente da nota {notaFiscal["numero"]} não encontrado.");
                }
                return(null);
            }

            // Obtendo os dados comuns por pedido ou nota
            var nf            = notaFiscal == null ? (string)pedido["numero"] : ((string)notaFiscal["numero"]).Left(10);
            var filial        = _nomeFilial;
            var estado        = (string)cliente["uf"];
            var cidade        = ((string)cliente["cidade"]).Left(50);
            var situacao      = notaFiscal == null ? "Pedido em aberto" : "Nota emitida";
            var gerente       = "";
            var representante = pedido["vendedor"] != null ? (string)pedido["vendedor"] : "";
            var canal         = "";
            var segmento      = "";
            var nomeCliente   = String.IsNullOrEmpty((string)cliente["nome"]) ? NAO_DISPONIVEL : ((string)cliente["nome"]).Left(50);
            var complementar  = "";
            var dataEmissao   = notaFiscal == null?Convert.ToDateTime((string)pedido["data"]) : Convert.ToDateTime((string)notaFiscal["dataEmissao"]);

            var endereco = String.Format("{0}, {1}, {2}", (string)cliente["endereco"], (string)cliente["bairro"], ((string)cliente["numero"]).Left(150));
            var cep      = (string)cliente["cep"];
            var telefone = String.IsNullOrEmpty((string)cliente["fone"]) ? NAO_DISPONIVEL : ((string)cliente["fone"]).Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "");
            var email    = String.IsNullOrEmpty((string)cliente["email"]) ? NAO_DISPONIVEL : ((string)cliente["email"]).Left(100);

            //TODO Tratar itens com quantidade zerada
            var qtdeTotalItens = QtdeTotalPedido(itens);
            var valorFrete     = ((JsonObject)pedido).Keys.Contains("valorfrete") ? (decimal)pedido["valorfrete"] : 0;
            var valorDesconto  = ((JsonObject)pedido).Keys.Contains("desconto") ? Convert.ToDecimal((((string)pedido["desconto"]).Replace("%", ""))) : 0;

            decimal valorFretePorItem, valorDescontoPorItem;

            if (qtdeTotalItens > 0)
            {
                valorFretePorItem    = (valorFrete / qtdeTotalItens);
                valorDescontoPorItem = (valorDesconto / qtdeTotalItens);
            }
            else
            {
                valorFretePorItem    = 0;
                valorDescontoPorItem = 0;
            }


            var transportadora = "";
            var tipoFrete      = "";

            if (!((JsonObject)pedido).Keys.Contains("transporte"))
            {
                transportadora = "Retirada";
                tipoFrete      = "ND";
            }
            else if (((JsonObject)pedido["transporte"]).Keys.Contains("servico_correios"))
            {
                transportadora = (string)pedido["transporte"]["servico_correios"];
                tipoFrete      = "FOB";
            }
            else if (((JsonObject)pedido["transporte"]).Keys.Contains("transportadora"))
            {
                transportadora = (string)pedido["transporte"]["transportadora"];
                tipoFrete      = (string)pedido["transporte"]["tipo_frete"] == "D" ? "FOB" : "CIF";
            }
            else
            {
                transportadora = "Não Informado";
                tipoFrete      = "ND";
            }

            var auxFormaPgto = "";

            if (!((JsonObject)pedido).Keys.Contains("parcelas"))
            {
                auxFormaPgto = "Não Informado";
            }
            else
            {
                auxFormaPgto = (string)pedido["parcelas"][0]["parcela"]["forma_pagamento"]["descricao"];
            }

            var formaPgto = "";

            if (auxFormaPgto.ToUpper().Contains("BOLETO"))
            {
                formaPgto = "Boleto";
            }
            else if (auxFormaPgto.ToUpper().Contains("DINHEIRO"))
            {
                formaPgto = "Dinheiro";
            }
            else
            {
                formaPgto = "Cartão";
            }

            #region Tratamento do CNPJ
            var    tipoCliente = "";
            string cnpjSemPonto = ((string)cliente["cnpj"]).ToString().Replace(".", "").Replace("/", "").Replace("-", "");
            string cnpjParte1 = "", cnpjParte2 = "";

            if (cnpjSemPonto.Length < 14)
            {
                cnpjParte1 = cnpjSemPonto;
            }
            else
            {
                cnpjParte1 = cnpjSemPonto.Substring(0, 8);
                cnpjParte2 = cnpjSemPonto.Substring(8, 4);
            }

            if (Regex.IsMatch((string)cliente["cnpj"], @"(^(\d{2}.\d{3}.\d{3}/\d{4}-\d{2})$)"))
            {
                tipoCliente = "Pessoa Jurídica";
            }
            else if (Regex.IsMatch((string)cliente["cnpj"], @"(^(\d{3}.\d{3}.\d{3}-\d{2})$)"))
            {
                tipoCliente = "Pessoa Física";
            }
            else
            {
                tipoCliente = "Indefinido";
            }

            #endregion

            var registro = new StringBuilder();

            foreach (dynamic aux in itens)
            {
                var item = aux["item"];

                if (string.IsNullOrWhiteSpace(item["codigo"]))
                {
                    _logger.Error($"Produto '{item["descricao"]}' não possui código.");
                }
                else
                {
                    // Consultando o produto na lista pré-carregada
                    Produto produto          = ConsultaProduto(item["codigo"]);
                    var     nomeGrupoProduto = "";

                    if (produto != null)
                    {
                        GrupoProduto grupoProduto = (GrupoProduto)ConsultaGrupoProduto(produto.grupoProduto);
                        nomeGrupoProduto = grupoProduto != null ? grupoProduto.nome : "";
                    }

                    // campos do produto
                    //TODO Tratar itens com quantidade zerada
                    var nomeProduto          = ((string)(!string.IsNullOrEmpty(produto?.descricao) ? produto?.descricao : (string)item["descricao"])).Left(50);
                    var qtde                 = decimal.ToInt32(Convert.ToDecimal(((string)item["quantidade"]).Replace(".", ",")));
                    var valorTotalItem       = decimal.Parse(((string)item["valorunidade"]).Replace(".", ",")) * qtde;
                    var valorFreteRateado    = valorFretePorItem * qtde;
                    var valorDescontoRateado = valorDescontoPorItem * qtde;

                    // Criando uma linha nova para cada registro, quando já foi regitrado o primeiro item
                    // Gerando a string com os dados necessários e concatenando.
                    var stringRegistro = string.Join(";", new string[]
                    {
                        nf.Left(10)                                                                    // Nota Fiscal ou Pedido
                        , filial.Left(50)                                                              // Filial
                        , estado.Left(2)                                                               // Estado
                        , cidade.Left(50)                                                              // Cidade
                        , situacao                                                                     // Região (usado para situação)
                        , gerente.Left(50)                                                             // Gerente
                        , representante.Left(50)                                                       // Representante
                        , canal.Left(50)                                                               // Canal
                        , segmento.Left(50)                                                            // Segmento
                        , produto?.marca != null ? ((string)produto.marca).Left(50) : ""               // Marca
                        , ""                                                                           // Linha Produto
                        , produto?.grupoProduto != null ? ((string)produto.grupoProduto).Left(50) : "" // Produto
                        , ""                                                                           // Subgrupo
                        , nomeProduto.Sanitize().Left(50)                                              // Descricao
                        , nomeCliente.Left(100)                                                        // Cliente
                        , complementar.Left(50)                                                        // Coringa
                        , dataEmissao.ToString("dd")                                                   // dia
                        , dataEmissao.ToString("MM")                                                   // mes
                        , dataEmissao.ToString("yyyy")                                                 // ano
                        , valorTotalItem.ToString("N").Replace(".", "")                                // valor do item
                        , valorTotalItem.ToString("N").Replace(".", "")                                // rentabilidade
                        , qtde.ToString()                                                              // quantidade
                        , "0"                                                                          // litros
                        , "0"                                                                          // quilos
                        , "0"                                                                          // metros
                        , cnpjParte1.Left(8)                                                           // CNPJ
                        , cnpjParte2.Left(4)                                                           // CNPJ_FILIAL
                        , endereco.Left(150)                                                           // Endereço
                        , cep.Left(9)                                                                  // CEP
                        , telefone.Left(100)                                                           // Telefone
                        , email.Left(100)                                                              // Email
                        , ""                                                                           // Observacoes
                        , valorFreteRateado.ToString()                                                 // Frete - > Valor monetário adicional
                        , (valorTotalItem - valorDescontoRateado).ToString()                           // Valor monetário adicional
                        , ""                                                                           // Valor monetário adicional
                        , ""                                                                           // Valor monetário adicional
                        , ""                                                                           // Valor monetário adicional
                        , transportadora.Left(50)                                                      // Transportadora --> Informação adicional de pedido
                        , tipoFrete.Left(50)                                                           // Tipo Frete --> Informação adicional de pedido
                        , formaPgto.Left(50)                                                           // Informação adicional de pedido
                        , ""                                                                           // Informação adicional de pedido
                        , ""                                                                           // Informação adicional de pedido
                        , ""                                                                           // Informação adicional de produto
                        , ""                                                                           // Informação adicional de produto
                        , ""                                                                           // Informação adicional de produto
                        , ""                                                                           // Informação adicional de produto
                        , ""                                                                           // Informação adicional de produto
                        , tipoCliente.Left(50)                                                         // TipoCliente -->  Informação adicional de cliente
                        , ""                                                                           // Informação adicional de cliente
                        , ""                                                                           // Informação adicional de cliente
                        , ""                                                                           // Informação adicional de cliente
                        , ""                                                                           // Informação adicional de cliente
                    });
                    registro.AppendLine(stringRegistro);
                }
            }
            return(registro.ToString());
        }