Files
whatsapp/run_003_turnero.php
T

164 lines
5.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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);
}