114 lines
4.3 KiB
PHP
114 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* Migración: Módulo Administrativo de Laboratorio
|
|
* Ejecuta las 7 migraciones SQL del módulo en orden
|
|
*
|
|
* Uso:
|
|
* php migrations/20260302_lab_run_migrations.php
|
|
* php migrations/20260302_lab_run_migrations.php --rollback
|
|
*
|
|
* Las tablas se crean en este orden para respetar las FK:
|
|
* 1. lab_pacientes (depende de users)
|
|
* 2. lab_enfermeras (independiente)
|
|
* 3. lab_ordenes_medicas (depende de lab_pacientes, conversations, admin_users)
|
|
* 4. lab_domicilios (depende de lab_ordenes_medicas, lab_pacientes)
|
|
* 5. lab_asignaciones (depende de lab_domicilios, lab_enfermeras)
|
|
* 6. lab_autorizaciones (depende de lab_ordenes_medicas)
|
|
* 7. lab_actividad_admin (depende de admin_users)
|
|
*/
|
|
|
|
require_once __DIR__ . '/../config/config.php';
|
|
|
|
$isRollback = in_array('--rollback', $argv ?? []);
|
|
$line = str_repeat('─', 60);
|
|
|
|
echo "\n$line\n";
|
|
echo $isRollback
|
|
? " 🔄 ROLLBACK — Módulo Administrativo Lab\n"
|
|
: " 🚀 MIGRACIÓN — Módulo Administrativo Lab\n";
|
|
echo "$line\n\n";
|
|
|
|
// ── Archivos en orden de ejecución (rollback = inverso) ──────────────────────
|
|
$migrations = [
|
|
'20260302_lab_01_pacientes.sql',
|
|
'20260302_lab_02_enfermeras.sql',
|
|
'20260302_lab_03_ordenes_medicas.sql',
|
|
'20260302_lab_04_domicilios.sql',
|
|
'20260302_lab_05_asignaciones.sql',
|
|
'20260302_lab_06_autorizaciones.sql',
|
|
'20260302_lab_07_actividad_admin.sql',
|
|
];
|
|
|
|
// ── Sentencias DROP para rollback (orden inverso para respetar FK) ───────────
|
|
$rollback = [
|
|
'DROP TABLE IF EXISTS `lab_actividad_admin`',
|
|
'DROP TABLE IF EXISTS `lab_autorizaciones`',
|
|
'DROP TABLE IF EXISTS `lab_asignaciones`',
|
|
'DROP TABLE IF EXISTS `lab_domicilios`',
|
|
'DROP TABLE IF EXISTS `lab_ordenes_medicas`',
|
|
'DROP TABLE IF EXISTS `lab_enfermeras`',
|
|
'DROP TABLE IF EXISTS `lab_pacientes`',
|
|
];
|
|
|
|
try {
|
|
$db = Database::getInstance();
|
|
$pdo = $db->getConnection();
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
if ($isRollback) {
|
|
// ── ROLLBACK ─────────────────────────────────────────────────────────
|
|
foreach ($rollback as $sql) {
|
|
$table = preg_replace('/.*`(lab_\w+)`.*/', '$1', $sql);
|
|
$pdo->exec($sql);
|
|
echo " ✅ DROP $table\n";
|
|
}
|
|
echo "\n ✔ Rollback completado correctamente.\n\n";
|
|
} else {
|
|
// ── MIGRACIÓN ────────────────────────────────────────────────────────
|
|
$dir = __DIR__;
|
|
|
|
foreach ($migrations as $file) {
|
|
$path = "$dir/$file";
|
|
|
|
if (!file_exists($path)) {
|
|
echo " ⚠️ Archivo no encontrado: $file (omitido)\n";
|
|
continue;
|
|
}
|
|
|
|
$sql = file_get_contents($path);
|
|
|
|
// Separar sentencias por ';' pero solo las CREATE TABLE
|
|
// (Los archivos contienen una sola sentencia CREATE TABLE)
|
|
$pdo->exec($sql);
|
|
|
|
// Extraer nombre de tabla del archivo para feedback
|
|
preg_match('/CREATE TABLE IF NOT EXISTS `(\w+)`/i', $sql, $m);
|
|
$table = $m[1] ?? $file;
|
|
echo " ✅ $table\n";
|
|
}
|
|
|
|
echo "\n$line\n";
|
|
echo " ✔ Todas las migraciones ejecutadas correctamente.\n";
|
|
echo "$line\n\n";
|
|
|
|
// ── Tabla de control de migraciones ejecutadas en system_logs ────────
|
|
try {
|
|
$pdo->prepare("
|
|
INSERT INTO system_logs (level, message, context, created_at)
|
|
VALUES ('info', 'lab_module_migration', ?, NOW())
|
|
")->execute([json_encode([
|
|
'version' => '20260302',
|
|
'module' => 'lab_admin',
|
|
'tables' => 7,
|
|
'executed' => date('Y-m-d H:i:s'),
|
|
])]);
|
|
} catch (Exception $e) {
|
|
// system_logs puede no tener estas columnas — no falla la migración
|
|
}
|
|
}
|
|
} catch (PDOException $e) {
|
|
echo "\n ❌ ERROR: " . $e->getMessage() . "\n\n";
|
|
echo " Ejecuta --rollback para deshacer los cambios parciales.\n\n";
|
|
exit(1);
|
|
}
|