#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # adn/tools/cli/verificar_datos_fenix_dasu.rb # ========================================================== # Verificación minuciosa de datos entre FENIX (producción) # y DASU-SQL4 (nuevo sistema) - desde abril 13 # ========================================================== require 'tiny_tds' require 'json' require 'base64' require_relative 'drones/lib/dasu_executor' puts "=== COMPARACIÓN FENIX vs DASU-SQL4 ===" puts "Fecha: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" puts "" # ========================================== # 1. CONEXIÓN A FENIX (PRODUCCIÓN) # ========================================== puts "\n[1] Conectando a srvv-fenix (PRODUCCIÓN)..." # Autorizar candados primero system("ruby adn/tools/candados/candados.rb authorize >/dev/null 2>&1") # Obtener credencial de candados pass_cmd = `ruby adn/tools/candados/candados.rb get utnlarioja.intranet:monlaricardo 2>/dev/null`.strip if pass_cmd.empty? puts "[!] Error: No se pudo obtener credencial de candados" exit 1 end sql_user = 'UTNlarioja\\monlaricardo' sql_host = '10.0.10.200' begin client_fenix = TinyTds::Client.new( username: sql_user, password: pass_cmd, host: sql_host, timeout: 600, database: 'sysdasuten' ) puts "[+] Conectado a srvv-fenix" rescue => e puts "[!] Error conectando a fenix: #{e.message}" exit 1 end # ========================================== # 2. TABLAS PRINCIPALES PARA VERIFICAR # ========================================== # El usuario mencionó "venta de bonos" como tarea repetitiva # Verificamos tablas relacionadas con bonos y afiliados tablas_principales = [ 'Bonos', 'BonosAfiliado', 'AutorizacionGasto', 'AutorizacionBonosExcepcion', 'afiliados', 'ControlPrestaciones', 'usuarios', 'transacciones' ] puts "\n[2] Verificando tablas principales..." # ========================================== # 3. OBTENER DATOS DE FENIX # ========================================== datos_fenix = {} tablas_principales.each do |tabla| begin # Verificar si existe existe = client_fenix.execute(" SELECT TOP 1 1 FROM sys.objects WHERE name = '#{tabla}' AND type = 'U' ").to_a.any? unless existe puts " #{tabla}: NO EXISTE" next end # Buscar columna de fecha cols = client_fenix.execute(" SELECT TOP 1 COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '#{tabla}' AND DATA_TYPE IN ('datetime', 'datetime2', 'date', 'smalldatetime') ").to_a if cols.empty? # Sin columna de fecha, solo contar total count_total = client_fenix.execute("SELECT COUNT(*) as total FROM #{tabla}").first['total'] datos_fenix[tabla] = { total: count_total, col_fecha: nil } puts " #{tabla}: #{count_total} registros (sin fecha)" next end col_fecha = cols.first['COLUMN_NAME'] # Contar total y desde abril 13 count_total = client_fenix.execute("SELECT COUNT(*) as total FROM #{tabla}").first['total'] count_desde_13 = client_fenix.execute(" SELECT COUNT(*) as total FROM #{tabla} WHERE #{col_fecha} >= '2026-04-13' ").first['total'] # Última fecha ultima_fecha = client_fenix.execute(" SELECT MAX(#{col_fecha}) as ultima FROM #{tabla} ").first['ultima'] # Últimos 5 registros ultimos = client_fenix.execute(" SELECT TOP 5 * FROM #{tabla} ORDER BY #{col_fecha} DESC ").to_a datos_fenix[tabla] = { total: count_total, desde_13: count_desde_13, col_fecha: col_fecha, ultima_fecha: ultima_fecha, ultimos: ultimos } puts " #{tabla}: #{count_desde_13} desde 2026-04-13 (total: #{count_total}) - última: #{ultima_fecha}" rescue => e puts " #{tabla}: ERROR - #{e.message}" end end # ========================================== # 4. CONSULTAR DASU-SQL4 # ========================================== puts "\n[3] Consultando DASU-SQL4..." ps_script = <<~PSCMD.strip $ErrorActionPreference = "Stop" $JSON_PATH = "C:\\temp\\comparacion_dasu_output.json" $null = New-Item -ItemType Directory -Force -Path "C:\\temp" $connString = "Server=localhost;Database=sysdasuten;Integrated Security=true;TrustServerCertificate=yes;" $conn = New-Object System.Data.SqlClient.SqlConnection($connString) $conn.Open() $tablasPrincipales = @('Bonos', 'BonosAfiliado', 'AutorizacionGasto', 'AutorizacionBonosExcepcion', 'afiliados', 'ControlPrestaciones', 'usuarios', 'transacciones') $datos = @{} foreach ($tabla in $tablasPrincipales) { try { # Verificar si existe $check = New-Object System.Data.SqlClient.SqlCommand("SELECT TOP 1 1 FROM sys.objects WHERE name = '$tabla' AND type = 'U'", $conn) $existe = $check.ExecuteScalar() if ($existe) { # Buscar columna fecha $cmdCol = New-Object System.Data.SqlClient.SqlCommand("SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$tabla' AND DATA_TYPE IN ('datetime', 'datetime2', 'date', 'smalldatetime')", $conn) $colFecha = $cmdCol.ExecuteScalar() if ($colFecha) { # Count total $cmdTotal = New-Object System.Data.SqlClient.SqlCommand("SELECT COUNT(*) FROM [$tabla]", $conn) $countTotal = $cmdTotal.ExecuteScalar() # Count desde abril 13 $cmd13 = New-Object System.Data.SqlClient.SqlCommand("SELECT COUNT(*) FROM [$tabla] WHERE [$colFecha] >= '2026-04-13'", $conn) $count13 = $cmd13.ExecuteScalar() # Última fecha $cmdMax = New-Object System.Data.SqlClient.SqlCommand("SELECT MAX([$colFecha]) as ultima FROM [$tabla]", $conn) $ultima = $cmdMax.ExecuteScalar() # Últimos 5 $cmdUltimos = New-Object System.Data.SqlClient.SqlCommand("SELECT TOP 5 * FROM [$tabla] ORDER BY [$colFecha] DESC", $conn) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmdUltimos) $ds = New-Object System.Data.DataSet $adapter.Fill($ds) $ultimos = $ds.Tables[0].Rows | ForEach-Object { $row = @{} $_.Table.Columns | ForEach-Object { $row[$_.ColumnName] = $_.($_) } $row } $datos[$tabla] = @{ total = $countTotal desde_13 = $count13 col_fecha = $colFecha ultima_fecha = $ultima ultimos = $ultimos } Write-Host " $tabla : $count13 desde 2026-04-13 (total: $countTotal) - última: $ultima" } else { $cmdTotal = New-Object System.Data.SqlClient.SqlCommand("SELECT COUNT(*) FROM [$tabla]", $conn) $countTotal = $cmdTotal.ExecuteScalar() $datos[$tabla] = @{ total = $countTotal; col_fecha = $null } Write-Host " $tabla : $countTotal registros (sin fecha)" } } else { Write-Host " $tabla : NO EXISTE" } } catch { Write-Host " $tabla : ERROR - $_" } } $conn.Close() $resultado = @{ datos = $datos timestamp = (Get-Date -Format "o") } $resultado | ConvertTo-Json -Depth 10 | Out-File -FilePath $JSON_PATH -Encoding utf8 PSCMD begin DasuExecutor.execute_ps_on_dasu(ps_script, output_path: 'C:\temp\comparacion_dasu_output.json') resultado_dasu = DasuExecutor.read_json_from_dasu('C:\temp\comparacion_dasu_output.json') datos_dasu = resultado_dasu['datos'] rescue => e puts "[!] Error consultando dasu-sql4: #{e.message}" puts e.backtrace.first(5).join("\n") datos_dasu = {} end # ========================================== # 5. COMPARAR RESULTADOS # ========================================== puts "\n[4] COMPARACIÓN FENIX vs DASU-SQL4:" puts "=" * 60 tablas_comunes = datos_fenix.keys & (datos_dasu || {}).keys if tablas_comunes.empty? puts " ⚠️ No hay tablas comunes para comparar" else puts " Tablas a comparar: #{tablas_comunes.join(', ')}" puts "" todas_coinciden = true tablas_comunes.each do |tabla| fenix = datos_fenix[tabla] dasu = datos_dasu[tabla] puts " === #{tabla} ===" puts " Columna fecha: #{fenix[:col_fecha] || dasu['col_fecha'] || 'N/A'}" puts " FENIX total: #{fenix[:total]} | DASU total: #{dasu['total']}" puts " FENIX desde_13: #{fenix[:desde_13]} | DASU desde_13: #{dasu['desde_13']}" puts " FENIX última: #{fenix[:ultima_fecha]} | DASU última: #{dasu['ultima_fecha']}" # Verificar coincidencia if fenix[:total] == dasu['total'] && fenix[:desde_13] == dasu['desde_13'] # Comparar fechas como strings fenix_fecha = fenix[:ultima_fecha].to_s.strip dasu_fecha = dasu['ultima_fecha'].to_s.strip if fenix_fecha == dasu_fecha puts " ✅ COINCIDE" else puts " ⚠️ FECHAS DIFIEREN" puts " FENIX: #{fenix_fecha}" puts " DASU: #{dasu_fecha}" todas_coinciden = false end else puts " ⚠️ NO COINCIDE - Diferencia en cantidades" todas_coinciden = false end puts "" end puts "=" * 60 if todas_coinciden puts " ✅ TODOS LOS DATOS COINCIDEN - El restore fue exitoso" else puts " ⚠️ HAY DIFERENCIAS - El restore puede estar incompleto" end end # ========================================== # 6. DETALLE ÚLTIMOS REGISTROS (BONOS) # ========================================== puts "\n[5] DETALLE ÚLTIMOS REGISTROS DE BONOS:" puts "=" * 60 if datos_fenix['Bonos'] && datos_fenix['Bonos'][:ultimos] puts " FENIX - Últimos 5 bonos:" datos_fenix['Bonos'][:ultimos].each_with_index do |registro, i| puts " #{i+1}. #{registro}" end end if datos_dasu && datos_dasu['Bonos'] && datos_dasu['Bonos']['ultimos'] puts "\n DASU-SQL4 - Últimos 5 bonos:" datos_dasu['Bonos']['ultimos'].each_with_index do |registro, i| puts " #{i+1}. #{registro}" end end puts "\n✅ Verificación completada" client_fenix.close