From 495da81b2dcd3c3ea00c0cdb902cc5606d383870 Mon Sep 17 00:00:00 2001 From: Keiko Date: Tue, 30 Jun 2026 00:32:36 +0000 Subject: [PATCH] =?UTF-8?q?Migraci=C3=B3n=20a=20la=20versi=C3=B3n=20m?= =?UTF-8?q?=C3=A1s=20estable=20de=20Gitea=20en=20Del=20Austral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Keiko --- database.sql | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 database.sql diff --git a/database.sql b/database.sql new file mode 100644 index 0000000..f09a5db --- /dev/null +++ b/database.sql @@ -0,0 +1,251 @@ +-- ============================================================ +-- Base de datos: Del Austral — Historial Clínico Digital +-- Importar este archivo desde phpMyAdmin (pestaña "Importar") +-- dentro de la base de datos que crees en cPanel. +-- +-- Este esquema ya incluye TODO (sedes, múltiples profesionales, +-- rol desarrollador, confirmación de turnos, etc.) — es para una +-- instalación NUEVA, desde cero. Si ya tenías el sistema andando +-- con pacientes cargados, no uses este archivo: usá en cambio +-- las migraciones (migracion_v2.sql en adelante) en orden. +-- ============================================================ + +SET NAMES utf8mb4; +SET time_zone = '-03:00'; + +-- ------------------------------------------------------------ +-- Tabla: sedes (sucursales / lugares de atención) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS sedes ( + id INT PRIMARY KEY AUTO_INCREMENT, + nombre VARCHAR(150) NOT NULL UNIQUE, + activa TINYINT(1) NOT NULL DEFAULT 1, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: desarrollador (contraseña única, separada de "usuarios") +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS desarrollador ( + id INT PRIMARY KEY AUTO_INCREMENT, + clave_hash VARCHAR(255) NOT NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: usuarios (profesionales y administrativas; cada uno +-- con su propio PIN de 4 dígitos, hasheado) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS usuarios ( + id INT PRIMARY KEY AUTO_INCREMENT, + nombre_completo VARCHAR(150) NOT NULL, + rol ENUM('desarrollador', 'profesional', 'administrativa') NOT NULL DEFAULT 'profesional', + patron_hash VARCHAR(255) NOT NULL, + activo TINYINT(1) NOT NULL DEFAULT 1, + estado_licencia ENUM('activo','suspendido','pausado','prohibido') NOT NULL DEFAULT 'activo', + licencia_dias SMALLINT UNSIGNED NULL, + licencia_inicio DATE NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: usuarios_sedes (en qué sede(s) atiende cada usuario) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS usuarios_sedes ( + usuario_id INT NOT NULL, + sede_id INT NOT NULL, + PRIMARY KEY (usuario_id, sede_id), + FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE, + FOREIGN KEY (sede_id) REFERENCES sedes(id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: obras_sociales (catálogo editable de obras sociales) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS profesionales_legajos ( + id INT PRIMARY KEY AUTO_INCREMENT, + usuario_id INT NOT NULL UNIQUE, + titulo ENUM('Dr.','Dra.','Lic.','Tec.','Mg.','Prof.','Otro') NOT NULL DEFAULT 'Dr.', + nombre VARCHAR(80) NOT NULL, + apellido VARCHAR(80) NOT NULL, + dni VARCHAR(20) NULL, + fecha_nacimiento DATE NULL, + lugar_nacimiento VARCHAR(150) NULL, + especialidad VARCHAR(150) NULL, + email VARCHAR(150) NULL, + telefono VARCHAR(40) NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS obras_sociales ( + id INT PRIMARY KEY AUTO_INCREMENT, + nombre VARCHAR(120) NOT NULL UNIQUE, + es_predefinida TINYINT(1) NOT NULL DEFAULT 0, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +INSERT INTO obras_sociales (nombre, es_predefinida) VALUES + ('Particular (sin obra social)', 1), + ('OSDE', 1), + ('Swiss Medical', 1), + ('Galeno', 1), + ('Medifé', 1), + ('IOMA', 1), + ('PAMI', 1), + ('Unión Personal', 1), + ('OSDEPYM', 1), + ('Jerárquicos Salud', 1), + ('Sancor Salud', 1), + ('Seros', 1), + ('Accord Salud', 1), + ('ACA Salud', 1), + ('Apross', 1), + ('OSECAC', 1), + ('Luis Pasteur', 1), + ('Hospital Italiano (Plan de Salud)', 1) +ON DUPLICATE KEY UPDATE nombre = nombre; + +-- ------------------------------------------------------------ +-- Tabla: pacientes (legajo principal) +-- Cada paciente pertenece a UN profesional (aislamiento total +-- entre profesionales) y a UNA sede (puede migrarse después). +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS pacientes ( + id INT PRIMARY KEY AUTO_INCREMENT, + profesional_id INT NULL, + sede_id INT NULL, + recuperado_de_profesional VARCHAR(150) NULL, + nombre VARCHAR(100) NOT NULL, + apellido VARCHAR(100) NOT NULL, + dni VARCHAR(20) NOT NULL, + fecha_nacimiento DATE NOT NULL, + sexo ENUM('Femenino', 'Masculino', 'Otro') NOT NULL, + obra_social_id INT NULL, + numero_afiliado VARCHAR(60) NULL, + telefono VARCHAR(40) NULL, + email VARCHAR(150) NULL, + direccion VARCHAR(200) NULL, + motivo_consulta TEXT NULL, + patologia VARCHAR(255) NULL, + sintomas TEXT NULL, + observaciones_generales TEXT NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (profesional_id) REFERENCES usuarios(id) ON DELETE SET NULL, + FOREIGN KEY (sede_id) REFERENCES sedes(id) ON DELETE SET NULL, + FOREIGN KEY (obra_social_id) REFERENCES obras_sociales(id) ON DELETE SET NULL, + UNIQUE INDEX idx_dni_por_profesional (profesional_id, dni), + INDEX idx_apellido_nombre (apellido, nombre), + INDEX idx_obra_social (obra_social_id), + INDEX idx_pacientes_profesional (profesional_id), + INDEX idx_pacientes_sede (sede_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: sesiones (cada día/sesión de atención dentro de un legajo) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS sesiones ( + id INT PRIMARY KEY AUTO_INCREMENT, + paciente_id INT NOT NULL, + fecha_sesion DATE NOT NULL, + descripcion TEXT NOT NULL, + evolucion TEXT NULL, + proxima_cita DATE NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (paciente_id) REFERENCES pacientes(id) ON DELETE CASCADE, + INDEX idx_paciente_fecha (paciente_id, fecha_sesion) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: legajos_eliminados (papelera / base histórica) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS legajos_eliminados ( + id INT PRIMARY KEY AUTO_INCREMENT, + paciente_id_original INT NOT NULL, + profesional_id_original INT NULL, + sede_id_original INT NULL, + nombre_completo VARCHAR(220) NOT NULL, + dni VARCHAR(20) NOT NULL, + datos_json LONGTEXT NOT NULL, + eliminado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_dni_eliminado (dni), + INDEX idx_papelera_profesional (profesional_id_original), + INDEX idx_papelera_sede (sede_id_original) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: citas (agenda). El choque de horario se valida por +-- profesional_id + fecha + hora, sin importar la sede. +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS citas ( + id INT PRIMARY KEY AUTO_INCREMENT, + paciente_id INT NOT NULL, + profesional_id INT NULL, + fecha DATE NOT NULL, + hora TIME NULL, + motivo VARCHAR(255) NULL, + estado ENUM('pendiente', 'atendida', 'cancelada', 'ausente') NOT NULL DEFAULT 'pendiente', + notas TEXT NULL, + token_confirmacion VARCHAR(64) NULL, + confirmada_por_paciente TINYINT(1) NOT NULL DEFAULT 0, + revisada_por_profesional TINYINT(1) NOT NULL DEFAULT 1, + sesion_generada_id INT NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (paciente_id) REFERENCES pacientes(id) ON DELETE CASCADE, + FOREIGN KEY (profesional_id) REFERENCES usuarios(id) ON DELETE SET NULL, + INDEX idx_citas_fecha (fecha, hora), + INDEX idx_citas_paciente (paciente_id), + INDEX idx_citas_choque (profesional_id, fecha, hora), + UNIQUE INDEX idx_citas_token (token_confirmacion) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: archivos_adjuntos (PDF e imágenes ligados a un legajo) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS archivos_adjuntos ( + id INT PRIMARY KEY AUTO_INCREMENT, + paciente_id INT NOT NULL, + sesion_id INT NULL, + nombre_original VARCHAR(255) NOT NULL, + nombre_archivo VARCHAR(255) NOT NULL, + tipo_mime VARCHAR(100) NOT NULL, + tamanio_bytes INT NOT NULL, + descripcion VARCHAR(255) NULL, + subido_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (paciente_id) REFERENCES pacientes(id) ON DELETE CASCADE, + FOREIGN KEY (sesion_id) REFERENCES sesiones(id) ON DELETE SET NULL, + INDEX idx_adjuntos_paciente (paciente_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: plantillas_evolucion (texto libre reutilizable, +-- cada profesional tiene las suyas, no se comparten) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS plantillas_evolucion ( + id INT PRIMARY KEY AUTO_INCREMENT, + profesional_id INT NULL, + nombre VARCHAR(120) NOT NULL, + contenido TEXT NOT NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (profesional_id) REFERENCES usuarios(id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ------------------------------------------------------------ +-- Tabla: historial_cambios (auditoría de quién hizo qué) +-- ------------------------------------------------------------ +CREATE TABLE IF NOT EXISTS historial_cambios ( + id INT PRIMARY KEY AUTO_INCREMENT, + usuario_id INT NULL, + usuario_nombre VARCHAR(150) NULL, + accion VARCHAR(60) NOT NULL, + entidad VARCHAR(60) NOT NULL, + entidad_id INT NULL, + descripcion VARCHAR(500) NULL, + creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_historial_entidad (entidad, entidad_id), + INDEX idx_historial_fecha (creado_en) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;