#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # Verificación Final Comparativa - FENIX vs DASU-SQL4 # ========================================================== require 'tiny_tds' require_relative 'drones/lib/dasu_executor' puts "═" * 70 puts " VERIFICACIÓN FINAL - FENIX (PRODUCCIÓN) vs DASU-SQL4" puts " Fecha: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" puts "═" * 70 # ========================================== # 1. FENIX - Obtener datos # ========================================== puts "\n[1] Conectando a FENIX (PRODUCCIÓN)..." begin pass_cmd = `ruby adn/tools/candados/candados.rb get utnlarioja.intranet:monlaricardo 2>/dev/null`.strip sql_user = 'UTNlarioja\\monlaricardo' sql_host = '10.0.10.200' client_fenix = TinyTds::Client.new( username: sql_user, password: pass_cmd, host: sql_host, timeout: 600, database: 'sysdasuten' ) puts "[+] Conectado a FENIX" # Consultas a FENIX puts "\n[2] Obteniendo datos de FENIX..." fenix_data = {} # Total BonosAfiliado result = client_fenix.execute("SELECT COUNT(*) as c FROM BonosAfiliado") fenix_data[:total_bonos] = result.first['c'] # Registros por día (últimos 5 días) result = client_fenix.execute(" SELECT TOP 5 CAST(fecha AS DATE) as dia, COUNT(*) as c FROM BonosAfiliado GROUP BY CAST(fecha AS DATE) ORDER BY dia DESC ") fenix_data[:por_dia] = {} result.each { |r| fenix_data[:por_dia][r['dia']] = r['c'] } # Última fecha result = client_fenix.execute("SELECT MAX(fecha) as ultima FROM BonosAfiliado") fenix_data[:ultima_fecha] = result.first['ultima'] # MAX(idsolicitud) result = client_fenix.execute("SELECT MAX(idsolicitud) as max_id FROM BonosAfiliado") fenix_data[:max_idsolicitud] = result.first['max_id'] # AutorizacionBonosExcepcion result = client_fenix.execute("SELECT COUNT(*) as c FROM AutorizacionBonosExcepcion") fenix_data[:total_aut] = result.first['c'] result = client_fenix.execute("SELECT MAX(fechasolicitud) as ultima FROM AutorizacionBonosExcepcion") fenix_data[:ultima_fecha_aut] = result.first['ultima'] client_fenix.close puts " Total BonosAfiliado: #{fenix_data[:total_bonos]}" puts " Última fecha: #{fenix_data[:ultima_fecha]}" puts " MAX(idsolicitud): #{fenix_data[:max_idsolicitud]}" puts " Total AutorizacionBonosExcepcion: #{fenix_data[:total_aut]}" rescue => e puts "[!] Error conectando a FENIX: #{e.message}" fenix_data = {} end # ========================================== # 2. DASU-SQL4 - Obtener datos # ========================================== puts "\n[3] Conectando a DASU-SQL4..." ps_script = <<~PSCMD.strip $ErrorActionPreference = "Stop" $JSON_PATH = "C:\\temp\\verificacion_final_output.json" $connString = "Server=localhost;Database=sysdasuten;Integrated Security=true;TrustServerCertificate=yes;" $conn = New-Object System.Data.SqlClient.SqlConnection($connString) $conn.Open() $data = @{} # Total BonosAfiliado $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT COUNT(*) as c FROM BonosAfiliado", $conn) $data.total_bonos = $cmd.ExecuteScalar() # Por día $cmd = New-Object System.Data.SqlClient.SqlCommand(" SELECT TOP 5 CONVERT(varchar, CAST(fecha AS DATE), 120) as dia, COUNT(*) as c FROM BonosAfiliado GROUP BY CAST(fecha AS DATE) ORDER BY dia DESC ", $conn) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd) $ds = New-Object System.Data.DataSet $adapter.Fill($ds) $por_dia = @{} $ds.Tables[0].Rows | ForEach-Object { $por_dia[$($_.dia)] = $($_.c) } $data.por_dia = $por_dia # Última fecha $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT MAX(fecha) as ultima FROM BonosAfiliado", $conn) $data.ultima_fecha = $cmd.ExecuteScalar() # MAX(idsolicitud) $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT MAX(idsolicitud) as max_id FROM BonosAfiliado", $conn) $data.max_idsolicitud = $cmd.ExecuteScalar() # AutorizacionBonosExcepcion $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT COUNT(*) as c FROM AutorizacionBonosExcepcion", $conn) $data.total_aut = $cmd.ExecuteScalar() $cmd = New-Object System.Data.SqlClient.SqlCommand("SELECT MAX(fechasolicitud) as ultima FROM AutorizacionBonosExcepcion", $conn) $data.ultima_fecha_aut = $cmd.ExecuteScalar() $conn.Close() $data | ConvertTo-Json -Depth 5 | Out-File -FilePath $JSON_PATH -Encoding utf8 PSCMD begin DasuExecutor.execute_ps_on_dasu(ps_script, output_path: 'C:\temp\verificacion_final_output.json') dasu_data = DasuExecutor.read_json_from_dasu('C:\temp\verificacion_final_output.json') puts "[+] Conectado a DASU-SQL4" puts " Total BonosAfiliado: #{dasu_data['total_bonos']}" puts " Última fecha: #{dasu_data['ultima_fecha']}" puts " MAX(idsolicitud): #{dasu_data['max_idsolicitud']}" puts " Total AutorizacionBonosExcepcion: #{dasu_data['total_aut']}" rescue => e puts "[!] Error consultando DASU-SQL4: #{e.message}" dasu_data = {} end # ========================================== # 3. COMPARAR # ========================================== puts "\n" + "═" * 70 puts " COMPARACIÓN" puts "═" * 70 def comparar(nombre, fenix, dasu, formato = nil) fenix_val = fenix.nil? ? "N/A" : (formato ? formato.call(fenix) : fenix.to_s) dasu_val = dasu.nil? ? "N/A" : (formato ? formato.call(dasu) : dasu.to_s) coincide = fenix.to_s == dasu.to_s estado = coincide ? "✅" : "⚠️" puts " #{estado} #{nombre}:" puts " FENIX: #{fenix_val}" puts " DASU: #{dasu_val}" coincide end todos_coinciden = true # Comparar totales todos_coinciden &= comparar("Total BonosAfiliado", fenix_data[:total_bonos], dasu_data['total_bonos']) # Comparar última fecha todos_coinciden &= comparar("Última fecha", fenix_data[:ultima_fecha], dasu_data['ultima_fecha']) # Comparar MAX(idsolicitud) todos_coinciden &= comparar("MAX(idsolicitud)", fenix_data[:max_idsolicitud], dasu_data['max_idsolicitud']) # Comparar total autorizaciones todos_coinciden &= comparar("Total AutorizacionBonosExcepcion", fenix_data[:total_aut], dasu_data['total_aut']) # Comparar por día puts "\n Registros por día (últimos 5 días):" if fenix_data[:por_dia] && dasu_data['por_dia'] fenix_data[:por_dia].each do |dia, count| dasu_count = dasu_data['por_dia'][dia.to_s] coincide = count == dasu_count estado = coincide ? "✅" : "⚠️" puts " #{estado} #{dia}: FENIX=#{count} | DASU=#{dasu_count}" todos_coinciden = false unless coincide end end puts "\n" + "═" * 70 if todos_coinciden puts " ✅ TODOS LOS DATOS COINCIDEN - EL SISTEMA ESTÁ ACTUALIZADO" else puts " ⚠️ HAY DIFERENCIAS - REVISAR" end puts "═" * 70