using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using TarifasANEEL.Services; using TarifasANEEL.Utilities; using System.Data.OleDb; using System.Text.Json.Nodes; namespace TarifasANEEL { public class Program { private static async Task Main(string[] args) { try { // Configuração inicial ConfigurationService.LoadConfiguration(); // Inicialização do aplicativo var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); var logger = app.Services.GetRequiredService>(); // Conexão ao banco de dados using var resourcesConnection = DatabaseService.CreateConnection(ConfigurationService.ResourcesDbConnectionString); resourcesConnection.Open(); if (!DatabaseService.TableExists(resourcesConnection, ConfigurationService.ResourcesTableName)) { throw new Exception($"Falha ao acessar [{ConfigurationService.ResourcesTableName}]"); } using var dataConnection = DatabaseService.CreateConnection(ConfigurationService.MainDbConnectionString); dataConnection.Open(); DatabaseService.LoadDistribuidoras(dataConnection); using var command = new OleDbCommand( $"SELECT {ConfigurationService.ResourcesTableName}.resource_id, * " + $"FROM {ConfigurationService.ResourcesTableName} " + $"WHERE ((Not ({ConfigurationService.ResourcesTableName}.resource_id)=\"\"))" + $"ORDER BY {ConfigurationService.ResourcesTableName}.Ano DESC;", resourcesConnection); using var reader = command.ExecuteReader() ?? throw new Exception("Falha ao acessar os recursos"); int iRows = 0; var tasks = new List(); while (reader.Read()) { // Create a copy of the current row since reader will move to next row var readerValues = new Dictionary(); for (int i = 0; i < reader.FieldCount; i++) { readerValues[reader.GetName(i)] = reader.GetValue(i); } //tasks.Add(ProcessResourceAsync(readerValues, resourcesConnection, dataConnection)); await ProcessResourceAsync(readerValues, resourcesConnection, dataConnection); Console.WriteLine(iRows); iRows++; } await Task.WhenAll(tasks); } catch (Exception ex) { Console.WriteLine($"Erro: {ex.Message}"); } finally { TimerHelper.SetTimer(ConfigurationService.TimerDurationToClose); } } private static async Task ProcessResourceAsync(Dictionary readerValues, OleDbConnection resourcesConnection, OleDbConnection dataConnection) { string tableName = $"Tarifas_{readerValues["Ano"]}"; if (tableName == "Tarifas_2021") { int test1 = 0; } int offset = DatabaseService.GetOffsetForTable( tableName, (string)readerValues["Ano"] == "All", "_id", resourcesConnection); offset = 0; string apiUrl = ApiService.BuildUrl( ConfigurationService.ApiDadosAbertosUrl, readerValues, "Ano"); bool hasNextPage = true; while (hasNextPage) { JsonNode rootObject = await ApiService.PullDataAsync($"{apiUrl}offset={offset}"); JsonNode records = rootObject["result"]?["records"] ?? new JsonArray(); if (records.AsArray().Count > 0) { var formattedData = TarifaHelper.FormatData(records); DatabaseService.AddDataToTable(dataConnection, formattedData, ConfigurationService.DataTableName, (string)readerValues["Ano"]); offset += records.AsArray().Count; } else { hasNextPage = false; } } } } } //using System.Data; //using System.Data.OleDb; //using System.Text.Json; //using System.Text.Json.Nodes; //using System.Timers; //using Microsoft.AspNetCore.Builder; //using Microsoft.Extensions.Configuration; //using Microsoft.Extensions.DependencyInjection; //using Microsoft.Extensions.Logging; //namespace TarifasANEEL.App //{ // public class Program // { // static DateTime dtTimerEndTime; // static string? sApiDadosAbertosUrl; // static string? sResourcesDbPath; // static string? sDbPath; // static string? sResourcesTableName; // static string? sResourcesDbConnection; // static string? sDbConnection; // static DataTable? dtDistribuidoras = new(); // static string? sTimerDurationToClose; // static void SetConfig() // { // IConfigurationRoot config; // config = new ConfigurationBuilder() // .AddUserSecrets() // .Build(); // sApiDadosAbertosUrl = config["sApiDadosAbertosUrl"]!; // sResourcesDbPath = config["sResourcesDbPath"]!; // sDbPath = config["sDbPath"]!; // sResourcesTableName = config["sResourcesTableName"]!; // sTimerDurationToClose = config["sTimerDurationToClose"]; // sResourcesDbConnection = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={sResourcesDbPath};Persist Security Info=False;"; // sDbConnection = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={sDbPath};Jet OLEDB:Database Password=gds21"; // if (config.AsEnumerable().Where(c => c.Value == "" ^ c.Value == null).ToList().Any()) { throw new Exception("Falha ao acessar o arquivo de configuração"); } // } // static void SetDistTable(OleDbConnection conn) // { // if (!TabelaExiste(conn, "Distribuidoras_tarifas") ^ !TabelaExiste(conn, "Distribuidoras_geral")) // { // throw new Exception($"Falha ao acessar [Distribuidoras_tarifas] ou [Distribuidoras_geral]"); // } // string sQueryDist = $"SELECT *\r\nFROM Distribuidoras_geral\r\nWHERE ((Not (Distribuidoras_geral.CNPJ)=\"\"));"; // using OleDbCommand cmd = new(sQueryDist, conn); // using OleDbDataReader distReader = cmd.ExecuteReader() ?? throw new Exception(); // dtDistribuidoras!.Load(distReader); // } // private static bool TabelaExiste(OleDbConnection connection, string TableName) // { // try // { // using OleDbCommand command = new(@$"SELECT COUNT(*) FROM {TableName}", connection); // command.ExecuteScalar(); // return true; // } // catch (OleDbException) // { // return false; // } // } // public static int GetCountIdFromTable(string sTableName, string sIdColumnName, OleDbConnection connection) // { // int iOffset = 0; // if (TabelaExiste(connection, sTableName)) // { // using OleDbCommand cmd = new($"SELECT Count([{sIdColumnName}]) FROM {sTableName}", connection); // var test = cmd.ExecuteScalar() ?? "0"; // if (test.ToString() != "") // { // iOffset = int.Parse(test!.ToString() ?? "0"); // } // } // return iOffset; // } // public static int GetLastIdFromTable(string sTableName, string sIdColumnName, OleDbConnection connection) // { // int iOffset = 0; // if (TabelaExiste(connection, sTableName)) // { // using OleDbCommand cmd = new($"SELECT Last([{sIdColumnName}]) FROM {sTableName}", connection); // var test = cmd.ExecuteScalar() ?? "0"; // if (test.ToString() != "") // { // iOffset = int.Parse(test!.ToString() ?? "0"); // } // } // return iOffset; // } // public static string BuildUrl(string sBaseUrl, OleDbDataReader reader, string sReaderColumn) // { // string sWebString = $@"{sBaseUrl}?"; // for (int iCol = 0; iCol < reader.FieldCount; iCol++) // { // if (reader.GetName(iCol) != sReaderColumn) // { // if (reader[iCol].ToString() != "") // { // sWebString = $@"{sWebString}{reader.GetName(iCol)}={reader[iCol]}&"; // } // } // } // return sWebString; // } // private static async Task PullDataAsync(string sURL) // { // Console.WriteLine("Carregando dados da API"); // var client = new HttpClient(); // var request = new HttpRequestMessage(HttpMethod.Get, sURL); // var response = await client.SendAsync(request); // response.EnsureSuccessStatusCode(); // string sResponse = await response.Content.ReadAsStringAsync(); // JsonNode? rootObject = JsonSerializer.Deserialize(sResponse.ToString() // .Replace(@"""NomPostoTarifario"":""Não se aplica""", @"""NomPostoTarifario"":""N""") // .Replace(@"""DscPostoTarifario"":""Não se aplica""", @"""DscPostoTarifario"":""N""") // .Replace(@"""DscSubClasseConsumidor"":""Residencial""", @"""DscSubClasseConsumidor"":""""") // .Replace(@"""DscClasseConsumidor"":""Iluminação pública""", @"""DscClasseConsumidor"":""""") // .Replace(@"""DscModalidadeTarifaria"":""Convencional pré-pagamento""", @"""DscModalidadeTarifaria"":""pré-pagamento""") // .Replace(@"""Não se aplica""", @""""""))!; // Console.WriteLine("Dados carregados."); // return rootObject; // } // private static void CriarTabela(OleDbConnection connection, string TableName, string columnNames) // { // try // { // using OleDbCommand command = new(@$"CREATE TABLE {TableName} ({columnNames})", connection); // command.ExecuteNonQuery(); // } // catch (Exception ex) // { // Console.WriteLine($"Ocorreu um erro: {ex.Message}"); // } // } // private static void AdicionarDadosAoBanco(OleDbConnection connection, JsonNode records, string TableName) // { // try // { // string stringColumns = string.Join(", \n", records[0]!.AsObject().AsEnumerable().Select(d => "@" + d.Key).ToList()); // string createColumns = string.Join(", \n", records[0]!.AsObject().AsEnumerable().Select(d => d.Key + " TEXT").ToList()); // if (!TabelaExiste(connection, TableName)) // { // CriarTabela(connection, TableName, createColumns); // } // using OleDbTransaction transaction = connection.BeginTransaction(); // try // { // for (int iRow = 0; iRow < records!.AsArray().Count; iRow++) // { // var record = records[iRow]; // using OleDbCommand command = new(@$"INSERT INTO {TableName} VALUES ({stringColumns})", connection, transaction); // foreach (var child in record!.AsObject()) // { // command.Parameters.AddWithValue(child.Key, (child.Value ?? "")!.ToString()); // } // command.ExecuteNonQuery(); // } // transaction.Commit(); // Console.WriteLine($"{records!.AsArray().Count} dados adicionados com sucesso à [{TableName}] - Last _id {records[records!.AsArray().Count - 1]!["_id"]}"); // } // catch (Exception ex) // { // transaction.Rollback(); // Console.WriteLine($"Erro ao adicionar dados: {ex.Message}"); // } // } // catch (Exception ex) // { // Console.WriteLine($"Ocorreu um erro: {ex.Message}"); // } // } // static void SetTimerEndTime(DateTime date) => dtTimerEndTime = date; // private static void WhileTimerRuns(object sender, ElapsedEventArgs e) // { // Console.Write($"\rEncerrando em {dtTimerEndTime.Subtract(e.SignalTime).Seconds}"); // } // static void SetTimer() // { // var vTimer = new System.Timers.Timer(100); // double dRemainingTime; // int iInterval = Convert.ToInt32(sTimerDurationToClose!); // SetTimerEndTime(DateTime.Now.AddSeconds(iInterval)); // vTimer.Elapsed += WhileTimerRuns!; // vTimer.AutoReset = true; // vTimer.Enabled = true; // Console.WriteLine(""); // Console.WriteLine("Pressione qualquer tecla para encerrar o programa..."); // Console.WriteLine(""); // Task.Factory.StartNew( // () => // { // Console.ReadKey(); // dRemainingTime = DateTime.Now.Subtract(dtTimerEndTime).TotalSeconds; // } // ).Wait( // TimeSpan.FromSeconds(iInterval) // ); // } // static JsonNode FormatData(JsonNode jsData) // { // JsonNode data = (JsonNode)JsonDocument.Parse(jsData.Root.ToString()).Deserialize(typeof(JsonNode))!; // dynamic jsNewData = new JsonObject(); // DataTable vDistTable = dtDistribuidoras!; // int iCount = data["result"]!["records"]!.AsArray().Count; // for (int i = 0; i < iCount; i++) // { // //jsNewData.Add(new JsonObject()); // var record = data["result"]!["records"]![i]; // string ID_dist = vDistTable.Select($"CNPJ LIKE '%{record!["NumCPFCNPJ"]}%'").First()[0].ToString()!; // string Grupo = record["DscSubGrupoTarifario"]!.ToString(); // string Perfil = ""; // if (record["DscDetalheConsumidor"]!.ToString() == "SCEE") // { // Perfil = "SCEE - " + record["DscModalidadeTarifaria"]!.ToString().ToUpper(); // } // else if (record["DscDetalheConsumidor"]!.ToString() == "APE") // { // Perfil = record["DscModalidadeTarifaria"]!.ToString().ToUpper() + " APE"; // } // else // { // Perfil = string.Join('_', (new string[] { record!["DscModalidadeTarifaria"]!.ToString().ToUpper(), record!["DscDetalheConsumidor"]!.ToString().ToUpper() }).Where(x => !string.IsNullOrEmpty(x))); // } // Perfil = string.Join( // '_', // (new string[] { // Perfil.ToString(), // record["DscClasseConsumidor"]!.ToString().ToUpper(), // record["DscSubClasseConsumidor"]!.ToString().ToUpper() // }).Where(x => !string.IsNullOrEmpty(x))); // string Ciclo = "RH" + record!["DscResolucaoHomologatoria"]!.ToString().Split(' ')[3].Replace(".", "").Replace(",", ""); // string DatInicioVigencia = DateOnly.Parse(record!["DatInicioVigencia"]!.ToString()).ToString(); // string DatFimVigencia = DateOnly.Parse(record!["DatFimVigencia"]!.ToString()).ToString(); // string Energia_P = ""; // string Energia_FP = ""; // string Enc_P = ""; // string Enc_FP = ""; // string Dem_P = ""; // string Dem_FP = ""; // string ER_P = ""; // string ER_FP = ""; // string Megaflex = ""; // string Covid_P = ""; // string Covid_FP = ""; // string Desc_Rural = ""; // string EH_P = ""; // string EH_FP = ""; // switch (record["DscComponenteTarifario"]!.ToString(), record["DscSubGrupoTarifario"]!.ToString()[0], record["DscModalidadeTarifaria"]!.ToString()) // { // case ("TE", 'B', _): // Energia_P = record["VlrComponenteTarifario"]!.ToString(); // Energia_FP = record["VlrComponenteTarifario"]!.ToString(); // break; // case ("TE", 'A', "Ponta"): // Energia_P = record["VlrComponenteTarifario"]!.ToString(); // break; // } // if (jsNewData[ID_dist] == null) { jsNewData[ID_dist] = new JsonObject(); } // if (jsNewData[ID_dist][Grupo] == null) { jsNewData[ID_dist][Grupo] = new JsonObject(); } // if (jsNewData[ID_dist][Grupo][Perfil] == null) { jsNewData[ID_dist][Grupo][Perfil] = new JsonObject(); } // if (jsNewData[ID_dist][Grupo][Perfil][Ciclo] == null) { jsNewData[ID_dist][Grupo][Perfil][Ciclo] = new JsonObject(); } // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["DatInicioVigencia"] = DatInicioVigencia; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["DatFimVigencia"] = DatFimVigencia; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Energia_P"] = Energia_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Energia_FP"] = Energia_FP; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Enc_P"] = Enc_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Enc_FP"] = Enc_FP; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Dem_P"] = Dem_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Dem_FP"] = Dem_FP; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["ER_P"] = ER_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["ER_FP"] = ER_FP; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Megaflex"] = Megaflex; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Covid_P"] = Covid_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Covid_FP"] = Covid_FP; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["Desc_Rural"] = Desc_Rural; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["EH_P"] = EH_P; // jsNewData[ID_dist][Grupo][Perfil][Ciclo]["EH_FP"] = EH_FP; // } // return jsNewData; // } // private static async Task Main(string[] args) // { // try // { // SetConfig(); // int iOffset = 0; // var builder = WebApplication.CreateBuilder(args); // var app = builder.Build(); // var logger = app.Services.GetRequiredService>(); // using OleDbConnection connection = new(sResourcesDbConnection); // connection.Open(); // if (!TabelaExiste(connection, sResourcesTableName!)) { throw new Exception($"Falha ao acessar [{sResourcesTableName}]"); } // using OleDbConnection conn = new(sDbConnection); // conn.Open(); // SetDistTable(conn); // using OleDbCommand command = new($"SELECT {sResourcesTableName}.resource_id, *\r\nFROM {sResourcesTableName}\r\nWHERE ((Not ({sResourcesTableName}.resource_id)=\"\"));\r\n", connection); // using OleDbDataReader reader = command.ExecuteReader() ?? throw new Exception(); // while (reader.Read()) // { // iOffset = 0; // string sTableName = $"Tarifas_{reader["Ano"]}"; // if ((string)reader["Ano"] == "All") // { // iOffset = GetLastIdFromTable(sTableName, "_id", connection); // } // else // { // iOffset = GetCountIdFromTable(sTableName, "_id", connection); // } // string sWebString = BuildUrl(sApiDadosAbertosUrl!, reader, "Ano"); // bool hasNextPage = true; // JsonNode? tempRecords = null; // while (hasNextPage) // { // JsonNode? rootObject = await PullDataAsync($@"{sWebString}offset={iOffset}"); // tempRecords = rootObject["result"]!["records"]!; // int iTotal = (int)rootObject!["result"]!["total"]!; // if (tempRecords != null && tempRecords.AsArray().Count != 0 && iOffset < iTotal) // { // JsonNode jsFormatedData = FormatData(tempRecords); // AdicionarDadosAoBanco(connection, tempRecords, sTableName); // iOffset += tempRecords!.AsArray().Count + iOffset; // } // else // { // Console.WriteLine("Nada mais a adicionar."); // hasNextPage = false; // } // } // } // } // catch (Exception ex) // { // Console.WriteLine(ex.Message); // } // finally // { // SetTimer(); // } // } // } //}