164 lines
5.1 KiB
PHP
164 lines
5.1 KiB
PHP
<?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
|
||
*/
|
||
|
||
// Cargar config primero para que MIGRATION_TOKEN esté disponible
|
||
require_once __DIR__ . '/config/config.php';
|
||
|
||
// Ejecutar solo desde CLI o con token de protección básica en web
|
||
if (php_sapi_name() !== 'cli') {
|
||
$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");
|
||
}
|
||
}
|
||
|
||
$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);
|
||
}
|