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