using System.Text; using System.Net.Http.Headers; using System.Text.Json; using System.Web; using System.Text.RegularExpressions; using System.IO; using System.Data.OleDb; using System.Globalization; namespace Download_Faturas { public class Program { #if DEBUG public const String log_faturas = @"X:\Back\Carteira x.x\4Docs\import.txt"; public const String log_faturas2 = @"X:\Back\Carteira x.x\4Docs\import2.txt"; #else public const String log_faturas = "import.txt"; public const String log_faturas2 = "import2.txt"; #endif public const string caminho_DB = "X:/Middle/Informativo Setorial/Modelo Word/BD1_dados cadastrais e faturas.accdb"; private static HttpClient httpClient = new HttpClient(); private static OleDbConnection conn = new(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho_DB + ";Jet OLEDB:Database Password=gds21"); private static OleDbCommand cmd = new(); private static StreamReader sr = new StreamReader(log_faturas); private static StreamWriter sw = new StreamWriter(log_faturas2); private static string? fatura; public static async Task Main() { //Abre a conexao com o banco de dados conn.Open(); cmd.Connection = conn; //Loop entre as faturas pendentes while ((fatura = sr.ReadLine()) != null) { string fatura_ID = fatura.Split(",")[0]; string fatura_status = fatura.Split(",")[1]; string fatura_arquivo = fatura.Split(",")[2]; //Verifica se a fatura foi processada e atualiza os valores para banco de dados if (fatura_status == "DELAYED" | fatura_status == "ACTIONABLE" | fatura_status == "" | fatura_status == "UNIDADE CONSUMIDORA NÃO LOCALIZADA NO BD") { string token = "UFY4VWzqcHYcGNd0gkBOMFL9G5ZThV6gXBQIJ79F5HSqITzavz4Fe7iXvAbJLvZJ"; //token = await req_token(); HttpResponseMessage response = await status(token, fatura_ID); JsonElement result = JsonDocument.Parse(response.Content.ReadAsStringAsync().Result).RootElement; //Verifica se a fatura foi processada e atualiza os valores para o banco de dados bool multiple = result.TryGetProperty("multiple", out var _); if (result.GetProperty("status").GetString() == "SUCCESS" & !multiple) { fatura_status = processar_fatura(result, fatura_ID, fatura_arquivo); sw.WriteLine(fatura_ID + "," + fatura_status + "," + fatura_arquivo); } else if (result.GetProperty("status").GetString() == "SUCCESS" & multiple) { var agrupadas_ID = result.GetProperty("children"); foreach (JsonElement individual_ID in agrupadas_ID.EnumerateArray()) { HttpResponseMessage response_individual = await status(token, individual_ID.ToString()); JsonElement result_individual = JsonDocument.Parse(response_individual.Content.ReadAsStringAsync().Result).RootElement; if (result_individual.GetProperty("status").GetString() == "SUCCESS") { fatura_status = processar_fatura(result_individual, fatura_ID, fatura_arquivo); sw.WriteLine(individual_ID.ToString() + "," + fatura_status + "," + fatura_arquivo); } else { sw.WriteLine(individual_ID.ToString() + "," + result_individual.GetProperty("status").GetString() + "," + fatura_arquivo); } } } else { sw.WriteLine(fatura_ID + "," + result.GetProperty("status").GetString() + "," + fatura_arquivo); } } else { sw.WriteLine(fatura); } } conn.Close(); sr.Close(); sw.Close(); File.Move(log_faturas2, log_faturas, true); } public static string processar_fatura(JsonElement result, string fatura_ID, string fatura_arquivo) { //Variavel para armazenar os dados a serem lancados para a TUSD no BD recordSet dadosTusd = new(); //Resultado da fatura processada Rootobject parsedResult = JsonSerializer.Deserialize(result.GetProperty("result")); dadosTusd.Mes = int.Parse(parsedResult.dates.reading.periodUntil.AddDays(-15).ToString("yMM")); string uc = new Regex("^0+").Replace(parsedResult.locationNumber, ""); //Vinculo da fatura com os dados cadastrais string selectSQL = $"SELECT COUNT (Cod_Smart_unidade) FROM Dados_cadastrais WHERE Codigo_Instalacao = '{uc}'"; cmd.CommandText = selectSQL; var unidades = (int)cmd.ExecuteScalar(); if (unidades == 1) { selectSQL = $"SELECT Cod_Smart_unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP FROM Dados_cadastrais WHERE Codigo_Instalacao = '{uc}'"; } else { selectSQL = $"SELECT Cod_Smart_unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP FROM Dados_cadastrais WHERE (CNPJ_CPF LIKE '{parsedResult.customer.cnpj?.Substring(0, 8) ?? "NAN"}%' AND Codigo_Instalacao = '{uc}') OR (Razao_Social LIKE '{parsedResult.customer.name}' AND Codigo_Instalacao = '{uc}')"; } cmd.CommandText = selectSQL; OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { //Dados cadastrais dadosTusd.Cod_Smart_unidade = long.Parse(reader["Cod_Smart_unidade"].ToString()); dadosTusd.Perfil_CliqCCEE = reader["PerfilCCEE"].ToString(); dadosTusd.Submercado = reader["Submercado"].ToString(); dadosTusd.Ambiente = reader["Status_unidade"].ToString(); dadosTusd.Grupo = reader["Grupo"].ToString(); dadosTusd.Distribuidora = reader["Distribuidora"].ToString(); dadosTusd.ICMS = float.Parse(reader["ICMS_TUSD"].ToString()); dadosTusd.Dem_Cont_P = float.Parse(reader["Demanda_P"].ToString()); dadosTusd.Dem_Cont_FP = float.Parse(reader["Demanda_FP"].ToString()); } reader.Close(); //Verifica se a fatura ja foi lançada selectSQL = $"SELECT Cod_TUSD FROM Dados_TUSD WHERE Cod_TUSD = {long.Parse(dadosTusd.Cod_Smart_unidade.ToString() + dadosTusd.Mes.ToString())}"; cmd.CommandText = selectSQL; reader = cmd.ExecuteReader(); bool tusdLanc = reader.HasRows; reader.Close(); if (dadosTusd.Cod_Smart_unidade == 0) { return "UNIDADE CONSUMIDORA NÃO LOCALIZADA NO BD"; } else if (tusdLanc) { return "FATURA DUPLICADA NO BD"; } else { //PIS e Cofins string pisSQL = $"SELECT Distribuidoras_PIS.PIS, Distribuidoras_PIS.COFINS FROM Distribuidoras_geral INNER JOIN Distribuidoras_PIS ON Distribuidoras_geral.ID_dist = Distribuidoras_PIS.ID_dist WHERE Distribuidoras_PIS.Mes='{dadosTusd.Mes}' AND Distribuidoras_geral.Distribuidora='{dadosTusd.Distribuidora}'"; cmd.CommandText = pisSQL; reader = cmd.ExecuteReader(); while (reader.Read()) { //PIS e Cofins dadosTusd.PIS = float.Parse(reader["PIS"].ToString()); dadosTusd.COFINS = float.Parse(reader["COFINS"].ToString()); } reader.Close(); //Dados da fatura processada dadosTusd.Cod_TUSD = long.Parse(dadosTusd.Cod_Smart_unidade.ToString() + dadosTusd.Mes.ToString()); dadosTusd.Perfil = parsedResult.tariffModality == "blue" ? "AZUL" : "VERDE"; dadosTusd.Valor = parsedResult.totalCharges; dadosTusd.Inicio_Leitura = parsedResult.dates.reading.periodFrom; dadosTusd.Fim_leitura = parsedResult.dates.reading.periodUntil; dadosTusd.Hora_TUSD = DateTime.Now; dadosTusd.Dem_Reativa_kvar = 0; dadosTusd.Multa = 0; dadosTusd.Credito = 0; dadosTusd.Bandeira_RS_MWh = 0; dadosTusd.FIC_DIC = 0; dadosTusd.Enc_conexao = 0; dadosTusd.Liminar_ICMS = 0; dadosTusd.Outros = 0; dadosTusd.Cred_livre = 0; dadosTusd.Tempo_TUSD = 0; dadosTusd.Lanc_aut = true; dadosTusd.Rev_atual = true; dadosTusd.Revisao = 0; //Loop entre os dados faturados na fatura int j = 0; foreach (Item item in parsedResult.items) { switch (item.type, item.period) { //Energia Ponta case ("energy", "peak"): dadosTusd.Consumo_P = item.billed / 1000; break; //Energia Fora de Ponta case ("energy", "off-peak"): dadosTusd.Consumo_FP = item.billed / 1000; break; //Demanda Ponta case ("demand", "peak"): dadosTusd.Dem_Cont_P = item.contract == 0 ? dadosTusd.Dem_Cont_P : item.contract; break; //Demanda Fora de Ponta case ("demand", "off-peak"): dadosTusd.Dem_Cont_FP = item.contract == 0 ? dadosTusd.Dem_Cont_FP : item.contract; break; //Ilum. publica case ("publicLighting", _): dadosTusd.Ilum_Publica = item.charge; break; //Energia Reativa case ("excessReactiveEnergy", _): dadosTusd.En_Reativa_Mvarh = item.billed / 1000 + dadosTusd.En_Reativa_Mvarh; break; //Demanda Reativa case ("excessReactiveDemand", _): dadosTusd.Dem_Reativa_kvar = item.billed; break; //Bandeira Tarifaria case ("flagSurcharge", _): dadosTusd.Bandeira_RS_MWh = item.charge; break; //Items não classificados case ("other", _): j++; //Exclui os items lançados anteriormente para a fatura if (j == 1) { string deleteOthers = $"DELETE FROM Dados_TUSD_aux WHERE Cod_TUSD = {dadosTusd.Cod_TUSD}"; cmd.CommandText = deleteOthers; cmd.ExecuteNonQuery(); } //Insere os novos items string insertOthers = "INSERT INTO Dados_TUSD_aux (Cod_TUSD,Id,Nome,Valor,Cod_lanc) VALUES (" + dadosTusd.Cod_TUSD + "," + j + ",'" + item.name + "'," + item.charge.ToString(new CultureInfo("en-US")) + "," + 0 + ")"; cmd.CommandText = insertOthers; cmd.ExecuteNonQuery(); break; } } //Busca a demanda registrada nos itens medidos foreach (Measureditem measuredItem in parsedResult.measuredItems) { switch (measuredItem.type, measuredItem.period) { case ("demand", "peak"): dadosTusd.Dem_Reg_P = measuredItem.measured; break; case ("demand", "off-peak"): dadosTusd.Dem_Reg_FP = measuredItem.measured; break; } } var dados = dadosTusd.GetType().GetProperties(); StringBuilder fields = new StringBuilder(); StringBuilder values = new StringBuilder(); //Verifica se já existe a fatura lançada | atualizar fatura ou nova fatura string selectTUSD = $"SELECT Cod_TUSD FROM Dados_TUSD WHERE Cod_TUSD = {dadosTusd.Cod_TUSD}"; cmd.CommandText = selectTUSD.ToString(); reader = cmd.ExecuteReader(); if (reader.Read()) { //Cria o comando para atualização da fatura reader.Close(); StringBuilder updateSQL = new StringBuilder("UPDATE Dados_TUSD SET "); //Loop por todos os dados ja obtidos for (var i = 0; i < dados.Count(); i++) { //Adiciona o nome do campo string field = dados[i].Name + "="; //Valor para o campo selecionado var value = dados[i].GetValue(dadosTusd) ?? ""; //Adiciona '(aspas) para textos e datas if (dados[i].PropertyType.Name == "String" ^ dados[i].PropertyType.Name == "DateTime") { value = "'" + (dados[i].GetValue(dadosTusd)?.ToString() ?? "") + "'"; } //Substitui ,(virgula) por .(ponto) else if (dados[i].PropertyType.Name == "Single") { float valueFloat = (float)value; value = valueFloat.ToString(new CultureInfo("en-US")); } if (i > 0) { updateSQL.Append(","); } updateSQL.Append(field + value); } updateSQL.Append($" WHERE Cod_TUSD = {dadosTusd.Cod_TUSD}"); cmd.CommandText = updateSQL.ToString(); cmd.ExecuteNonQuery(); } else { //Cria o comando para lançar da fatura reader.Close(); StringBuilder insertSQL = new StringBuilder("INSERT INTO Dados_TUSD ("); //Loop pelo nome dos campos for (var i = 0; i < dados.Count(); i++) { //Adiciona o nome do campo string field = dados[i].Name; //Valor para o campo selecionado var value = dados[i].GetValue(dadosTusd) ?? ""; //Adiciona '(aspas) para textos e datas if (dados[i].PropertyType.Name == "String" ^ dados[i].PropertyType.Name == "DateTime") { value = "'" + (dados[i].GetValue(dadosTusd)?.ToString() ?? "") + "'"; } //Substitui ,(virgula) por .(ponto) else if (dados[i].PropertyType.Name == "Single") { float valueFloat = (float)value; value = valueFloat.ToString(new CultureInfo("en-US")); } if (i > 0) { fields.Append(","); values.Append(","); } fields.Append(field); values.Append(value); } insertSQL.Append(fields) .Append(") VALUES (") .Append(values) .Append(")"); cmd.CommandText = insertSQL.ToString(); cmd.ExecuteNonQuery(); } return "FATURA INCLUIDA NO BD"; } } public static async Task req_token() { var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.4docs.cloud/v2/oauth2/token"); var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("smart:vnqtvmesikjzyipc")); request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}"); request.Content = new StringContent("grant_type=client_credentials"); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); var response = await httpClient.SendAsync(request); return JsonDocument.Parse(response.Content.ReadAsStringAsync().Result).RootElement.GetProperty("access_token").GetString(); } public static async Task status(string token, string id) { var request = new HttpRequestMessage(new HttpMethod("GET"), $"https://api.4docs.cloud/v2/request/status?id={id}"); request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {token}"); var response = await httpClient.SendAsync(request); return response; } } }