docs & tools: Actualización de informes y scripts de migración DASUTEN

This commit is contained in:
Ricardo Monla
2026-04-20 16:25:51 -03:00
parent faf46be84b
commit 65dd92b769
44 changed files with 3822 additions and 568 deletions
+157
View File
@@ -0,0 +1,157 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
# ==========================================================
# Restauración COMPLETA desde backup local en dasu-sql4
# ==========================================================
require_relative 'drones/lib/dasu_executor'
puts "=== RESTAURACIÓN COMPLETA DESDE BACKUP LOCAL ==="
puts "Fecha: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
puts ""
# Script PowerShell para restore (sin drop, la BD ya no existe)
ps_script = <<~PSCMD.strip
$ErrorActionPreference = "Stop"
$JSON_PATH = "C:\\temp\\restaurar_completo_output.json"
$null = New-Item -ItemType Directory -Force -Path "C:\\temp"
# Encontrar el backup más reciente
Write-Host "[0/5] Buscando backup más reciente..."
$backupFile = Get-ChildItem "F:\\BACKUP\\sysdasuten_FULL_*.bak" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (-not $backupFile) {
Write-Host "[!] No se encontró backup en F:\\BACKUP\\"
exit 1
}
$BACKUP_FILE = $backupFile.FullName
Write-Host " Backup: $($backupFile.Name)"
Write-Host " Tamaño: $([math]::Round($backupFile.Length / 1MB, 2)) MB"
# Ver archivos lógicos en el backup
Write-Host "`n[1/5] Leyendo archivos lógicos del backup..."
$connString = "Server=localhost;Database=master;Integrated Security=true;TrustServerCertificate=yes;"
$conn = New-Object System.Data.SqlClient.SqlConnection($connString)
$conn.Open()
$cmd = New-Object System.Data.SqlClient.SqlCommand("RESTORE FILELISTONLY FROM DISK = '$BACKUP_FILE'", $conn)
$adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd)
$ds = New-Object System.Data.DataSet
$adapter.Fill($ds)
$logicalNames = @{}
if ($ds.Tables[0].Rows.Count -gt 0) {
Write-Host " Archivos en el backup:"
$ds.Tables[0].Rows | ForEach-Object {
Write-Host " Tipo: $($_.Type) | Lógico: $($_.LogicalName) | Físico: $($_.PhysicalName)"
if ($_.Type -eq 'D') {
$logicalNames['data'] = $_.LogicalName
} elseif ($_.Type -eq 'L') {
$logicalNames['log'] = $_.LogicalName
}
}
}
Write-Host "`n[2/5] Restaurando desde backup..."
Write-Host " Backup: $BACKUP_FILE"
Write-Host " LogicalName data: $($logicalNames['data'])"
Write-Host " LogicalName log: $($logicalNames['log'])"
$restoreSql = @"
RESTORE DATABASE sysdasuten
FROM DISK = '$BACKUP_FILE'
WITH REPLACE, RECOVERY,
MOVE '$($logicalNames['data'])' TO 'F:\\DATA\\sysdasuten.mdf',
MOVE '$($logicalNames['log'])' TO 'F:\\LOG\\sysdasuten_log.ldf'
"@
Write-Host " SQL: $restoreSql"
$cmd = New-Object System.Data.SqlClient.SqlCommand($restoreSql, $conn)
$cmd.CommandTimeout = 600
$start = Get-Date
try {
$cmd.ExecuteNonQuery() | Out-Null
$duracion = [math]::Round((New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds, 2)
Write-Host " Restore completado en ${duracion}s"
} catch {
Write-Host " ERROR en restore: $_"
exit 1
}
Write-Host "`n[3/5] Poniendo BD en línea..."
$cmd = New-Object System.Data.SqlClient.SqlCommand("
ALTER DATABASE sysdasuten SET MULTI_USER
", $conn)
$cmd.ExecuteNonQuery() | Out-Null
Write-Host " BD en línea"
# Verificar restore
Write-Host "`n[4/5] Verificando cantidad de registros..."
$cmd = New-Object System.Data.SqlClient.SqlCommand("
SELECT COUNT(*) as total FROM sysdasuten.dbo.BonosAfiliado
", $conn)
$total = $cmd.ExecuteScalar()
Write-Host " Total registros en BonosAfiliado: $total"
Write-Host "`n[5/5] Verificando IDs y fechas..."
$cmd = New-Object System.Data.SqlClient.SqlCommand("
SELECT MAX(idsolicitud) as max_id FROM sysdasuten.dbo.BonosAfiliado
", $conn)
$maxId = $cmd.ExecuteScalar()
Write-Host " MAX(idsolicitud): $maxId"
$cmd = New-Object System.Data.SqlClient.SqlCommand("
SELECT MAX(fecha) as ultima_fecha FROM sysdasuten.dbo.BonosAfiliado
", $conn)
$ultimaFecha = $cmd.ExecuteScalar()
Write-Host " Última fecha: $ultimaFecha"
# Verificar registros con idsolicitud = 0 vs > 0
$cmd = New-Object System.Data.SqlClient.SqlCommand("
SELECT
SUM(CASE WHEN idsolicitud = 0 THEN 1 ELSE 0 END) as con_cero,
SUM(CASE WHEN idsolicitud > 0 THEN 1 ELSE 0 END) as con_mayor_cero
FROM sysdasuten.dbo.BonosAfiliado
", $conn)
$adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd)
$ds = New-Object System.Data.DataSet
$adapter.Fill($ds)
if ($ds.Tables[0].Rows.Count -gt 0) {
$row = $ds.Tables[0].Rows[0]
Write-Host " Con idsolicitud=0: $($row.con_cero)"
Write-Host " Con idsolicitud>0: $($row.con_mayor_cero)"
}
$conn.Close()
$resultado = @{
paso = "restore_completo"
backup = $BACKUP_FILE
total_registros = $total
max_idsolicitud = $maxId
ultima_fecha = $ultimaFecha
timestamp = (Get-Date -Format "o")
}
$resultado | ConvertTo-Json | Out-File -FilePath $JSON_PATH -Encoding utf8
PSCMD
puts "\n[1/2] Ejecutando restauración..."
DasuExecutor.execute_ps_on_dasu(ps_script, output_path: 'C:\temp\restaurar_completo_output.json')
puts "\n[2/2] Leyendo resultado..."
begin
resultado = DasuExecutor.read_json_from_dasu('C:\temp\restaurar_completo_output.json')
puts "\n=== RESULTADO ==="
puts " Backup: #{resultado['backup']}"
puts " Total registros: #{resultado['total_registros']}"
puts " MAX(idsolicitud): #{resultado['max_idsolicitud']}"
puts " Última fecha: #{resultado['ultima_fecha']}"
rescue => e
puts "[!] Error leyendo resultado: #{e.message}"
end
puts "\n✅ Restauración completada"