Files
whatsapp/run_roles_migration.php
T
2026-03-10 18:42:51 -05:00

82 lines
3.1 KiB
PHP

<?php
/**
* Ejecuta la migración del sistema de Roles y Módulos.
* Acceder UNA sola vez desde el navegador (admin autenticado).
* Eliminar o proteger este archivo después de ejecutar.
*/
require_once 'config/config.php';
if (!isUserLoggedIn()) {
header('Location: login.php'); exit;
}
$sqlFile = __DIR__ . '/migrations/20260304_roles_and_modules.sql';
if (!file_exists($sqlFile)) {
die('❌ Archivo de migración no encontrado: ' . $sqlFile);
}
$sql = file_get_contents($sqlFile);
// Eliminar comentarios de línea (-- ...) y comentarios de bloque (/* ... */)
$sql = preg_replace('/--[^\n]*/', '', $sql);
$sql = preg_replace('/\/\*.*?\*\//s', '', $sql);
// Dividir en sentencias individuales por el punto y coma
$statements = array_filter(
array_map('trim', explode(';', $sql)),
fn($s) => $s !== '' && $s !== "\n"
);
try {
$pdo = createDbConnection();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$ok = 0; $errors = [];
foreach ($statements as $stmt) {
if (!trim($stmt)) continue;
try {
$pdo->exec($stmt);
$ok++;
} catch (PDOException $e) {
// Ignorar: columna ya existe, índice ya existe, clave duplicada en INSERT
$msg = $e->getMessage();
if (
str_contains($msg, 'Duplicate entry') ||
str_contains($msg, 'Duplicate key') ||
str_contains($msg, 'already exists') ||
str_contains($msg, 'Duplicate column name') ||
str_contains($msg, "Can't DROP") ||
preg_match('/already exists/i', $msg)
) {
$ok++;
} else {
$errors[] = '<strong>Error:</strong> ' . htmlspecialchars($msg) .
'<br><code>' . htmlspecialchars(substr($stmt, 0, 200)) . '</code>';
}
}
}
?>
<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8">
<title>Migración Roles</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head><body class="p-4">
<div class="container" style="max-width:740px">
<h3 class="mb-3">🔧 Migración: Roles y Módulos</h3>
<div class="alert alert-<?= $errors ? 'warning' : 'success' ?>">
✅ <strong><?= $ok ?></strong> sentencias ejecutadas correctamente.<br>
<?php if ($errors): ?>
⚠️ <strong><?= count($errors) ?></strong> advertencias (ver abajo).
<?php endif; ?>
</div>
<?php foreach ($errors as $e): ?>
<div class="alert alert-danger small"><?= $e ?></div>
<?php endforeach; ?>
<a href="lab_usuarios.php" class="btn btn-primary">Ir a Usuarios & Roles →</a>
<a href="lab_dashboard.php" class="btn btn-outline-secondary ms-2">Dashboard</a>
<p class="mt-3 text-muted small">⚠️ Elimina o protege este archivo (<code>run_roles_migration.php</code>) después de ejecutarlo.</p>
</div></body></html>
<?php
} catch (Exception $e) {
echo '<div class="alert alert-danger p-3">❌ Error de conexión: ' . htmlspecialchars($e->getMessage()) . '</div>';
}