This commit is contained in:
Lizandro Guarnizo
2026-04-18 13:28:32 -05:00
parent 56fd2d9174
commit 876e935a66
3 changed files with 440 additions and 0 deletions
+163
View File
@@ -0,0 +1,163 @@
<?php
/**
* Runner — Migración 003: Módulo Turnero (Oleada 1)
*
* Uso desde terminal:
* php run_003_turnero.php
*
* O desde el navegador (solo en desarrollo, no exponer en producción):
* https://tu-dominio/run_003_turnero.php
*/
// Ejecutar solo desde CLI o con token de protección básica en web
if (php_sapi_name() !== 'cli') {
// En web: exigir token para evitar ejecuciones accidentales
$token = $_GET['token'] ?? '';
if (empty($token) || $token !== (defined('MIGRATION_TOKEN') ? MIGRATION_TOKEN : '')) {
http_response_code(403);
die("Acceso denegado. Usa CLI: php run_003_turnero.php\n");
}
}
require_once __DIR__ . '/config/config.php';
$sqlFile = __DIR__ . '/migrations/003_turnero.sql';
if (!file_exists($sqlFile)) {
echo "❌ Archivo no encontrado: $sqlFile\n";
exit(1);
}
try {
$db = Database::getInstance();
$pdo = $db->getConnection();
$sql = file_get_contents($sqlFile);
$statements = [];
// Separar sentencias por ; respetando comentarios de línea y bloques
$lines = explode("\n", $sql);
$current = '';
foreach ($lines as $line) {
$trimmed = trim($line);
// Saltar líneas de comentario
if (str_starts_with($trimmed, '--') || str_starts_with($trimmed, '#')) {
continue;
}
$current .= ' ' . $trimmed;
if (str_ends_with($trimmed, ';')) {
$stmt = trim($current);
if (!empty($stmt) && $stmt !== ';') {
$statements[] = $stmt;
}
$current = '';
}
}
echo "\n🚀 Ejecutando Migración 003 — Turnero\n";
echo str_repeat('─', 60) . "\n\n";
$ok = 0;
$err = 0;
foreach ($statements as $stmt) {
$preview = substr(preg_replace('/\s+/', ' ', $stmt), 0, 90);
try {
$pdo->exec($stmt);
echo "" . $preview . "\n";
$ok++;
} catch (PDOException $e) {
$msg = $e->getMessage();
// Errores ignorables: duplicado, ya existe, columna ya existe
$ignorable = (
str_contains($msg, 'Duplicate entry') ||
str_contains($msg, 'already exists') ||
str_contains($msg, "Duplicate key name")||
str_contains($msg, 'errno: 1050') || // table exists
str_contains($msg, 'errno: 1060') || // column exists
str_contains($msg, 'errno: 1061') // key exists
);
if ($ignorable) {
echo " ️ (ya existía) " . $preview . "\n";
$ok++;
} else {
echo " ✗ ERROR: " . $msg . "\n";
echo " SQL: " . $preview . "\n\n";
$err++;
}
}
}
echo "\n" . str_repeat('─', 60) . "\n";
echo "✅ Completado: $ok OK";
if ($err) {
echo " | ⚠️ $err errores";
}
echo "\n\n";
// ── Verificación post-migración ──────────────────────────
echo "📋 Verificación de tablas creadas:\n";
$tablas = [
'exam_tipos', 'exam_tipo_consentimientos',
'turnero_lugares', 'turnero_prioridades',
'turnero_sesiones', 'turnero_turnos',
'turnero_solicitudes', 'turnero_examen_items',
'turnero_consentimientos',
];
foreach ($tablas as $tabla) {
try {
$count = $pdo->query("SELECT COUNT(*) FROM `$tabla`")->fetchColumn();
echo "$tabla ($count filas)\n";
} catch (PDOException $e) {
echo "$tabla — NO ENCONTRADA\n";
}
}
// Verificar columna tipo en lab_formularios
try {
$cols = $pdo->query("SHOW COLUMNS FROM lab_formularios LIKE 'tipo'")->fetchAll();
if (!empty($cols)) {
echo " ✓ lab_formularios.tipo (ENUM)\n";
} else {
echo " ✗ lab_formularios.tipo — NO SE AGREGÓ\n";
}
} catch (PDOException $e) {
echo " ✗ lab_formularios — " . $e->getMessage() . "\n";
}
// Verificar prioridades
echo "\n🎫 Prioridades insertadas:\n";
$prios = $pdo->query("SELECT codigo, nombre, color FROM turnero_prioridades ORDER BY orden_peso")->fetchAll(PDO::FETCH_ASSOC);
foreach ($prios as $p) {
echo " [{$p['codigo']}] {$p['nombre']} {$p['color']}\n";
}
// Verificar lugares
echo "\n📍 Lugares creados:\n";
$lugares = $pdo->query("SELECT id, nombre FROM turnero_lugares ORDER BY sort_order")->fetchAll(PDO::FETCH_ASSOC);
foreach ($lugares as $l) {
echo " [{$l['id']}] {$l['nombre']}\n";
}
// Verificar exámenes de ejemplo
echo "\n🧪 Tipos de examen de ejemplo:\n";
$exams = $pdo->query("SELECT codigo, nombre, categoria FROM exam_tipos ORDER BY id")->fetchAll(PDO::FETCH_ASSOC);
foreach ($exams as $e) {
echo " [{$e['codigo']}] {$e['nombre']}{$e['categoria']}\n";
}
echo "\n✅ Migración 003 lista. Continúa con FASE 3.2 (Motor de cola + API).\n\n";
} catch (Exception $e) {
echo "❌ Error fatal: " . $e->getMessage() . "\n";
exit(1);
}