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

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);
}