diff --git a/Download Faturas/Fatura.cs b/Download Faturas/Fatura.cs index 4882a31..764a812 100644 --- a/Download Faturas/Fatura.cs +++ b/Download Faturas/Fatura.cs @@ -3,6 +3,7 @@ using System.Data.OleDb; using System.Globalization; using System.Net.Http.Headers; + using System.Reflection; using System.Runtime.Intrinsics.X86; using System.Text; using System.Text.Json; @@ -69,28 +70,36 @@ string uc = new Regex("^0+").Replace(parsedResult.locationNumber, string.Empty).Replace("/", string.Empty).Replace("-", string.Empty).Replace(".", string.Empty); // Vinculo da fatura com os dados cadastrais - string selectSQL = $"SELECT COUNT (Cod_Smart_unidade) FROM Dados_cadastrais WHERE Codigo_Instalacao = '@uc'"; - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + int? unidades; + string sqlQuery = $"SELECT COUNT (Cod_Smart_unidade) FROM Dados_cadastrais WHERE Codigo_Instalacao = @uc"; + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { cmd.Parameters.AddWithValue("@uc", uc); - int? unidades = (int?)cmd.ExecuteScalar(); + unidades = (int?)cmd.ExecuteScalar(); if (unidades == 1) { - selectSQL = $"SELECT Cod_Smart_unidade, Cliente, Unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP, Caminho_NFs FROM Dados_cadastrais WHERE Codigo_Instalacao = '{uc}'"; + sqlQuery = $"SELECT Cod_Smart_unidade, Cliente, Unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP, Caminho_NFs FROM Dados_cadastrais WHERE Codigo_Instalacao = @uc"; } else { - selectSQL = $"SELECT Cod_Smart_unidade, Cliente, Unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP, Caminho_NFs FROM Dados_cadastrais WHERE (CNPJ_CPF LIKE '@CNPJ%' AND Codigo_Instalacao = '@uc') OR (Razao_Social LIKE '@Razao_Social' AND Codigo_Instalacao = '@uc')"; + sqlQuery = $"SELECT Cod_Smart_unidade, Cliente, Unidade, PerfilCCEE, Submercado, Status_unidade, Grupo, Distribuidora, ICMS_TUSD, Demanda_P, Demanda_FP, Caminho_NFs FROM Dados_cadastrais WHERE (CNPJ_CPF LIKE @cnpj AND Codigo_Instalacao = @uc) OR (Razao_Social LIKE @razao_social AND Codigo_Instalacao = @uc)"; } } - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { - cmd.Parameters.AddWithValue("@CNPJ", parsedResult.customer.cnpj?[..8] ?? "NAN"); - cmd.Parameters.AddWithValue("@uc", uc); - cmd.Parameters.AddWithValue("@Razao_Social", parsedResult.customer.name.Replace("'", "''")); + if (unidades == 1) + { + cmd.Parameters.AddWithValue("@uc", uc); + } + else + { + cmd.Parameters.AddWithValue("@cnpj", parsedResult.customer.cnpj?[..8] != null ? parsedResult.customer.cnpj?[..8] + "%" : "NAN"); + cmd.Parameters.AddWithValue("@uc", uc); + cmd.Parameters.AddWithValue("@razao_social", parsedResult.customer.name); + } using (OleDbDataReader reader = cmd.ExecuteReader()) { @@ -116,10 +125,11 @@ // Verifica se a fatura ja foi lançada bool tusdLanc; - selectSQL = $"SELECT Cod_TUSD FROM Dados_TUSD WHERE Cod_TUSD = @Cod_TUSD"; - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + sqlQuery = $"SELECT Cod_TUSD FROM Dados_TUSD WHERE Cod_TUSD = ?"; + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { - cmd.Parameters.AddWithValue("@Cod_TUSD", long.Parse(dadosTusd.Cod_Smart_unidade.ToString() + dadosTusd.Mes.ToString())); + double cod_tusd = double.Parse(dadosTusd.Cod_Smart_unidade.ToString() + dadosTusd.Mes.ToString()); + cmd.Parameters.AddWithValue("?", cod_tusd); using (OleDbDataReader reader = cmd.ExecuteReader()) { @@ -142,12 +152,12 @@ 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='@mes' AND Distribuidoras_geral.Distribuidora='@distribuidora'"; + sqlQuery = $"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 = ? AND Distribuidoras_geral.Distribuidora = ?"; - using (OleDbCommand cmd = new OleDbCommand(pisSQL, conn)) + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { - cmd.Parameters.AddWithValue("@mes", dadosTusd.Mes); - cmd.Parameters.AddWithValue("@distribuidora", dadosTusd.Distribuidora); + cmd.Parameters.AddWithValue("?", dadosTusd.Mes.ToString()); + cmd.Parameters.AddWithValue("?", dadosTusd.Distribuidora); using (OleDbDataReader reader = cmd.ExecuteReader()) { @@ -188,7 +198,8 @@ dadosTusd.Valor = parsedResult.totalCharges; dadosTusd.Inicio_Leitura = parsedResult.dates.reading.periodFrom; dadosTusd.Fim_leitura = parsedResult.dates.reading.periodUntil; - dadosTusd.Hora_TUSD = DateTime.Now; + DateTime d = DateTime.Now; + dadosTusd.Hora_TUSD = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); dadosTusd.Dem_Reativa_kvar = 0; dadosTusd.Multa = 0; dadosTusd.Credito = 0; @@ -256,26 +267,26 @@ dadosTusd.Dem_Cont_FP = item.contract; } - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { if (dadosTusd.Perfil == "AZUL") { if (item.period == "peak") { - selectSQL = $"UPDATE Dados_cadastrais SET Demanda_P = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; + sqlQuery = $"UPDATE Dados_cadastrais SET Demanda_P = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; cmd.Parameters.AddWithValue("@demanda", item.contract); cmd.Parameters.AddWithValue("@cod_smart_unidade", dadosTusd.Cod_Smart_unidade); } else if (item.period == "off-peak") { - selectSQL = $"UPDATE Dados_cadastrais SET Demanda_FP = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; + sqlQuery = $"UPDATE Dados_cadastrais SET Demanda_FP = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; cmd.Parameters.AddWithValue("@demanda", item.contract); cmd.Parameters.AddWithValue("@cod_smart_unidade", dadosTusd.Cod_Smart_unidade); } } else if (dadosTusd.Perfil == "VERDE") { - selectSQL = $"UPDATE Dados_cadastrais SET Demanda_P = @demanda, Demanda_FP = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; + sqlQuery = $"UPDATE Dados_cadastrais SET Demanda_P = @demanda, Demanda_FP = @demanda WHERE Cod_Smart_unidade = @cod_smart_unidade"; cmd.Parameters.AddWithValue("@demanda", item.contract); cmd.Parameters.AddWithValue("@cod_smart_unidade", dadosTusd.Cod_Smart_unidade); } @@ -313,8 +324,8 @@ // Exclui os items lançados anteriormente para a fatura e cria a instrução SQL para inserir os novos items if (j == 1) { - string deleteOthers = $"DELETE FROM Dados_TUSD_aux WHERE Cod_TUSD = @cod_tusd"; - using (OleDbCommand cmd = new OleDbCommand(deleteOthers, conn)) + sqlQuery = $"DELETE FROM Dados_TUSD_aux WHERE Cod_TUSD = @cod_tusd"; + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { cmd.Parameters.AddWithValue("@cod_tusd", dadosTusd.Cod_TUSD); cmd.ExecuteNonQuery(); @@ -378,58 +389,45 @@ 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()) + if (tusdLanc) { // Cria o comando para atualização da fatura - reader.Close(); - StringBuilder updateSQL = new StringBuilder("UPDATE Dados_TUSD SET "); + sqlQuery = "UPDATE Dados_TUSD SET "; // Loop por todos os dados ja obtidos - for (var i = 0; i < dados.Count(); i++) + PropertyInfo[] propriedades = typeof(RecordSet).GetProperties(); + foreach (PropertyInfo propriedade in propriedades) { - // Adiciona o nome do campo - string field = dados[i].Name + "="; + string nomeColuna = propriedade.Name; - // Valor para o campo selecionado - var value = dados[i].GetValue(dadosTusd) ?? string.Empty; - - // Adiciona '(aspas) para textos e datas - if (dados[i].PropertyType.Name == "String" ^ dados[i].PropertyType.Name == "DateTime") - { - value = "'" + (dados[i].GetValue(dadosTusd)?.ToString() ?? string.Empty) + "'"; - } - - // 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); + // Adicione a coluna à instrução SQL + sqlQuery += $"{nomeColuna} = @{nomeColuna}, "; } - updateSQL.Append($" WHERE Cod_TUSD = {dadosTusd.Cod_TUSD}"); - cmd.CommandText = updateSQL.ToString(); - cmd.ExecuteNonQuery(); + // Remova a última vírgula e adicione a cláusula WHERE + sqlQuery = sqlQuery.TrimEnd(',', ' ') + $" WHERE Cod_TUSD = @cod_tusd"; + + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) + { + foreach (PropertyInfo propriedade in propriedades) + { + string nomeColuna = propriedade.Name; + object valorColuna = propriedade.GetValue(dadosTusd) ?? string.Empty; + cmd.Parameters.AddWithValue($"@{nomeColuna}", valorColuna); + } + + // Valor do código TUSD na cláusula WHERE + cmd.Parameters.AddWithValue("@cod_tusd", dadosTusd.Cod_TUSD); + + cmd.ExecuteNonQuery(); + } // Inseri os itens classificados como "othes" após criar o registro da TUSD devido as relação entre as tabelas foreach ((string name, float valor) in insertOthers) { j++; - selectSQL = "INSERT INTO Dados_TUSD_aux (Cod_TUSD,Id,Nome,Valor,Cod_lanc) VALUES ( @cod_tusd, @j,'@name',@valor,0)"; - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + sqlQuery = "INSERT INTO Dados_TUSD_aux (Cod_TUSD,Id,Nome,Valor,Cod_lanc) VALUES (@cod_tusd, @j, @name, @valor,0)"; + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { cmd.Parameters.AddWithValue("@cod_tusd", dadosTusd.Cod_TUSD); cmd.Parameters.AddWithValue("@j", j); @@ -442,55 +440,58 @@ else { // Cria o comando para lançar da fatura - reader.Close(); - StringBuilder insertSQL = new StringBuilder("INSERT INTO Dados_TUSD ("); + sqlQuery = "INSERT INTO Dados_TUSD ("; - // Loop pelo nome dos campos - for (var i = 0; i < dados.Count(); i++) + PropertyInfo[] propriedades = typeof(RecordSet).GetProperties(); + int i = 0; + foreach (PropertyInfo propriedade in propriedades) { - // Adiciona o nome do campo - string field = dados[i].Name; + string nomeColuna = propriedade.Name; - // Valor para o campo selecionado - var value = dados[i].GetValue(dadosTusd) ?? string.Empty; - - // Adiciona '(aspas) para textos e datas - if (dados[i].PropertyType.Name == "String" ^ dados[i].PropertyType.Name == "DateTime") - { - value = "'" + (dados[i].GetValue(dadosTusd)?.ToString() ?? string.Empty) + "'"; - } - - // 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); + // Adicione a coluna à instrução SQL + sqlQuery += $"{nomeColuna}, "; } - insertSQL.Append(fields) - .Append(") VALUES (") - .Append(values) - .Append(")"); + // Remova a última vírgula e adicione a cláusula VALUES + sqlQuery = sqlQuery.TrimEnd(',', ' ') + ") VALUES ("; - cmd.CommandText = insertSQL.ToString(); - cmd.ExecuteNonQuery(); + foreach (PropertyInfo propriedade in propriedades) + { + // Adicione os parâmetros à instrução SQL + string nomeColuna = propriedade.Name; + sqlQuery += $"@{nomeColuna}, "; + } + + // Remova a última vírgula e feche a instrução SQL + sqlQuery = sqlQuery.TrimEnd(',', ' ') + ")"; + + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) + { + foreach (PropertyInfo propriedade in propriedades) + { + string nomeColuna = propriedade.Name; + object valorColuna = propriedade.GetValue(dadosTusd) ?? string.Empty; + cmd.Parameters.AddWithValue($"@{nomeColuna}", valorColuna); + } + + foreach (OleDbParameter param in cmd.Parameters) + { + Console.WriteLine($"Nome do parâmetro: {param.ParameterName}"); + Console.WriteLine($"Valor do parâmetro: {param.Value}"); + Console.WriteLine($"Tipo de dados do parâmetro: {param.DbType}"); + Console.WriteLine(); + } + + cmd.ExecuteNonQuery(); + } // Inseri os itens classificados como "othes" após criar o registro da TUSD devido as relação entre as tabelas + j = 0; foreach ((string name, float valor) in insertOthers) { j++; - selectSQL = "INSERT INTO Dados_TUSD_aux (Cod_TUSD,Id,Nome,Valor,Cod_lanc) VALUES ( @cod_tusd, @j,'@name',@valor,0)"; - using (OleDbCommand cmd = new OleDbCommand(selectSQL, conn)) + sqlQuery = "INSERT INTO Dados_TUSD_aux (Cod_TUSD,Id,Nome,Valor,Cod_lanc) VALUES (@cod_tusd, @j, @name, @valor, 0)"; + using (OleDbCommand cmd = new OleDbCommand(sqlQuery, conn)) { cmd.Parameters.AddWithValue("@cod_tusd", dadosTusd.Cod_TUSD); cmd.Parameters.AddWithValue("@j", j); diff --git a/Download Faturas/RecordSet.cs b/Download Faturas/RecordSet.cs index 0b11a8d..1528487 100644 --- a/Download Faturas/RecordSet.cs +++ b/Download Faturas/RecordSet.cs @@ -2,19 +2,19 @@ { public class RecordSet { - public long Cod_TUSD { get; set; } + public double Cod_TUSD { get; set; } - public long Cod_Smart_unidade { get; set; } + public double Cod_Smart_unidade { get; set; } public int Mes { get; set; } - public float Revisao { get; set; } + public int Revisao { get; set; } public bool Rev_atual { get; set; } public DateTime Hora_TUSD { get; set; } - public float Tempo_TUSD { get; set; } + public int Tempo_TUSD { get; set; } public string? Perfil_CliqCCEE { get; set; }