Tabla central de identidad de la plataforma. Almacena las credenciales de autenticación (hash bcrypt), tokens de sesión activos, asignación de rol principal (`role_id`) y subrol opcional (`subrole_id`), preferencia de idioma y estado de cuenta.
| Column |
Data Type |
Nullable |
Default |
Key |
Purpose / Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | Identificador único correlativo del usuario. |
| email | varchar(255) | NO | None | UNIQUE | Correo electrónico institucional o personal (login). |
| password_hash | varchar(255) | NO | None | - | Hash seguro de contraseña generado mediante `password_hash()`. |
| login_token | varchar(100) | YES | NULL | UNIQUE | Token de autenticación/persistencia de sesión HttpOnly. |
| role_id | int(11) | NO | None | FK | Rol principal (1=Admin, 2=Company, 3=Provider, 4=Client). |
| name | varchar(255) | YES | NULL | - | Nombre completo o razón social asociada a la cuenta. |
| is_active | tinyint(1) | YES | 1 | - | Flag de cuenta activa (1=Habilitada, 0=Suspendida/Bloqueada). |
| lang_pref | enum('es','en') | YES | 'es' | - | Preferencia de idioma de la interfaz del usuario. |
| created_at | timestamp | NO | current_timestamp() | - | Fecha y hora exacta de registro. |
| subrole_id | int(11) | YES | NULL | FK | Subrol fino opcional para permisos especiales (ej. Clinical Lead). |
🔗 Foreign Key Constraints
Catálogo maestro de roles del sistema. Define los 4 tipos de actores principales: Administrador, Empresa (Company HR), Proveedor (Provider/Therapist) y Paciente (Client).
| Column |
Data Type |
Nullable |
Default |
Key |
Purpose / Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID único del rol. |
| name | varchar(50) | NO | None | UNIQUE | Nombre único del rol (ej: 'admin', 'company', 'provider', 'client'). |
Permite crear sub-roles jerárquicos o especializados vinculados a un rol base (por ejemplo, subrol "Clinical Lead" dentro de los administradores).
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del subrol. |
| role_id | int(11) | NO | None | FK | Rol primario al que pertenece. |
| name | varchar(100) | NO | None | - | Nombre visible del subrol. |
| slug | varchar(100) | NO | None | UNIQUE | Identificador técnico slug único. |
| description | text | YES | NULL | - | Detalle de funciones del subrol. |
| is_active | tinyint(1) | YES | 1 | - | Estado activo/inactivo. |
| created_at | timestamp | NO | current_timestamp() | - | Fecha de creación. |
🔗 Foreign Key Constraints
Matriz de permisos de grano fino asignados a un subrol específico (ej. `admin.cl_messages.read`, `reports.export`).
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del registro. |
| subrole_id | int(11) | NO | None | FK | Subrol que posee el permiso. |
| permission | varchar(150) | NO | None | UNIQUE_KEY | Cadena de permiso clave. |
🔗 Foreign Key Constraints
Registro de auditoría legal e inmutable para el cumplimiento normativo GDPR (Irlanda/UK). Guarda las declaraciones explícitas de consentimiento de políticas de privacidad, procesamiento de datos y cookies.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del log. |
| user_id | int(11) | NO | None | FK | Usuario que otorga consentimiento. |
| consent_type | enum('privacy_policy','data_processing','cookies') | NO | None | - | Tipo de consentimiento legal. |
| accepted | tinyint(1) | NO | None | - | 1=Aceptado, 0=Rechazado. |
| ip_address | varchar(45) | YES | NULL | - | Dirección IP (IPv4/IPv6) desde la cual se firmó. |
| user_agent | text | YES | NULL | - | Navegador / dispositivo del usuario. |
| created_at | timestamp | NO | current_timestamp() | - | Timestamp de auditoría. |
🔗 Foreign Key Constraints
Almacena las cuentas de empresas cliente corporativo (Enterprise Clients). Define la asignación de sesiones de salud mental subvencionadas por empleado (`sessions_per_member`), vigencia de contratos corporativos y total de miembros enrolados.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID único de la empresa. |
| user_id | int(11) | NO | None | UNIQUE / FK | Cuenta de usuario (login HR). |
| name | varchar(255) | NO | None | - | Nombre/Razón social de la empresa. |
| contact_name | varchar(255) | YES | NULL | - | Nombre del contacto principal HR. |
| contact_email | varchar(255) | YES | NULL | - | Correo de contacto institucional. |
| industry | varchar(100) | YES | NULL | - | Sector comercial / industria. |
| country | varchar(100) | YES | NULL | - | País de operación. |
| sessions_per_member | int(11) | YES | 8 | - | Bolsa de sesiones permitidas por empleado al año. |
| total_members_enrolled | int(11) | YES | 0 | - | Contador de empleados registrados. |
| contract_start | date | YES | NULL | - | Fecha inicio del contrato. |
| contract_end | date | YES | NULL | - | Fecha término del contrato. |
| is_active | tinyint(1) | YES | 1 | - | Estado activo/inactivo del contrato. |
🔗 Foreign Key Constraints
Tokens únicos y seguros generados por gestores HR o Administradores para permitir el auto-registro anónimo de empleados dentro de la bolsa corporativa de una empresa.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del enlace. |
| company_id | int(11) | NO | None | FK | Empresa emisora. |
| token | varchar(64) | NO | None | UNIQUE | Hash o token seguro de la URL de registro. |
| is_active | tinyint(1) | YES | 1 | - | 1=Válido, 0=Revocado. |
| created_by | int(11) | NO | None | FK | Usuario creador del token. |
| created_at | timestamp | NO | current_timestamp() | - | Timestamp de creación. |
🔗 Foreign Key Constraints
Perfil clínico e informativo del paciente (cliente). Vincula la cuenta de usuario con su empresa corporativa, terapeuta asignado (`provider_id`), recuento de sesiones consumidas vs permitidas, estado del emparejamiento (match) y datos de emergencia (Next of Kin y GP médico general).
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID interno del paciente. |
| user_id | int(11) | NO | None | UNIQUE / FK | Cuenta de usuario asociada. |
| provider_id | int(11) | YES | NULL | FK | Terapeuta asignado (SET NULL si se desasigna). |
| company_id | int(11) | NO | None | FK | Empresa a la que está afiliado. |
| name | varchar(255) | NO | None | - | Nombre completo del paciente. |
| service_preference | enum('coaching','counselling','both') | YES | NULL | - | Preferencia de tipo de servicio. |
| status | enum('new_match','active','engaged','inactive') | YES | 'new_match' | - | Estado del paciente en la plataforma. |
| total_sessions_allowed | int(11) | YES | 8 | - | Límite total de sesiones. |
| sessions_used | int(11) | YES | 0 | - | Sesiones ya realizadas. |
| next_of_kin_name | varchar(255) | YES | NULL | - | Contacto de emergencia de familiar cercano. |
| gp_name | varchar(255) | YES | NULL | - | Nombre del Médico General / Cabecera (GP). |
| intake_completed | tinyint(1) | YES | 0 | - | Flag de formulario de admisión completado. |
🔗 Foreign Key Constraints
Perfil profesional del terapeuta o coach mental. Guarda sus especialidades clínicas en formato `JSON`, configuración de duración de sesión y tiempo de descanso (buffer time), tope máximo de pacientes activos, zona horaria y enlaces de videollamada (Zoom/Google Meet).
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID único del proveedor. |
| user_id | int(11) | NO | None | UNIQUE / FK | Cuenta de usuario. |
| name | varchar(255) | NO | None | - | Nombre profesional y títulos. |
| specialties | longtext (JSON) | YES | NULL | - | Array JSON validado con especialidades. |
| session_duration | int(11) | YES | 50 | - | Duración estándar de consulta en minutos. |
| buffer_time | int(11) | YES | 30 | - | Tiempo de descanso/preparación entre citas (min). |
| max_clients | int(11) | YES | 10 | - | Límite máximo de pacientes activos. |
| timezone | varchar(100) | YES | 'Europe/Dublin' | - | Zona horaria de atención (ej. Europe/Dublin). |
| video_provider | enum('zoom','meet','both') | YES | 'zoom' | - | Proveedor de videoconferencia. |
🔗 Foreign Key Constraints
Horarios semanales de atención del terapeuta. Define las ventanas de horas por día de la semana (`day_of_week` 1 a 7) para alimentar el motor de agendamiento automático de citas.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del horario. |
| provider_id | int(11) | NO | None | FK | Proveedor al que pertenece. |
| day_of_week | tinyint(4) | NO | None | UNIQUE | Día de la semana (1=Lunes, 7=Domingo). |
| start_time | time | NO | '09:00:00' | - | Hora de inicio de atención. |
| end_time | time | NO | '17:00:00' | - | Hora de fin de atención. |
| active | tinyint(1) | YES | 1 | - | Indica si atiende ese día. |
🔗 Foreign Key Constraints
Áreas de interés o temas de salud mental seleccionados por el paciente (ej. Ansiedad, Estrés laboral, Mindfulness) con ponderación (`weight`) para sugerencias de emparejamiento con terapeutas.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del interés. |
| client_id | int(11) | NO | None | FK | Paciente asociado. |
| topic | varchar(100) | NO | None | - | Tópico/Tema de interés. |
| weight | int(11) | YES | 100 | - | Ponderación/Prioridad del interés. |
🔗 Foreign Key Constraints
Citas y sesiones de terapia/coaching agendadas entre un paciente y un proveedor. Registra la fecha programada, tipo de videollamada, estado de la sesión, solicitudes de cambio o cancelación (más/menos de 24h de aviso), asistencia registrada (`attendance`) y las 5 métricas de evaluación de calidad del terapeuta.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID único de la cita. |
| client_id | int(11) | NO | None | FK | Paciente asistente. |
| provider_id | int(11) | NO | None | FK | Terapeuta que atiende. |
| scheduled_at | datetime | NO | None | INDEX | Fecha y hora programada. |
| type | enum('therapy','coaching','intake') | YES | 'therapy' | - | Modalidad de la sesión. |
| video_link | varchar(255) | YES | NULL | - | URL directa a la videollamada segura. |
| status | enum('scheduled','completed','cancelled','late_cancel') | YES | 'scheduled' | INDEX | Estado de la cita. |
| change_request_type | enum('none','reschedule','cancel') | YES | 'none' | - | Tipo de cambio solicitado. |
| attendance | tinyint(1) | YES | NULL | - | 1=Asistió, 0=No asistió (Ausente). |
| rating_overall | tinyint(1) | YES | NULL | - | Evaluación global de la sesión (1 a 5). |
🔗 Foreign Key Constraints
Cuestionario de evaluación inmediata de riesgo de crisis de 3 preguntas clave (Intención, Seguridad física y Red de apoyo). Si el resultado determina alto riesgo (`high_risk`), activa automáticamente alertas de crisis en la plataforma.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de la evaluación. |
| client_id | int(11) | NO | None | FK | Paciente evaluado. |
| q1_intent | tinyint(1) | NO | None | - | Respuesta Pregunta 1: Intención autodestructiva. |
| q2_safety | tinyint(1) | NO | None | - | Respuesta Pregunta 2: Entorno seguro. |
| q3_support | tinyint(1) | NO | None | - | Respuesta Pregunta 3: Contacto de apoyo disponible. |
| result | enum('safe','high_risk') | NO | None | - | Resultado del triaje de riesgo. |
| created_at | timestamp | NO | current_timestamp() | - | Fecha y hora del test. |
🔗 Foreign Key Constraints
Sistema centralizado de alertas de seguridad del paciente. Registra alertas automáticas por riesgo de crisis (`crisis_risk`) o caída drástica de puntuaciones de bienestar (`screen_wellbeing`). Permite gestionar el flujo de resolución por parte del equipo clínico o administrador.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de la alerta. |
| client_id | int(11) | NO | None | FK | Paciente afectado por la alerta. |
| type | enum('crisis_risk','screen_wellbeing') | NO | None | - | Categoría de la alerta. |
| severity | enum('critical','warning','info') | NO | 'warning' | - | Nivel de severidad técnica/clínica. |
| status | enum('active','resolved') | NO | 'active' | INDEX | Estado de atención (Activa / Resuelta). |
| resolved_by | int(11) | YES | NULL | FK | Usuario admin/clínico que resolvió la alerta. |
| resolved_at | timestamp | YES | NULL | - | Fecha y hora de resolución. |
🔗 Foreign Key Constraints
Planes formales de contención de crisis y seguridad médica redactados colaborativamente entre el terapeuta y el paciente en situaciones de alto riesgo. Almacena estrategias de afrontamiento, contactos de red de apoyo y confirmación explícita.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del plan. |
| client_id | int(11) | NO | None | FK | Paciente asociado. |
| provider_id | int(11) | NO | None | FK | Terapeuta responsable. |
| session_id | int(11) | YES | NULL | FK | Sesión en la que se formuló. |
| coping_strategies | text | YES | NULL | - | Estrategias de afrontamiento. |
| is_confirmed | tinyint(1) | YES | 0 | - | Confirmación explícita por el paciente. |
🔗 Foreign Key Constraints
Resultados de evaluaciones clínicas estandarizadas internacionales (PHQ-9 para depresión, GAD-7 para ansiedad y WHO-5 para bienestar). Almacena las respuestas individuales estructuradas en `answers_json`, puntuación total (`score`) y nivel de riesgo determinado.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del resultado. |
| client_id | int(11) | NO | None | FK | Paciente evaluado. |
| type | enum('PHQ9','GAD7','WHO5') | NO | None | INDEX | Cuestionario aplicado. |
| score | int(11) | NO | None | - | Puntuación numérica total calculada. |
| risk_level | enum('minimal','mild','moderate',...) | YES | NULL | - | Nivel de severidad clínica inferido. |
| answers_json | longtext (JSON) | YES | NULL | - | JSON validado con las respuestas a cada ítem. |
| administered_by | int(11) | YES | NULL | FK | Proveedor que administró la prueba. |
🔗 Foreign Key Constraints
Registros contables de facturación por servicios de terapia/coaching prestados. Relaciona la sesión realizada con el proveedor emisor, el paciente receptor y la empresa corporativa financiadora.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de factura. |
| session_id | int(11) | YES | NULL | FK | Cita asociada. |
| provider_id | int(11) | YES | NULL | FK | Proveedor de la atención. |
| amount | decimal(10,2) | NO | None | - | Monto bruto cobrado. |
| currency | varchar(10) | YES | 'EUR' | - | Moneda (predeterminado EUR para IE/UK). |
| status | enum('pending','submitted','paid') | YES | 'pending' | INDEX | Estado del ciclo de cobro. |
| pdf_path | varchar(255) | YES | NULL | - | Ruta al archivo PDF generado. |
🔗 Foreign Key Constraints
Registros de transacciones y conciliaciones de pago asociadas a las facturas emitidas (vía transferencia bancaria o registro manual). Almacena el número de comprobante o ID de transacción externa.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del pago. |
| invoice_id | int(11) | NO | None | FK | Factura pagada. |
| method | enum('transfer','manual') | NO | 'transfer' | - | Método de liquidación. |
| transaction_id | varchar(255) | YES | NULL | - | ID o código de transferencia bancaria. |
| receipt_path | varchar(255) | YES | NULL | - | Comprobante adjunto. |
🔗 Foreign Key Constraints
Sistema de mensajería interna peer-to-peer (ej. Paciente ↔ Terapeuta o Terapeuta ↔ Admin). Implementa mecanismo de borrado suave dual (`deleted_by_sender` y `deleted_by_receiver`) para permitir ocultar chats individualmente sin perder trazabilidad legal.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID del mensaje. |
| sender_id | int(11) | NO | None | FK | Usuario remitente. |
| receiver_id | int(11) | NO | None | FK | Usuario destinatario. |
| content | text | NO | None | - | Cuerpo cifrado/texto del mensaje. |
| is_read | tinyint(1) | YES | 0 | INDEX | 1=Leído, 0=Pendiente. |
| deleted_by_sender | tinyint(1) | NO | 0 | - | Flag de borrado por emisor. |
| deleted_by_receiver | tinyint(1) | NO | 0 | - | Flag de borrado por receptor. |
🔗 Foreign Key Constraints
Cola asíncrona de envío de correos electrónicos transaccionales (confirmaciones de cita, alertas de crisis, invitaciones corporativas). Evita bloqueos en peticiones HTTP mediante procesamiento desacoplado en background.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de la cola. |
| to_email | varchar(255) | NO | None | - | Email del destinatario. |
| subject | varchar(500) | NO | None | - | Asunto del correo. |
| status | enum('pending','sent','failed') | YES | 'pending' | INDEX | Estado del envío. |
| attempts | tinyint(4) | YES | 0 | - | Número de reintentos acumulados. |
| metadata | longtext (JSON) | YES | NULL | - | Metadatos adicionales en formato JSON validado. |
Base de conocimiento y Preguntas Frecuentes. Permite segmentar el contenido según el rol del usuario objetivo (`target_role`: cliente, proveedor, empresa, admin o todos).
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de la pregunta. |
| category_id | int(11) | NO | None | FK | Categoría de la FAQ. |
| target_role | enum('all','client','provider',...) | NO | 'all' | INDEX | Rol objetivo para filtrar respuestas. |
| question | varchar(500) | NO | None | - | Pregunta formulada. |
| answer | text | NO | None | - | Respuesta detallada. |
🔗 Foreign Key Constraints
Categorías para organizar las FAQs (ej: Facturación, Uso de Plataforma, Primeros Pasos) con icono emoji y ordenamiento visual.
| Column | Data Type | Nullable | Default | Key | Description |
| id | int(11) | NO | AUTO_INC | PRIMARY | ID de categoría. |
| slug | varchar(50) | NO | None | UNIQUE | Slug amigable para URLs. |
| label | varchar(100) | NO | None | - | Nombre visible de la categoría. |
| icon | varchar(20) | YES | '❓' | - | Icono o emoji asociativo. |