320 lines
9.9 KiB
Ruby
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
|