codigo0/docs/AUDITORIA_ESTRUCTURAL_ESTADO_ACTUAL.md

1058 lines
30 KiB
Markdown
Raw Normal View History

2026-01-19 08:10:16 +00:00
# 🧠 AUDITORÍA ESTRUCTURAL COMPLETA - ESTADO ACTUAL
**Proyecto:** Guía TES - Aplicación PWA
**Fecha:** 2025-01-07
**Tipo:** Auditoría técnica sin modificaciones
**Estado:** ✅ COMPLETADO
---
## 📋 OBJETIVO
Documentar el estado real y actual de la aplicación para establecer una base sólida para futuras implementaciones (panel admin, base de datos, SCORM, contenido externo) **SIN ROMPER NADA**.
---
## 🧩 SECCIÓN A — ESTRUCTURA DEL PROYECTO
### Estructura de Carpetas Principal
```
guia-tes/
├── src/ → Código fuente principal
│ ├── components/ → Componentes UI reutilizables
│ │ ├── ui/ → Componentes base (shadcn/ui)
│ │ ├── guide/ → Componentes específicos de guías
│ │ └── ... → Otros componentes
│ ├── data/ → ⚠️ DATOS HARDCODEADOS (crítico)
│ │ ├── procedures.ts → Protocolos operativos
│ │ ├── drugs.ts → Vademécum (6 fármacos)
│ │ ├── guides-index.ts → Índice de guías formativas
│ │ ├── protocol-guide-manual-mapping.ts → Relaciones bidireccionales
│ │ └── manual-index.ts → Índice del manual de referencia
│ ├── pages/ → Páginas/rutas principales
│ │ ├── Home.tsx → Página inicial
│ │ ├── RCP.tsx → Protocolo RCP
│ │ ├── ViaAerea.tsx → Protocolo Vía Aérea
│ │ ├── Shock.tsx → Protocolo Shock
│ │ ├── Farmacos.tsx → Vademécum
│ │ ├── GuiaRefuerzo.tsx → Lista de guías formativas
│ │ └── ... → Otras páginas
│ ├── views/ → Vistas especializadas
│ │ ├── formativo/ → Vistas de contenido formativo
│ │ │ └── GuideViewer.tsx → Visualizador de guías
│ │ └── ... → Otras vistas
│ ├── services/ → Servicios y lógica de negocio
│ │ ├── content-adapter.ts → ✅ ADAPTER PATTERN (nuevo)
│ │ ├── content-relations.ts → Servicio de relaciones bidireccionales
│ │ └── ... → Otros servicios
│ ├── hooks/ → React hooks personalizados
│ │ └── ... → Hooks compartidos
│ ├── utils/ → Utilidades
│ │ ├── indexeddb.ts → ✅ IndexedDB para cache (nuevo)
│ │ └── ... → Otras utilidades
│ ├── App.tsx → Componente raíz y rutas
│ └── main.tsx → Punto de entrada
├── public/ → Archivos estáticos
│ ├── manual/ → Manual de referencia (94 archivos .md)
│ └── assets/ → Imágenes, iconos, etc.
├── backend/ → ⚠️ BACKEND NUEVO (separado)
│ ├── src/ → Código del servidor
│ ├── database/ → Migraciones SQL
│ └── scripts/ → Scripts de utilidad
├── admin-panel/ → ⚠️ PANEL ADMIN NUEVO (separado)
│ └── src/ → Código del panel React
└── docs/ → Documentación
```
### Análisis de Carpetas
#### ✅ Carpetas Activas y Críticas
- **`src/data/`** - ⚠️ **CRÍTICO**: Contiene TODO el contenido hardcodeado
- `procedures.ts` - Protocolos operativos (usado directamente en múltiples páginas)
- `drugs.ts` - Vademécum (usado en `Farmacos.tsx`)
- `guides-index.ts` - Guías formativas (usado en `GuiaRefuerzo.tsx`)
- **NO TOCAR** sin migración previa
- **`src/pages/`** - Páginas principales de la app
- Cada página importa directamente desde `src/data/`
- **Acoplamiento fuerte** con datos hardcodeados
- **`src/services/content-adapter.ts`** - ✅ **NUEVO**: Patrón Adapter implementado
- `LocalContentAdapter` - Lee de `src/data/` (fallback)
- `ExternalContentAdapter` - Lee de Content Pack JSON
- `ContentAdapterFactory` - Decide qué usar
- **Extensible** y **no intrusivo**
- **`src/utils/indexeddb.ts`** - ✅ **NUEVO**: Cache offline
- Almacena Content Pack para acceso offline
- Fallback a localStorage
#### ⚠️ Carpetas con Dependencias Externas
- **`backend/`** - Backend separado (Express.js + PostgreSQL)
- **No afecta** la app actual si falla
- Arquitectura aditiva
- **`admin-panel/`** - Panel de administración separado
- **No afecta** la app actual
- Arquitectura aditiva
#### 📦 Carpetas de Contenido
- **`public/manual/`** - 94 archivos Markdown del manual de referencia
- Cargados dinámicamente
- **No hardcodeados** en TypeScript
---
## 🧱 SECCIÓN B — CAPAS FUNCIONALES REALES
### Estado Actual de las Capas
#### ✅ **Capa Operativa** (EXISTE, pero mezclada)
**Ubicación:**
- `src/data/procedures.ts` - Datos de protocolos
- `src/pages/RCP.tsx`, `ViaAerea.tsx`, `Shock.tsx` - Visualización
- Componentes específicos en `src/components/`
**Características:**
- ✅ Datos estructurados (TypeScript interfaces)
- ✅ Componentes dedicados por protocolo
- ⚠️ **Hardcodeado** en `src/data/procedures.ts`
- ⚠️ **Acoplamiento directo** entre páginas y datos
**Ejemplo de uso:**
```typescript
// src/pages/RCP.tsx
import { getProcedureById } from '@/data/procedures';
const protocol = getProcedureById('rcp-adulto-svb');
```
#### ✅ **Capa Formativa** (EXISTE, parcialmente implementada)
**Ubicación:**
- `src/data/guides-index.ts` - Índice de guías
- `src/pages/GuiaRefuerzo.tsx` - Lista de guías
- `src/views/formativo/GuideViewer.tsx` - Visualizador
- `src/components/guide/` - Componentes específicos
**Características:**
- ✅ Estructura definida
- ✅ Visualizador completo con navegación
- ⚠️ **Contenido en Markdown** (archivos .md)
- ⚠️ **No integrado** con sistema de Content Pack aún
**Ejemplo de uso:**
```typescript
// src/pages/GuiaRefuerzo.tsx
import { guides } from '@/data/guides-index';
```
#### ✅ **Capa de Referencia** (EXISTE, múltiples fuentes)
**Ubicación:**
- `src/data/drugs.ts` - Vademécum (6 fármacos hardcodeados)
- `public/manual/` - Manual completo (94 archivos .md)
- `src/pages/Farmacos.tsx` - Visualización del vademécum
**Características:**
- ✅ Vademécum estructurado (TypeScript)
- ✅ Manual en Markdown (cargado dinámicamente)
- ⚠️ **Dos fuentes diferentes** (TypeScript + Markdown)
- ⚠️ **Vademécum limitado** (solo 6 fármacos)
**Ejemplo de uso:**
```typescript
// src/pages/Farmacos.tsx
import { drugs } from '@/data/drugs';
```
### ¿Están Mezcladas las Capas?
**Respuesta:** ⚠️ **PARCIALMENTE**
-**Separación conceptual** existe (operativa, formativa, referencia)
- ⚠️ **Implementación mezclada**:
- Operativa: TypeScript hardcodeado
- Formativa: Markdown + TypeScript
- Referencia: TypeScript (vademécum) + Markdown (manual)
-**Nueva arquitectura** (`ContentAdapter`) permite separación futura
### Archivos Concretos por Capa
| Capa | Archivos de Datos | Archivos de Visualización |
|------|------------------|---------------------------|
| **Operativa** | `src/data/procedures.ts` | `src/pages/RCP.tsx`, `ViaAerea.tsx`, `Shock.tsx` |
| **Formativa** | `src/data/guides-index.ts` | `src/pages/GuiaRefuerzo.tsx`, `src/views/formativo/GuideViewer.tsx` |
| **Referencia** | `src/data/drugs.ts` + `public/manual/` | `src/pages/Farmacos.tsx` + visualizador de manual |
---
## 📦 SECCIÓN C — MODELO DE DATOS ACTUAL (REAL)
### 1. Procedures (Protocolos Operativos)
**Archivo:** `src/data/procedures.ts`
**Estructura:**
```typescript
interface Procedure {
id: string; // Identificador único (slug)
title: string; // Título completo
shortTitle: string; // Título corto para UI
category: string; // Categoría (ej: "soporte_vital")
subcategory?: string; // Subcategoría opcional
priority: 'critica' | 'alta' | 'media' | 'baja';
ageGroup: 'adulto' | 'pediatrico' | 'todos';
steps: string[]; // Pasos del protocolo
warnings?: string[]; // Advertencias críticas
keyPoints?: string[]; // Puntos clave
equipment?: string[]; // Equipamiento necesario
drugs?: string[]; // Fármacos relacionados (por nombre)
}
```
**Características:**
- ✅ Tipado fuerte (TypeScript)
- ✅ Estructura clara y consistente
- ⚠️ **Hardcodeado** en archivo TypeScript
- ⚠️ **Relaciones implícitas** con fármacos (solo nombres)
- ⚠️ **Sin versionado**
- ⚠️ **Sin metadatos** de auditoría
**Funciones de acceso:**
```typescript
export function getProcedureById(id: string): Procedure | undefined
export function getAllProcedures(): Procedure[]
```
**Limitaciones:**
- No permite relaciones explícitas con otros contenidos
- No tiene estado (draft/published)
- No tiene versionado
- No tiene metadatos de creación/modificación
### 2. Drugs (Vademécum)
**Archivo:** `src/data/drugs.ts`
**Estructura:**
```typescript
interface Drug {
id: string; // Identificador único (slug)
genericName: string; // Nombre genérico
tradeName: string; // Nombre comercial
category: string; // Categoría farmacológica
presentation: string; // Presentación
adultDose: string; // Dosis adulto
pediatricDose?: string; // Dosis pediátrica (opcional)
routes: string[]; // Vías de administración
dilution?: string; // Dilución
indications: string[]; // Indicaciones
contraindications: string[]; // Contraindicaciones
sideEffects?: string; // Efectos adversos
antidote?: string; // Antídoto
notes?: string[]; // Notas
criticalPoints?: string[]; // Puntos críticos TES
source?: string; // Fuente
}
```
**Características:**
- ✅ Tipado fuerte
- ✅ Estructura completa
- ⚠️ **Solo 6 fármacos** hardcodeados
- ⚠️ **Sin relaciones** con protocolos
- ⚠️ **Sin versionado**
**Funciones de acceso:**
```typescript
export function getDrugById(id: string): Drug | undefined
export function findDrugByName(name: string): Drug | undefined
export const drugs: Drug[] = [...]
```
**Limitaciones:**
- Muy limitado (solo 6 fármacos)
- No tiene estado
- No tiene versionado
- No tiene metadatos
### 3. Guides (Guías Formativas)
**Archivo:** `src/data/guides-index.ts`
**Estructura:**
```typescript
interface Guide {
id: string; // Identificador único
titulo: string; // Título
descripcion: string; // Descripción
icono: string; // Icono (lucide-react)
secciones?: GuideSection[]; // Secciones (Markdown)
}
```
**Características:**
- ✅ Estructura definida
- ⚠️ **Contenido en Markdown** (archivos externos)
- ⚠️ **Carga dinámica** de contenido
-**10 guías** definidas
**Funciones de acceso:**
```typescript
export const guides: Guide[] = [...]
// Carga dinámica de contenido Markdown
```
**Limitaciones:**
- Contenido separado (índice en TS, contenido en MD)
- No tiene versionado
- No tiene metadatos
### 4. Checklists
**Estado:** ⚠️ **NO EXISTE como estructura independiente**
**Ubicación actual:**
- Checklists están **embebidos** en componentes de protocolos
- Ejemplo: `src/pages/RCP.tsx` tiene `rcpChecklistSteps` hardcodeado
**Estructura implícita:**
```typescript
// Dentro de componentes
const checklistSteps = [
{ id: '1', text: '...', checked: false },
...
]
```
**Limitaciones:**
- No es reutilizable
- No tiene estructura de datos propia
- Duplicado en múltiples componentes
### 5. Manual de Referencia
**Ubicación:** `public/manual/` (94 archivos .md)
**Estructura:**
- Organizado en bloques (BLOQUE_0 a BLOQUE_15)
- Cargado dinámicamente
- **No hardcodeado** en TypeScript
**Características:**
- ✅ Separado del código
- ✅ Fácil de modificar
- ⚠️ **Sin estructura de datos** en TypeScript
- ⚠️ **Sin relaciones** explícitas
### 6. Relaciones Bidireccionales
**Archivo:** `src/data/protocol-guide-manual-mapping.ts`
**Estructura:**
```typescript
interface ProtocolGuideManualMapping {
protocoloId: string;
protocoloRuta: string;
tieneGuia: boolean;
guiaId?: string;
guiaRuta?: string;
tieneManual: boolean;
manualBloque?: string;
manualTitulo?: string;
manualRuta?: string;
}
```
**Características:**
-**NUEVO**: Sistema de relaciones implementado
- ✅ Permite enlaces bidireccionales
- ⚠️ **Hardcodeado** en TypeScript
- ✅ Usado por `src/services/content-relations.ts`
---
## 🔗 SECCIÓN D — RELACIONES ENTRE DATOS
### Relaciones Actuales
#### ✅ Protocolo → Guía Formativa
**Estado:** ✅ **IMPLEMENTADO**
**Cómo funciona:**
- Mapeo en `protocol-guide-manual-mapping.ts`
- Servicio `content-relations.ts` expone `getProtocolRelations()`
- Componentes muestran enlaces en UI
**Ejemplo:**
```typescript
// src/pages/RCP.tsx
const relations = getProtocolRelations('rcp-adulto-svb');
if (relations.guide) {
// Mostrar enlace a guía formativa
}
```
#### ✅ Protocolo → Manual de Referencia
**Estado:** ✅ **IMPLEMENTADO**
**Cómo funciona:**
- Mismo sistema de mapeo
- Enlaces a bloques del manual
#### ✅ Guía → Protocolo
**Estado:** ✅ **IMPLEMENTADO**
**Cómo funciona:**
- Mapeo bidireccional
- `getGuideRelations()` en `content-relations.ts`
#### ⚠️ Fármaco → Protocolo
**Estado:** ⚠️ **IMPLÍCITO (solo por nombre)**
**Cómo funciona:**
- Protocolos tienen array `drugs?: string[]` con nombres
- Búsqueda por nombre: `findDrugByName()`
- **No hay relación explícita** en base de datos
**Limitación:**
- Si cambia el nombre del fármaco, se rompe la relación
- No hay validación de que el fármaco exista
#### ❌ Fármaco → Guía
**Estado:** ❌ **NO EXISTE**
#### ❌ Checklist → Protocolo
**Estado:** ❌ **NO EXISTE** (checklists embebidos)
### Resumen de Relaciones
| Desde | Hacia | Estado | Tipo |
|-------|-------|--------|------|
| Protocolo | Guía | ✅ Implementado | Explícito (mapping) |
| Protocolo | Manual | ✅ Implementado | Explícito (mapping) |
| Guía | Protocolo | ✅ Implementado | Explícito (mapping) |
| Protocolo | Fármaco | ⚠️ Implícito | Por nombre (string) |
| Fármaco | Protocolo | ❌ No existe | - |
| Checklist | Protocolo | ❌ No existe | Embebido |
---
## 🧠 SECCIÓN E — FLUJO DE USO DE LA APP
### Flujo Real del Usuario
#### 1. **Pantalla Inicial** (`Home.tsx`)
**Qué se carga:**
- Lista de protocolos principales
- Accesos rápidos
- Búsqueda global
**Datos cargados:**
```typescript
// Carga directa desde src/data/
import { getAllProcedures } from '@/data/procedures';
```
**Decisión de qué mostrar:**
- Hardcodeado en componente
- Prioridad por `priority` del protocolo
#### 2. **Navegación**
**Componentes:**
- `Header` - Navegación superior
- `BottomNav` - Navegación inferior (móvil)
- `MenuSheet` - Menú lateral
**Rutas principales:**
```typescript
// src/App.tsx
<Route path="/" element={<Home />} />
<Route path="/rcp" element={<RCP />} />
<Route path="/via-aerea" element={<ViaAerea />} />
<Route path="/shock" element={<Shock />} />
<Route path="/farmacos" element={<Farmacos />} />
<Route path="/guia-refuerzo" element={<GuiaRefuerzo />} />
<Route path="/guia-refuerzo/:guia" element={<GuideViewer />} />
```
#### 3. **Selección de Contenido**
**Protocolos:**
- Usuario hace clic en protocolo
- Navega a página específica (`/rcp`, `/via-aerea`, etc.)
- Componente carga datos con `getProcedureById()`
**Guías:**
- Usuario navega a `/guia-refuerzo`
- Ve lista de guías
- Selecciona una guía
- Carga contenido Markdown dinámicamente
**Fármacos:**
- Usuario navega a `/farmacos`
- Ve lista de 6 fármacos
- Puede buscar/filtrar
#### 4. **Visualización**
**Protocolos:**
- Componente específico por protocolo
- Muestra pasos, advertencias, puntos clave
- Checklist embebido
- Enlaces a guías/manual (si existen)
**Guías:**
- `GuideViewer` renderiza Markdown
- Navegación entre secciones
- Enlaces bidireccionales
**Fármacos:**
- Tabla o cards
- Información completa del fármaco
#### 5. **Acciones Posibles**
- ✅ Ver contenido
- ✅ Navegar entre capas (protocolo → guía → manual)
- ✅ Búsqueda
- ✅ Modo checklist (en algunos protocolos)
- ❌ Editar contenido (no implementado en app)
- ❌ Favoritos (no implementado)
- ❌ Historial (no implementado)
### ¿Dónde se Decide Qué se Muestra?
**Respuesta:** ⚠️ **HARDCODEADO en componentes**
- Cada página importa directamente desde `src/data/`
- Lógica de filtrado/ordenación en componentes
- **No hay capa de lógica de negocio** separada
### ¿Qué Datos se Cargan Primero?
**Orden de carga:**
1. **App.tsx** - Configuración y rutas
2. **Home.tsx** - Carga `getAllProcedures()`
3. **Páginas específicas** - Carga datos cuando se navega
**Estrategia:**
- ⚠️ **Carga bajo demanda** (no precarga)
- ⚠️ **Sin cache** de datos (excepto Content Pack nuevo)
-**Service Worker** para assets estáticos
### ¿Qué es Crítico para Offline?
**Crítico:**
-**Service Worker** - Cache de assets
-**Content Pack** (nuevo) - Cache en IndexedDB
- ⚠️ **Datos hardcodeados** - Siempre disponibles (bundle)
**No crítico:**
- ❌ Backend API (no usado en app actual)
- ❌ Panel admin (separado)
---
## ⚠️ SECCIÓN F — PUNTOS CRÍTICOS / NO TOCAR
### ❌ Archivos NO TOCAR (Sin Migración Previa)
#### 1. `src/data/procedures.ts`
**Razón:**
- Usado directamente en múltiples páginas
- Importado en: `RCP.tsx`, `ViaAerea.tsx`, `Shock.tsx`, `Home.tsx`
- **Cambios romperían** toda la app
**Riesgo:** 🔴 **CRÍTICO**
#### 2. `src/data/drugs.ts`
**Razón:**
- Usado en `Farmacos.tsx`
- Funciones `getDrugById()`, `findDrugByName()` usadas en protocolos
- **Cambios romperían** vademécum y referencias en protocolos
**Riesgo:** 🔴 **CRÍTICO**
#### 3. `src/data/guides-index.ts`
**Razón:**
- Usado en `GuiaRefuerzo.tsx`
- Estructura esperada por `GuideViewer`
- **Cambios romperían** visualización de guías
**Riesgo:** 🔴 **CRÍTICO**
#### 4. `src/pages/RCP.tsx`, `ViaAerea.tsx`, `Shock.tsx`
**Razón:**
- Componentes críticos de protocolos
- Lógica de visualización específica
- Checklists embebidos
- **Refactorizar requiere** migración completa
**Riesgo:** 🟠 **IMPORTANTE**
### ⚠️ Componentes Frágiles
#### 1. Checklists Embebidos
**Ubicación:** Dentro de componentes de protocolos
**Problema:**
- Lógica duplicada
- No reutilizable
- Difícil de mantener
**Riesgo:** 🟡 **TOLERABLE** (funciona, pero no escalable)
#### 2. Búsqueda de Fármacos por Nombre
**Ubicación:** `src/pages/RCP.tsx` y otros
**Problema:**
```typescript
const findDrugByName = (name: string) => {
return drugs.find(d =>
d.genericName.toLowerCase().includes(name.toLowerCase())
);
};
```
**Riesgo:** 🟠 **IMPORTANTE** (frágil si cambian nombres)
### 🔒 Lógica Duplicada Peligrosa
#### 1. Carga de Datos
**Problema:**
- Múltiples páginas importan directamente desde `src/data/`
- Sin capa de abstracción (excepto nuevo `ContentAdapter`)
**Riesgo:** 🟡 **TOLERABLE** (funciona, pero no ideal)
#### 2. Relaciones Bidireccionales
**Problema:**
- Mapeo hardcodeado en `protocol-guide-manual-mapping.ts`
- Si cambia un ID, hay que actualizar manualmente
**Riesgo:** 🟠 **IMPORTANTE**
---
## 🧩 SECCIÓN G — EXTENSIBILIDAD REAL
### ✅ Puntos Extensibles (Ya Implementados)
#### 1. **ContentAdapter Pattern** ✅
**Ubicación:** `src/services/content-adapter.ts`
**Características:**
-**Abstracción completa** de fuente de datos
-**Fallback automático** (External → Local)
-**No intrusivo** (no rompe código existente)
-**Extensible** (fácil añadir nuevos adapters)
**Cómo funciona:**
```typescript
// Factory decide qué adapter usar
const adapter = ContentAdapterFactory.create();
const protocol = adapter.getProtocol('rcp-adulto-svb');
```
**Ventajas:**
- Permite inyectar contenido externo
- Mantiene compatibilidad con datos locales
- Zero-downtime migration path
#### 2. **IndexedDB Cache** ✅
**Ubicación:** `src/utils/indexeddb.ts`
**Características:**
- ✅ Cache offline del Content Pack
- ✅ Fallback a localStorage
- ✅ Expiración automática
**Extensibilidad:**
- Fácil añadir más tipos de cache
- Permite estrategias de sincronización
#### 3. **Content Relations Service** ✅
**Ubicación:** `src/services/content-relations.ts`
**Características:**
- ✅ Abstrae relaciones bidireccionales
- ✅ Fácil de extender con nuevas relaciones
### ⚠️ Puntos Parcialmente Extensibles
#### 1. **Estructura de Procedures**
**Estado:** ⚠️ **PARCIAL**
**Extensible:**
- ✅ Interface TypeScript permite añadir campos
- ✅ Componentes pueden manejar campos opcionales
**No extensible:**
- ❌ Fuente de datos (hardcodeado)
- ❌ Versionado (no existe)
- ❌ Estados (no existe)
#### 2. **Estructura de Drugs**
**Estado:** ⚠️ **PARCIAL**
**Mismo análisis que Procedures**
### ❌ Puntos NO Extensibles (Sin Refactor)
#### 1. **Checklists Embebidos**
**Problema:**
- Lógica dentro de componentes
- No hay estructura de datos
- No reutilizable
**Solución requerida:**
- Extraer a estructura de datos
- Crear componente reutilizable
- Migrar checklists existentes
#### 2. **Carga Directa desde `src/data/`**
**Problema:**
- Múltiples imports directos
- Sin capa de abstracción (excepto nuevo adapter)
**Solución requerida:**
- Migrar a `ContentAdapter`
- Deprecar imports directos gradualmente
#### 3. **Relaciones Implícitas (Fármacos)**
**Problema:**
- Relación por nombre (string)
- No validada
- Frágil
**Solución requerida:**
- Sistema de relaciones explícitas
- Validación de integridad
---
## 📊 SECCIÓN H — DEUDA TÉCNICA REAL
### 🔴 Crítica (Debe Resolverse Pronto)
#### 1. **Datos Hardcodeados en TypeScript**
**Ubicación:** `src/data/*.ts`
**Problema:**
- Imposible modificar sin deploy
- No hay versionado
- No hay estados (draft/published)
- No hay auditoría
**Impacto:**
- Bloquea gestión externa de contenido
- Bloquea panel admin
- Bloquea SCORM
**Esfuerzo de resolución:** Alto (migración completa)
#### 2. **Acoplamiento Fuerte Páginas → Datos**
**Problema:**
- Páginas importan directamente desde `src/data/`
- Sin capa de abstracción (excepto nuevo adapter)
**Impacto:**
- Difícil cambiar fuente de datos
- Bloquea migración gradual
**Esfuerzo de resolución:** Medio (migrar a ContentAdapter)
#### 3. **Relaciones Implícitas (Fármacos)**
**Problema:**
- Protocolos referencian fármacos por nombre (string)
- No validado
- Se rompe si cambia nombre
**Impacto:**
- Errores silenciosos
- Mantenimiento difícil
**Esfuerzo de resolución:** Medio (sistema de relaciones)
### 🟠 Importante (Debe Planificarse)
#### 1. **Checklists No Estructurados**
**Problema:**
- Embebidos en componentes
- Duplicados
- No reutilizables
**Impacto:**
- Mantenimiento difícil
- Inconsistencias
**Esfuerzo de resolución:** Medio (extraer a estructura)
#### 2. **Falta de Versionado**
**Problema:**
- No hay historial de cambios
- No hay rollback
- No hay trazabilidad
**Impacto:**
- Imposible auditar cambios
- Riesgo de pérdida de datos
**Esfuerzo de resolución:** Alto (sistema completo)
#### 3. **Dos Fuentes de Referencia**
**Problema:**
- Vademécum en TypeScript (`drugs.ts`)
- Manual en Markdown (`public/manual/`)
**Impacto:**
- Inconsistencias posibles
- Mantenimiento separado
**Esfuerzo de resolución:** Medio (unificar)
### 🟡 Tolerable (Puede Esperar)
#### 1. **Falta de Tipado Fuerte en Algunos Lugares**
**Problema:**
- Algunos `any` o tipos débiles
- No crítico, pero mejorable
**Impacto:** Bajo
**Esfuerzo de resolución:** Bajo (mejora incremental)
#### 2. **Lógica Duplicada en Componentes**
**Problema:**
- Algunas funciones repetidas
- No crítico, pero mejorable
**Impacto:** Bajo
**Esfuerzo de resolución:** Bajo (refactor gradual)
#### 3. **Falta de Tests**
**Problema:**
- No hay tests automatizados
- No crítico para MVP
**Impacto:** Bajo (ahora), Alto (futuro)
**Esfuerzo de resolución:** Alto (sistema completo)
---
## 🧭 SECCIÓN I — CONCLUSIÓN EJECUTIVA
### ¿La Estructura Actual Aguanta el Sistema Propuesto?
**Respuesta:** ✅ **SÍ, CON ARQUITECTURA ADITIVA**
**Análisis:**
#### ✅ **Puntos Fuertes**
1. **ContentAdapter ya implementado** - Permite inyectar contenido externo sin romper nada
2. **Separación conceptual de capas** - Existe (operativa, formativa, referencia)
3. **Arquitectura aditiva del backend** - No afecta app actual
4. **IndexedDB cache** - Ya implementado para offline
#### ⚠️ **Limitaciones Actuales**
1. **Datos hardcodeados** - Bloquean gestión externa directa
2. **Acoplamiento páginas → datos** - Requiere migración gradual
3. **Falta de versionado** - No crítico para MVP, sí para producción
#### ✅ **Solución: Migración Gradual**
**Estrategia:**
1.**ContentAdapter ya implementado** - Permite migración sin romper
2.**Backend separado** - No afecta app actual
3.**Migrar páginas gradualmente** - De `src/data/` a `ContentAdapter`
4.**Mantener compatibilidad** - `LocalContentAdapter` como fallback
### ¿Qué se Puede Reutilizar?
#### ✅ **Totalmente Reutilizable**
1. **Estructuras de datos TypeScript** - Interfaces de `Procedure`, `Drug`, `Guide`
2. **Componentes de visualización** - `RCP.tsx`, `ViaAerea.tsx`, etc.
3. **Sistema de relaciones** - `content-relations.ts`
4. **ContentAdapter** - Ya implementado y funcional
#### ⚠️ **Reutilizable con Modificaciones**
1. **Páginas de protocolos** - Cambiar de `getProcedureById()` a `adapter.getProtocol()`
2. **Página de fármacos** - Cambiar de `drugs` array a `adapter.getAllDrugs()`
3. **Página de guías** - Cambiar de `guides` array a `adapter.getAllGuides()`
#### ❌ **No Reutilizable (Requiere Refactor)**
1. **Checklists embebidos** - Requieren extracción a estructura
2. **Lógica de búsqueda por nombre** - Requiere sistema de relaciones
### ¿Qué Debe Aislarse?
#### 🔴 **Crítico Aislar**
1. **`src/data/*.ts`** - NO TOCAR directamente
- Migrar a ContentAdapter
- Mantener como fallback
2. **Componentes de protocolos** - Aislar lógica de datos
- Usar ContentAdapter
- No importar directamente desde `src/data/`
#### 🟠 **Importante Aislar**
1. **Lógica de relaciones** - Ya aislada en `content-relations.ts`
2. **Cache offline** - Ya aislado en `indexeddb.ts`
### ¿Por Dónde Conviene Empezar SIN ROMPER NADA?
#### ✅ **Fase 1: Ya Completada** ✅
1. ✅ ContentAdapter implementado
2. ✅ ExternalContentAdapter funcional
3. ✅ IndexedDB cache implementado
4. ✅ Content Relations implementado
5. ✅ Backend separado creado
6. ✅ Panel admin separado creado
#### ⏳ **Fase 2: Migración Gradual (Siguiente)**
**Orden recomendado:**
1. **Migrar páginas una por una:**
- Empezar con páginas menos críticas
- Cambiar de `getProcedureById()` a `useProtocolAdapter()`
- Probar exhaustivamente
- Continuar con siguiente página
2. **Migrar vademécum:**
- Cambiar `Farmacos.tsx` a usar `ContentAdapter`
- Backend ya tiene drugs (35 fármacos)
- Content Pack ya incluye drugs
3. **Migrar guías:**
- Cambiar `GuiaRefuerzo.tsx` a usar `ContentAdapter`
- Backend ya tiene guides
- Content Pack ya incluye guides
#### ⏳ **Fase 3: Mejoras (Futuro)**
1. **Extraer checklists:**
- Crear estructura de datos
- Componente reutilizable
- Migrar checklists existentes
2. **Sistema de relaciones explícitas:**
- Reemplazar búsqueda por nombre
- Validación de integridad
3. **Versionado:**
- Implementar en backend (ya existe estructura)
- UI para ver historial
### Recomendaciones Finales
#### ✅ **Hacer Ahora**
1. **Continuar migración gradual** - Páginas a ContentAdapter
2. **Probar exhaustivamente** - Cada migración
3. **Mantener fallback** - LocalContentAdapter siempre disponible
#### ⏳ **Planificar**
1. **Extraer checklists** - Estructura de datos
2. **Sistema de relaciones** - Explícitas y validadas
3. **Versionado completo** - Backend + UI
#### ❌ **NO Hacer**
1. **Refactor masivo** - Riesgo alto de romper
2. **Eliminar `src/data/`** - Mantener como fallback
3. **Cambiar estructuras** - Sin migración previa
---
## 📋 RESUMEN TÉCNICO
### Estado Actual
-**Arquitectura aditiva** implementada (ContentAdapter)
-**Backend separado** (no afecta app)
-**Panel admin separado** (no afecta app)
- ⚠️ **Datos hardcodeados** (requieren migración gradual)
- ⚠️ **Acoplamiento páginas → datos** (mejorable)
### Capacidad de Extensión
-**Alta** - ContentAdapter permite inyectar contenido externo
-**Alta** - Backend listo para gestión de contenido
-**Alta** - Panel admin listo para edición
- ⚠️ **Media** - Requiere migración gradual de páginas
### Riesgo de Ruptura
-**Bajo** - Arquitectura aditiva
-**Bajo** - Fallback siempre disponible
- ⚠️ **Medio** - Si se toca `src/data/` directamente
-**Bajo** - Backend/Admin separados
### Conclusión
**La estructura actual SÍ aguanta el sistema propuesto** mediante:
1.**ContentAdapter** - Ya implementado
2.**Migración gradual** - Sin romper nada
3.**Fallback** - Siempre disponible
4.**Arquitectura aditiva** - Backend/Admin separados
**Próximo paso:** Migrar páginas gradualmente a ContentAdapter.
---
**Última actualización:** 2025-01-07
**Estado:** ✅ AUDITORÍA COMPLETA