up
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user