12 KiB
💊 MÓDULO VADEMÉCUM TES - DOCUMENTACIÓN DE IMPLEMENTACIÓN
Proyecto: Guía TES - Sistema de Gestión de Contenido
Fecha: 2025-01-07
Estado: ✅ IMPLEMENTACIÓN COMPLETA
🎯 OBJETIVO
Implementar un módulo completo de Vademécum TES (35 fármacos) en un sistema de contenido self-hosted (PostgreSQL) sin romper la app actual.
Características clave:
- ✅ Solo capa de REFERENCIA (no operativa ni formativa)
- ✅ Self-hosted (PostgreSQL, sin servicios externos)
- ✅ No modifica código existente (arquitectura aditiva)
- ✅ Versionado completo
- ✅ Workflow de validación
📐 ARQUITECTURA
┌─────────────────────────────────────────────────────────┐
│ Panel Admin (/drugs) │
│ - DrugManagerPage (lista) │
│ - DrugEditorPage (editor) │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ API REST (/api/drugs) │
│ - GET, POST, PUT │
│ - submit, approve, publish │
│ - versions │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ PostgreSQL (tes_content schema) │
│ - drugs (tabla principal) │
│ - drug_versions (versionado) │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Content Pack Generator │
│ - loadPublishedDrugs() │
│ - Incluye en /api/content-pack/latest.json │
└─────────────────────────────────────────────────────────┘
📊 ESTRUCTURA DE DATOS
Tabla: drugs
CREATE TABLE tes_content.drugs (
-- Identificación
id UUID PRIMARY KEY,
slug TEXT UNIQUE NOT NULL,
-- Información básica
generic_name TEXT NOT NULL,
trade_name TEXT,
-- Clasificación
category TEXT NOT NULL,
line tes_content.drug_line NOT NULL, -- 'first' | 'second'
frequency tes_content.drug_frequency NOT NULL, -- 'high' | 'medium' | 'low'
-- Presentación y dosificación
presentation TEXT NOT NULL,
adult_dose TEXT NOT NULL,
pediatric_dose TEXT, -- Obligatorio si published
routes TEXT[] DEFAULT '{}',
dilution TEXT,
-- Indicaciones y contraindicaciones
indications TEXT[] DEFAULT '{}',
contraindications TEXT[] DEFAULT '{}',
side_effects TEXT,
antidote TEXT,
-- Información específica TES
notes TEXT[] DEFAULT '{}',
critical_points TEXT[] DEFAULT '{}',
source TEXT,
-- Estado y validación
status tes_content.content_status NOT NULL DEFAULT 'draft',
-- Versionado
version TEXT NOT NULL DEFAULT '1.0.0',
latest_version TEXT NOT NULL DEFAULT '1.0.0',
current_version_id UUID,
-- Auditoría
created_by UUID NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_by UUID,
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
published_by UUID,
published_at TIMESTAMPTZ,
-- Metadatos
metadata JSONB DEFAULT '{}'
);
Tabla: drug_versions
CREATE TABLE tes_content.drug_versions (
id UUID PRIMARY KEY,
drug_id UUID NOT NULL REFERENCES drugs(id),
version TEXT NOT NULL,
drug_snapshot JSONB NOT NULL,
change_summary TEXT NOT NULL,
change_details JSONB,
change_type TEXT NOT NULL DEFAULT 'patch', -- 'major' | 'minor' | 'patch'
is_breaking BOOLEAN DEFAULT false,
is_active BOOLEAN NOT NULL DEFAULT false,
created_by UUID NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
published_at TIMESTAMPTZ,
published_by UUID
);
🔌 ENDPOINTS API
GET /api/drugs
Lista fármacos con filtros opcionales.
Query params:
category- Filtrar por categoríaline- Filtrar por línea (first|second)frequency- Filtrar por frecuencia (high|medium|low)status- Filtrar por estadosearch- Búsqueda por textopage- Número de página (default: 1)limit- Items por página (default: 50)
Respuesta:
{
"drugs": [...],
"pagination": {
"page": 1,
"limit": 50,
"total": 35,
"totalPages": 1
}
}
GET /api/drugs/:id
Obtiene un fármaco por ID o slug.
Respuesta:
{
"id": "...",
"slug": "adrenalina",
"generic_name": "Adrenalina",
"trade_name": "Adrenalina 1mg/1ml",
...
}
POST /api/drugs
Crea un nuevo fármaco (draft).
Requiere: content:create permission
Body:
{
"generic_name": "Adrenalina",
"category": "cardiovascular",
"line": "first",
"frequency": "high",
"presentation": "1mg/1ml ampolla",
"adult_dose": "1mg IV/IO cada 3-5 min",
...
}
PUT /api/drugs/:id
Actualiza un fármaco existente.
Requiere: content:edit permission
Body: Mismo formato que POST, solo campos a actualizar.
POST /api/drugs/:id/submit
Envía un fármaco a revisión (draft → in_review).
Requiere: content:submit permission
POST /api/drugs/:id/approve
Aprueba un fármaco (in_review → approved).
Requiere: validation:approve permission
Body (opcional):
{
"notes": "Comentarios de aprobación"
}
POST /api/drugs/:id/publish
Publica un fármaco (approved → published).
Requiere: content:publish permission
Validación: pediatric_dose debe estar presente.
GET /api/drugs/:id/versions
Obtiene historial de versiones de un fármaco.
Requiere: Autenticación
Respuesta:
{
"versions": [
{
"id": "...",
"version": "1.2.3",
"change_summary": "...",
"change_type": "minor",
"is_active": true,
"created_at": "..."
}
]
}
🎨 PANEL ADMIN
Ruta: /drugs
DrugManagerPage - Lista de fármacos con:
- Filtros: categoría, línea, frecuencia, estado, búsqueda
- Tabla con información clave
- Acciones: Ver, Editar, Enviar a revisión
- Paginación
Ruta: /drugs/new o /drugs/:id/edit
DrugEditorPage - Editor completo con:
- Información básica (nombre genérico, comercial, categoría, línea, frecuencia)
- Presentación y dosificación (adulto, pediátrica, vías, dilución)
- Indicaciones y contraindicaciones (arrays editables)
- Efectos adversos y antídoto
- Notas y puntos críticos TES (arrays editables)
- Fuente
- Botones de acción según estado y permisos
📦 CONTENT PACK
Los fármacos publicados se incluyen automáticamente en el Content Pack:
{
"metadata": {
"version": "1.0.0",
"generated_at": "...",
"hash": "sha256:..."
},
"content": {
"drugs": [
{
"id": "...",
"slug": "adrenalina",
"genericName": "Adrenalina",
"tradeName": "Adrenalina 1mg/1ml",
"category": "cardiovascular",
"line": "first",
"frequency": "high",
"presentation": "1mg/1ml ampolla",
"adultDose": "1mg IV/IO cada 3-5 min",
"pediatricDose": "0.01mg/kg IV/IO",
"routes": ["IV", "IO", "IM"],
...
}
],
...
}
}
🔄 WORKFLOW DE VALIDACIÓN
draft → [submit] → in_review → [approve] → approved → [publish] → published
↓ ↓
archived (en Content Pack)
Estados:
draft- Borrador (editable por creador)in_review- En revisión (esperando aprobación)approved- Aprobado (listo para publicar)published- Publicado (incluido en Content Pack)archived- Archivado (no visible)
Transiciones:
draft→in_review: Requierecontent:submitin_review→approved: Requierevalidation:approveapproved→published: Requierecontent:publish+pediatric_dose
📋 SCRIPT DE SEED
Ejecutar seed
cd backend
npm run seed:drugs
Fármacos incluidos
Primera Línea (15 fármacos):
- Adrenalina ✅ (published)
- Amiodarona ✅ (published)
- Atropina ✅ (published)
- Suero Fisiológico 0.9% (draft)
- Ringer Lactato (draft)
- Oxígeno ✅ (published)
- Salbutamol (draft)
- Glucosa 50% (draft)
- Diazepam (draft)
- Midazolam ✅ (published)
- Morfina (draft)
- Paracetamol (draft)
- AAS (draft)
- Naloxona (draft)
- Flumazenil (draft)
Segunda Línea (20 fármacos):
Todos en estado draft con "PENDIENTE VALIDACIÓN CLÍNICA" en campos faltantes.
✅ VALIDACIONES
Backend
generic_nameobligatoriocategoryobligatoriolinedebe serfirstosecondfrequencydebe serhigh,mediumolowpresentationobligatorioadult_doseobligatoriopediatric_doseobligatorio sistatus = published- Arrays normalizados (routes, indications, etc.)
- Versión semántica validada
Frontend
- Validación de campos requeridos
- Advertencia si
pediatric_dosefalta y se intenta publicar - Validación de arrays antes de guardar
🔐 PERMISOS
| Acción | Permiso Requerido |
|---|---|
| Ver fármacos | Ninguno (público) |
| Crear fármaco | content:create |
| Editar fármaco | content:edit |
| Enviar a revisión | content:submit |
| Aprobar | validation:approve |
| Publicar | content:publish |
🚀 INSTALACIÓN Y USO
1. Ejecutar migración
cd backend
npm run migrate:drugs
2. Ejecutar seed
npm run seed:drugs
3. Verificar
# Probar endpoint
curl http://localhost:3000/api/drugs
# Probar panel admin
# Abrir http://localhost:5174/drugs
📝 NOTAS IMPORTANTES
- No modifica código existente - Todo es aditivo
- Solo capa de referencia - No operativa ni formativa
- Self-hosted - Todo en PostgreSQL
- Placeholders claros - "PENDIENTE VALIDACIÓN CLÍNICA" donde falta información
- Versionado automático - Cada cambio crea nueva versión
- Auditoría completa - Todas las acciones se registran en
audit_logs
🔄 PRÓXIMOS PASOS SUGERIDOS
- Completar información faltante - Llenar los 30 fármacos con "PENDIENTE VALIDACIÓN CLÍNICA"
- Validación clínica - Revisar y aprobar fármacos desde el panel
- Integración en app PWA - Consumir drugs desde Content Pack
- Búsqueda avanzada - Mejorar búsqueda en panel admin
- Exportación - Exportar vademécum a PDF/Excel
Última actualización: 2025-01-07
Estado: ✅ IMPLEMENTACIÓN COMPLETA