Files
dtic-DIIAA/adn/tools/cli/verificar_datos_fenix_dasu.rb

320 lines
9.9 KiB
Ruby

#!/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