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); }