codigo0/docs/VADEMECUM_IMPLEMENTACION.md

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ía
  • line - Filtrar por línea (first | second)
  • frequency - Filtrar por frecuencia (high | medium | low)
  • status - Filtrar por estado
  • search - Búsqueda por texto
  • page - 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:

  • draftin_review: Requiere content:submit
  • in_reviewapproved: Requiere validation:approve
  • approvedpublished: Requiere content:publish + pediatric_dose

📋 SCRIPT DE SEED

Ejecutar seed

cd backend
npm run seed:drugs

Fármacos incluidos

Primera Línea (15 fármacos):

  1. Adrenalina (published)
  2. Amiodarona (published)
  3. Atropina (published)
  4. Suero Fisiológico 0.9% (draft)
  5. Ringer Lactato (draft)
  6. Oxígeno (published)
  7. Salbutamol (draft)
  8. Glucosa 50% (draft)
  9. Diazepam (draft)
  10. Midazolam (published)
  11. Morfina (draft)
  12. Paracetamol (draft)
  13. AAS (draft)
  14. Naloxona (draft)
  15. Flumazenil (draft)

Segunda Línea (20 fármacos): Todos en estado draft con "PENDIENTE VALIDACIÓN CLÍNICA" en campos faltantes.


VALIDACIONES

Backend

  • generic_name obligatorio
  • category obligatorio
  • line debe ser first o second
  • frequency debe ser high, medium o low
  • presentation obligatorio
  • adult_dose obligatorio
  • pediatric_dose obligatorio si status = published
  • Arrays normalizados (routes, indications, etc.)
  • Versión semántica validada

Frontend

  • Validación de campos requeridos
  • Advertencia si pediatric_dose falta 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

  1. No modifica código existente - Todo es aditivo
  2. Solo capa de referencia - No operativa ni formativa
  3. Self-hosted - Todo en PostgreSQL
  4. Placeholders claros - "PENDIENTE VALIDACIÓN CLÍNICA" donde falta información
  5. Versionado automático - Cada cambio crea nueva versión
  6. Auditoría completa - Todas las acciones se registran en audit_logs

🔄 PRÓXIMOS PASOS SUGERIDOS

  1. Completar información faltante - Llenar los 30 fármacos con "PENDIENTE VALIDACIÓN CLÍNICA"
  2. Validación clínica - Revisar y aprobar fármacos desde el panel
  3. Integración en app PWA - Consumir drugs desde Content Pack
  4. Búsqueda avanzada - Mejorar búsqueda en panel admin
  5. Exportación - Exportar vademécum a PDF/Excel

Última actualización: 2025-01-07
Estado: IMPLEMENTACIÓN COMPLETA