fix: Correcciones críticas y mejoras PWA

- Fix: ErrorBoundary movido dentro de BrowserRouter para resolver error de contexto React Router
- Fix: Service Worker actualizado con Promise.allSettled para manejar errores de caché
- Feat: Iconos PWA optimizados (192x192, 512x512, maskable)
- Feat: Scripts de diagnóstico y limpieza de desarrollo
- Feat: Documentación de diagnóstico de errores
- Update: React Router future flags configurados
- Update: Manifest.json con iconos y screenshots configurados
- Clean: Eliminados archivos obsoletos y documentación antigua
- Docs: Actualizado RESUMEN_MANUAL_TES.md y CHECKLIST_PWA_COMPLETA.md
This commit is contained in:
planetazuzu 2025-12-23 11:42:44 +01:00
parent 27cac410ae
commit a313cfe066
93 changed files with 1569 additions and 16149 deletions

155
COMANDOS_DESPLIEGUE.md Normal file
View file

@ -0,0 +1,155 @@
# 🚀 Comandos de Despliegue
## Estado Actual
✅ **Aplicación desplegada y corriendo**
- **Puerto:** 8607
- **URL:** http://localhost:8607
- **Gestor:** PM2
- **Estado:** Online
## Comandos Útiles
### Ver estado de la aplicación
```bash
pm2 list
pm2 status emerges-tes
pm2 info emerges-tes
```
### Ver logs
```bash
# Ver logs en tiempo real
pm2 logs emerges-tes
# Ver últimas 50 líneas
pm2 logs emerges-tes --lines 50 --nostream
# Ver solo errores
pm2 logs emerges-tes --err
```
### Gestionar la aplicación
```bash
# Reiniciar
pm2 restart emerges-tes
# Detener
pm2 stop emerges-tes
# Iniciar
pm2 start emerges-tes
# Eliminar del gestor PM2
pm2 delete emerges-tes
```
### Monitor en tiempo real
```bash
pm2 monit
```
### Guardar configuración PM2
```bash
pm2 save
```
## Opciones de Despliegue
### 1. Deploy con PM2 (Actual)
```bash
./deploy.sh --skip-git
```
- Puerto: 8607
- Gestión automática de procesos
- Reinicio automático
### 2. Deploy con Docker
```bash
./deploy-docker.sh --skip-git
```
- Puerto: 8607
- Contenedor aislado
- Opciones adicionales:
- `--rebuild` - Reconstruir imagen desde cero
- `--stop` - Detener contenedor
- `--logs` - Ver logs
### 3. Servidor de preview (desarrollo)
```bash
npm run preview
```
- Puerto: 4173
- Solo para pruebas locales
- Se detiene al cerrar terminal
### 4. Script interactivo
```bash
./desplegar.sh
```
- Menú interactivo con todas las opciones
## Verificar que funciona
### Desde el navegador
Abre: http://localhost:8607
### Desde la terminal
```bash
curl http://localhost:8607
```
### Verificar puerto
```bash
netstat -tlnp | grep 8607
# o
ss -tlnp | grep 8607
```
## Solución de Problemas
### Si la aplicación no responde
```bash
# Ver logs de errores
pm2 logs emerges-tes --err
# Reiniciar
pm2 restart emerges-tes
# Verificar que el puerto esté libre
lsof -i :8607
```
### Si necesitas cambiar el puerto
Edita `ecosystem.config.cjs` y cambia el puerto en:
- `args: 'serve -s dist -l [NUEVO_PUERTO]'`
- `PORT: [NUEVO_PUERTO]`
Luego reinicia:
```bash
pm2 restart emerges-tes
```
### Si necesitas reconstruir
```bash
npm run build
pm2 restart emerges-tes
```
## Acceso Remoto
Si quieres acceder desde otra máquina en la misma red:
1. Verifica tu IP local:
```bash
hostname -I
# o
ip addr show
```
2. Accede desde otro dispositivo usando:
```
http://[TU_IP_LOCAL]:8607
```
**Nota:** Asegúrate de que el firewall permita conexiones en el puerto 8607.

View file

@ -1,168 +0,0 @@
# ✅ Estado Final del Proyecto - Post Limpieza
**Fecha:** 2025-12-23
**Limpieza ejecutada:** ✅ Completada
---
## 📊 Resumen de Limpieza
### Archivos Movidos
- **393 archivos**`../EMERGES_REVISION_20251223/`
- `_BACKUP_MD/` (203 archivos)
- `MANUAL_TES_DIGITAL/` (110 archivos)
- `imagenes-pendientes/` (60 archivos)
- Scripts Python adicionales
- **5 configuraciones**`config_backup/`
- `vercel.json`
- `netlify.toml`
- `nginx.conf.example`
- `public/.htaccess`
- `public/_redirects`
- **55 documentos** organizados:
- 13 documentos esenciales → `docs/consolidado/`
- 42 documentos → `docs/archivo/`
---
## 🏗️ Estructura Final Optimizada
```
protocolo-r-pido/
├── public/ # Archivos públicos
│ ├── assets/infografias/ # 46+ imágenes organizadas
│ ├── manual/ # 78 archivos .md
│ ├── manifest.json
│ ├── sw.js
│ └── favicon.svg
├── src/ # ~136 archivos TS/TSX
│ ├── components/ # 40+ componentes
│ ├── data/ # Datos TypeScript
│ ├── hooks/ # Custom hooks
│ ├── pages/ # 20+ páginas
│ └── [otros]
├── docs/
│ ├── consolidado/ # 13 documentos esenciales
│ └── archivo/ # 42 documentos para referencia
├── config_backup/ # 5 configuraciones no usadas
├── scripts/
│ └── verificar-manual.ts # Script esencial
├── .github/
│ └── workflows/deploy.yml
├── Dockerfile # ✅ Mantenido
├── docker-compose.yml # ✅ Mantenido
├── docker-compose.prod.yml # ✅ Mantenido
├── deploy-docker.sh # ✅ Mantenido
├── ecosystem.config.js # ✅ Mantenido (PM2)
├── deploy.sh # ✅ Mantenido
├── webhook-deploy.sh # ✅ Mantenido
├── cleanup_completo.sh # ✅ Script de limpieza
├── package.json
├── vite.config.ts
├── tailwind.config.ts
└── README.md # ✅ Actualizado
```
---
## ✅ Correcciones Realizadas
### Errores Corregidos
1. **Error: "Objects are not valid as a React child"**
- ✅ Corregido en `MenuSheet.tsx`
- Componentes Icon ahora se instancian correctamente
2. **Error: "Cannot destructure property 'basename'"**
- ✅ Corregido en `App.tsx` y `ErrorBoundary.tsx`
- ErrorBoundary movido al nivel más externo
- Link eliminado de ErrorBoundary (usa window.location.href)
3. **Clave duplicada en image-registry.ts**
- ✅ Eliminada segunda definición de 'uso-tensiometro'
---
## 🚀 Estado del Proyecto
### Build
- ✅ Build exitoso sin errores
- ✅ Sin warnings de claves duplicadas
- ✅ Sin errores de sintaxis JSX
### Funcionalidades
- ✅ PWA funcionando (Service Worker, Manifest)
- ✅ React Router funcionando correctamente
- ✅ Todos los componentes renderizando correctamente
- ✅ Docker configurado y funcionando
- ✅ PM2 configurado (puerto 8607)
- ✅ GitHub Actions configurado
---
## 📦 Backups Creados
1. **Backup completo:** `../EMERGES_BACKUP_20251223_101230/`
- Tamaño: ~35MB
- Contiene: Todo el proyecto (sin node_modules)
2. **Archivos para revisión:** `../EMERGES_REVISION_20251223/`
- Tamaño: ~28MB
- Contiene: Backups, duplicados, scripts Python
**⚠️ Importante:** Revisar estos directorios antes de eliminar nada permanentemente.
---
## 🎯 Próximos Pasos Recomendados
1. **Verificar funcionalidades:**
```bash
npm run dev # Desarrollo
docker-compose up --build # Docker
```
2. **Probar PWA:**
- Service Worker registrado
- Manifest funciona
- Banner de instalación funciona
- Modo offline funciona
3. **Si todo funciona bien:**
- Puedes eliminar backups antiguos (mantener solo el más reciente)
- El proyecto está optimizado y listo para desarrollo
---
## 📝 Documentación Disponible
**Documentos esenciales en `docs/consolidado/`:**
- `DEPLOYMENT_SERVER.md` - Despliegue en servidor
- `DEPLOYMENT_DOCKER.md` - Despliegue con Docker
- `DEPLOYMENT_GITHUB.md` - Despliegue GitHub Pages
- `VERIFICACION_PWA.md` - Verificación PWA
- `ESTADO_FUNCIONALIDADES.md` - Estado de funcionalidades
- `ANALISIS_TECNOLOGICO_PROYECTO.md` - Análisis técnico completo
- Y más...
**Documentos archivados en `docs/archivo/`:**
- 42 documentos de referencia histórica
---
## ✨ Resultado Final
- ✅ **Proyecto limpio y organizado**
- ✅ **Estructura clara y mantenible**
- ✅ **Errores corregidos**
- ✅ **Build funcionando**
- ✅ **PWA funcionando**
- ✅ **Docker configurado**
- ✅ **Listo para desarrollo y producción**
---
**Proyecto optimizado y funcionando correctamente! 🎉**

99
ESTRUCTURA.md Normal file
View file

@ -0,0 +1,99 @@
# 📁 Estructura del Proyecto guia-tes
## Carpetas Principales
```
guia-tes/
├── 📂 assets/ # Recursos multimedia (imágenes, videos, slides)
│ ├── checklists_app/
│ ├── consent_privacy/
│ ├── images/ # Imágenes organizadas por bloques (bloque_00 a bloque_08)
│ ├── slides/ # Presentaciones organizadas por bloques
│ ├── templates/
│ └── videos/ # Videos organizados por bloques
├── 📂 src/ # Código fuente de la aplicación React
│ ├── components/ # Componentes React organizados por categoría
│ │ ├── communication-scripts/
│ │ ├── content/
│ │ ├── decision-trees/
│ │ ├── drugs/
│ │ ├── layout/
│ │ ├── manual/
│ │ ├── material-checklists/
│ │ ├── procedures/
│ │ ├── references/
│ │ ├── shared/
│ │ ├── telephone-protocols/
│ │ ├── tools/
│ │ └── ui/
│ ├── data/ # Datos y configuraciones
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilidades de librerías
│ ├── pages/ # Páginas principales de la aplicación
│ └── utils/ # Funciones utilitarias
├── 📂 public/ # Archivos públicos estáticos
│ ├── assets/ # Recursos públicos (diagramas, infografías)
│ └── manual/ # Archivos Markdown del manual (93 archivos)
│ ├── BLOQUE_0_FUNDAMENTOS/
│ ├── BLOQUE_1_PROCEDIMIENTOS_BASICOS/
│ ├── BLOQUE_2_MATERIAL_E_INMOVILIZACION/
│ ├── BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/
│ ├── BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/
│ ├── BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/
│ ├── BLOQUE_6_FARMACOLOGIA/
│ ├── BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/
│ ├── BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/
│ ├── BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA/
│ ├── BLOQUE_10_SITUACIONES_ESPECIALES/
│ ├── BLOQUE_11_PROTOCOLOS_TRAUMA/
│ ├── BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL/
│ ├── BLOQUE_13_COMUNICACION_RELACION_PACIENTE/
│ ├── BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES/
│ └── BLOQUE_15_ALTERACIONES_PSIQUIATRICAS_Y_CONTENCION/
├── 📂 scripts/ # Scripts de utilidad y automatización
├── 📂 docs/ # Documentación del proyecto
│ ├── archivo/
│ └── consolidado/
├── 📂 dist/ # Archivos compilados para producción
├── 📂 config_backup/ # Configuraciones de respaldo
└── 📂 node_modules/ # Dependencias de Node.js (no editar)
```
## Archivos Principales en la Raíz
- `package.json` - Configuración del proyecto y dependencias
- `vite.config.ts` - Configuración de Vite (build tool)
- `tsconfig.json` - Configuración de TypeScript
- `tailwind.config.ts` - Configuración de Tailwind CSS
- `index.html` - Punto de entrada HTML
- `manifest.json` - Configuración PWA
- Scripts de despliegue: `deploy.sh`, `deploy-docker.sh`
- Scripts de limpieza: `cleanup_project.sh`, `cleanup_completo.sh`
- Scripts de utilidad: `integrate_assets.py`, `generar_documentos_word.py`
## Estadísticas
- **Total archivos:** ~1,232
- **Total carpetas:** ~229
- **Archivos del manual:** 93 archivos .md
- **Componentes React:** ~85 componentes
## Cómo Ver la Estructura
1. **Desde la terminal:**
```bash
./mostrar-estructura.sh
```
2. **Desde el explorador de archivos:**
- Abre la carpeta `/home/planetazuzu/guia-tes`
- Si no ves carpetas ocultas, presiona `Ctrl+H` para mostrarlas
3. **Ver este archivo:**
```bash
cat ESTRUCTURA.md
```

139
ESTRUCTURA_PROYECTO.txt Normal file
View file

@ -0,0 +1,139 @@
═══════════════════════════════════════════════════════════
ESTRUCTURA DEL PROYECTO: guia-tes
═══════════════════════════════════════════════════════════
📁 CARPETAS PRINCIPALES:
───────────────────────────────────────────────────────────
📂 assets/ (0 archivos, 136K)
📂 config_backup/ (5 archivos, 24K)
📂 dist/ (186 archivos, 12M)
📂 docs/ (17 archivos, 232K)
📂 node_modules/ (26629 archivos, 322M)
📂 public/ (149 archivos, 10M)
📂 scripts/ (12 archivos, 116K)
📂 src/ (137 archivos, 1,3M)
📄 ARCHIVOS PRINCIPALES EN LA RAÍZ:
───────────────────────────────────────────────────────────
📄 abrir-carpeta.sh (1,2K)
📄 cleanup_completo.sh (16K)
📄 cleanup_project.sh (8,5K)
📄 components.json (414)
📄 deploy-docker.sh (4,5K)
📄 deploy.sh (4,0K)
📄 docker-compose.prod.yml (995)
📄 docker-compose.yml (654)
📄 ecosystem.config.js (852)
📄 eslint.config.js (765)
📄 generar_documentos_word.py (13K)
📄 integrate_assets.py (15K)
📄 manifest.json (33K)
📄 mostrar-estructura.sh (2,9K)
📄 package.json (3,3K)
📄 package-lock.json (339K)
📄 postcss.config.js (81)
📄 README.md (1,3K)
📄 reorganizar_proyecto.sh (3,0K)
📄 servir-local.sh (149)
📄 tailwind.config.ts (3,9K)
📄 tailwind.config.ts (3,9K)
📄 tsconfig.app.json (652)
📄 tsconfig.json (369)
📄 tsconfig.node.json (481)
📄 vite.config.ts (6,2K)
📄 vite.config.ts (6,2K)
📄 vite-plugin-manifest.ts (2,1K)
📄 webhook-deploy.sh (1,4K)
═══════════════════════════════════════════════════════════
ESTRUCTURA DETALLADA DE CARPETAS IMPORTANTES
═══════════════════════════════════════════════════════════
📁 src/ (código fuente):
src
src/components
src/components/communication-scripts
src/components/content
src/components/decision-trees
src/components/drugs
src/components/layout
src/components/manual
src/components/material-checklists
src/components/procedures
src/components/references
src/components/shared
src/components/telephone-protocols
src/components/tools
src/components/ui
src/data
src/hooks
src/lib
src/pages
src/utils
📁 public/ (archivos públicos):
public
public/assets
public/assets/diagramas
public/assets/infografias
public/manual
public/manual/BLOQUE_0_FUNDAMENTOS
public/manual/BLOQUE_10_SITUACIONES_ESPECIALES
public/manual/BLOQUE_11_PROTOCOLOS_TRAUMA
public/manual/BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL
public/manual/BLOQUE_13_COMUNICACION_RELACION_PACIENTE
public/manual/BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES
public/manual/BLOQUE_15_ALTERACIONES_PSIQUIATRICAS_Y_CONTENCION
public/manual/BLOQUE_1_PROCEDIMIENTOS_BASICOS
public/manual/BLOQUE_2_MATERIAL_E_INMOVILIZACION
public/manual/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA
public/manual/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP
public/manual/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS
public/manual/BLOQUE_6_FARMACOLOGIA
public/manual/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL
public/manual/BLOQUE_8_GESTION_OPERATIVA
public/manual/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION
public/manual/BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA
📁 assets/ (recursos multimedia):
assets
assets/checklists_app
assets/consent_privacy
assets/images
assets/images/bloque_00
assets/images/bloque_01
assets/images/bloque_02
assets/images/bloque_03
assets/images/bloque_04
assets/images/bloque_05
assets/images/bloque_06
assets/images/bloque_07
assets/images/bloque_08
assets/slides
assets/slides/bloque_00
assets/slides/bloque_01
assets/slides/bloque_02
assets/slides/bloque_03
assets/slides/bloque_04
assets/slides/bloque_05
assets/slides/bloque_06
assets/slides/bloque_07
assets/slides/bloque_08
assets/templates
assets/videos
assets/videos/bloque_00
assets/videos/bloque_01
assets/videos/bloque_02
assets/videos/bloque_03
assets/videos/bloque_04
assets/videos/bloque_05
assets/videos/bloque_06
assets/videos/bloque_07
assets/videos/bloque_08
═══════════════════════════════════════════════════════════
RESUMEN
═══════════════════════════════════════════════════════════
Total archivos: 1233
Total carpetas: 229

Binary file not shown.

View file

@ -1 +0,0 @@
Archivo MD,Ruta MD,Línea,Tipo,Ruta Referenciada,Extensión,Existe,Ruta Encontrada,Contexto
1 Archivo MD Ruta MD Línea Tipo Ruta Referenciada Extensión Existe Ruta Encontrada Contexto

48
abrir-carpeta.sh Executable file
View file

@ -0,0 +1,48 @@
#!/bin/bash
# Script para abrir la carpeta del proyecto en el explorador de archivos
CARPETA="/home/planetazuzu/guia-tes"
echo "Intentando abrir: $CARPETA"
echo ""
# Verificar que la carpeta existe
if [ ! -d "$CARPETA" ]; then
echo "ERROR: La carpeta no existe: $CARPETA"
exit 1
fi
# Verificar permisos
if [ ! -r "$CARPETA" ]; then
echo "ERROR: No tienes permisos de lectura en: $CARPETA"
exit 1
fi
echo "✓ Carpeta existe y es accesible"
echo ""
# Intentar abrir con diferentes métodos
if command -v nautilus &> /dev/null; then
echo "Abriendo con Nautilus..."
nautilus "$CARPETA" &
elif command -v dolphin &> /dev/null; then
echo "Abriendo con Dolphin..."
dolphin "$CARPETA" &
elif command -v thunar &> /dev/null; then
echo "Abriendo con Thunar..."
thunar "$CARPETA" &
elif command -v xdg-open &> /dev/null; then
echo "Abriendo con xdg-open..."
xdg-open "$CARPETA" &
else
echo "ERROR: No se encontró ningún explorador de archivos instalado"
echo "Puedes navegar manualmente a: $CARPETA"
exit 1
fi
echo ""
echo "Si la carpeta no se abre, intenta ejecutar manualmente:"
echo " nautilus $CARPETA"
echo " o"
echo " xdg-open $CARPETA"

View file

@ -1,374 +0,0 @@
#!/usr/bin/env python3
"""
Análisis profundo del contenido del Manual TES Digital
Verifica: referencias cruzadas, links rotos, formato, imágenes, etc.
"""
import os
import re
from pathlib import Path
from collections import defaultdict
from typing import Dict, List, Set, Tuple
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
def obtener_todos_los_archivos_md() -> List[Path]:
"""Obtiene todos los archivos .md del manual"""
archivos = []
for bloque_dir in MANUAL_DIR.iterdir():
if bloque_dir.is_dir() and bloque_dir.name.startswith("BLOQUE_"):
for archivo in bloque_dir.glob("*.md"):
archivos.append(archivo)
return sorted(archivos)
def extraer_referencias_entre_corchetes(contenido: str) -> List[str]:
"""Extrae referencias del tipo [texto](ruta) o [texto]"""
patrones = [
r'\[([^\]]+)\]\(([^\)]+)\)', # [texto](ruta)
r'\[([^\]]+)\]', # [texto] sin ruta
]
referencias = []
for patron in patrones:
matches = re.findall(patron, contenido)
for match in matches:
if isinstance(match, tuple):
referencias.append(match[1] if match[1] else match[0])
else:
referencias.append(match)
return referencias
def extraer_referencias_cruzadas(contenido: str) -> List[str]:
"""Extrae referencias a otros capítulos/bloques"""
# Patrones comunes de referencias cruzadas
patrones = [
r'(?:ver|Ver|VER|consultar|Consultar|CONSULTAR)\s+(?:el\s+)?(?:capítulo|Capítulo|CAPÍTULO|bloque|Bloque|BLOQUE)?\s*([0-9]+\.[0-9]+(?:\.[0-9]+)?)',
r'(?:ver|Ver|VER|consultar|Consultar|CONSULTAR)\s+(?:el\s+)?(?:capítulo|Capítulo|CAPÍTULO|bloque|Bloque|BLOQUE)?\s*([0-9]+\.[0-9]+)',
r'\(ver\s+([0-9]+\.[0-9]+(?:\.[0-9]+)?)\)',
r'\(Ver\s+([0-9]+\.[0-9]+(?:\.[0-9]+)?)\)',
r'\[([0-9]+\.[0-9]+(?:\.[0-9]+)?)\]',
]
referencias = []
for patron in patrones:
matches = re.findall(patron, contenido)
referencias.extend(matches)
return referencias
def extraer_imagenes(contenido: str) -> List[str]:
"""Extrae referencias a imágenes"""
patron = r'!\[([^\]]*)\]\(([^\)]+)\)'
matches = re.findall(patron, contenido)
return [match[1] for match in matches]
def extraer_tablas(contenido: str) -> int:
"""Cuenta tablas en formato markdown"""
# Buscar líneas que contengan | (indicador de tabla)
lineas = contenido.split('\n')
tablas = 0
en_tabla = False
for linea in lineas:
if '|' in linea and linea.strip().startswith('|'):
if not en_tabla:
tablas += 1
en_tabla = True
elif en_tabla and not linea.strip():
en_tabla = False
elif en_tabla and '|' not in linea:
en_tabla = False
return tablas
def analizar_estructura_headers(contenido: str) -> Dict:
"""Analiza la estructura de headers del documento"""
lineas = contenido.split('\n')
headers = []
for linea in lineas:
if linea.startswith('#'):
nivel = len(linea) - len(linea.lstrip('#'))
texto = linea.lstrip('#').strip()
headers.append({'nivel': nivel, 'texto': texto})
return {
'total': len(headers),
'headers': headers,
'tiene_titulo_principal': len(headers) > 0 and headers[0]['nivel'] == 1,
'estructura_valida': len(headers) > 0
}
def verificar_metadatos(contenido: str) -> Dict:
"""Verifica metadatos comunes en los archivos"""
metadatos = {
'tiene_version': False,
'tiene_fecha': False,
'tiene_tipo': False,
'version': None,
'fecha': None,
'tipo': None
}
# Buscar versión
match_version = re.search(r'\*\*Versión:\*\*\s*([^\n]+)', contenido)
if match_version:
metadatos['tiene_version'] = True
metadatos['version'] = match_version.group(1).strip()
# Buscar fecha
match_fecha = re.search(r'\*\*Fecha:\*\*\s*([^\n]+)', contenido)
if match_fecha:
metadatos['tiene_fecha'] = True
metadatos['fecha'] = match_fecha.group(1).strip()
# Buscar tipo
match_tipo = re.search(r'\*\*Tipo:\*\*\s*([^\n]+)', contenido)
if match_tipo:
metadatos['tiene_tipo'] = True
metadatos['tipo'] = match_tipo.group(1).strip()
return metadatos
def analizar_contenido_completitud(contenido: str) -> Dict:
"""Analiza la completitud del contenido"""
lineas = contenido.split('\n')
lineas_no_vacias = [l for l in lineas if l.strip()]
return {
'total_lineas': len(lineas),
'lineas_no_vacias': len(lineas_no_vacias),
'total_caracteres': len(contenido),
'palabras': len(contenido.split()),
'tiene_contenido_sustancial': len(lineas_no_vacias) > 50, # Más de 50 líneas no vacías
'ratio_contenido': len(lineas_no_vacias) / len(lineas) if lineas else 0
}
def analizar_archivo(archivo: Path) -> Dict:
"""Analiza un archivo completo"""
try:
with open(archivo, 'r', encoding='utf-8') as f:
contenido = f.read()
except Exception as e:
return {'error': str(e)}
# Extraer información básica
nombre_archivo = archivo.name
ruta_relativa = str(archivo.relative_to(BASE_DIR))
# Análisis
referencias = extraer_referencias_entre_corchetes(contenido)
referencias_cruzadas = extraer_referencias_cruzadas(contenido)
imagenes = extraer_imagenes(contenido)
num_tablas = extraer_tablas(contenido)
estructura_headers = analizar_estructura_headers(contenido)
metadatos = verificar_metadatos(contenido)
completitud = analizar_contenido_completitud(contenido)
return {
'archivo': nombre_archivo,
'ruta': ruta_relativa,
'referencias': referencias,
'referencias_cruzadas': referencias_cruzadas,
'imagenes': imagenes,
'num_tablas': num_tablas,
'estructura_headers': estructura_headers,
'metadatos': metadatos,
'completitud': completitud
}
def verificar_links_rotos(analisis_archivos: List[Dict]) -> List[Dict]:
"""Verifica links rotos entre archivos"""
# Crear mapa de archivos existentes
archivos_existentes = set()
for analisis in analisis_archivos:
if 'error' not in analisis:
archivos_existentes.add(analisis['archivo'])
# También agregar variaciones del nombre
nombre_sin_ext = Path(analisis['archivo']).stem
archivos_existentes.add(nombre_sin_ext)
links_rotos = []
for analisis in analisis_archivos:
if 'error' in analisis:
continue
archivo_actual = analisis['archivo']
for ref in analisis['referencias']:
# Verificar si es una ruta relativa
if ref.startswith('../') or ref.startswith('./'):
# Intentar resolver la ruta
archivo_ref_dir = Path(analisis['ruta']).parent
ruta_completa = (BASE_DIR / archivo_ref_dir / ref).resolve()
if not ruta_completa.exists():
links_rotos.append({
'archivo': archivo_actual,
'referencia': ref,
'tipo': 'ruta_relativa'
})
elif ref.endswith('.md'):
# Verificar si el archivo existe
if ref not in archivos_existentes:
# Buscar en todos los bloques
encontrado = False
for bloque_dir in MANUAL_DIR.iterdir():
if bloque_dir.is_dir():
if (bloque_dir / ref).exists():
encontrado = True
break
if not encontrado:
links_rotos.append({
'archivo': archivo_actual,
'referencia': ref,
'tipo': 'archivo_md'
})
return links_rotos
def generar_reporte_profundo():
"""Genera un reporte profundo del análisis"""
print("Analizando contenido de archivos...")
archivos = obtener_todos_los_archivos_md()
analisis_completo = []
for archivo in archivos:
analisis = analizar_archivo(archivo)
analisis_completo.append(analisis)
if 'error' in analisis:
print(f"⚠️ Error analizando {archivo.name}: {analisis['error']}")
print(f"✅ Analizados {len(analisis_completo)} archivos")
# Verificar links rotos
print("Verificando links rotos...")
links_rotos = verificar_links_rotos(analisis_completo)
# Generar estadísticas
stats = {
'total_archivos': len(analisis_completo),
'archivos_con_errores': len([a for a in analisis_completo if 'error' in a]),
'archivos_con_metadatos_completos': len([a for a in analisis_completo if 'metadatos' in a and a['metadatos']['tiene_version'] and a['metadatos']['tiene_fecha']]),
'total_referencias_cruzadas': sum(len(a.get('referencias_cruzadas', [])) for a in analisis_completo),
'total_imagenes': sum(len(a.get('imagenes', [])) for a in analisis_completo),
'total_tablas': sum(a.get('num_tablas', 0) for a in analisis_completo),
'links_rotos': len(links_rotos),
'archivos_sin_contenido_sustancial': len([a for a in analisis_completo if 'completitud' in a and not a['completitud'].get('tiene_contenido_sustancial', False)])
}
# Generar reporte markdown
reporte_md = []
reporte_md.append("# REPORTE DE ANÁLISIS PROFUNDO - MANUAL TES DIGITAL\n")
reporte_md.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte_md.append("---\n")
# Estadísticas generales
reporte_md.append("## 📊 ESTADÍSTICAS GENERALES\n")
reporte_md.append(f"- **Total de archivos analizados:** {stats['total_archivos']}")
reporte_md.append(f"- **Archivos con errores de lectura:** {stats['archivos_con_errores']}")
reporte_md.append(f"- **Archivos con metadatos completos:** {stats['archivos_con_metadatos_completos']}")
reporte_md.append(f"- **Total referencias cruzadas:** {stats['total_referencias_cruzadas']}")
reporte_md.append(f"- **Total imágenes referenciadas:** {stats['total_imagenes']}")
reporte_md.append(f"- **Total tablas:** {stats['total_tablas']}")
reporte_md.append(f"- **Links rotos encontrados:** {stats['links_rotos']}")
reporte_md.append(f"- **Archivos sin contenido sustancial:** {stats['archivos_sin_contenido_sustancial']}\n")
reporte_md.append("---\n")
# Links rotos
if links_rotos:
reporte_md.append("## 🔴 LINKS ROTOS ENCONTRADOS\n")
reporte_md.append(f"**Total:** {len(links_rotos)}\n")
for link_roto in links_rotos[:20]: # Limitar a 20 para no hacer el reporte muy largo
reporte_md.append(f"- `{link_roto['archivo']}` → `{link_roto['referencia']}` ({link_roto['tipo']})")
if len(links_rotos) > 20:
reporte_md.append(f"\n*... y {len(links_rotos) - 20} más*")
else:
reporte_md.append("## ✅ NO SE ENCONTRARON LINKS ROTOS\n")
reporte_md.append("\n---\n")
# Análisis de metadatos
reporte_md.append("## 📋 ANÁLISIS DE METADATOS\n")
archivos_sin_version = [a for a in analisis_completo if 'metadatos' in a and not a['metadatos']['tiene_version']]
archivos_sin_fecha = [a for a in analisis_completo if 'metadatos' in a and not a['metadatos']['tiene_fecha']]
archivos_sin_tipo = [a for a in analisis_completo if 'metadatos' in a and not a['metadatos']['tiene_tipo']]
if archivos_sin_version:
reporte_md.append(f"\n### Archivos sin versión ({len(archivos_sin_version)}):")
for archivo in archivos_sin_version[:10]:
reporte_md.append(f"- `{archivo['archivo']}`")
if len(archivos_sin_version) > 10:
reporte_md.append(f"*... y {len(archivos_sin_version) - 10} más*")
if archivos_sin_fecha:
reporte_md.append(f"\n### Archivos sin fecha ({len(archivos_sin_fecha)}):")
for archivo in archivos_sin_fecha[:10]:
reporte_md.append(f"- `{archivo['archivo']}`")
if len(archivos_sin_fecha) > 10:
reporte_md.append(f"*... y {len(archivos_sin_fecha) - 10} más*")
if archivos_sin_tipo:
reporte_md.append(f"\n### Archivos sin tipo ({len(archivos_sin_tipo)}):")
for archivo in archivos_sin_tipo[:10]:
reporte_md.append(f"- `{archivo['archivo']}`")
if len(archivos_sin_tipo) > 10:
reporte_md.append(f"*... y {len(archivos_sin_tipo) - 10} más*")
if not archivos_sin_version and not archivos_sin_fecha and not archivos_sin_tipo:
reporte_md.append("✅ Todos los archivos tienen metadatos completos\n")
reporte_md.append("\n---\n")
# Análisis de completitud
reporte_md.append("## 📄 ANÁLISIS DE COMPLETITUD\n")
archivos_cortos = [a for a in analisis_completo if 'completitud' in a and a['completitud']['lineas_no_vacias'] < 50]
if archivos_cortos:
reporte_md.append(f"\n### Archivos con menos de 50 líneas de contenido ({len(archivos_cortos)}):")
for archivo in archivos_cortos[:10]:
lineas = archivo['completitud']['lineas_no_vacias']
reporte_md.append(f"- `{archivo['archivo']}` ({lineas} líneas)")
if len(archivos_cortos) > 10:
reporte_md.append(f"*... y {len(archivos_cortos) - 10} más*")
else:
reporte_md.append("✅ Todos los archivos tienen contenido sustancial\n")
reporte_md.append("\n---\n")
# Resumen de referencias cruzadas
reporte_md.append("## 🔗 REFERENCIAS CRUZADAS\n")
reporte_md.append(f"Se encontraron {stats['total_referencias_cruzadas']} referencias cruzadas entre capítulos.\n")
reporte_md.append("Esto indica buena integración entre los diferentes capítulos del manual.\n")
reporte_md.append("\n---\n")
# Recomendaciones
reporte_md.append("## 💡 RECOMENDACIONES\n")
recomendaciones = []
if stats['links_rotos'] > 0:
recomendaciones.append("Revisar y corregir los links rotos identificados")
if stats['archivos_con_metadatos_completos'] < stats['total_archivos']:
recomendaciones.append("Completar metadatos (versión, fecha, tipo) en todos los archivos")
if stats['archivos_sin_contenido_sustancial'] > 0:
recomendaciones.append("Revisar archivos con poco contenido para asegurar completitud")
if not recomendaciones:
recomendaciones.append("✅ El proyecto está en excelente estado")
for i, rec in enumerate(recomendaciones, 1):
reporte_md.append(f"{i}. {rec}")
reporte_md.append("\n---\n")
return "\n".join(reporte_md), stats
if __name__ == "__main__":
reporte_md, stats = generar_reporte_profundo()
reporte_path = BASE_DIR / "REPORTE_ANALISIS_PROFUNDO.md"
with open(reporte_path, "w", encoding="utf-8") as f:
f.write(reporte_md)
print(f"\n✅ Reporte generado: {reporte_path}")
print(f"\n📊 Resumen:")
print(f" - Archivos analizados: {stats['total_archivos']}")
print(f" - Links rotos: {stats['links_rotos']}")
print(f" - Referencias cruzadas: {stats['total_referencias_cruzadas']}")
print(f" - Imágenes: {stats['total_imagenes']}")
print(f" - Tablas: {stats['total_tablas']}")

View file

@ -1,327 +0,0 @@
#!/usr/bin/env python3
"""
Búsqueda EXHAUSTIVA de referencias a archivos multimedia
Incluye búsqueda de patrones sutiles y referencias textuales
"""
import os
import re
from pathlib import Path
from typing import List, Dict
import csv
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
def buscar_referencias_exhaustivas(archivo: Path) -> List[Dict]:
"""Búsqueda exhaustiva de TODAS las posibles referencias a medios"""
referencias = []
try:
with open(archivo, 'r', encoding='utf-8') as f:
contenido = f.read()
lineas = contenido.split('\n')
for num_linea, linea in enumerate(lineas, 1):
# 1. Imágenes Markdown estándar: ![alt](ruta)
patron1 = r'!\[([^\]]*)\]\(([^\)]+)\)'
matches = re.findall(patron1, linea)
for texto_alt, ruta in matches:
# Verificar si parece ser una imagen
if any(ext in ruta.lower() for ext in ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.bmp', '.webp']):
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'imagen_markdown',
'ruta_referenciada': ruta.strip(),
'extension': Path(ruta).suffix.lower(),
'texto_alt': texto_alt,
'contexto': linea.strip()[:150]
})
# 2. Enlaces a archivos multimedia: [texto](archivo.ext)
patron2 = r'\[([^\]]*)\]\(([^\)]+\.(jpg|jpeg|png|gif|svg|bmp|webp|pdf|doc|docx|ppt|pptx|xls|xlsx|mp4|avi|mov|wmv|mkv|webm|flv))\)'
matches = re.findall(patron2, linea, re.IGNORECASE)
for texto, ruta, ext in matches:
tipo = 'documento' if ext.lower() in ['pdf', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'] else \
'video' if ext.lower() in ['mp4', 'avi', 'mov', 'wmv', 'mkv', 'webm', 'flv'] else 'imagen'
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': f'{tipo}_enlace',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': texto,
'contexto': linea.strip()[:150]
})
# 3. Referencias directas a archivos (sin markdown)
patron3 = r'\b([^\s\(\)]+\.(jpg|jpeg|png|gif|svg|bmp|webp|pdf|doc|docx|ppt|pptx|mp4|avi|mov|wmv))\b'
matches = re.findall(patron3, linea, re.IGNORECASE)
for ruta, ext in matches:
# Evitar URLs y rutas de código
if not ruta.startswith('http') and not ruta.startswith('//') and '.' in ruta:
tipo = 'documento' if ext.lower() in ['pdf', 'doc', 'docx', 'ppt', 'pptx'] else \
'video' if ext.lower() in ['mp4', 'avi', 'mov', 'wmv'] else 'imagen'
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': f'{tipo}_directo',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': '',
'contexto': linea.strip()[:150]
})
# 4. Referencias textuales: "ver figura X", "anexo Y", etc.
patron4 = r'(ver|Ver|VER|consultar|Consultar|CONSULTAR|adjunto|Adjunto|ADJUNTO|anexo|Anexo|ANEXO|figura|Figura|FIGURA|imagen|Imagen|IMAGEN|gráfico|Gráfico|GRÁFICO|diagrama|Diagrama|DIAGRAMA|tabla|Tabla|TABLA)\s+[A-Z]?\d+[\.\)]?\s*[:\-]?\s*([^\s,\.\)]+\.(jpg|jpeg|png|gif|svg|pdf|doc|docx))'
matches = re.findall(patron4, linea, re.IGNORECASE)
for palabra, ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'referencia_textual',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': palabra,
'contexto': linea.strip()[:150]
})
# 5. Rutas relativas con ../ o ./
patron5 = r'\(([\.\/][^\)]+\.(jpg|jpeg|png|gif|svg|pdf|doc|docx|mp4|avi|mov))\)'
matches = re.findall(patron5, linea, re.IGNORECASE)
for ruta, ext in matches:
tipo = 'documento' if ext.lower() in ['pdf', 'doc', 'docx'] else \
'video' if ext.lower() in ['mp4', 'avi', 'mov'] else 'imagen'
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': f'{tipo}_relativa',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': '',
'contexto': linea.strip()[:150]
})
# 6. Referencias a carpetas comunes
patron6 = r'(assets|images|img|imagenes|media|multimedia|videos|docs|documentos|public|static)/[^\s\)]+\.(jpg|jpeg|png|gif|svg|pdf|mp4|avi|mov)'
matches = re.findall(patron6, linea, re.IGNORECASE)
for carpeta, ext in matches:
# Extraer nombre de archivo
match_archivo = re.search(rf'{carpeta}/([^\s\)]+\.{ext})', linea, re.IGNORECASE)
if match_archivo:
nombre_archivo = match_archivo.group(1)
ruta_completa = f"{carpeta}/{nombre_archivo}"
tipo = 'documento' if ext.lower() == 'pdf' else \
'video' if ext.lower() in ['mp4', 'avi', 'mov'] else 'imagen'
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': f'{tipo}_carpeta',
'ruta_referenciada': ruta_completa,
'extension': ext.lower(),
'texto_alt': carpeta,
'contexto': linea.strip()[:150]
})
except Exception as e:
print(f"Error procesando {archivo}: {e}")
return referencias
def verificar_existencia(ruta: str, archivo_origen: Path) -> tuple:
"""Verifica si un archivo existe"""
ruta = ruta.strip()
# URLs externas
if ruta.startswith(('http://', 'https://', '//')):
return True, "URL externa"
# Ruta absoluta
if os.path.isabs(ruta):
return os.path.exists(ruta), ruta
# Ruta relativa desde el archivo origen
archivo_dir = archivo_origen.parent
ruta_resuelta = (archivo_dir / ruta).resolve()
if ruta_resuelta.exists() and ruta_resuelta.is_file():
return True, str(ruta_resuelta.relative_to(BASE_DIR))
# Buscar desde raíz del proyecto
ruta_desde_raiz = BASE_DIR / ruta.lstrip('/')
if ruta_desde_raiz.exists() and ruta_desde_raiz.is_file():
return True, str(ruta_desde_raiz.relative_to(BASE_DIR))
# Buscar en ubicaciones comunes
ubicaciones = [
BASE_DIR / "public" / ruta,
BASE_DIR / "src" / "assets" / ruta,
BASE_DIR / "assets" / ruta,
BASE_DIR / "images" / ruta,
BASE_DIR / "docs" / ruta,
MANUAL_DIR / ruta,
]
for ubicacion in ubicaciones:
if ubicacion.exists() and ubicacion.is_file():
return True, str(ubicacion.relative_to(BASE_DIR))
return False, ruta
def obtener_archivos_md() -> List[Path]:
"""Obtiene todos los archivos .md del manual"""
archivos = []
for bloque_dir in MANUAL_DIR.iterdir():
if bloque_dir.is_dir() and bloque_dir.name.startswith("BLOQUE_"):
for archivo in bloque_dir.glob("*.md"):
archivos.append(archivo)
return sorted(archivos)
def main():
print("🔍 Búsqueda EXHAUSTIVA de referencias a archivos multimedia...")
archivos_md = obtener_archivos_md()
print(f" Analizando {len(archivos_md)} archivos .md...")
todas_referencias = []
for archivo in archivos_md:
refs = buscar_referencias_exhaustivas(archivo)
todas_referencias.extend(refs)
print(f" Encontradas {len(todas_referencias)} referencias potenciales")
# Verificar existencia
print(" Verificando existencia de archivos...")
resultados = []
for ref in todas_referencias:
existe, ruta_encontrada = verificar_existencia(ref['ruta_referenciada'], Path(BASE_DIR / ref['ruta_md']))
resultados.append({
'Archivo MD': ref['archivo_md'],
'Ruta MD': ref['ruta_md'],
'Línea': ref['linea'],
'Tipo': ref['tipo'],
'Ruta Referenciada': ref['ruta_referenciada'],
'Extensión': ref['extension'],
'Existe': '' if existe else 'No',
'Ruta Encontrada': ruta_encontrada if existe else 'N/A',
'Contexto': ref['contexto']
})
# Separar faltantes
faltantes = [r for r in resultados if r['Existe'] == 'No']
existentes = [r for r in resultados if r['Existe'] == '']
# Generar CSV
csv_path = BASE_DIR / "REFERENCIAS_MULTIMEDIA_COMPLETO.csv"
with open(csv_path, 'w', newline='', encoding='utf-8') as f:
if resultados:
writer = csv.DictWriter(f, fieldnames=resultados[0].keys())
writer.writeheader()
writer.writerows(resultados)
else:
f.write("Archivo MD,Ruta MD,Línea,Tipo,Ruta Referenciada,Extensión,Existe,Ruta Encontrada,Contexto\n")
# Generar reporte Markdown
reporte = []
reporte.append("# REPORTE EXHAUSTIVO: REFERENCIAS A ARCHIVOS MULTIMEDIA\n")
reporte.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte.append("---\n")
reporte.append("## 📊 RESUMEN EJECUTIVO\n")
reporte.append(f"- **Total de archivos .md analizados:** {len(archivos_md)}\n")
reporte.append(f"- **Total de referencias encontradas:** {len(resultados)}\n")
reporte.append(f"- **Archivos existentes:** {len(existentes)}\n")
reporte.append(f"- **Archivos faltantes:** {len(faltantes)}\n")
if resultados:
reporte.append(f"- **Porcentaje de completitud:** {(len(existentes)/len(resultados)*100):.1f}%\n")
else:
reporte.append("- **Porcentaje de completitud:** N/A (no se encontraron referencias)\n")
reporte.append("---\n")
if faltantes:
reporte.append("## ❌ ARCHIVOS MULTIMEDIA FALTANTES\n")
reporte.append(f"**Total:** {len(faltantes)} referencias a archivos que NO existen\n\n")
reporte.append("| Archivo MD | Línea | Tipo | Ruta Referenciada | Extensión | Contexto |\n")
reporte.append("|------------|-------|------|-------------------|-----------|----------|\n")
for ref in faltantes:
contexto_corto = ref['Contexto'][:80].replace('|', '\\|')
reporte.append(f"| `{ref['Archivo MD']}` | {ref['Línea']} | {ref['Tipo']} | `{ref['Ruta Referenciada']}` | {ref['Extensión']} | {contexto_corto}... |\n")
else:
reporte.append("## ✅ NO SE ENCONTRARON ARCHIVOS MULTIMEDIA FALTANTES\n")
if len(resultados) == 0:
reporte.append("\n**Resultado:** No se encontraron referencias a archivos multimedia en ningún archivo .md del proyecto.\n")
reporte.append("\nEsto indica que:\n")
reporte.append("- Los archivos .md no contienen referencias a imágenes, videos o documentos externos\n")
reporte.append("- El contenido es principalmente texto con formato Markdown\n")
reporte.append("- No hay dependencias de archivos multimedia que deban ser creados\n")
else:
reporte.append("\nTodas las referencias encontradas apuntan a archivos existentes.\n")
reporte.append("\n---\n")
if existentes and len(existentes) > 0:
reporte.append("## ✅ ARCHIVOS MULTIMEDIA EXISTENTES\n")
reporte.append(f"**Total:** {len(existentes)} referencias a archivos que existen\n\n")
reporte.append("| Archivo MD | Tipo | Ruta Referenciada | Ruta Encontrada |\n")
reporte.append("|------------|------|-------------------|-----------------|\n")
for ref in existentes[:30]:
reporte.append(f"| `{ref['Archivo MD']}` | {ref['Tipo']} | `{ref['Ruta Referenciada']}` | `{ref['Ruta Encontrada']}` |\n")
if len(existentes) > 30:
reporte.append(f"\n*... y {len(existentes) - 30} referencias más (ver CSV completo)*\n")
reporte.append("\n---\n")
if resultados:
reporte.append("## 📋 ESTADÍSTICAS POR TIPO\n")
por_tipo = {}
por_tipo_faltantes = {}
for ref in resultados:
tipo = ref['Tipo']
por_tipo[tipo] = por_tipo.get(tipo, 0) + 1
if ref['Existe'] == 'No':
por_tipo_faltantes[tipo] = por_tipo_faltantes.get(tipo, 0) + 1
reporte.append("| Tipo | Total | Faltantes | Existentes |\n")
reporte.append("|------|-------|-----------|------------|\n")
for tipo in sorted(por_tipo.keys()):
total = por_tipo[tipo]
faltantes_tipo = por_tipo_faltantes.get(tipo, 0)
existentes_tipo = total - faltantes_tipo
reporte.append(f"| {tipo} | {total} | {faltantes_tipo} | {existentes_tipo} |\n")
reporte.append("\n---\n")
reporte.append("## 📄 ARCHIVOS GENERADOS\n")
reporte.append(f"- **CSV completo:** `REFERENCIAS_MULTIMEDIA_COMPLETO.csv`\n")
reporte.append(f"- **Reporte Markdown:** Este archivo\n")
reporte.append("\nEl archivo CSV contiene todas las referencias encontradas con detalles completos.\n")
# Guardar reporte
reporte_path = BASE_DIR / "REPORTE_MULTIMEDIA_COMPLETO.md"
with open(reporte_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(reporte))
print(f"\n✅ Reporte generado: {reporte_path}")
print(f"✅ CSV generado: {csv_path}")
print(f"\n📊 Resumen final:")
print(f" - Archivos analizados: {len(archivos_md)}")
print(f" - Referencias encontradas: {len(resultados)}")
print(f" - Archivos faltantes: {len(faltantes)}")
print(f" - Archivos existentes: {len(existentes)}")
if __name__ == "__main__":
main()

View file

@ -1,321 +0,0 @@
#!/usr/bin/env python3
"""
Script exhaustivo para buscar TODAS las referencias a archivos multimedia
y verificar si existen en el sistema
"""
import os
import re
from pathlib import Path
from typing import List, Dict, Tuple
import csv
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
def buscar_todas_referencias_multimedia(archivo: Path) -> List[Dict]:
"""Busca TODAS las referencias a medios en un archivo"""
referencias = []
try:
with open(archivo, 'r', encoding='utf-8') as f:
contenido = f.read()
lineas = contenido.split('\n')
for num_linea, linea in enumerate(lineas, 1):
# 1. Patrones de imágenes: ![texto](ruta.jpg)
patron_imagen = r'!\[([^\]]*)\]\(([^\)]+\.(jpg|jpeg|png|gif|svg|bmp|webp))\)'
matches = re.findall(patron_imagen, linea, re.IGNORECASE)
for texto_alt, ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'imagen',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': texto_alt,
'contexto': linea.strip()[:100]
})
# 2. Referencias a videos en enlaces: [texto](video.mp4)
patron_video_enlace = r'\[([^\]]*)\]\(([^\)]+\.(mp4|avi|mov|wmv|mkv|webm|flv))\)'
matches = re.findall(patron_video_enlace, linea, re.IGNORECASE)
for texto, ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'video',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': texto,
'contexto': linea.strip()[:100]
})
# 3. Referencias directas a videos (sin enlace)
patron_video_directo = r'([^\s]+\.(mp4|avi|mov|wmv|mkv|webm|flv))'
matches = re.findall(patron_video_directo, linea, re.IGNORECASE)
for ruta, ext in matches:
# Evitar falsos positivos en URLs
if not ruta.startswith('http'):
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'video',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': '',
'contexto': linea.strip()[:100]
})
# 4. Enlaces a PDF/DOC/PPT
patron_documentos = r'\[([^\]]*)\]\(([^\)]+\.(pdf|doc|docx|ppt|pptx|xls|xlsx))\)'
matches = re.findall(patron_documentos, linea, re.IGNORECASE)
for texto, ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'documento',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': texto,
'contexto': linea.strip()[:100]
})
# 5. Referencias a anexos/adjuntos/figuras
patron_anexo = r'(ver|Ver|VER|consultar|Consultar|CONSULTAR|adjunto|Adjunto|ADJUNTO|anexo|Anexo|ANEXO|figura|Figura|FIGURA|imagen|Imagen|IMAGEN)\s+[A-Z]?\d+[\.\)]?\s*[:\-]?\s*([^\s,\.\)]+\.(jpg|jpeg|png|gif|svg|pdf|doc|docx))'
matches = re.findall(patron_anexo, linea, re.IGNORECASE)
for palabra, ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'referencia_textual',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': palabra,
'contexto': linea.strip()[:100]
})
# 6. Rutas relativas que podrían ser archivos
patron_rutas = r'\(([\.\/][^\)]+\.(jpg|jpeg|png|gif|svg|pdf|doc|docx|mp4|avi|mov))\)'
matches = re.findall(patron_rutas, linea, re.IGNORECASE)
for ruta, ext in matches:
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'ruta_relativa',
'ruta_referenciada': ruta.strip(),
'extension': ext.lower(),
'texto_alt': '',
'contexto': linea.strip()[:100]
})
# 7. Referencias a carpetas de assets/imágenes
patron_assets = r'(assets|images|img|imagenes|media|multimedia|videos|docs|documentos)/([^\s\)]+\.(jpg|jpeg|png|gif|svg|pdf|mp4|avi|mov))'
matches = re.findall(patron_assets, linea, re.IGNORECASE)
for carpeta, nombre_archivo, ext in matches:
# Construir ruta completa
ruta_completa = f"{carpeta}/{nombre_archivo}"
referencias.append({
'archivo_md': archivo.name,
'ruta_md': str(archivo.relative_to(BASE_DIR)),
'linea': num_linea,
'tipo': 'ruta_assets',
'ruta_referenciada': ruta_completa,
'extension': ext.lower(),
'texto_alt': '',
'contexto': linea.strip()[:100]
})
except Exception as e:
print(f"Error procesando {archivo}: {e}")
return referencias
def verificar_existencia_archivo(ruta_referenciada: str, archivo_origen: Path) -> Tuple[bool, str]:
"""Verifica si un archivo existe y devuelve la ruta encontrada"""
# Limpiar la ruta
ruta = ruta_referenciada.strip()
# Si es URL, no verificar
if ruta.startswith('http://') or ruta.startswith('https://'):
return True, "URL externa"
# Si es ruta absoluta
if os.path.isabs(ruta):
if os.path.exists(ruta):
return True, ruta
return False, ruta
# Si es ruta relativa
archivo_dir = archivo_origen.parent
# Intentar resolver desde el directorio del archivo
ruta_completa = (archivo_dir / ruta).resolve()
if ruta_completa.exists():
return True, str(ruta_completa.relative_to(BASE_DIR))
# Intentar desde la raíz del proyecto
ruta_desde_raiz = BASE_DIR / ruta.lstrip('/')
if ruta_desde_raiz.exists():
return True, str(ruta_desde_raiz.relative_to(BASE_DIR))
# Buscar en ubicaciones comunes
ubicaciones_comunes = [
BASE_DIR / "public" / ruta,
BASE_DIR / "src" / "assets" / ruta,
BASE_DIR / "assets" / ruta,
BASE_DIR / "images" / ruta,
BASE_DIR / "docs" / ruta,
MANUAL_DIR / ruta,
BASE_DIR / ruta,
]
for ubicacion in ubicaciones_comunes:
if ubicacion.exists():
return True, str(ubicacion.relative_to(BASE_DIR))
return False, ruta
def obtener_todos_archivos_md() -> List[Path]:
"""Obtiene todos los archivos .md del manual"""
archivos = []
for bloque_dir in MANUAL_DIR.iterdir():
if bloque_dir.is_dir() and bloque_dir.name.startswith("BLOQUE_"):
for archivo in bloque_dir.glob("*.md"):
archivos.append(archivo)
return sorted(archivos)
def generar_reporte_completo():
"""Genera reporte completo de multimedia faltante"""
print("Buscando referencias a archivos multimedia...")
archivos_md = obtener_todos_archivos_md()
todas_referencias = []
for archivo in archivos_md:
referencias = buscar_todas_referencias_multimedia(archivo)
todas_referencias.extend(referencias)
print(f"Encontradas {len(todas_referencias)} referencias a medios")
# Verificar existencia
print("Verificando existencia de archivos...")
resultados = []
for ref in todas_referencias:
existe, ruta_encontrada = verificar_existencia_archivo(ref['ruta_referenciada'], Path(BASE_DIR / ref['ruta_md']))
resultados.append({
'archivo_md': ref['archivo_md'],
'ruta_md': ref['ruta_md'],
'linea': ref['linea'],
'tipo': ref['tipo'],
'ruta_referenciada': ref['ruta_referenciada'],
'extension': ref['extension'],
'existe': '' if existe else 'No',
'ruta_encontrada': ruta_encontrada if existe else 'N/A',
'contexto': ref['contexto']
})
# Separar existentes y faltantes
referencias_faltantes = [r for r in resultados if r['existe'] == 'No']
referencias_existentes = [r for r in resultados if r['existe'] == '']
# Generar CSV
print("Generando archivo CSV...")
csv_path = BASE_DIR / "REFERENCIAS_MULTIMEDIA_COMPLETO.csv"
with open(csv_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=[
'Archivo MD', 'Ruta MD', 'Línea', 'Tipo', 'Ruta Referenciada',
'Extensión', 'Existe', 'Ruta Encontrada', 'Contexto'
])
writer.writeheader()
writer.writerows(resultados)
# Generar reporte Markdown
reporte_md = []
reporte_md.append("# REPORTE COMPLETO: REFERENCIAS A ARCHIVOS MULTIMEDIA\n")
reporte_md.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte_md.append("---\n")
reporte_md.append("## 📊 RESUMEN EJECUTIVO\n")
reporte_md.append(f"- **Total de referencias encontradas:** {len(resultados)}\n")
reporte_md.append(f"- **Archivos existentes:** {len(referencias_existentes)}\n")
reporte_md.append(f"- **Archivos faltantes:** {len(referencias_faltantes)}\n")
reporte_md.append(f"- **Porcentaje de completitud:** {(len(referencias_existentes)/len(resultados)*100 if resultados else 0):.1f}%\n")
reporte_md.append("---\n")
if referencias_faltantes:
reporte_md.append("## ❌ ARCHIVOS MULTIMEDIA FALTANTES\n")
reporte_md.append(f"**Total:** {len(referencias_faltantes)} referencias a archivos que no existen\n\n")
reporte_md.append("| Archivo MD | Línea | Tipo | Ruta Referenciada | Extensión | Contexto |\n")
reporte_md.append("|------------|-------|------|------------------|-----------|----------|\n")
for ref in referencias_faltantes:
reporte_md.append(f"| `{ref['archivo_md']}` | {ref['linea']} | {ref['tipo']} | `{ref['ruta_referenciada']}` | {ref['extension']} | {ref['contexto'][:50]}... |\n")
else:
reporte_md.append("## ✅ NO SE ENCONTRARON ARCHIVOS MULTIMEDIA FALTANTES\n")
reporte_md.append("Todas las referencias a archivos multimedia apuntan a archivos existentes.\n")
reporte_md.append("\n---\n")
if referencias_existentes:
reporte_md.append("## ✅ ARCHIVOS MULTIMEDIA EXISTENTES\n")
reporte_md.append(f"**Total:** {len(referencias_existentes)} referencias a archivos existentes\n\n")
reporte_md.append("| Archivo MD | Tipo | Ruta Referenciada | Ruta Encontrada |\n")
reporte_md.append("|------------|------|-------------------|-----------------|\n")
# Mostrar solo primeros 20 para no hacer el reporte muy largo
for ref in referencias_existentes[:20]:
reporte_md.append(f"| `{ref['archivo_md']}` | {ref['tipo']} | `{ref['ruta_referenciada']}` | `{ref['ruta_encontrada']}` |\n")
if len(referencias_existentes) > 20:
reporte_md.append(f"\n*... y {len(referencias_existentes) - 20} referencias más (ver CSV completo)*\n")
reporte_md.append("\n---\n")
reporte_md.append("## 📋 ESTADÍSTICAS POR TIPO\n")
por_tipo = {}
por_tipo_faltantes = {}
for ref in resultados:
tipo = ref['tipo']
por_tipo[tipo] = por_tipo.get(tipo, 0) + 1
if ref['existe'] == 'No':
por_tipo_faltantes[tipo] = por_tipo_faltantes.get(tipo, 0) + 1
reporte_md.append("| Tipo | Total | Faltantes | Existentes |\n")
reporte_md.append("|------|-------|-----------|------------|\n")
for tipo in sorted(por_tipo.keys()):
total = por_tipo[tipo]
faltantes = por_tipo_faltantes.get(tipo, 0)
existentes = total - faltantes
reporte_md.append(f"| {tipo} | {total} | {faltantes} | {existentes} |\n")
reporte_md.append("\n---\n")
reporte_md.append("## 📄 ARCHIVOS GENERADOS\n")
reporte_md.append(f"- **CSV completo:** `REFERENCIAS_MULTIMEDIA_COMPLETO.csv`\n")
reporte_md.append(f"- **Reporte Markdown:** Este archivo\n")
reporte_md.append("\nEl archivo CSV contiene todas las referencias encontradas con detalles completos.\n")
# Guardar reporte
reporte_path = BASE_DIR / "REPORTE_MULTIMEDIA_COMPLETO.md"
with open(reporte_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(reporte_md))
print(f"\n✅ Reporte generado: {reporte_path}")
print(f"✅ CSV generado: {csv_path}")
print(f"\n📊 Resumen:")
print(f" - Referencias encontradas: {len(resultados)}")
print(f" - Archivos faltantes: {len(referencias_faltantes)}")
print(f" - Archivos existentes: {len(referencias_existentes)}")
if __name__ == "__main__":
generar_reporte_completo()

View file

@ -1,41 +0,0 @@
#!/usr/bin/env python3
"""
Copia los archivos .md del manual a public/manual/ para que sean accesibles vía fetch
"""
import shutil
from pathlib import Path
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_SOURCE = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
MANUAL_DEST = BASE_DIR / "public" / "manual"
def copiar_archivos_manual():
"""Copia todos los archivos .md de los bloques a public/manual/"""
# Crear directorio destino si no existe
MANUAL_DEST.mkdir(parents=True, exist_ok=True)
# Contar archivos copiados
archivos_copiados = 0
# Buscar todas las carpetas BLOQUE_*
for bloque_dir in MANUAL_SOURCE.iterdir():
if bloque_dir.is_dir() and bloque_dir.name.startswith("BLOQUE_"):
# Crear directorio destino para este bloque
bloque_dest = MANUAL_DEST / bloque_dir.name
bloque_dest.mkdir(parents=True, exist_ok=True)
# Copiar todos los archivos .md del bloque
for archivo_md in bloque_dir.glob("*.md"):
if archivo_md.is_file():
destino = bloque_dest / archivo_md.name
shutil.copy2(archivo_md, destino)
archivos_copiados += 1
print(f"✅ Copiado: {bloque_dir.name}/{archivo_md.name}")
print(f"\n✅ Total de archivos copiados: {archivos_copiados}")
print(f"📁 Ubicación destino: {MANUAL_DEST}")
if __name__ == "__main__":
copiar_archivos_manual()

View file

@ -95,11 +95,11 @@ if command -v pm2 &> /dev/null; then
echo -e "${YELLOW} Reiniciando aplicación existente...${NC}"
pm2 restart "$APP_NAME" || {
echo -e "${YELLOW} Error al reiniciar, intentando iniciar...${NC}"
pm2 start ecosystem.config.js
pm2 start ecosystem.config.cjs
}
else
echo -e "${YELLOW} Iniciando nueva instancia...${NC}"
pm2 start ecosystem.config.js
pm2 start ecosystem.config.cjs
fi
# Guardar configuración PM2

143
desplegar.sh Executable file
View file

@ -0,0 +1,143 @@
#!/bin/bash
# Script interactivo para desplegar la aplicación
# Uso: ./desplegar.sh
set -e
# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}🚀 DESPLIEGUE DE LA APLICACIÓN GUIA-TES${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo ""
# Verificar herramientas disponibles
echo -e "${CYAN}Verificando herramientas disponibles...${NC}"
HAS_PM2=false
HAS_DOCKER=false
HAS_NODE=false
if command -v pm2 &> /dev/null; then
HAS_PM2=true
echo -e "${GREEN}✓ PM2 disponible${NC}"
else
echo -e "${YELLOW}✗ PM2 no disponible${NC}"
fi
if command -v docker &> /dev/null && (command -v docker-compose &> /dev/null || docker compose version &> /dev/null); then
HAS_DOCKER=true
echo -e "${GREEN}✓ Docker disponible${NC}"
else
echo -e "${YELLOW}✗ Docker no disponible${NC}"
fi
if command -v node &> /dev/null && command -v npm &> /dev/null; then
HAS_NODE=true
echo -e "${GREEN}✓ Node.js y npm disponibles${NC}"
else
echo -e "${RED}✗ Node.js o npm no disponibles${NC}"
exit 1
fi
echo ""
# Verificar si existe build
if [ ! -d "dist" ] || [ -z "$(ls -A dist)" ]; then
echo -e "${YELLOW}⚠️ No hay build de producción. Necesitas construir primero.${NC}"
echo -e "${CYAN}¿Construir ahora? (s/n):${NC} "
read -r BUILD_NOW
if [[ "$BUILD_NOW" =~ ^[Ss]$ ]]; then
echo -e "${YELLOW}Construyendo aplicación...${NC}"
npm run build
echo -e "${GREEN}✓ Build completado${NC}"
else
echo -e "${RED}No se puede desplegar sin build. Ejecuta: npm run build${NC}"
exit 1
fi
else
echo -e "${GREEN}✓ Build encontrado en dist/${NC}"
fi
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN}OPCIONES DE DESPLIEGUE:${NC}"
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "1) ${GREEN}Deploy con PM2${NC} (Recomendado para servidor local/producción)"
echo -e " - Puerto: 8607"
echo -e " - Gestión automática de procesos"
echo -e " - Reinicio automático"
echo ""
if [ "$HAS_DOCKER" = true ]; then
echo -e "2) ${GREEN}Deploy con Docker${NC} (Recomendado para producción aislada)"
echo -e " - Puerto: 8607"
echo -e " - Contenedor aislado"
echo -e " - Fácil de escalar"
echo ""
fi
echo -e "3) ${GREEN}Servir localmente${NC} (Solo para pruebas)"
echo -e " - Puerto: 4173 (preview)"
echo -e " - No persiste después de cerrar terminal"
echo ""
echo -e "4) ${GREEN}Generar build para despliegue estático${NC}"
echo -e " - Para GitHub Pages, Netlify, Vercel"
echo -e " - Solo genera los archivos en dist/"
echo ""
echo -e "${CYAN}Selecciona una opción (1-4):${NC} "
read -r OPTION
case $OPTION in
1)
if [ "$HAS_PM2" = false ]; then
echo -e "${RED}PM2 no está instalado. Instálalo con: npm install -g pm2${NC}"
exit 1
fi
echo ""
echo -e "${YELLOW}Ejecutando deploy con PM2...${NC}"
./deploy.sh --skip-git
;;
2)
if [ "$HAS_DOCKER" = false ]; then
echo -e "${RED}Docker no está disponible${NC}"
exit 1
fi
echo ""
echo -e "${YELLOW}Ejecutando deploy con Docker...${NC}"
./deploy-docker.sh --skip-git
;;
3)
echo ""
echo -e "${YELLOW}Iniciando servidor de preview...${NC}"
echo -e "${GREEN}La aplicación estará disponible en: http://localhost:4173${NC}"
echo -e "${YELLOW}Presiona Ctrl+C para detener${NC}"
npm run preview
;;
4)
echo ""
echo -e "${YELLOW}Generando build de producción...${NC}"
npm run build
echo ""
echo -e "${GREEN}✓ Build completado en dist/${NC}"
echo -e "${CYAN}Para desplegar:${NC}"
echo -e " - GitHub Pages: Sube la carpeta dist/ a tu repositorio"
echo -e " - Netlify: Arrastra la carpeta dist/ a Netlify"
echo -e " - Vercel: Ejecuta 'vercel --prod' desde la raíz"
;;
*)
echo -e "${RED}Opción inválida${NC}"
exit 1
;;
esac
echo ""
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✅ Proceso completado${NC}"
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"

View file

@ -1,8 +1,9 @@
# Resumen de Creación del Manual TES Digital
**Fecha:** 2025
**Última actualización:** 2025-12-23
**Archivo Creado:** `docs/MANUAL_TES_DIGITAL.md`
**Estado:** ✅ Completado
**Estado:** ✅ Completado y Desplegado
---
@ -12,6 +13,7 @@
- Propósito del manual
- Aviso legal y responsabilidad médica
- Versión y validación
- **Archivos:** `BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md`, `BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md`
- **Etiquetas:** [DOC]
### 2. Principios Generales
@ -22,26 +24,38 @@
- **Etiquetas:** [APP], [DOC]
### 3. Procedimientos Básicos TES
- RCP Adulto SVB [APP]
- RCP Adulto SVA [APP]
- RCP Pediátrico [APP]
- OVACE [APP]
- Shock hemorrágico [APP]
- Inmovilización espinal [APP]
- Extricación vehicular [APP]
- RCP Adulto SVB [APP] - `BLOQUE_04_1_RCP_ADULTOS.md`
- RCP Adulto SVA [APP] - `BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md`
- RCP Pediátrico [APP] - `BLOQUE_04_2_RCP_PEDIATRIA.md`, `BLOQUE_04_3_RCP_LACTANTES.md`
- OVACE [APP] - `BLOQUE_04_6_OVACE_ADULTOS.md`, `BLOQUE_04_7_OVACE_PEDIATRIA.md`, `BLOQUE_04_8_OVACE_LACTANTES.md`
- Uso DESA [APP] - `BLOQUE_04_4_USO_DESA.md`
- Inmovilización espinal [APP] - `BLOQUE_02_5_TABLERO_ESPINAL.md`, `BLOQUE_02_3_COLLARIN_CERVICAL.md`
- Extricación vehicular [APP] - `BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`
- Material e inmovilización [APP] - 14 archivos en BLOQUE_2
- **Etiquetas:** [APP]
### 4. Protocolos Transtelefónicos
- Introducción [DOC]
- PCR (adultos, niños, lactantes) [APP] [IA_FUTURA]
- DESA guiado por teléfono [APP] [IA_FUTURA]
- OVACE transtelefónica (adultos, niños, lactantes) [APP] [IA_FUTURA]
- SCA (identificación y atención precoz) [APP] [IA_FUTURA]
- Introducción [DOC] - `BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md`
- PCR transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_1_PCR_TRANSTELEFONICA.md`
- OVACE transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_2_OVACE_TRANSTELEFONICA.md`
- SCA transtelefónico [APP] [IA_FUTURA] - `BLOQUE_05_3_SCA_TRANSTELEFONICO.md`
- Ictus transtelefónico [APP] [IA_FUTURA] - `BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md`
- Anafilaxia transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md`
- Crisis asmática transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md`
- Hipoglucemia transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md`
- **Total:** 10 archivos en BLOQUE_5
- **Etiquetas:** [APP], [DOC], [IA_FUTURA]
### 5. Vademécum y Abreviaturas
- Vademécum de fármacos (5 fármacos) [APP]
- Abreviaturas comunes [DOC]
- Vademécum operativo [APP] - `BLOQUE_06_1_VADEMECUM_OPERATIVO.md`
- Oxígeno: administración y seguridad [APP] - `BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md`
- Adrenalina: uso en anafilaxia y RCP [APP] - `BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md`
- Aspirina: uso en SCA [APP] - `BLOQUE_06_4_ASPIRINA_USO_SCA.md`
- Glucagón: uso en hipoglucemia [APP] - `BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md`
- Salbutamol: uso en crisis asmática [APP] - `BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md`
- Abreviaturas y terminología [DOC] - `BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md`
- Principios de administración [APP] - `BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md`
- **Total:** 8 archivos en BLOQUE_6
- **Etiquetas:** [APP], [DOC]
### 6. Conducción y Seguridad Vial
@ -91,10 +105,11 @@
- ✅ SCA (identificación y atención precoz)
**Vademécum:**
- ✅ 5 fármacos de emergencia (Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol)
- ✅ Dosis adulto y pediátrica
- ✅ Indicaciones y contraindicaciones
- ✅ Vías de administración
- ✅ 6 fármacos principales de emergencia (Oxígeno, Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol)
- ✅ Dosis adulto y pediátrica detalladas
- ✅ Indicaciones y contraindicaciones completas
- ✅ Vías de administración y diluciones
- ✅ Puntos críticos TES específicos
**Calculadoras:**
- ✅ Escala de Coma de Glasgow (GCS)
@ -211,12 +226,14 @@
## 📊 ESTADÍSTICAS DEL MANUAL
### Contenido Total
- **Líneas:** ~1,200 líneas
- **Capítulos:** 9 capítulos principales
- **Subsecciones:** ~50 subsecciones
- **Protocolos:** 15+ protocolos documentados
- **Fármacos:** 5 fármacos en vademécum
- **Patologías:** 10 patologías por sistemas
- **Archivos .md:** 94 archivos en `public/manual/`
- **Bloques temáticos:** 17 bloques/carpetas principales (BLOQUE_0 a BLOQUE_15 + otros)
- **Líneas totales:** ~47,410 líneas de contenido
- **Subsecciones:** 94 capítulos/secciones documentados
- **Protocolos:** 20+ protocolos documentados
- **Fármacos:** 6 fármacos principales en vademécum (Oxígeno, Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol)
- **Patologías:** 10 patologías por sistemas documentadas
- **Calculadoras:** 10+ herramientas (Glasgow, perfusiones, dosis pediátricas, etc.)
### Distribución por Etiquetas
- **[APP]:** ~70% del contenido
@ -226,60 +243,84 @@
### Fuentes de Contenido Unificadas
- ✅ Plan maestro (protocolos transtelefónicos)
- ✅ `src/data/procedures.ts` (protocolos básicos)
- ✅ `src/data/drugs.ts` (vademécum)
- ✅ `src/data/calculators.ts` (Glasgow, perfusiones)
- ✅ `src/pages/Patologias.tsx` (patologías)
- ✅ `src/data/drugs.ts` (vademécum con 6 fármacos principales)
- ✅ `src/data/calculators.ts` (Glasgow, perfusiones, calculadoras)
- ✅ `src/pages/Patologias.tsx` (10 patologías por sistemas)
- ✅ `src/pages/Escena.tsx` (seguridad, ABCDE, triage)
- ✅ `public/manual/` (94 archivos .md organizados en 15 bloques)
---
## ✅ ESTADO FINAL
### Completado
- ✅ Manual unificado creado
- ✅ Todo el contenido clínico recopilado
- ✅ Estructura por capítulos lógica
### Completado ✅
- ✅ Manual unificado creado (`docs/MANUAL_TES_DIGITAL.md`)
- ✅ Manual estructurado completo (94 archivos en `public/manual/`)
- ✅ Todo el contenido clínico recopilado y organizado
- ✅ Estructura por bloques lógica (17 bloques temáticos)
- ✅ Etiquetado correcto ([APP], [DOC], [IA_FUTURA])
- ✅ Sin duplicados
- ✅ Contenido ordenado y estructurado
- ✅ Capítulo de evolución incluido
- ✅ **Aplicación desplegada y funcionando** (Puerto 8607)
- ✅ PWA funcional con service worker
- ✅ Navegación y búsqueda implementadas
- ✅ Componentes React para visualización del manual
### Pendiente (No bloqueante)
- ⏳ Validación médica del contenido
- ⏳ Implementación en aplicación (Fase 2)
- ⏳ Desarrollo de flujos interactivos (Fase 3)
- ⏳ Validación médica del contenido completo
- ⏳ Revisión contra guías oficiales (ERC, AHA, SEMES)
- ⏳ Desarrollo de flujos interactivos avanzados (Fase 3)
- ⏳ Integración de IA (Fase 4, futuro)
---
## 🎯 PRÓXIMOS PASOS RECOMENDADOS
### Inmediato
1. **Validación Médica**
### Inmediato (Prioridad Alta)
1. **Validación Médica** ⚠️
- Revisión por profesionales médicos especializados
- Validación contra guías oficiales (ERC, AHA, SEMES)
- Corrección de errores o inconsistencias
- **Estado:** Pendiente - Requerido antes de uso en producción
2. **Implementación [APP]**
- Convertir contenido [APP] en aplicación digital
- Crear UI para protocolos transtelefónicos
- Integrar vademécum y calculadoras
2. **Mejoras de la Aplicación** ✅ (En progreso)
- ✅ Aplicación desplegada y funcionando
- ✅ Navegación del manual implementada
- ✅ Vademécum y calculadoras integradas
- ⏳ Optimización de rendimiento
- ⏳ Mejoras de UX/UI
### Medio Plazo
3. **Flujos Interactivos**
- Desarrollar árboles de decisión
- Implementar validación de pasos
- Crear navegación condicional
3. **Flujos Interactivos Avanzados**
- Desarrollar árboles de decisión interactivos
- Implementar validación de pasos en protocolos
- Crear navegación condicional según respuestas
- Checklists interactivos con validación
4. **Contenido Adicional**
- Expandir vademécum con más fármacos
- Añadir más protocolos transtelefónicos
- Incluir más casos clínicos y ejemplos
### Largo Plazo
4. **IA de Apoyo (si se valida seguridad)**
- Análisis de audio para validación de técnica
- Sugerencias contextuales
- Aprendizaje continuo
5. **IA de Apoyo (si se valida seguridad)**
- Análisis de audio para validación de técnica RCP
- Sugerencias contextuales durante protocolos
- Aprendizaje continuo y mejora de recomendaciones
- **Importante:** Solo después de validación médica completa
---
**Manual creado exitosamente** ✅
El manual `MANUAL_TES_DIGITAL.md` es ahora la **fuente de verdad** del proyecto, conteniendo todo el contenido clínico y operativo unificado y estructurado, listo para su validación médica y posterior implementación en aplicación digital.
El proyecto contiene:
- **Manual unificado:** `docs/MANUAL_TES_DIGITAL.md` - Documento consolidado de referencia
- **Manual estructurado:** `public/manual/` - 94 archivos .md organizados en 15 bloques temáticos
- **Aplicación funcional:** Desplegada y corriendo en http://localhost:8607
El contenido está completamente estructurado y listo para su validación médica y posterior evolución a aplicación digital interactiva.
**Última actualización:** 2025-12-23
**Estado:** ✅ Aplicación desplegada y funcionando

View file

@ -1,204 +0,0 @@
# Resumen: Añadida Sección Material y Oxigenoterapia
**Fecha:** 2025-12-23
**Archivo Modificado:** `docs/MANUAL_TES_DIGITAL.md`
**Sección Añadida:** 3.8 Procedimientos Básicos TES Material y Oxigenoterapia
---
## ✅ SECCIÓN AÑADIDA
### 3.8 Procedimientos Básicos TES Material y Oxigenoterapia
**Ubicación:** Dentro de la sección 3 "Procedimientos Básicos TES", como subsección 3.8, después de "3.7 Extricación Vehicular"
**Subsecciones Incluidas:**
#### 3.8.1 Manejo Básico de Material Sanitario [APP] [DOC]
- Collarines cervicales (selección de talla, colocación básica)
- Férulas (rígidas, neumáticas, de vacío)
- Camilla, férno y sistemas de inmovilización
- Consideraciones generales de seguridad
- Errores frecuentes a evitar
#### 3.8.2 Oxigenoterapia [APP] [DOC]
- Indicaciones generales de administración de oxígeno
- Dispositivos habituales:
- Gafas nasales
- Mascarilla simple
- Mascarilla con reservorio
- Venturi
- Bolsa autoinflable (Ambú)
- Rangos orientativos de FiO2 por dispositivo
- Tabla de referencia rápida
- Recomendaciones generales de uso y seguridad
#### 3.8.3 Cálculo de Duración de una Botella de Oxígeno [APP] [IA_FUTURA]
- Fórmula práctica: (Presión en bar × Volumen) ÷ Flujo en L/min
- Ejemplos prácticos:
- Botella de 2 L
- Botella de 5 L
- Botella de 10 L
- Consideración de margen de seguridad (20%)
- Advertencias operativas (no apurar botellas)
- Tabla de referencia rápida por flujo
#### 3.8.4 Recomendaciones Generales de Uso de Dispositivos [APP] [DOC]
- Salvafast (cánula orofaríngea)
- Ambú (bolsa autoinflable)
- Aspirador de secreciones
- Monitor / pulsioxímetro
- Electrodos (colocación básica y errores frecuentes)
#### 3.8.5 Preparación para Evolución Digital [IA_FUTURA]
- Checklists visuales
- Calculadoras automáticas
- Infografías
- Recordatorios inteligentes (no diagnósticos)
- Casos de uso seguros para IA
---
## 📋 RELACIÓN APP / DOC / IA_FUTURA
### [APP] - Contenido para Intervención Rápida (~60%)
**Incluye:**
- ✅ Selección y colocación de collarines cervicales
- ✅ Tipos y uso de férulas
- ✅ Sistemas de inmovilización
- ✅ Selección de dispositivo de O2 según situación
- ✅ Rangos de FiO2 por dispositivo
- ✅ Cálculo de duración de botella de O2
- ✅ Uso de Salvafast, Ambú, aspirador
- ✅ Colocación de electrodos
- ✅ Tablas de referencia rápida
**Características:**
- Consulta rápida durante intervención
- Checklists operativos
- Cálculos prácticos
- Errores frecuentes a evitar
### [DOC] - Contenido Formativo (~35%)
**Incluye:**
- ✅ Consideraciones generales de seguridad
- ✅ Principios de oxigenoterapia
- ✅ Indicaciones y contraindicaciones
- ✅ Técnicas de uso de dispositivos
- ✅ Recomendaciones de seguridad
**Características:**
- Lectura pausada
- Formación y referencia
- Contexto y fundamentos
### [IA_FUTURA] - Asistencia Inteligente Segura (~5%)
**Incluye:**
- ✅ Calculadoras automáticas (duración de botella)
- ✅ Checklists visuales interactivos
- ✅ Recordatorios inteligentes (no diagnósticos)
- ✅ Validación de técnica (procedimental)
**Principios de Seguridad:**
- ❌ NO diagnóstico de necesidad de O2
- ❌ NO interpretación de ECG
- ❌ NO decisión de cambio de dispositivo sin validación humana
- ✅ Solo apoyo procedimental y cálculos
---
## 📊 CONTENIDO AÑADIDO
### Estadísticas
- **Líneas añadidas:** ~400 líneas
- **Subsecciones:** 5 subsecciones principales
- **Tablas:** 2 tablas de referencia rápida
- **Checklists:** Múltiples listas de verificación
- **Errores frecuentes:** Documentados en cada dispositivo
### Contenido Específico
**Material Sanitario:**
- 3 tipos de férulas documentados
- 3 sistemas de inmovilización
- 4 errores frecuentes por categoría
**Oxigenoterapia:**
- 5 dispositivos documentados
- Tabla de rangos de FiO2
- 6 indicaciones generales
- Consideraciones especiales para EPOC
**Cálculo de Botellas:**
- Fórmula práctica
- 3 ejemplos con diferentes tamaños
- Tabla de referencia rápida (3 tamaños × 3 flujos)
- Margen de seguridad del 20%
**Dispositivos:**
- 5 dispositivos documentados
- Técnicas de uso
- Errores frecuentes por dispositivo
- Consideraciones de seguridad
---
## ✅ ELEMENTOS INCLUIDOS
### Notas de Seguridad
- ✅ Nota de seguridad al inicio de la sección
- ✅ Nota final de seguridad
- ✅ Advertencias operativas en cada subsección
- ✅ Errores frecuentes documentados
### Preparación para Evolución Digital
- ✅ Checklists visuales futuros
- ✅ Calculadoras automáticas
- ✅ Infografías
- ✅ Recordatorios inteligentes (no diagnósticos)
- ✅ Casos de uso seguros para IA documentados
### Actualización del Índice
- ✅ Índice actualizado con enlace a nueva sección
---
## 📝 ARCHIVO MODIFICADO
**Archivo:** `docs/MANUAL_TES_DIGITAL.md`
**Cambios Realizados:**
1. ✅ Añadida sección 3.8 completa
2. ✅ Actualizado índice con enlace a nueva sección
3. ✅ Mantenido formato y estructura existente
4. ✅ No se modificó contenido existente
**Estado:**
- ✅ Sección añadida incrementalmente
- ✅ Sin sobrescritura de contenido
- ✅ Estructura clara y delimitada
- ✅ Etiquetado correcto [APP] [DOC] [IA_FUTURA]
---
## 🎯 PRÓXIMOS PASOS SUGERIDOS
### Inmediato
- [ ] Validación médica del contenido añadido
- [ ] Revisión de cálculos y fórmulas
- [ ] Verificación de rangos de FiO2
### Implementación
- [ ] Convertir a formato checklist para APP
- [ ] Crear calculadora automática de duración de botella
- [ ] Diseñar infografías de colocación de dispositivos
---
**Sección añadida exitosamente** ✅
El manual ahora incluye procedimientos básicos de material sanitario y oxigenoterapia, listo para validación médica y posterior implementación en aplicación digital.

View file

@ -1,331 +0,0 @@
# 🔍 Análisis Completo: ¿Qué Falta en la App?
**Fecha:** 2025-12-23 (Actualizado - Última revisión: 2025-12-23)
**Versión de la App:** 1.0.0
---
## 📊 RESUMEN EJECUTIVO
| Categoría | Estado | Completitud |
|-----------|--------|-------------|
| **Funcionalidades Core** | ✅ 99% | Casi completo |
| **PWA / Offline** | ✅ 95% | Implementado |
| **Contenido** | ⚠️ 75% | Parcial |
| **UX / Persistencia** | ✅ 95% | Implementado |
| **Búsqueda / Compartir** | ✅ 90% | Implementado |
| **Optimización** | ✅ 100% | Completado |
| **Contenido Visual** | ⚠️ 60% | En progreso |
| **Validación / Tests** | ❌ 0% | No implementado |
---
## ✅ LO QUE YA FUNCIONA (98%)
### 🎯 Funcionalidades Core
- ✅ **Navegación completa** - Todas las rutas funcionan
- ✅ **Búsqueda global** - Busca en protocolos y fármacos
- ✅ **9 Calculadoras** - Todas funcionales
- ✅ **Vademécum de fármacos** - Completo y navegable
- ✅ **Protocolos de emergencia** - RCP, Ictus, Shock, Vía Aérea
- ✅ **Manual completo** - Navegable por partes/bloques/capítulos
- ✅ **PWA básica** - Service Worker registrado y funcionando
- ✅ **Sistema de actualizaciones** - Detecta y notifica nuevas versiones
- ✅ **Compartir App** - Web Share API implementado
- ✅ **Favoritos persistentes** - localStorage implementado
- ✅ **Historial de búsquedas** - sessionStorage implementado
- ✅ **Página de Favoritos** - `/favoritos` funcional
- ✅ **Página de Historial** - `/historial` funcional
- ✅ **Página de Ajustes** - `/ajustes` con tema y limpieza de datos
- ✅ **Página Acerca de** - `/acerca` con información de la app
- ✅ **Galería de imágenes** - `/galeria` con todas las infografías
- ✅ **Error Boundaries** - Implementado y activo
### 📱 PWA / Offline
- ✅ **Service Worker** - Registrado y activo
- ✅ **Cache de assets** - JS, CSS, HTML cacheados
- ✅ **Cache de imágenes** - Configurado para `/assets/infografias/`
- ✅ **Actualizaciones automáticas** - Sistema implementado
- ✅ **Manifest.json** - Configurado correctamente
- ✅ **Banner de instalación** - Implementado con fallback dev
- ✅ **Indicador offline** - Mostrado en Header (Wifi/WifiOff)
### 🎨 Contenido Visual
- ✅ **48 imágenes organizadas** - En `public/assets/infografias/`
- ✅ **Galería de imágenes** - Vista completa con filtros por bloque
- ✅ **~20 referencias en Markdown** - Imágenes visibles en capítulos críticos
- Collarín Cervical (10 imágenes)
- Triage START (1 imagen)
- ABCDE (1 imagen)
- Constantes Vitales (4 imágenes)
- Oxigenoterapia (3 imágenes)
- BVM (2 imágenes)
- Cánulas (1 imagen)
- Protocolos Transtelefónicos (2 imágenes)
---
## ⚠️ LO QUE FALTA O ESTÁ INCOMPLETO
### 🔴 ALTA PRIORIDAD (Funcionalidad Core)
#### 1. Contenido Visual (60% implementado)
- ⚠️ **Más referencias en Markdown** (~15% hecho)
- Estado: 20 referencias añadidas de ~130 capítulos
- Impacto: Muchos capítulos aún sin imágenes visibles
- Esfuerzo: Alto (manual, ~15-20 horas más)
- Progreso: Se añaden progresivamente
- ❌ **21 Medios Visuales Faltantes** (documentados)
- Estado: Documentados en `SUGERENCIAS_MEDIOS_VISUALES.md`
- Impacto: Temas críticos sin visualización
- Esfuerzo: Alto (creación de medios, ~40-60 horas)
- Prioridad: Alta para RCP paso a paso, Glasgow visual, Farmacología
- ❌ **~90 Capítulos sin imágenes**
- Estado: Mayoría de capítulos sin medios visuales
- Impacto: Contenido menos accesible
- Esfuerzo: Muy alto (creación masiva, ~200+ horas)
- Prioridad: Media (ir añadiendo progresivamente)
#### 2. Páginas de Error (50% implementado)
- ✅ **Error Boundaries** - Implementado
- ❌ **Páginas de error personalizadas** (mejora)
- Estado: Solo 404 básico y ErrorBoundary genérico
- Impacto: UX mejorable en errores específicos
- Esfuerzo: Bajo (1-2 horas)
- Prioridad: Media
---
### 🟡 MEDIA PRIORIDAD (Mejoras UX)
#### 3. Búsqueda Avanzada (✅ 100% implementado)
- ✅ **Filtros por categoría**
- Estado: Implementado con filtros dinámicos
- Impacto: Fácil encontrar contenido específico
- Esfuerzo: Completado (4-6 horas)
- Fecha: 2025-12-23
- ⚠️ **Búsqueda por tags**
- Estado: No implementado (filtros por categoría cubren la necesidad)
- Impacto: Bajo (los filtros existentes son suficientes)
- Esfuerzo: Opcional (3-4 horas si se requiere en el futuro)
#### 4. Compartir / Exportar (✅ 80% implementado)
- ✅ **Compartir App** - Implementado
- ✅ **Compartir protocolos específicos**
- Estado: Implementado con Web Share API + clipboard fallback
- Impacto: Los usuarios pueden compartir protocolos individuales
- Esfuerzo: Completado (3-4 horas)
- Fecha: 2025-12-23
- Funcionalidad: Botón de compartir en ProcedureCard y DrugCard
- ✅ **Deep links a protocolos**
- Estado: Implementado (URLs con ?id=)
- Impacto: Enlaces directos a contenido funcionando
- Esfuerzo: Completado (incluido en compartir)
- Fecha: 2025-12-23
- ❌ **Exportar a PDF**
- Estado: No implementado
- Impacto: No se pueden guardar protocolos offline
- Esfuerzo: Alto (6-8 horas)
#### 5. Optimización de Performance (0% implementado)
- ❌ **Lazy loading de componentes**
- Estado: Todo se carga al inicio
- Impacto: Bundle grande (1.2MB)
- Esfuerzo: Medio (4-6 horas)
- ❌ **Code splitting**
- Estado: No implementado
- Impacto: Carga inicial lenta
- Esfuerzo: Medio (3-4 horas)
#### 6. Contenido Adicional
- ❌ **Expandir vademécum** (5 → 30-40 fármacos)
- Estado: Solo 5 fármacos base
- Impacto: Vademécum incompleto
- Esfuerzo: Alto (20-30 horas, requiere validación médica)
- ❌ **Interacciones medicamentosas**
- Estado: No implementado
- Impacto: Información incompleta
- Esfuerzo: Alto (15-20 horas, requiere validación médica)
---
### 🟢 BAJA PRIORIDAD (Nice to Have)
#### 7. Analytics / Tracking (0% implementado)
- ❌ **Analytics locales** (opcional, con consentimiento)
- Estado: No implementado
- Impacto: No hay métricas de uso
- Esfuerzo: Medio (4-6 horas)
#### 8. Tests (0% implementado)
- ❌ **Tests unitarios**
- Estado: No implementado
- Impacto: Riesgo de regresiones
- Esfuerzo: Alto (20-30 horas)
- ❌ **Tests de integración**
- Estado: No implementado
- Impacto: No hay validación automática
- Esfuerzo: Alto (15-20 horas)
- ❌ **Tests E2E**
- Estado: No implementado
- Impacto: No hay validación de flujos completos
- Esfuerzo: Muy alto (30-40 horas)
#### 9. Notificaciones (0% implementado)
- ❌ **Notificaciones push**
- Estado: No implementado
- Impacto: No hay alertas
- Esfuerzo: Alto (requiere backend, 10-15 horas)
#### 10. Autenticación / Sincronización (0% implementado)
- ❌ **Sistema de usuarios**
- Estado: No implementado
- Impacto: No hay personalización entre dispositivos
- Esfuerzo: Muy alto (requiere backend, 40-60 horas)
---
## 📋 CHECKLIST DETALLADO POR CATEGORÍA
### Funcionalidades Core
- [x] Navegación completa
- [x] Búsqueda básica
- [x] **Búsqueda avanzada con filtros**
- [x] Calculadoras (9)
- [x] Vademécum
- [x] Protocolos
- [x] Manual completo
- [x] **Favoritos persistentes**
- [x] **Historial real**
- [x] **Página de favoritos**
- [x] **Página de ajustes**
- [x] **Página acerca de**
- [x] **Galería de imágenes**
- [x] **Error Boundaries**
- [x] **Compartir protocolos específicos**
- [x] **Compartir fármacos específicos**
- [x] **Deep links**
### PWA / Offline
- [x] Service Worker registrado
- [x] Cache de assets
- [x] Cache de imágenes
- [x] Sistema de actualizaciones
- [x] Manifest.json
- [x] Banner de instalación
- [x] Indicador visual offline
- [ ] **Test offline completo** ⚠️ (requiere servidor)
### Contenido Visual
- [x] 48 imágenes organizadas
- [x] Galería de imágenes funcional
- [x] **Referencias en Markdown** ⚠️ (~15% hecho, 20 referencias de ~130 capítulos)
- [ ] **21 medios faltantes** ❌ (documentados)
- [ ] **Medios para ~90 capítulos** ❌ (sin imágenes)
### Error Handling
- [x] **Error Boundaries**
- [ ] **Páginas de error personalizadas** ⚠️ (mejora, no crítico)
- [x] **Manejo de errores global**
### Performance
- [x] **Lazy loading**
- [x] **Code splitting**
- [x] **Optimización de bundle**
### Contenido
- [ ] **Expandir vademécum** ❌ (5 → 30-40)
- [ ] **Interacciones medicamentosas**
- [ ] **Validación médica** ⚠️ (pendiente)
### Tests
- [ ] **Tests unitarios**
- [ ] **Tests de integración**
- [ ] **Tests E2E**
---
## 🎯 PLAN DE ACCIÓN RECOMENDADO
### Fase 1: Completar Contenido Visual (2-3 semanas)
1. **Añadir más referencias de imágenes en Markdown** (15-20 horas)
- Priorizar capítulos críticos restantes (RCP, Glasgow, Farmacología)
- Ir añadiendo progresivamente
2. **Crear 5-6 medios críticos faltantes** (20-30 horas)
- RCP paso a paso visual
- ABCDE visual completo
- Glasgow visual
- Farmacología básica visual
**Total:** ~35-50 horas
### Fase 2: Mejoras UX (✅ COMPLETADA)
1. ✅ **Búsqueda avanzada** (4-6 horas) - Completado
2. ✅ **Compartir protocolos** (3-4 horas) - Completado
3. ✅ **Deep links** (2-3 horas) - Completado
4. ⚠️ **Mejorar páginas de error** (1-2 horas) - Pendiente (baja prioridad)
**Total:** ✅ ~10-15 horas completadas
### Fase 3: Optimización (✅ COMPLETADA)
1. ✅ **Lazy loading** (4-6 horas) - Completado
2. ✅ **Code splitting** (3-4 horas) - Completado
**Total:** ✅ ~7-10 horas completadas
---
## 📊 ESTIMACIÓN TOTAL
| Fase | Esfuerzo | Prioridad | Estado |
|------|----------|-----------|--------|
| **Fase 1: Visual** | 35-50 horas | 🔴 Alta | ⚠️ En progreso (60%) |
| **Fase 2: UX** | 10-15 horas | 🟡 Media | ✅ **COMPLETADA** |
| **Fase 3: Optimización** | 7-10 horas | 🟡 Media | ✅ **COMPLETADA** |
| **Total completado** | **~17-25 horas** | | ✅ |
| **Total pendiente** | **35-50 horas** | | ⚠️ |
**Tiempo estimado restante:** 1-1.5 meses (trabajo part-time) - Solo Fase 1 pendiente
---
## 🚨 BLOQUEADORES CRÍTICOS
1. **Validación médica del contenido**
- Estado: Pendiente
- Impacto: No se puede publicar sin validación
- Acción: Contactar profesionales médicos
2. **Creación de medios visuales faltantes**
- Estado: Documentados pero no creados
- Impacto: Temas críticos sin visualización
- Acción: Crear medios prioritarios (RCP, Glasgow, ABCDE)
---
## ✅ CONCLUSIÓN
**Estado actual:** La app está **99% funcional** en términos de funcionalidades core.
**Lo que falta principalmente:**
1. **Contenido visual** (más referencias en Markdown, crear medios faltantes) - ⚠️ 60% completado
2. ~~**Búsqueda avanzada** (filtros, tags)~~ - ✅ **COMPLETADO**
3. ~~**Compartir/exportar** (protocolos específicos, PDF)~~ - ✅ **80% COMPLETADO** (falta solo PDF)
4. ~~**Optimización** (lazy loading, code splitting)~~ - ✅ **COMPLETADO**
5. **Expandir contenido** (vademécum, interacciones) - ❌ Pendiente
**Prioridad inmediata:** Completar contenido visual (Fase 1) para tener una app visualmente completa.
---
**Última actualización:** 2025-12-23

View file

@ -1,101 +0,0 @@
# PLAN DE RECURSOS MULTIMEDIA - Manual TES Digital
**Generado:** 2025-12-14 12:17:44
---
## 1. RECURSOS MVP (Prioridad: Sí)
| Capítulo | Tipo Recurso | Nombre Recurso | Ruta Sugerida | Prioridad | Estado | Prompt |
|----------|--------------|----------------|---------------|-----------|--------|--------|
| 1.1 | Imagen paso a paso (colocación/uso) | Colocación manguito TA y pulsioxímetro | `assets/images/bloque_01/B01_1.1_colocación_manguito_ta_y_pulsioxímetro.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Colocación manguito TA y pulsioxímetro. Requisitos: sin dato... (ver Excel) |
| 2.0 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.0 | `assets/images/bloque_02/B02_2.0_foto_del_equipo_dispositivo_principal_relacionado_con_2_0.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.0. R... (ver Excel) |
| 2.1 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.1 | `assets/images/bloque_02/B02_2.1_foto_del_equipo_dispositivo_principal_relacionado_con_2_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.1. R... (ver Excel) |
| 2.2 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.2 | `assets/images/bloque_02/B02_2.2_foto_del_equipo_dispositivo_principal_relacionado_con_2_2.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.2. R... (ver Excel) |
| 2.3 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.3 | `assets/images/bloque_02/B02_2.3_foto_del_equipo_dispositivo_principal_relacionado_con_2_3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.3. R... (ver Excel) |
| 2.3 | Imagen error común vs correcto | Correcto vs incorrecto para 2.3 | `assets/images/bloque_02/B02_2.3_correcto_vs_incorrecto_para_2_3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 2.3. Requisitos: sin datos perso... (ver Excel) |
| 2.4 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.4 | `assets/images/bloque_02/B02_2.4_foto_del_equipo_dispositivo_principal_relacionado_con_2_4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.4. R... (ver Excel) |
| 2.4 | Vídeo demo (30-90s) | Vídeo montaje/uso del dispositivo | `assets/videos/bloque_02/B02_2.4_vídeo_montaje_uso_del_dispositivo.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo montaje/uso del dispositivo. Con maniquí o simulación, ... (ver Excel) |
| 2.5 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.5 | `assets/images/bloque_02/B02_2.5_foto_del_equipo_dispositivo_principal_relacionado_con_2_5.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.5. R... (ver Excel) |
| 2.5 | Vídeo demo (30-90s) | Vídeo montaje/uso del dispositivo | `assets/videos/bloque_02/B02_2.5_vídeo_montaje_uso_del_dispositivo.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo montaje/uso del dispositivo. Con maniquí o simulación, ... (ver Excel) |
| 2.6 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.6 | `assets/images/bloque_02/B02_2.6_foto_del_equipo_dispositivo_principal_relacionado_con_2_6.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.6. R... (ver Excel) |
| 2.6 | Vídeo demo (30-90s) | Vídeo montaje/uso del dispositivo | `assets/videos/bloque_02/B02_2.6_vídeo_montaje_uso_del_dispositivo.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo montaje/uso del dispositivo. Con maniquí o simulación, ... (ver Excel) |
| 2.7 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.7 | `assets/images/bloque_02/B02_2.7_foto_del_equipo_dispositivo_principal_relacionado_con_2_7.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.7. R... (ver Excel) |
| 2.7 | Vídeo demo (30-90s) | Vídeo movimientos en bloque / transferencias | `assets/videos/bloque_02/B02_2.7_vídeo_movimientos_en_bloque_transferencias.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo movimientos en bloque / transferencias. Con maniquí o s... (ver Excel) |
| 2.8 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.8 | `assets/images/bloque_02/B02_2.8_foto_del_equipo_dispositivo_principal_relacionado_con_2_8.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.8. R... (ver Excel) |
| 2.8 | Vídeo demo (30-90s) | Vídeo movimientos en bloque / transferencias | `assets/videos/bloque_02/B02_2.8_vídeo_movimientos_en_bloque_transferencias.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo movimientos en bloque / transferencias. Con maniquí o s... (ver Excel) |
| 2.9 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.9 | `assets/images/bloque_02/B02_2.9_foto_del_equipo_dispositivo_principal_relacionado_con_2_9.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.9. R... (ver Excel) |
| 2.10 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.10 | `assets/images/bloque_02/B02_2.10_foto_del_equipo_dispositivo_principal_relacionado_con_2_10.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.10. ... (ver Excel) |
| 2.10 | Imagen error común vs correcto | Correcto vs incorrecto para 2.10 | `assets/images/bloque_02/B02_2.10_correcto_vs_incorrecto_para_2_10.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 2.10. Requisitos: sin datos pers... (ver Excel) |
| 2.11 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.11 | `assets/images/bloque_02/B02_2.11_foto_del_equipo_dispositivo_principal_relacionado_con_2_11.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.11. ... (ver Excel) |
| 2.11 | Imagen error común vs correcto | Correcto vs incorrecto para 2.11 | `assets/images/bloque_02/B02_2.11_correcto_vs_incorrecto_para_2_11.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 2.11. Requisitos: sin datos pers... (ver Excel) |
| 2.11 | Imagen paso a paso (colocación/uso) | Binder: colocación en trocánteres | `assets/images/bloque_02/B02_2.11_binder_colocación_en_trocánteres.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Binder: colocación en trocánteres. Requisitos: sin datos per... (ver Excel) |
| 2.11 | Vídeo demo (30-90s) | Vídeo binder: colocación y verificación | `assets/videos/bloque_02/B02_2.11_vídeo_binder_colocación_y_verificación.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo binder: colocación y verificación. Con maniquí o simula... (ver Excel) |
| 2.12 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.12 | `assets/images/bloque_02/B02_2.12_foto_del_equipo_dispositivo_principal_relacionado_con_2_12.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.12. ... (ver Excel) |
| 2.12 | Imagen error común vs correcto | Correcto vs incorrecto para 2.12 | `assets/images/bloque_02/B02_2.12_correcto_vs_incorrecto_para_2_12.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 2.12. Requisitos: sin datos pers... (ver Excel) |
| 2.13 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.13 | `assets/images/bloque_02/B02_2.13_foto_del_equipo_dispositivo_principal_relacionado_con_2_13.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.13. ... (ver Excel) |
| 2.13 | Imagen error común vs correcto | Correcto vs incorrecto para 2.13 | `assets/images/bloque_02/B02_2.13_correcto_vs_incorrecto_para_2_13.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 2.13. Requisitos: sin datos pers... (ver Excel) |
| 2.X | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 2.X | `assets/images/bloque_02/B02_2.X_foto_del_equipo_dispositivo_principal_relacionado_con_2_x.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 2.X. R... (ver Excel) |
| 3.0 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.0 | `assets/images/bloque_03/B03_3.0_foto_del_equipo_dispositivo_principal_relacionado_con_3_0.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.0. R... (ver Excel) |
| 3.0 | Diagrama simple (sin infografía compleja) | Ejemplos de cálculo de O2 (tabla simple) | `assets/images/bloque_03/B03_3.0_ejemplos_de_cálculo_de_o2_tabla_simple.png` | Alta | Pendiente | Crea un DIAGRAMA SIMPLE (sin infografía compleja) para: Ejemplos de cálculo de O2 (tabla simple).... (ver Excel) |
| 3.0 | Vídeo demo (30-90s) | Vídeo verificación O2 + fuga | `assets/videos/bloque_03/B03_3.0_vídeo_verificación_o2_fuga.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo verificación O2 + fuga. Con maniquí o simulación, sin p... (ver Excel) |
| 3.1 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.1 | `assets/images/bloque_03/B03_3.1_foto_del_equipo_dispositivo_principal_relacionado_con_3_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.1. R... (ver Excel) |
| 3.1 | Imagen error común vs correcto | Correcto vs incorrecto para 3.1 | `assets/images/bloque_03/B03_3.1_correcto_vs_incorrecto_para_3_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 3.1. Requisitos: sin datos perso... (ver Excel) |
| 3.2 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.2 | `assets/images/bloque_03/B03_3.2_foto_del_equipo_dispositivo_principal_relacionado_con_3_2.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.2. R... (ver Excel) |
| 3.2 | Vídeo demo (30-90s) | Aspiración: preparación + uso + post-uso | `assets/videos/bloque_03/B03_3.2_aspiración_preparación_uso_post_uso.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Aspiración: preparación + uso + post-uso. Con maniquí o simul... (ver Excel) |
| 3.3 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.3 | `assets/images/bloque_03/B03_3.3_foto_del_equipo_dispositivo_principal_relacionado_con_3_3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.3. R... (ver Excel) |
| 3.3 | Imagen error común vs correcto | Correcto vs incorrecto para 3.3 | `assets/images/bloque_03/B03_3.3_correcto_vs_incorrecto_para_3_3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 3.3. Requisitos: sin datos perso... (ver Excel) |
| 3.3 | Vídeo demo (30-90s) | BVM a dos TES (sello + ventilación) | `assets/videos/bloque_03/B03_3.3_bvm_a_dos_tes_sello_ventilación.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: BVM a dos TES (sello + ventilación). Con maniquí o simulación... (ver Excel) |
| 3.4 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.4 | `assets/images/bloque_03/B03_3.4_foto_del_equipo_dispositivo_principal_relacionado_con_3_4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.4. R... (ver Excel) |
| 3.5 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.5 | `assets/images/bloque_03/B03_3.5_foto_del_equipo_dispositivo_principal_relacionado_con_3_5.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.5. R... (ver Excel) |
| 3.5 | Plantilla / dataset (JSON/CSV) | Checklist app (JSON) vía aérea | `assets/templates/bloque_03/B03_3.5_checklist_app_json_vía_aérea.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Checklist app (JSON) vía aérea. Formato JSON para app. Campos cl... (ver Excel) |
| 3.6 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.6 | `assets/images/bloque_03/B03_3.6_foto_del_equipo_dispositivo_principal_relacionado_con_3_6.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.6. R... (ver Excel) |
| 3.7 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.7 | `assets/images/bloque_03/B03_3.7_foto_del_equipo_dispositivo_principal_relacionado_con_3_7.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.7. R... (ver Excel) |
| 3.8 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.8 | `assets/images/bloque_03/B03_3.8_foto_del_equipo_dispositivo_principal_relacionado_con_3_8.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.8. R... (ver Excel) |
| 3.9 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.9 | `assets/images/bloque_03/B03_3.9_foto_del_equipo_dispositivo_principal_relacionado_con_3_9.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.9. R... (ver Excel) |
| 3.10 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.10 | `assets/images/bloque_03/B03_3.10_foto_del_equipo_dispositivo_principal_relacionado_con_3_10.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.10. ... (ver Excel) |
| 3.11 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.11 | `assets/images/bloque_03/B03_3.11_foto_del_equipo_dispositivo_principal_relacionado_con_3_11.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.11. ... (ver Excel) |
| 3.12 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.12 | `assets/images/bloque_03/B03_3.12_foto_del_equipo_dispositivo_principal_relacionado_con_3_12.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.12. ... (ver Excel) |
| 3.13 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.13 | `assets/images/bloque_03/B03_3.13_foto_del_equipo_dispositivo_principal_relacionado_con_3_13.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.13. ... (ver Excel) |
| 3.14 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.14 | `assets/images/bloque_03/B03_3.14_foto_del_equipo_dispositivo_principal_relacionado_con_3_14.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.14. ... (ver Excel) |
| 3.15 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.15 | `assets/images/bloque_03/B03_3.15_foto_del_equipo_dispositivo_principal_relacionado_con_3_15.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.15. ... (ver Excel) |
| 3.16 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.16 | `assets/images/bloque_03/B03_3.16_foto_del_equipo_dispositivo_principal_relacionado_con_3_16.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.16. ... (ver Excel) |
| 3.17 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.17 | `assets/images/bloque_03/B03_3.17_foto_del_equipo_dispositivo_principal_relacionado_con_3_17.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.17. ... (ver Excel) |
| 3.18 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.18 | `assets/images/bloque_03/B03_3.18_foto_del_equipo_dispositivo_principal_relacionado_con_3_18.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.18. ... (ver Excel) |
| 3.X | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.X | `assets/images/bloque_03/B03_3.X_foto_del_equipo_dispositivo_principal_relacionado_con_3_x.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.X. R... (ver Excel) |
| 3.X2 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.X2 | `assets/images/bloque_03/B03_3.X2_foto_del_equipo_dispositivo_principal_relacionado_con_3_x2.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.X2. ... (ver Excel) |
| 3.X2 | Plantilla / dataset (JSON/CSV) | Checklists app (JSON/CSV) | `assets/templates/bloque_03/B03_3.X2_checklists_app_json_csv.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Checklists app (JSON/CSV). Formato JSON para app. Campos claros,... (ver Excel) |
| 3.X3 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.X3 | `assets/images/bloque_03/B03_3.X3_foto_del_equipo_dispositivo_principal_relacionado_con_3_x3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.X3. ... (ver Excel) |
| 3.X3 | Plantilla / dataset (JSON/CSV) | Checklists app (JSON/CSV) | `assets/templates/bloque_03/B03_3.X3_checklists_app_json_csv.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Checklists app (JSON/CSV). Formato JSON para app. Campos claros,... (ver Excel) |
| 3.X4 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.X4 | `assets/images/bloque_03/B03_3.X4_foto_del_equipo_dispositivo_principal_relacionado_con_3_x4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.X4. ... (ver Excel) |
| 3.X5 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.X5 | `assets/images/bloque_03/B03_3.X5_foto_del_equipo_dispositivo_principal_relacionado_con_3_x5.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.X5. ... (ver Excel) |
| 3.X5 | Plantilla / dataset (JSON/CSV) | Checklists app (JSON/CSV) | `assets/templates/bloque_03/B03_3.X5_checklists_app_json_csv.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Checklists app (JSON/CSV). Formato JSON para app. Campos claros,... (ver Excel) |
| 3.99 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 3.99 | `assets/images/bloque_03/B03_3.99_foto_del_equipo_dispositivo_principal_relacionado_con_3_99.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 3.99. ... (ver Excel) |
| 4.0 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.0 | `assets/images/bloque_04/B04_4.0_foto_del_equipo_dispositivo_principal_relacionado_con_4_0.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.0. R... (ver Excel) |
| 4.1 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.1 | `assets/images/bloque_04/B04_4.1_foto_del_equipo_dispositivo_principal_relacionado_con_4_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.1. R... (ver Excel) |
| 4.1 | Imagen error común vs correcto | Correcto vs incorrecto para 4.1 | `assets/images/bloque_04/B04_4.1_correcto_vs_incorrecto_para_4_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 4.1. Requisitos: sin datos perso... (ver Excel) |
| 4.1 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.1 | `assets/images/bloque_04/B04_4.1_secuencia_visual_4_1.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.1. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.1 | Vídeo demo (30-90s) | Vídeo demo 4.1 | `assets/videos/bloque_04/B04_4.1_vídeo_demo_4_1.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.1. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 4.2 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.2 | `assets/images/bloque_04/B04_4.2_foto_del_equipo_dispositivo_principal_relacionado_con_4_2.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.2. R... (ver Excel) |
| 4.3 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.3 | `assets/images/bloque_04/B04_4.3_foto_del_equipo_dispositivo_principal_relacionado_con_4_3.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.3. R... (ver Excel) |
| 4.4 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.4 | `assets/images/bloque_04/B04_4.4_foto_del_equipo_dispositivo_principal_relacionado_con_4_4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.4. R... (ver Excel) |
| 4.4 | Imagen error común vs correcto | Correcto vs incorrecto para 4.4 | `assets/images/bloque_04/B04_4.4_correcto_vs_incorrecto_para_4_4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Correcto vs incorrecto para 4.4. Requisitos: sin datos perso... (ver Excel) |
| 4.4 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.4 | `assets/images/bloque_04/B04_4.4_secuencia_visual_4_4.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.4. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.4 | Vídeo demo (30-90s) | Vídeo demo 4.4 | `assets/videos/bloque_04/B04_4.4_vídeo_demo_4_4.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.4. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 4.4 | Imagen error común vs correcto | DESA: colocación electrodos correcta vs incorrecta | `assets/images/bloque_04/B04_4.4_desa_colocación_electrodos_correcta_vs_incorrecta.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: DESA: colocación electrodos correcta vs incorrecta. Requisit... (ver Excel) |
| 4.5 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.5 | `assets/images/bloque_04/B04_4.5_foto_del_equipo_dispositivo_principal_relacionado_con_4_5.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.5. R... (ver Excel) |
| 4.6 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.6 | `assets/images/bloque_04/B04_4.6_foto_del_equipo_dispositivo_principal_relacionado_con_4_6.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.6. R... (ver Excel) |
| 4.6 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.6 | `assets/images/bloque_04/B04_4.6_secuencia_visual_4_6.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.6. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.6 | Vídeo demo (30-90s) | Vídeo demo 4.6 | `assets/videos/bloque_04/B04_4.6_vídeo_demo_4_6.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.6. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 4.7 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.7 | `assets/images/bloque_04/B04_4.7_foto_del_equipo_dispositivo_principal_relacionado_con_4_7.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.7. R... (ver Excel) |
| 4.7 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.7 | `assets/images/bloque_04/B04_4.7_secuencia_visual_4_7.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.7. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.7 | Vídeo demo (30-90s) | Vídeo demo 4.7 | `assets/videos/bloque_04/B04_4.7_vídeo_demo_4_7.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.7. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 4.8 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.8 | `assets/images/bloque_04/B04_4.8_foto_del_equipo_dispositivo_principal_relacionado_con_4_8.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.8. R... (ver Excel) |
| 4.8 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.8 | `assets/images/bloque_04/B04_4.8_secuencia_visual_4_8.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.8. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.8 | Vídeo demo (30-90s) | Vídeo demo 4.8 | `assets/videos/bloque_04/B04_4.8_vídeo_demo_4_8.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.8. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 4.9 | Imagen referencia (material/landmark) | Foto del equipo/dispositivo principal relacionado con 4.9 | `assets/images/bloque_04/B04_4.9_foto_del_equipo_dispositivo_principal_relacionado_con_4_9.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Foto del equipo/dispositivo principal relacionado con 4.9. R... (ver Excel) |
| 4.9 | Imagen paso a paso (colocación/uso) | Secuencia visual 4.9 | `assets/images/bloque_04/B04_4.9_secuencia_visual_4_9.jpg` | Alta | Pendiente | Genera/obtén una FOTO realista para: Secuencia visual 4.9. Requisitos: sin datos personales, sin ... (ver Excel) |
| 4.9 | Vídeo demo (30-90s) | Vídeo demo 4.9 | `assets/videos/bloque_04/B04_4.9_vídeo_demo_4_9.mp4` | Alta | Pendiente | Graba un VÍDEO DEMO (60-120s) para: Vídeo demo 4.9. Con maniquí o simulación, sin pacientes reale... (ver Excel) |
| 8.0 | Plantilla / dataset (JSON/CSV) | Plantilla informe/registro (CSV/JSON) | `assets/templates/bloque_08/B08_8.0_plantilla_informe_registro_csv_json.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Plantilla informe/registro (CSV/JSON). Formato JSON para app. Ca... (ver Excel) |
| 8.1 | Plantilla / dataset (JSON/CSV) | Plantilla informe/registro (CSV/JSON) | `assets/templates/bloque_08/B08_8.1_plantilla_informe_registro_csv_json.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Plantilla informe/registro (CSV/JSON). Formato JSON para app. Ca... (ver Excel) |
| 8.2 | Plantilla / dataset (JSON/CSV) | Plantilla informe/registro (CSV/JSON) | `assets/templates/bloque_08/B08_8.2_plantilla_informe_registro_csv_json.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Plantilla informe/registro (CSV/JSON). Formato JSON para app. Ca... (ver Excel) |
| 8.3 | Plantilla / dataset (JSON/CSV) | Plantilla informe/registro (CSV/JSON) | `assets/templates/bloque_08/B08_8.3_plantilla_informe_registro_csv_json.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Plantilla informe/registro (CSV/JSON). Formato JSON para app. Ca... (ver Excel) |
| 8.4 | Plantilla / dataset (JSON/CSV) | Plantilla informe/registro (CSV/JSON) | `assets/templates/bloque_08/B08_8.4_plantilla_informe_registro_csv_json.json` | Alta | Pendiente | Crea una PLANTILLA/DATASET para: Plantilla informe/registro (CSV/JSON). Formato JSON para app. Ca... (ver Excel) |
---

View file

@ -1,133 +0,0 @@
# 📤 Cambios Pendientes para GitHub
**Fecha:** 2025-12-17
---
## 📊 Estado Actual
**Código inicial subido a GitHub**
⏳ **Cambios de limpieza pendientes de subir**
---
## 🔄 Cambios Pendientes
### Archivos Modificados
1. **`src/data/manual-index.ts`**
- ✅ Rutas actualizadas de `manual-tes/...` a `/manual/...`
- ✅ 93 rutas actualizadas
2. **`src/pages/ManualViewer.tsx`**
- ✅ Simplificado para usar rutas directas del índice
- ✅ Eliminada lógica de conversión de rutas
### Archivos Nuevos (Sin Rastrear)
1. **Scripts de Limpieza:**
- `scripts/limpiar_manual.py` - Script de limpieza e integración
- `scripts/actualizar_rutas_indice.py` - Script de actualización de rutas
2. **Documentación:**
- `REPORTE_LIMPIEZA_MANUAL.md` - Reporte detallado de limpieza
- `RESUMEN_LIMPIEZA_COMPLETA.md` - Resumen ejecutivo
- `LIMPIEZA_COMPLETADA.md` - Documentación final
- `DEPLOYMENT_GITHUB.md` - Guía de despliegue
- `COMANDOS_GIT.md` - Comandos Git útiles
- `INSTRUCCIONES_PUSH.md` - Instrucciones de push
- `PUSH_FINAL.md` - Guía final de push
3. **Backup:**
- `backup_manual_pre_limpieza/` - Backup completo (432 archivos)
---
## 🚀 Comandos para Subir Cambios
### Opción 1: Subir Todo (Recomendado)
```bash
cd /home/planetazuzu/protocolo-r-pido
# Agregar todos los cambios
git add .
# Hacer commit
git commit -m "feat: Limpieza e integración completa del Manual TES
- Actualizadas 93 rutas en manual-index.ts para apuntar a /manual/
- Simplificado ManualViewer para usar rutas directas
- Agregados scripts de limpieza y actualización
- Documentación completa de la limpieza
- Backup completo de archivos originales
- 93 archivos del manual organizados en public/manual/"
# Subir cambios
git push origin main
```
### Opción 2: Subir Solo Cambios Esenciales
```bash
cd /home/planetazuzu/protocolo-r-pido
# Solo archivos modificados (sin backup ni docs)
git add src/data/manual-index.ts src/pages/ManualViewer.tsx
# Commit
git commit -m "fix: Actualizar rutas del manual a /manual/"
# Push
git push origin main
```
### Opción 3: Excluir Backup del Repositorio
```bash
cd /home/planetazuzu/protocolo-r-pido
# Agregar .gitignore para backup si no existe
echo "backup_manual_pre_limpieza/" >> .gitignore
# Agregar cambios (sin backup)
git add src/ scripts/ *.md
git add .gitignore
# Commit y push
git commit -m "feat: Limpieza e integración completa"
git push origin main
```
---
## 📋 Checklist Antes de Subir
- [ ] Verificar que `public/manual/` tenga los 93 archivos
- [ ] Verificar que las rutas en `manual-index.ts` sean correctas
- [ ] Probar localmente que la app funcione (`npm run dev`)
- [ ] Decidir si incluir el backup en el repositorio (recomendado: NO)
- [ ] Revisar qué documentación incluir
---
## ⚠️ Recomendaciones
### ✅ Incluir en el Repositorio
- ✅ Código fuente (`src/`)
- ✅ Scripts de utilidad (`scripts/`)
- ✅ Documentación esencial (`*.md` excepto backups)
- ✅ Configuración (`package.json`, `vite.config.ts`, etc.)
### ❌ NO Incluir en el Repositorio
- ❌ Backup completo (`backup_manual_pre_limpieza/`) - Muy pesado
- ❌ `node_modules/` - Ya está en `.gitignore`
- ❌ `dist/` - Se genera en build
---
## 🎯 Próximos Pasos Sugeridos
1. **Subir cambios de limpieza** (este documento)
2. **Configurar despliegue automático** (Vercel/Netlify/GitHub Pages)
3. **Probar la aplicación en producción**
4. **Documentar el proceso de despliegue**
---
**¿Quieres que suba estos cambios ahora o prefieres hacerlo manualmente?**

View file

@ -1,89 +0,0 @@
# 📤 Comandos para Subir a GitHub
**Repositorio:** https://github.com/planetazuzu/guia-tes-digital
---
## ✅ Estado Actual
- ✅ Git inicializado
- ✅ Remote configurado: `origin` → https://github.com/planetazuzu/guia-tes-digital.git
- ✅ Contenido remoto traído
---
## 🚀 Próximos Pasos
### 1. Hacer Commit
```bash
cd /home/planetazuzu/protocolo-r-pido
git add .
git commit -m "feat: Aplicación completa Manual TES Digital
- Integración de 93 capítulos del manual completo
- Componente MarkdownViewer para renderizar archivos .md
- Navegación jerárquica completa (ManualIndex)
- Sistema de búsqueda mejorado (busca en parte/bloque/capítulo)
- Página ManualViewer con navegación anterior/siguiente
- Scripts de verificación del manual
- Puerto configurado en 8096
- Configuración de despliegue (Vercel, Netlify, GitHub Pages)
- Todos los problemas detectados corregidos"
```
### 2. Subir al Repositorio
```bash
git push -u origin main
```
---
## ⚠️ Si Pide Autenticación
### Opción 1: Personal Access Token
1. Ve a: https://github.com/settings/tokens
2. Genera un token con permisos `repo`
3. Usa el token como contraseña cuando git lo pida
### Opción 2: SSH
```bash
# Cambiar a SSH
git remote set-url origin git@github.com:planetazuzu/guia-tes-digital.git
git push -u origin main
```
---
## 📋 Archivos que se Subirán
- ✅ Todo el código fuente (`src/`)
- ✅ Archivos de configuración
- ✅ Los 93 archivos .md del manual (`public/manual/`)
- ✅ Scripts de verificación
- ✅ Documentación
**NO se subirán:**
- ❌ `node_modules/` (se instalan con `npm install`)
- ❌ `dist/` (se genera con `npm run build`)
---
## ✅ Verificación Post-Push
Después del push, verificar en:
https://github.com/planetazuzu/guia-tes-digital
Debe mostrar:
- ✅ Carpeta `src/` con todo el código
- ✅ Carpeta `public/manual/` con los 93 archivos .md
- ✅ Archivos de configuración
- ✅ README.md actualizado
---
**¿Ejecuto el commit y push ahora?**

View file

@ -1,40 +0,0 @@
# Mensaje de Commit para GitHub
## Título del Commit
```
fix: Renumeración Bloque 2→4 (Soporte Vital) y resolución de conflictos organizacionales
```
## Descripción Detallada
```
🔧 CORRECCIONES CRÍTICAS DE ORGANIZACIÓN
### Renumeración Bloque 2 → 4 (Soporte Vital Básico)
- Resuelto conflicto crítico: dos bloques compartían numeración "Bloque 2"
- Renumerados 9 archivos de BLOQUE_02_* → BLOQUE_04_*
- Actualizados títulos internos: 2.0-2.8 → 4.0-4.8
- Actualizadas referencias cruzadas en múltiples capítulos
### Resolución de Duplicidades
- Glucómetro: Convertido 3.11 a redirect hacia 1.7 (ubicación definitiva)
- Actualizadas referencias a Glucómetro (3.11, 1.5 → 1.7)
### Documentación
- Generado DIAGNOSTICO_ORGANIZACIONAL_CRITICO.md
- Generado PLAN_RENUMERACION_COMPLETO.md
- Generado INFORME_RENUMERACION_BLOQUE_2_4.md
### Archivos Afectados
- 9 archivos renumerados (03_SOPORTE_VITAL_BASICO/)
- 10+ archivos con referencias actualizadas
- 1 archivo convertido a redirect (BLOQUE_03_11_GLUCOMETRO.md)
### Próximos Pasos Documentados
- Resolver duplicidades restantes (Collarín, Errores)
- Buscar bloques faltantes (7-14)
- Completar contenido vacío (Bloque 8: 8.0-8.4)
Fixes: Conflictos de numeración detectados en auditoría organizacional
```

View file

@ -1,202 +0,0 @@
# 🚀 Guía de Deployment - EMERGES TES
Esta guía explica cómo desplegar EMERGES TES en un servidor propio (VPS Ubuntu).
## 📋 Requisitos del Servidor
- **OS:** Ubuntu 20.04+ o similar
- **RAM:** Mínimo 512MB (recomendado 1GB+)
- **CPU:** 1 core mínimo
- **Espacio:** 2GB+ para aplicación y dependencias
- **Node.js:** v18+ (solo para build, no necesario en producción)
- **Nginx:** Para servir archivos estáticos
## 🔧 Instalación Inicial
### 1. Instalar Node.js (para build)
```bash
# Usar nvm (recomendado)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
# O instalar directamente
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
```
### 2. Instalar Nginx
```bash
sudo apt update
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
```
### 3. Clonar y preparar proyecto
```bash
# Crear directorio
sudo mkdir -p /var/www/emerges-tes
sudo chown $USER:$USER /var/www/emerges-tes
# Clonar repositorio (o subir archivos)
cd /var/www/emerges-tes
git clone <tu-repo> .
# Instalar dependencias
npm ci
```
## 🏗️ Build de Producción
```bash
# Build estático
npm run build
# Verificar que se creó el directorio dist/
ls -la dist/
```
El directorio `dist/` contiene todos los archivos estáticos listos para servir.
## ⚙️ Configuración Nginx
### 1. Crear configuración
```bash
sudo nano /etc/nginx/sites-available/emerges-tes
```
Copiar contenido de `nginx.conf.example` y ajustar:
- `server_name`: tu dominio
- `root`: ruta a `/var/www/emerges-tes/dist`
### 2. Activar sitio
```bash
sudo ln -s /etc/nginx/sites-available/emerges-tes /etc/nginx/sites-enabled/
sudo nginx -t # Verificar configuración
sudo systemctl reload nginx
```
### 3. Verificar permisos
```bash
sudo chown -R www-data:www-data /var/www/emerges-tes/dist
sudo chmod -R 755 /var/www/emerges-tes/dist
```
## 🔒 SSL con Let's Encrypt (Opcional pero Recomendado)
```bash
# Instalar Certbot
sudo apt install -y certbot python3-certbot-nginx
# Obtener certificado
sudo certbot --nginx -d emergestes.com -d www.emergestes.com
# Renovación automática (ya configurado)
sudo certbot renew --dry-run
```
## 🔄 Deploy Automático
### Opción 1: Script de deploy
```bash
# Hacer ejecutable
chmod +x deploy.sh
# Ejecutar deploy
./deploy.sh
```
### Opción 2: Deploy manual
```bash
# 1. Actualizar código
git pull origin main
# 2. Instalar dependencias (si hay cambios)
npm ci
# 3. Build
npm run build
# 4. Verificar
ls -la dist/
# 5. Nginx se sirve automáticamente desde dist/
# Si necesitas forzar recarga:
sudo systemctl reload nginx
```
## 📊 Monitoreo (Opcional)
### PM2 (solo si necesitas servidor Node.js)
```bash
# Instalar PM2
npm install -g pm2
# Usar solo para preview/desarrollo
pm2 start ecosystem.config.js
pm2 save
pm2 startup # Configurar inicio automático
```
**Nota:** Para producción, Nginx sirviendo archivos estáticos es más eficiente que PM2.
## 🔍 Verificación Post-Deploy
1. **Verificar que la app carga:**
```bash
curl http://localhost
```
2. **Verificar rutas SPA:**
- Visitar `/herramientas`, `/farmacos`, etc.
- Todas deben funcionar sin 404
3. **Verificar Service Worker:**
- Abrir DevTools > Application > Service Workers
- Debe estar registrado
4. **Verificar PWA:**
- Debe poder instalarse en móvil
- Debe funcionar offline
## 🐛 Troubleshooting
### Error 502 Bad Gateway
- Verificar que Nginx está corriendo: `sudo systemctl status nginx`
- Verificar logs: `sudo tail -f /var/log/nginx/error.log`
### Rutas 404 en SPA
- Verificar que `try_files` en nginx incluye `/index.html`
- Verificar que `base` en `vite.config.ts` es correcto
### Service Worker no funciona
- Verificar que `sw.js` está en `dist/`
- Verificar headers de cache en nginx
### Build falla
- Verificar Node.js versión: `node --version` (debe ser 18+)
- Limpiar cache: `rm -rf node_modules dist && npm ci && npm run build`
## 📝 Notas Importantes
- **No necesitas Node.js corriendo en producción** - Nginx sirve archivos estáticos
- **El build se hace en el servidor** - No subir `node_modules` ni `dist/` al repo
- **Actualizaciones:** Solo hacer `git pull` + `npm run build` + recargar Nginx
- **Backup:** Considerar hacer backup de `dist/` antes de cada deploy
## 🔗 Enlaces Útiles
- [Nginx Documentation](https://nginx.org/en/docs/)
- [Let's Encrypt](https://letsencrypt.org/)
- [Vite Build](https://vitejs.dev/guide/build.html)

View file

@ -1,174 +0,0 @@
# ✅ Estado Final: Imágenes Organizadas para PWA
**Fecha:** 2025-12-23
**Estado:** ✅ **COMPLETADO**
---
## 📊 RESUMEN EJECUTIVO
| Aspecto | Estado | Detalles |
|---------|--------|----------|
| **Imágenes organizadas** | ✅ | 48 de 49 (98%) |
| **Estructura creada** | ✅ | 5 bloques organizados |
| **Build verificado** | ✅ | Imágenes incluidas en `dist/` |
| **Service Worker** | ✅ | Configurado para cachear |
| **PWA Offline** | ✅ | Lista para funcionar |
---
## 📁 DISTRIBUCIÓN DE IMÁGENES
```
public/assets/infografias/
├── bloque-0-fundamentos/ → 9 imágenes
│ └── Algoritmos, flujos, oxigenoterapia
├── bloque-2-inmovilizacion/ → 27 imágenes
│ └── Collarín, tablero, colchón, camilla
├── bloque-3-material-sanitario/ → 9 imágenes
│ └── Pulsioxímetro, tensiómetro, AMBU, cánulas
├── bloque-7-conduccion/ → 1 imagen
│ └── Configuración GPS
└── bloque-12-marco-legal/ → 2 imágenes
└── Decisiones éticas
```
**Total:** 48 imágenes organizadas
---
## ✅ VERIFICACIONES COMPLETADAS
### 1. Organización
- ✅ Imágenes movidas desde `imagenes-pendientes/` a `public/assets/infografias/`
- ✅ Estructura de carpetas creada
- ✅ Nombres de archivo preservados
### 2. Build
- ✅ `npm run build` ejecutado exitosamente
- ✅ Imágenes copiadas a `dist/assets/infografias/`
- ✅ Estructura de carpetas mantenida
### 3. Service Worker
- ✅ Configurado para cachear rutas `/assets/infografias/`
- ✅ Estrategia cache-first (offline-first)
- ✅ Cache automático al cargar imágenes
### 4. Vite Config
- ✅ `copyPublicDir: true` activado
- ✅ Imágenes incluidas en build
- ✅ Estructura de carpetas preservada
---
## ⚠️ PENDIENTE
### 1. Imagen No Mapeada
**Archivo:** `7 Mandamientos Movilización Segura Paciente.png`
**Ubicación:** `imagenes-pendientes/`
**Acción:** Revisar y mover a `bloque-2-inmovilizacion/` (probablemente)
---
### 2. Referencias en Markdown
**Estado:** ⏳ Pendiente
**Acción requerida:** Añadir referencias en archivos `.md` del manual:
**Ejemplo:**
```markdown
![Colocación de collarín - Paso 1](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
```
**Archivos a editar:**
- `MANUAL_TES_DIGITAL/02_MATERIAL_E_INMOVILIZACION/...`
- `MANUAL_TES_DIGITAL/00_FUNDAMENTOS/...`
- `MANUAL_TES_DIGITAL/03_MATERIAL_SANITARIO/...`
- etc.
---
## 🎯 PRÓXIMOS PASOS
### Paso 1: Mover Imagen Pendiente
```bash
# Revisar y mover manualmente
cp "imagenes-pendientes/7 Mandamientos Movilización Segura Paciente.png" \
public/assets/infografias/bloque-2-inmovilizacion/
```
### Paso 2: Añadir Referencias en Markdown
Editar archivos del manual para incluir imágenes relevantes.
### Paso 3: Test Offline
1. Cargar app con imágenes
2. DevTools > Network > Offline
3. Verificar que las imágenes cargan desde cache
---
## 📝 ARCHIVOS CREADOS/MODIFICADOS
### Scripts
- ✅ `scripts/organizar_imagenes_auto.py` - Script de organización automática
### Documentación
- ✅ `GUIA_INTEGRAR_IMAGENES_PWA.md` - Guía completa
- ✅ `RESUMEN_ORGANIZACION_IMAGENES.md` - Resumen de organización
- ✅ `RESUMEN_PWA_IMAGENES.md` - Resumen técnico
- ✅ `ESTADO_INFOGRAFIAS_MEDIOS.md` - Estado de medios
### Configuración
- ✅ `public/sw.js` - Service Worker actualizado
- ✅ `vite.config.ts` - Configuración de build actualizada
---
## 🚀 FUNCIONAMIENTO PWA
### Cómo Funciona
1. **Usuario carga página** con imagen en Markdown
2. **Navegador solicita** imagen desde `/assets/infografias/...`
3. **Service Worker intercepta** y cachea la imagen
4. **Siguiente visita offline:** Imagen se sirve desde cache
5. **Resultado:** PWA funciona completamente offline con imágenes
### Verificación
```bash
# Build
npm run build
# Verificar imágenes en dist/
find dist/assets/infografias -type f | wc -l
# Debe mostrar: 48
# Preview local
npm run preview
# Abrir en navegador y verificar que las imágenes cargan
```
---
## ✅ CONCLUSIÓN
**Estado:** ✅ **COMPLETADO**
Las imágenes están:
- ✅ Organizadas en `public/assets/infografias/`
- ✅ Incluidas en el build (`dist/`)
- ✅ Configuradas para cache en Service Worker
- ✅ Listas para funcionar offline en PWA
**Solo falta:**
- ⏳ Añadir referencias en archivos Markdown del manual
- ⏳ Mover 1 imagen pendiente
**La PWA está lista para funcionar offline con imágenes una vez que se añadan las referencias en el manual.**

View file

@ -1,245 +0,0 @@
# 📊 ESTADO ACTUAL DE HERRAMIENTAS - ACTUALIZADO
**Fecha de análisis:** 2025-01-27
**Última verificación:** Código fuente revisado
---
## ✅ HERRAMIENTAS IMPLEMENTADAS Y COMPLETAS (100%)
### 1. ✅ Calculadora de Glasgow (GCS)
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/GlasgowCalculator.tsx`
**Funcionalidades:**
- ✅ Escala completa (Apertura Ocular, Respuesta Verbal, Respuesta Motora)
- ✅ Cálculo automático del score
- ✅ Interpretación del resultado (TCE Grave/Moderado/Leve)
- ✅ UI completa y funcional
---
### 2. ✅ Fórmula de Parkland (Quemados)
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/ParklandCalculator.tsx`
**Funcionalidades:**
- ✅ Cálculo de líquidos totales en primeras 24h
- ✅ Distribución 50% primeras 8h / 50% siguientes 16h
- ✅ Cálculo de velocidades de infusión
- ✅ Ajuste según tiempo transcurrido desde la quemadura
- ✅ Cálculo de mantenimiento después de 24h
- ✅ Advertencias y consideraciones clínicas
- ✅ Validación de inputs
- ✅ UI completa y funcional
---
### 3. ✅ Dosis Pediátricas por Peso
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/PediatricDoseCalculator.tsx`
**Funcionalidades:**
- ✅ Selección de fármaco de lista de 10 fármacos comunes
- ✅ Cálculo automático de dosis por peso (mg/kg)
- ✅ Conversión a volumen (ml) según concentración
- ✅ Aplicación de dosis mínima y máxima
- ✅ Advertencias cuando se excede dosis máxima
- ✅ Información detallada del fármaco (presentación, concentración, vía)
- ✅ Notas importantes por fármaco
- ✅ Validación de inputs
- ✅ Recordatorios de verificación obligatoria
- ✅ UI completa y funcional
**Fármacos incluidos:** 10 fármacos (Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol, Furosemida, Morfina, Naloxona, Glucosa)
---
### 4. ✅ Temporizador de RCP
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/RCPTimer.tsx`
**Funcionalidades:**
- ✅ Temporizador de 2 minutos por ciclo
- ✅ Alertas sonoras/visuales (Web Audio API)
- ✅ Contador de ciclos completados
- ✅ Recordatorio de cambio de reanimador
- ✅ Barra de progreso visual
- ✅ Alerta cuando quedan 10 segundos para cambio
- ✅ Pausa y reinicio
- ✅ UI completa y funcional
**Nota:** El documento `HERRAMIENTAS_FALTANTES.md` indica que NO está implementada, pero **SÍ LO ESTÁ** y está completa.
---
### 5. ✅ Calculadora de Duración de Botella de Oxígeno
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/OxygenDurationCalculator.tsx`
**Funcionalidades:**
- ✅ Selección de tamaño de botella (D, E, M, G, H)
- ✅ Entrada de presión actual (PSI)
- ✅ Entrada de flujo de oxígeno (L/min)
- ✅ Cálculo de duración estimada
- ✅ Conversión a horas y minutos
- ✅ Advertencias cuando la botella tiene poca duración
- ✅ Validación de inputs
- ✅ UI completa y funcional
**Nota:** El documento `HERRAMIENTAS_FALTANTES.md` indica que NO está implementada, pero **SÍ LO ESTÁ** y está completa.
---
### 6. ✅ Calculadora de Goteo
**Estado:** ✅ **100% COMPLETA**
**Archivo:** `src/components/tools/DripRateCalculator.tsx`
**Funcionalidades:**
- ✅ Cálculo de gotas por minuto
- ✅ Cálculo de ml por hora
- ✅ Selección de factor de goteo (20, 60, 15 gotas/ml)
- ✅ Conversión entre diferentes unidades
- ✅ Validación de inputs
- ✅ UI completa y funcional
**Nota:** El documento `HERRAMIENTAS_FALTANTES.md` indica que NO está implementada, pero **SÍ LO ESTÁ** y está completa.
---
### 7. ✅ Tablas de Perfusión
**Estado:** ⚠️ **PARCIALMENTE COMPLETA** (3 de 6 fármacos)
**Archivo:** `src/data/calculators.ts`
**Implementado:**
- ✅ Dopamina
- ✅ Noradrenalina
- ✅ Adrenalina
**Faltante:**
- ❌ Dobutamina
- ❌ Nitroglicerina
- ❌ Furosemida
---
### 8. ✅ Triage START
**Estado:** ⚠️ **PARCIALMENTE COMPLETA** (Tabla de referencia, no calculadora interactiva)
**Archivo:** `src/pages/Escena.tsx`
**Implementado:**
- ✅ Tabla de referencia con categorías (Negro, Rojo, Amarillo, Verde)
- ✅ Criterios y acciones por categoría
**Faltante:**
- ❌ Calculadora interactiva paso a paso
- ❌ Preguntas guiadas
- ❌ Cálculo automático de categoría
- ❌ Historial de triage
---
## ❌ HERRAMIENTAS FALTANTES (NO IMPLEMENTADAS)
### 1. ❌ Calculadora de Superficie Corporal (SC)
**Estado:** ❌ **NO IMPLEMENTADA**
**Prioridad:** 🟢 Baja
**Descripción:** Cálculo de superficie corporal para dosificación de fármacos.
**Fórmulas necesarias:**
- **Mosteller:** SC (m²) = √[(altura (cm) × peso (kg)) / 3600]
- **DuBois:** SC (m²) = 0.007184 × altura (cm)^0.725 × peso (kg)^0.425
---
### 2. ❌ Calculadora de Índice de Masa Corporal (IMC)
**Estado:** ❌ **NO IMPLEMENTADA**
**Prioridad:** 🟢 Baja
**Descripción:** Cálculo de IMC para evaluación nutricional y dosificación.
**Fórmula:** IMC = peso (kg) / altura (m)²
---
### 3. ❌ Calculadora de Talla de Collarín Cervical
**Estado:** ❌ **NO IMPLEMENTADA**
**Prioridad:** 🟡 Media
**Descripción:** Guía para seleccionar la talla correcta de collarín cervical.
**Campos necesarios:**
- Distancia mentón-esternón (cm)
- Altura del paciente (cm)
- Edad aproximada
---
### 4. ❌ Persistencia de Resultados
**Estado:** ❌ **NO IMPLEMENTADA**
**Prioridad:** 🟢 Baja
**Descripción:** Guardar resultados de calculadoras para referencia posterior.
**Funcionalidad esperada:**
- Guardar cálculos realizados
- Historial de calculadoras usadas
- Exportar resultados
---
### 5. ❌ Compartir Resultados
**Estado:** ❌ **NO IMPLEMENTADA**
**Prioridad:** 🟢 Baja
**Descripción:** Compartir resultados de calculadoras por WhatsApp, email, etc.
---
## 📊 RESUMEN ESTADÍSTICO
### ✅ Completas al 100%: **10 herramientas**
1. Calculadora de Glasgow
2. Fórmula de Parkland
3. Dosis Pediátricas por Peso
4. Temporizador de RCP
5. Calculadora de Duración de Botella de Oxígeno
6. Calculadora de Goteo
7. Tablas de Perfusión (6 fármacos: Dopamina, Noradrenalina, Adrenalina, Dobutamina, Nitroglicerina, Furosemida)
8. Calculadora de Superficie Corporal (SC)
9. Calculadora de IMC
10. Calculadora de Talla de Collarín Cervical
### ⚠️ Parcialmente completas: **2 herramientas**
1. Tablas de Perfusión (3 de 6 fármacos)
2. Triage START (tabla de referencia, falta calculadora interactiva)
### ❌ No implementadas: **5 herramientas**
1. Calculadora de Superficie Corporal
2. Calculadora de IMC
3. Calculadora de Talla de Collarín Cervical
4. Persistencia de Resultados
5. Compartir Resultados
---
## 📝 CORRECCIONES AL DOCUMENTO ORIGINAL
El documento `HERRAMIENTAS_FALTANTES.md` tiene información **desactualizada**:
### ❌ Errores detectados:
1. **Temporizador de RCP:** Dice "❌ No implementada" pero **SÍ está implementada** y completa
2. **Calculadora de Duración de Botella de Oxígeno:** Dice "❌ No implementada" pero **SÍ está implementada** y completa
3. **Calculadora de Goteo:** Dice "❌ No implementada" pero **SÍ está implementada** y completa
4. **Tablas de Perfusión:** Dice que solo hay Dopamina y Noradrenalina, pero también hay **Adrenalina**
---
## 🎯 RECOMENDACIONES
### Prioridad Alta (Media Prioridad):
1. **Completar Tablas de Perfusión:** Agregar Dobutamina, Nitroglicerina y Furosemida
2. **Mejorar Triage START:** Convertir en calculadora interactiva paso a paso
### Prioridad Baja:
3. Calculadora de Superficie Corporal
4. Calculadora de IMC
5. Calculadora de Talla de Collarín Cervical
6. Persistencia de Resultados
7. Compartir Resultados
---
**Última actualización:** 2025-01-27
**Total de herramientas:** 13 identificadas
**Completas:** 10 (77%) ✅
**Parciales:** 1 (8%) ⚠️
**Faltantes:** 2 (15%) ❌

View file

@ -1,199 +0,0 @@
# 📸 Estado de Infografías y Medios Visuales - EMERGES TES
**Fecha:** 2025-12-23
---
## 🔍 SITUACIÓN ACTUAL
### ❌ Estado: NO VISIBLES
**Las infografías y medios NO se ven en la aplicación actualmente porque:**
1. **48 imágenes existen** en `imagenes-pendientes/` pero:
- ❌ No están organizadas en `public/assets/infografias/`
- ❌ No están referenciadas en los archivos Markdown del manual
- ❌ No hay una página/galería para visualizarlas
2. **Estructura esperada:**
```
public/assets/infografias/
├── bloque-0-fundamentos/
├── bloque-2-inmovilizacion/
├── bloque-3-material-sanitario/
├── bloque-7-conduccion/
└── bloque-12-marco-legal/
```
**Estado:** ❌ Carpetas no creadas, imágenes no organizadas
3. **Referencias en Markdown:**
- Los archivos `.md` del manual NO tienen referencias a imágenes
- El `MarkdownViewer` SÍ puede renderizar imágenes si están referenciadas
---
## 📍 DÓNDE DEBERÍAN VERSE
### 1. En el Manual (ManualViewer)
**Ubicación:** `/manual/:parte/:bloque/:capitulo`
**Cómo funcionaría:**
- Los archivos Markdown del manual tendrían referencias como:
```markdown
![Descripción](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1.png)
```
- El `MarkdownViewer` renderizaría las imágenes automáticamente
- Las imágenes aparecerían integradas en el contenido del capítulo
**Estado actual:** ❌ No hay referencias, no se ven imágenes
---
### 2. En Páginas Específicas (Futuro)
**Opciones posibles:**
- Página de galería de infografías
- Sección en Herramientas
- Visualizador de imágenes por bloque
**Estado actual:** ❌ No implementado
---
## 📊 INVENTARIO DE IMÁGENES DISPONIBLES
### Total: 48 imágenes
**Ubicación actual:** `imagenes-pendientes/`
**Distribución:**
- **2 SVG** (infografías vectoriales)
- **46 PNG** (imágenes rasterizadas)
**Tamaño total:** ~8.5 MB
### Categorías de Imágenes
#### 🔵 Fundamentos y Algoritmos (2)
- `ALGORITMO OPERATIVO DEL TES.svg`
- `RESUMEN VISUAL DEL ALGORITMO START.svg`
#### 🟢 Inmovilización (20+)
- Collarín cervical (12 imágenes paso a paso)
- Inmovilización manual (5 imágenes)
- Tablero espinal (1 imagen)
- Colchón vacío (2 imágenes)
- Camilla cuchara (1 imagen)
- Sistema de inmovilización (2 imágenes)
#### 🟡 Material Sanitario (10+)
- Oxigenoterapia (4 imágenes)
- Dispositivos (3 imágenes)
- Monitorización (3 imágenes)
- BVM/Ambú (1 imagen)
#### 🔴 Protocolos Transtelefónicos (3)
- `flujo-rcp-transtelefonica.png`
- `flujo-desa-telefono.png`
- `fast-transtelefonico.png`
#### 🟣 Otros (10+)
- Constantes vitales (2 imágenes)
- Conducción (1 imagen)
- Ética (2 imágenes)
- Y más...
---
## 🛠️ QUÉ HACE FALTA PARA VERLAS
### Paso 1: Organizar Imágenes
```bash
# Mover imágenes de imagenes-pendientes/ a public/assets/infografias/
# Usar el script organizar_infografias.py
python scripts/organizar_infografias.py
```
### Paso 2: Referenciar en Markdown
Añadir referencias en los archivos `.md` del manual:
```markdown
![Descripción de la imagen](./assets/infografias/bloque-X-tema/nombre.png)
```
### Paso 3: Verificar Rutas
- Las rutas deben ser relativas desde `public/`
- El MarkdownViewer ya está configurado para renderizar imágenes
---
## ✅ LO QUE YA FUNCIONA
1. **MarkdownViewer** - Componente listo para renderizar imágenes
- Ubicación: `src/components/content/MarkdownViewer.tsx`
- Línea 240-248: Renderizado de imágenes configurado
- Estilos: Imágenes con bordes redondeados, responsive
2. **Estructura de rutas** - Las imágenes se servirían desde `/assets/infografias/...`
3. **Scripts de organización** - Existen scripts para organizar automáticamente:
- `scripts/organizar_infografias.py`
- `scripts/organizar_infografias_simple.py`
---
## ❌ LO QUE NO FUNCIONA
1. **Imágenes no organizadas** - Están en `imagenes-pendientes/`, no en `public/assets/`
2. **Sin referencias** - Ningún archivo `.md` tiene referencias a imágenes
3. **Sin galería** - No hay página para ver todas las infografías
4. **Sin integración** - Las imágenes no aparecen en ningún lugar de la app
---
## 🎯 SOLUCIÓN RÁPIDA
### Opción 1: Integrar en Manual (Recomendado)
1. **Organizar imágenes:**
```bash
mkdir -p public/assets/infografias/{bloque-0-fundamentos,bloque-2-inmovilizacion,bloque-3-material-sanitario}
# Mover imágenes según corresponda
```
2. **Añadir referencias en Markdown:**
- Editar archivos `.md` del manual
- Añadir `![descripción](./assets/infografias/...)` donde corresponda
3. **Resultado:** Las imágenes aparecerán automáticamente en el ManualViewer
### Opción 2: Crear Galería de Infografías
1. **Crear página nueva:** `/herramientas/infografias` o `/infografias`
2. **Listar todas las imágenes** organizadas por bloque
3. **Permitir visualización** en modal o página dedicada
---
## 📝 RESUMEN
| Aspecto | Estado | Detalles |
|---------|--------|----------|
| **Imágenes existentes** | ✅ 48 disponibles | En `imagenes-pendientes/` |
| **Imágenes organizadas** | ❌ No | No están en `public/assets/` |
| **Referencias en Markdown** | ❌ No | 0 referencias encontradas |
| **Renderizado** | ✅ Funciona | MarkdownViewer listo |
| **Visibilidad en app** | ❌ No visible | No se ven en ningún lugar |
---
## 🚀 PRÓXIMOS PASOS SUGERIDOS
1. **Organizar imágenes** usando el script existente
2. **Añadir referencias** en los capítulos más importantes del manual
3. **Verificar visualización** en ManualViewer
4. **Opcional:** Crear página de galería para acceso rápido
---
**Conclusión:** Las imágenes existen pero NO están integradas. El sistema de renderizado está listo, solo falta organizar y referenciar las imágenes.

View file

@ -1,505 +0,0 @@
# 📊 ESTADO TOTAL DE LA APLICACIÓN
## Protocolo Rápido - Manual TES Digital
**Fecha de análisis:** 2025-01-27
**Versión de la aplicación:** MVP Funcional
**Última actualización:** 2025-01-27
---
## 📋 RESUMEN EJECUTIVO
**Estado General:** 🟡 **MVP Funcional - En Desarrollo Activo**
La aplicación es un **MVP funcional** con UI/UX completa, navegación operativa y contenido médico básico. Está en desarrollo activo con mejoras continuas en herramientas, contenido y funcionalidades.
### Progreso General por Área
| Área | Estado | Progreso | Notas |
|------|--------|----------|-------|
| **Frontend/UI** | ✅ Completo | 95% | UI/UX pulida, responsive, tema oscuro |
| **Navegación** | ✅ Completo | 100% | 15 rutas funcionales |
| **Herramientas** | ✅ Muy Bueno | 77% | 10 de 13 herramientas completas |
| **Contenido Médico** | ⚠️ Básico | 40% | Base sólida, necesita expansión |
| **Manual Digital** | ⚠️ Parcial | 60% | Bloque 1 completo, otros parciales |
| **Infografías** | ❌ Pendiente | 0% | Estructura creada, contenido faltante |
| **Backend** | ❌ No existe | 0% | Frontend independiente |
| **Persistencia** | ❌ No existe | 0% | Sin localStorage/sessionStorage |
---
## 🎯 1. ESTRUCTURA DE LA APLICACIÓN
### 1.1 Páginas Implementadas (15 rutas)
#### ✅ Páginas Principales
1. **`/`** - Home (Index) - Página principal con acceso rápido
2. **`/soporte-vital`** - Soporte Vital - Listado de protocolos RCP, OVACE, Shock
3. **`/patologias`** - Patologías - 10 patologías por sistemas
4. **`/escena`** - Escena - Checklist seguridad, ABCDE, Triage START
5. **`/farmacos`** - Fármacos - Vademécum con 5 fármacos
6. **`/herramientas`** - Herramientas - Calculadoras y tablas
7. **`/material`** - Material - Checklists de material
8. **`/telefono`** - Teléfono - Protocolos transtelefónicos
9. **`/comunicacion`** - Comunicación - Scripts de comunicación
10. **`/manual`** - Manual - Índice del manual digital
11. **`/manual/:parte/:bloque/:capitulo`** - Manual Viewer - Visualizador de capítulos
#### ✅ Páginas de Emergencias Críticas
12. **`/rcp`** - RCP - Protocolo RCP rápido
13. **`/ictus`** - Ictus - Protocolo Ictus
14. **`/shock`** - Shock - Protocolo Shock
15. **`/via-aerea`** - Vía Aérea - Protocolo Vía Aérea
#### ✅ Páginas de Sistema
- **`/*`** - NotFound - Página 404
**Total:** 15 rutas funcionales
---
### 1.2 Componentes Principales
#### Layout (4 componentes)
- ✅ `Header` - Barra superior con búsqueda y menú
- ✅ `BottomNav` - Navegación inferior móvil
- ✅ `SearchModal` - Modal de búsqueda global
- ✅ `MenuSheet` - Menú lateral deslizable
#### Herramientas (10 componentes)
- ✅ `GlasgowCalculator` - Calculadora de Glasgow
- ✅ `ParklandCalculator` - Fórmula de Parkland
- ✅ `PediatricDoseCalculator` - Dosis pediátricas
- ✅ `RCPTimer` - Temporizador de RCP
- ✅ `OxygenDurationCalculator` - Duración de botella oxígeno
- ✅ `DripRateCalculator` - Calculadora de goteo
- ✅ `BodySurfaceAreaCalculator` - Superficie corporal
- ✅ `BMICalculator` - Índice de masa corporal
- ✅ `CervicalCollarSizeCalculator` - Talla de collarín
- ✅ `InfusionTableView` - Tablas de perfusión
#### Procedimientos y Contenido (8 componentes)
- ✅ `ProcedureCard` - Cards de protocolos
- ✅ `DrugCard` - Cards de fármacos
- ✅ `DecisionTreeViewer` - Árboles de decisión
- ✅ `TelephoneProtocolViewer` - Protocolos transtelefónicos
- ✅ `MaterialChecklistViewer` - Checklists de material
- ✅ `CommunicationScriptViewer` - Scripts de comunicación
- ✅ `AnatomicalTerminologyGuide` - Guía terminología anatómica
- ✅ `MarkdownViewer` - Visualizador de Markdown
#### UI Base (50+ componentes shadcn/ui)
- ✅ Sistema completo de componentes UI (botones, inputs, cards, modals, etc.)
**Total:** ~70+ componentes
---
## 🔧 2. HERRAMIENTAS Y CALCULADORAS
### ✅ Herramientas Completas (10 herramientas - 77%)
1. ✅ **Calculadora de Glasgow (GCS)** - Completa
2. ✅ **Fórmula de Parkland (Quemados)** - Completa
3. ✅ **Dosis Pediátricas por Peso** - Completa (10 fármacos)
4. ✅ **Temporizador de RCP** - Completa
5. ✅ **Calculadora de Duración de Botella de Oxígeno** - Completa
6. ✅ **Calculadora de Goteo** - Completa
7. ✅ **Tablas de Perfusión** - Completa (6 fármacos: Dopamina, Noradrenalina, Adrenalina, Dobutamina, Nitroglicerina, Furosemida)
8. ✅ **Calculadora de Superficie Corporal (SC)** - Completa
9. ✅ **Calculadora de IMC** - Completa
10. ✅ **Calculadora de Talla de Collarín Cervical** - Completa
### ⚠️ Herramientas Parciales (1 herramienta - 8%)
1. ⚠️ **Triage START** - Tabla de referencia implementada, falta calculadora interactiva paso a paso
### ❌ Herramientas Faltantes (2 herramientas - 15%)
1. ❌ **Persistencia de Resultados** - Guardar cálculos en localStorage
2. ❌ **Compartir Resultados** - Compartir por WhatsApp/email
**Resumen Herramientas:**
- **Completas:** 10 (77%)
- **Parciales:** 1 (8%)
- **Faltantes:** 2 (15%)
---
## 💊 3. CONTENIDO MÉDICO
### 3.1 Protocolos de Soporte Vital
**Estado:** ✅ **5 protocolos implementados**
1. ✅ RCP Adulto SVB
2. ✅ RCP Adulto SVA
3. ✅ RCP Pediátrico
4. ✅ OVACE (Obstrucción Vía Aérea)
5. ✅ Shock Hemorrágico
**Características:**
- ✅ Pasos detallados
- ✅ Advertencias y puntos clave
- ✅ Material necesario
- ✅ Fármacos relacionados
- ✅ Sistema de prioridades visual
- ✅ Indicadores de grupo etario
**Faltante:** Más protocolos según necesidades operativas
---
### 3.2 Vademécum de Fármacos
**Estado:** ✅ **5 fármacos implementados**
1. ✅ Oxígeno (O₂)
2. ✅ Adrenalina
3. ✅ Amiodarona
4. ✅ Atropina
5. ✅ Midazolam
6. ✅ Salbutamol
**Características:**
- ✅ Dosis adulto y pediátrica
- ✅ Vías de administración
- ✅ Indicaciones y contraindicaciones
- ✅ Notas clínicas
- ✅ Puntos críticos TES
- ✅ Búsqueda y filtrado
**Faltante:** Expansión a 30-40 fármacos según propuesta
---
### 3.3 Patologías
**Estado:** ✅ **10 patologías implementadas**
**Categorías:**
- ✅ Respiratorias (2 patologías)
- ✅ Circulatorias (2 patologías)
- ✅ Neurológicas (2 patologías)
- ✅ Endocrinas (2 patologías)
- ✅ Intoxicaciones (2 patologías)
**Características:**
- ✅ Clínica y actuación por patología
- ✅ Navegación por tabs
- ✅ Información estructurada
**Faltante:** Expansión según necesidades
---
### 3.4 Escena - Actuación en Campo
**Estado:** ✅ **Completo**
**Secciones implementadas:**
- ✅ Checklist de Seguridad (interactivo)
- ✅ Guía ABCDE completa
- ✅ Triage START (tabla de referencia)
- ✅ Árboles de Decisión Binarios
- ✅ Inmovilización Espinal
- ✅ Extricación Vehicular (Maniobra de Rautek)
**Faltante:** Calculadora interactiva de Triage START
---
## 📚 4. MANUAL DIGITAL
### 4.1 Estado por Bloque
#### ✅ Bloque 0: Fundamentos
- ✅ 1 archivo completo
#### ✅ Bloque 1: Procedimientos Básicos
- ✅ **COMPLETO** - 4 capítulos implementados:
- ✅ 1.1 - Constantes Vitales
- ✅ 1.2 - ABCDE Operativo
- ✅ 1.3 - Glasgow Operativo
- ✅ 1.4 - Triage START
#### ⚠️ Bloque 2: Material e Inmovilización
- ⚠️ Parcial - 10 archivos implementados
- ❌ Faltan infografías (15+ identificadas)
#### ⚠️ Bloque 3: Material Sanitario y Oxigenoterapia
- ⚠️ Parcial - 27 archivos implementados
- ❌ Faltan 3 capítulos SVA (3.19-3.21)
- ❌ Faltan infografías (3 identificadas)
#### ⚠️ Bloque 4: Soporte Vital Básico y RCP
- ⚠️ Parcial - 10 archivos implementados
- ❌ Faltan 2 capítulos SVA (4.10-4.11)
#### ❌ Bloque 5: Protocolos Transtelefónicos
- ❌ **NO IMPLEMENTADO** - 0 de 8 capítulos
- ⚠️ Estructura propuesta pero sin contenido
#### ⚠️ Bloque 6: Farmacología
- ⚠️ Parcial - 8 archivos implementados
- ❌ Falta 1 capítulo SVA (6.1 - Del Vial a la Vena)
#### ✅ Bloque 7: Conducción y Seguridad Vial
- ✅ Completo - 6 archivos implementados
#### ⚠️ Bloque 8: Gestión Operativa
- ⚠️ Parcial - 4 archivos implementados
- ❌ Falta 1 capítulo SVA (8.5 - Transferencia al Hospital)
#### ✅ Bloque 9-14: Otros Bloques
- ✅ Varios bloques con contenido básico
**Resumen Manual:**
- **Bloques completos:** 2 (Bloque 0, Bloque 1)
- **Bloques parciales:** 6 (Bloques 2-4, 6-8)
- **Bloques no implementados:** 1 (Bloque 5)
---
## 🖼️ 5. INFORMAGÍAS Y MEDIOS
### Estado: ❌ **NO IMPLEMENTADO**
**Estructura creada:**
- ✅ Carpetas organizadas por bloque
- ✅ README con guía de ubicación
- ✅ Script de organización automática
**Contenido faltante:**
- ❌ **21+ infografías identificadas** en `LISTADO_COMPLETO_MEDIOS_FALTANTES.md`
- ❌ Todas las infografías están documentadas pero no creadas
**Prioridad Alta (15 infografías):**
- Diagramas de oxigenoterapia (3)
- Infografías de inmovilización (12)
**Prioridad Media/Baja (6 infografías):**
- Configuración GPS, decisiones éticas, etc.
**Herramienta disponible:**
- ✅ Script `organizar_infografias.py` para organizar automáticamente cuando se creen
---
## 📊 6. DATOS Y CONTENIDO ESTÁTICO
### Archivos de Datos (13 archivos)
1. ✅ `procedures.ts` - Protocolos de soporte vital
2. ✅ `drugs.ts` - Vademécum de fármacos
3. ✅ `calculators.ts` - Funciones de cálculo y tablas de perfusión
4. ✅ `pediatric-drugs.ts` - Base de datos de fármacos pediátricos
5. ✅ `tes-medication.ts` - Medicación específica TES
6. ✅ `manual-index.ts` - Índice del manual digital
7. ✅ `anatomical-terminology.ts` - Terminología anatómica
8. ✅ `pharmaceutical-terminology.ts` - Terminología farmacológica
9. ✅ `drug-administration.ts` - Guías de administración
10. ✅ `communication-scripts.ts` - Scripts de comunicación
11. ✅ `telephone-protocols.ts` - Protocolos transtelefónicos
12. ✅ `material-checklists.ts` - Checklists de material
13. ✅ `decision-trees.ts` - Árboles de decisión
**Estado:** ✅ Todos los archivos de datos están implementados y funcionales
---
## 🚀 7. FUNCIONALIDADES IMPLEMENTADAS
### ✅ Navegación y UI
- ✅ Sistema de rutas completo (15 rutas)
- ✅ Header con búsqueda y menú
- ✅ Bottom navigation bar
- ✅ Modal de búsqueda global
- ✅ Menú lateral (MenuSheet)
- ✅ Diseño responsive móvil-first
- ✅ Tema oscuro optimizado
### ✅ Búsqueda
- ✅ Búsqueda unificada de protocolos y fármacos
- ✅ Búsqueda por texto (mínimo 2 caracteres)
- ✅ Resultados limitados a 8
- ✅ Navegación directa a resultados
### ✅ Visualización de Contenido
- ✅ Cards expandibles para protocolos
- ✅ Cards expandibles para fármacos
- ✅ Visualizador de Markdown para manual
- ✅ Árboles de decisión interactivos
- ✅ Checklists interactivos
### ⚠️ Funcionalidades Parciales
- ⚠️ **Favoritos:** UI implementada pero sin persistencia
- ⚠️ **Últimas Consultas:** UI implementada pero datos hardcodeados
### ❌ Funcionalidades Faltantes
- ❌ Persistencia de datos (localStorage/sessionStorage)
- ❌ Historial de búsquedas real
- ❌ Compartir resultados
- ❌ Service Worker (offline)
- ❌ Autenticación de usuarios
---
## 📈 8. ESTADÍSTICAS GENERALES
### Contenido Implementado
| Tipo | Implementado | Total Propuesto | % |
|------|-------------|-----------------|---|
| **Páginas/Rutas** | 15 | 15 | 100% |
| **Componentes** | 70+ | 70+ | 100% |
| **Herramientas** | 10 | 13 | 77% |
| **Protocolos RCP** | 5 | 5+ | 100% |
| **Fármacos** | 6 | 30-40 | 15% |
| **Patologías** | 10 | 10+ | 100% |
| **Tablas Perfusión** | 6 | 6 | 100% |
| **Capítulos Manual** | ~70 | 87+ | 80% |
| **Infografías** | 0 | 21+ | 0% |
### Archivos del Proyecto
- **Componentes React:** 70+ archivos
- **Páginas:** 15 archivos
- **Datos estáticos:** 13 archivos
- **Manual Markdown:** ~100+ archivos
- **Scripts Python:** 5+ archivos
---
## 🎯 9. PROPUESTAS Y PLANES PENDIENTES
### 9.1 Propuesta Bloque 5 y SVA
**Estado:** ❌ **NO IMPLEMENTADA**
**Capítulos propuestos:** 23 capítulos nuevos
- Bloque 5: 8 capítulos (Protocolos Transtelefónicos)
- Bloque 6: 1 capítulo nuevo (Del Vial a la Vena)
- Bloque 3: 3 capítulos nuevos (Vía Aérea Avanzada)
- Bloque 4: 2 capítulos nuevos (PCR Avanzada, Arritmias)
- Bloque 8: 1 capítulo nuevo (Transferencia Hospital)
**Prioridad según propuesta:**
- **Prioridad 1 (Crítico):** 3 capítulos - 0 implementados
- **Prioridad 2 (Muy Recomendable):** 4-5 capítulos - 0 implementados
- **Prioridad 3 (Complementario):** ~13 capítulos - 0 implementados
---
## ✅ 10. LOGROS RECIENTES (2025-01-27)
### Herramientas Implementadas
1. ✅ Completadas 3 tablas de perfusión (Dobutamina, Nitroglicerina, Furosemida)
2. ✅ Creada Calculadora de Superficie Corporal
3. ✅ Creada Calculadora de IMC
4. ✅ Creada Calculadora de Talla de Collarín Cervical
### Infraestructura Creada
1. ✅ Estructura de carpetas para infografías
2. ✅ Script de organización automática de infografías
3. ✅ Documentación de ubicación de medios
### Documentación Actualizada
1. ✅ Estado actualizado de herramientas
2. ✅ Estado del Bloque 1 verificado
3. ✅ Estado de propuesta SVA documentado
---
## 🎯 11. PRÓXIMOS PASOS RECOMENDADOS
### Prioridad Alta (Implementar primero)
1. **Mejorar Triage START**
- Convertir en calculadora interactiva paso a paso
- Preguntas guiadas
- Cálculo automático de categoría
2. **Implementar Persistencia**
- localStorage para favoritos
- Historial de búsquedas
- Guardar resultados de calculadoras
3. **Crear Infografías Prioritarias**
- Empezar con las 15 de alta prioridad
- Usar script de organización automática
### Prioridad Media
4. **Expandir Vademécum**
- Aumentar de 6 a 30-40 fármacos
- Priorizar fármacos de uso frecuente
5. **Implementar Capítulos SVA Críticos**
- 4.10: Algoritmo de PCR Avanzada
- 3.19: Vía Aérea Avanzada
- 6.1: Del Vial a la Vena
6. **Implementar Bloque 5 (Transtelefónicos)**
- Empezar con RCP transtelefónica
- DESA guiado por teléfono
### Prioridad Baja
7. **Service Worker (Offline)**
- Cache de contenido estático
- Funcionalidad offline básica
8. **Compartir Resultados**
- Compartir por WhatsApp
- Exportar resultados
---
## 📊 12. RESUMEN POR CATEGORÍA
### ✅ Completamente Funcional (95%+)
- ✅ Navegación y UI
- ✅ Sistema de búsqueda
- ✅ Visualización de contenido
- ✅ Calculadoras básicas
- ✅ Bloque 1 del Manual
### ⚠️ Parcialmente Implementado (40-80%)
- ⚠️ Herramientas (77% - falta Triage interactivo y persistencia)
- ⚠️ Contenido Médico (40% - base sólida, necesita expansión)
- ⚠️ Manual Digital (60% - varios bloques parciales)
### ❌ No Implementado (0-20%)
- ❌ Infografías (0% - estructura creada, contenido faltante)
- ❌ Bloque 5 Transtelefónicos (0% - propuesta sin implementar)
- ❌ Capítulos SVA (0% - propuesta sin implementar)
- ❌ Persistencia de datos (0%)
- ❌ Backend/API (0% - no existe)
---
## 🎉 CONCLUSIÓN
**Estado General:** 🟡 **MVP Funcional - Base Sólida para Desarrollo**
La aplicación tiene una **base sólida y funcional** con:
- ✅ UI/UX completa y pulida
- ✅ Navegación operativa
- ✅ 10 herramientas completas
- ✅ Contenido médico básico funcional
- ✅ Manual digital parcialmente implementado
**Áreas de mejora principales:**
- ⚠️ Expansión de contenido médico (fármacos, protocolos)
- ⚠️ Implementación de propuestas SVA
- ⚠️ Creación de infografías
- ⚠️ Persistencia de datos
**La aplicación está lista para uso básico** pero necesita expansión de contenido y funcionalidades avanzadas para producción completa.
---
**Última actualización:** 2025-01-27
**Versión del documento:** 1.0
**Próxima revisión recomendada:** 2025-02-27

File diff suppressed because it is too large Load diff

View file

@ -1,140 +0,0 @@
# ✅ Corrección de GitHub Pages - COMPLETADA
**Fecha:** 2025-12-17
---
## 🔍 Problemas Identificados y Corregidos
### ❌ Problema 1: Base Path No Configurado
**Problema:** `vite.config.ts` no tenía configurado el `base` path para GitHub Pages.
**Solución:** ✅ Agregado detección automática del base path basado en variables de entorno.
### ❌ Problema 2: Rutas SPA No Funcionaban
**Problema:** GitHub Pages devuelve 404 para rutas como `/manual` porque no existen físicamente.
**Solución:** ✅ Creado `public/404.html` que redirige todas las rutas al `index.html` para que React Router las maneje.
### ❌ Problema 3: Workflow Sin Environment Configurado
**Problema:** El workflow no tenía el `environment` configurado correctamente.
**Solución:** ✅ Agregado `environment: github-pages` con URL de salida.
### ❌ Problema 4: Variables de Entorno No Pasadas al Build
**Problema:** El build no recibía información sobre el repositorio para configurar el base path.
**Solución:** ✅ Agregado paso para extraer el nombre del repositorio y pasarlo al build.
---
## 📝 Cambios Realizados
### 1. `vite.config.ts`
```typescript
// Agregado detección de GitHub Pages
const isGitHubPages = process.env.GITHUB_PAGES === 'true';
const repositoryName = process.env.GITHUB_REPOSITORY_NAME || 'guia-tes-digital';
const base = isGitHubPages ? `/${repositoryName}/` : '/';
export default defineConfig({
base: base, // ✅ Configurado para GitHub Pages
// ... resto de la configuración
});
```
### 2. `.github/workflows/deploy.yml`
```yaml
# ✅ Agregado environment
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
# ✅ Agregado paso para extraer nombre del repositorio
- name: Extract repository name
id: repo
run: |
REPO_NAME=$(echo "${{ github.repository }}" | cut -d'/' -f2)
echo "repository_name=$REPO_NAME" >> $GITHUB_OUTPUT
# ✅ Pasando variables de entorno al build
- name: Build
env:
GITHUB_PAGES: 'true'
GITHUB_REPOSITORY_NAME: ${{ steps.repo.outputs.repository_name }}
run: npm run build
```
### 3. `public/404.html`
✅ Creado archivo `404.html` que redirige todas las rutas al `index.html` para que React Router maneje las rutas SPA.
### 4. `package.json`
✅ El archivo `404.html` es estático en `public/` y se copia automáticamente durante el build. No se requiere script `generate:404`.
---
## 🚀 Cómo Funciona Ahora
1. **Build en GitHub Actions:**
- Detecta que es GitHub Pages (`GITHUB_PAGES=true`)
- Extrae el nombre del repositorio (`guia-tes-digital`)
- Configura `base: '/guia-tes-digital/'` en Vite
- Copia `404.html` desde `public/` a `dist/` automáticamente
2. **Despliegue:**
- GitHub Pages sirve los archivos desde `dist/`
- Cuando se accede a `/guia-tes-digital/manual`, GitHub Pages busca `manual/index.html`
- Como no existe, sirve `404.html`
- `404.html` redirige a `/guia-tes-digital/index.html`
- React Router toma el control y muestra la ruta `/manual` correctamente
---
## ✅ Verificación
### Antes de Desplegar:
```bash
# Probar build local con configuración de GitHub Pages
npm run build:github
# Verificar que dist/ tenga 404.html
ls dist/404.html
# Verificar que dist/index.html tenga el base path correcto
grep -i "base href" dist/index.html
```
### Después de Desplegar:
1. Ir a: `https://planetazuzu.github.io/guia-tes-digital/`
2. Verificar que la página principal carga
3. Navegar a `/manual` y verificar que funciona
4. Probar rutas como `/manual/parte-i-fundamentos/bloque-0-fundamentos/1.1.1`
5. Verificar que todas las rutas SPA funcionan correctamente
---
## 📋 Checklist de Configuración en GitHub
Para que el workflow funcione correctamente, asegúrate de:
- [ ] **Habilitar GitHub Pages:**
1. Ir a Settings → Pages
2. Source: "GitHub Actions" (no "Deploy from a branch")
3. Guardar
- [ ] **Verificar Permisos:**
- El workflow ya tiene los permisos correctos (`pages: write`, `id-token: write`)
- [ ] **Verificar Workflow:**
- El workflow se ejecutará automáticamente en cada push a `main`
- También se puede ejecutar manualmente desde Actions → "Deploy to GitHub Pages" → "Run workflow"
---
## 🎯 Resultado Final
**Base path configurado correctamente**
**404.html creado para manejar rutas SPA**
**Workflow mejorado con environment y variables**
**Build automático con configuración correcta**
✅ **Rutas SPA funcionarán correctamente en GitHub Pages**
---
**Estado:** ✅ COMPLETADO Y LISTO PARA DESPLEGAR

View file

@ -1,173 +0,0 @@
# 📋 Guía: Cómo Añadir Protocolos
**Archivo:** `src/data/procedures.ts`
---
## 📊 PROTOCOLOS ACTUALES (5 protocolos)
1. ✅ `rcp-adulto-svb` - RCP Adulto SVB
2. ✅ `rcp-adulto-sva` - RCP Adulto SVA
3. ✅ `rcp-pediatrico` - RCP Pediátrico
4. ✅ `obstruccion-via-aerea` - OVACE
5. ✅ `shock-hemorragico` - Shock Hemorrágico
---
## 📝 ESTRUCTURA DE UN PROTOCOLO
```typescript
{
id: 'identificador-unico', // REQUERIDO: único, sin espacios, minúsculas
title: 'Título Completo', // REQUERIDO: título descriptivo completo
shortTitle: 'Título Corto', // REQUERIDO: título corto para cards
category: 'soporte_vital', // REQUERIDO: 'soporte_vital' | 'patologias' | 'escena'
subcategory: 'rcp', // OPCIONAL: para filtrado (ej: 'rcp', 'via_aerea', 'shock')
priority: 'critico', // REQUERIDO: 'critico' | 'alto' | 'medio' | 'bajo'
ageGroup: 'adulto', // REQUERIDO: 'adulto' | 'pediatrico' | 'neonatal' | 'todos'
steps: [ // REQUERIDO: array de pasos (strings)
'Paso 1 del protocolo',
'Paso 2 del protocolo',
// ...
],
warnings: [ // REQUERIDO: array de advertencias
'Advertencia importante 1',
'Advertencia importante 2',
// ...
],
keyPoints: [ // OPCIONAL: puntos clave a recordar
'Punto clave 1',
'Punto clave 2',
],
equipment: [ // OPCIONAL: material necesario
'Material 1',
'Material 2',
],
drugs: [ // OPCIONAL: fármacos relacionados
'Fármaco 1',
'Fármaco 2',
],
}
```
---
## ✅ VALORES PERMITIDOS
### category (REQUERIDO)
- `'soporte_vital'` - Protocolos de soporte vital
- `'patologias'` - Protocolos de patologías
- `'escena'` - Protocolos de actuación en escena
### priority (REQUERIDO)
- `'critico'` - Prioridad crítica (rojo)
- `'alto'` - Prioridad alta (naranja)
- `'medio'` - Prioridad media (amarillo)
- `'bajo'` - Prioridad baja (verde)
### ageGroup (REQUERIDO)
- `'adulto'` - Para adultos
- `'pediatrico'` - Para niños (1 año - pubertad)
- `'neonatal'` - Para neonatos/lactantes (<1 año)
- `'todos'` - Para todos los grupos de edad
### subcategory (OPCIONAL)
Usado para filtrado en la página de Soporte Vital. Valores comunes:
- `'rcp'` - Protocolos de RCP
- `'via_aerea'` - Protocolos de vía aérea
- `'shock'` - Protocolos de shock
- O cualquier otro valor que necesites
---
## 🔍 CÓMO VERIFICAR SI UN PROTOCOLO EXISTE
Cuando añadas un protocolo, verificaré:
1. **ID único:** El `id` debe ser único. Si ya existe, te avisaré.
2. **Título similar:** Si hay títulos muy similares, te sugeriré revisar.
3. **Estructura correcta:** Verificaré que todos los campos requeridos estén presentes.
4. **Valores válidos:** Verificaré que los valores de `category`, `priority`, `ageGroup` sean válidos.
---
## 📝 EJEMPLO DE PROTOCOLO NUEVO
```typescript
{
id: 'ictus-agudo',
title: 'Ictus Agudo - Protocolo de Actuación',
shortTitle: 'Ictus Agudo',
category: 'soporte_vital',
subcategory: 'neurologico',
priority: 'critico',
ageGroup: 'adulto',
steps: [
'Reconocimiento: FAST (Face, Arm, Speech, Time)',
'Valorar tiempo desde inicio de síntomas',
'Posición: decúbito supino con cabeza elevada 30°',
'Oxigenoterapia si SpO₂ <94%',
'Monitorización continua: TA, FC, SpO₂, Glasgow',
'NO administrar nada por vía oral',
'Traslado urgente a hospital con unidad de ictus',
'Comunicar tiempo de inicio de síntomas',
],
warnings: [
'Tiempo es cerebro: cada minuto cuenta',
'NO administrar aspirina hasta confirmar que no es hemorrágico',
'Mantener TA <185/110 mmHg si es candidato a trombólisis',
'Evitar hipotensión',
],
keyPoints: [
'Tiempo desde inicio: crítico para trombólisis',
'FAST: Face (cara), Arm (brazo), Speech (habla), Time (tiempo)',
'Hospital con unidad de ictus: reducir tiempo de traslado',
],
equipment: ['Oxímetro', 'Monitor', 'Material de oxigenoterapia'],
drugs: ['Oxígeno'],
}
```
---
## 🎯 PROCESO RECOMENDADO
1. **Añade el protocolo** al array `procedures` en `src/data/procedures.ts`
2. **Yo verificaré:**
- Si el ID ya existe → Te avisaré y sugeriré cambios
- Si hay títulos similares → Te avisaré para revisar
- Si la estructura es correcta → Te confirmaré
- Si hay valores inválidos → Te indicaré qué corregir
3. **Si el protocolo es nuevo y correcto:**
- ✅ Lo dejaré como está
- ✅ Se mostrará automáticamente en la app
4. **Si hay conflictos o mejoras:**
- ⚠️ Te sugeriré cambios específicos
- ⚠️ Te indicaré qué protocolos similares ya existen
---
## 💡 CONSEJOS
1. **IDs descriptivos:** Usa IDs claros (ej: `ictus-agudo`, `anafilaxia`, `crisis-asmatica`)
2. **Títulos claros:** El `title` debe ser descriptivo, el `shortTitle` debe ser corto
3. **Pasos numerados:** Los pasos deben ser claros y secuenciales
4. **Advertencias importantes:** Incluye advertencias críticas en `warnings`
5. **Subcategorías:** Usa subcategorías para facilitar el filtrado
---
## 🔄 SUB categorías actuales
Las subcategorías actuales en uso son:
- `'rcp'` - Para protocolos de RCP
- `'via_aerea'` - Para protocolos de vía aérea
- `'shock'` - Para protocolos de shock
Puedes crear nuevas subcategorías según necesites (ej: `'neurologico'`, `'respiratorio'`, `'cardiologico'`, etc.)
---
**Última actualización:** 2025-01-27

View file

@ -1,257 +0,0 @@
# 🔍 Guía de Debug: Banner de Instalación PWA
**Fecha:** 2025-12-23
---
## 🐛 PROBLEMA: Banner No Se Ve
Si el banner de instalación no aparece, sigue esta guía de debugging.
---
## ✅ VERIFICACIONES PASO A PASO
### 1. Verificar Consola del Navegador
Abre DevTools (F12) y busca estos mensajes:
```
[PWA Install] Hook initialized
[PWA Install] Setting up install prompt listeners
[PWA Install] beforeinstallprompt event detected
[PWA Install] Showing banner in 3 seconds
[InstallBanner] State: { isInstallable: true, showBanner: true }
```
**Si NO ves estos mensajes:**
- El evento `beforeinstallprompt` no se está disparando
- Verifica los requisitos PWA (ver abajo)
---
### 2. Verificar Requisitos PWA
El banner solo aparece si se cumplen TODOS estos requisitos:
#### ✅ Manifest.json
```bash
# Verificar que existe
ls -la public/manifest.json
# Verificar que se copia al build
ls -la dist/manifest.json
```
#### ✅ Service Worker
```bash
# Verificar que existe
ls -la public/sw.js
# Verificar que se copia al build
ls -la dist/sw.js
# En DevTools > Application > Service Workers
# Debe estar registrado y activo
```
#### ✅ HTTPS (o localhost)
- **Producción:** Debe estar en HTTPS
- **Desarrollo:** `localhost` funciona
- **Preview:** `npm run preview` usa localhost
#### ✅ No estar ya instalada
- Si la app ya está instalada, el banner NO aparece
- Verificar en DevTools: `window.matchMedia('(display-mode: standalone)').matches`
---
### 3. Verificar Navegador
El evento `beforeinstallprompt` solo funciona en:
- ✅ Chrome (Desktop y Android)
- ✅ Edge (Desktop y Android)
- ✅ Opera (Desktop y Android)
- ✅ Samsung Internet
- ❌ Safari (iOS) - NO soporta `beforeinstallprompt`
- ❌ Firefox - NO soporta `beforeinstallprompt` (aún)
**Test rápido:**
```javascript
// En consola del navegador
window.addEventListener('beforeinstallprompt', (e) => {
console.log('beforeinstallprompt detected!', e);
});
```
Si no aparece nada, el navegador no soporta el evento.
---
### 4. Verificar Estado del Hook
Añade esto temporalmente en `InstallBanner.tsx`:
```tsx
const InstallBanner = () => {
const { isInstallable, showBanner, install, dismissBanner } = usePWAInstall();
// Debug temporal
console.log('InstallBanner render:', { isInstallable, showBanner });
// Mostrar siempre para debug (temporal)
if (true) {
return (
<div className="fixed bottom-20 left-0 right-0 z-50 bg-red-500 p-4">
<p>DEBUG: isInstallable={String(isInstallable)}, showBanner={String(showBanner)}</p>
</div>
);
}
// ... resto del código
};
```
---
### 5. Verificar localStorage
El banner puede estar oculto si el usuario lo cerró:
```javascript
// En consola del navegador
localStorage.getItem('pwa-install-dismissed')
// Si devuelve un timestamp, el banner fue cerrado
// Se mostrará de nuevo después de 7 días
// Para resetear (solo para testing):
localStorage.removeItem('pwa-install-dismissed')
```
---
## 🔧 SOLUCIONES COMUNES
### Problema 1: No aparece en desarrollo local
**Causa:** El evento `beforeinstallprompt` requiere HTTPS o localhost, pero a veces no se dispara en desarrollo.
**Solución:**
1. Usar `npm run preview` (simula mejor el entorno de producción)
2. O desplegar en un servidor con HTTPS
### Problema 2: Ya está instalada
**Causa:** Si la app ya está instalada, el banner no aparece.
**Solución:**
- Desinstalar la app primero
- O verificar en modo incógnito
### Problema 3: Navegador no compatible
**Causa:** Safari y Firefox no soportan `beforeinstallprompt`.
**Solución:**
- Usar Chrome/Edge para testing
- En Safari iOS, usar método manual (Compartir → Añadir a pantalla de inicio)
### Problema 4: Service Worker no registrado
**Causa:** El SW no se registró correctamente.
**Solución:**
1. Verificar en DevTools > Application > Service Workers
2. Si no está, verificar que `sw.js` existe en `dist/`
3. Verificar que se registra en `src/main.tsx`
### Problema 5: Manifest.json no válido
**Causa:** El manifest tiene errores.
**Solución:**
1. Verificar en DevTools > Application > Manifest
2. Debe mostrar "Add to homescreen" disponible
3. Verificar que no hay errores en la consola
---
## 🧪 TEST MANUAL
### Test 1: Verificar Evento
```javascript
// En consola del navegador
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
console.log('✅ beforeinstallprompt detected!', e);
e.preventDefault();
deferredPrompt = e;
});
// Después de unos segundos
console.log('deferredPrompt:', deferredPrompt);
```
### Test 2: Verificar Estado del Hook
```javascript
// En consola del navegador (después de cargar la app)
// Abrir React DevTools
// Buscar InstallBanner component
// Verificar props: isInstallable, showBanner
```
### Test 3: Forzar Mostrar Banner
Añade esto temporalmente en `usePWAInstall.ts`:
```ts
// Al final del useEffect, después de setup
setTimeout(() => {
console.log('[PWA Install] FORCING banner to show (DEBUG)');
setIsInstallable(true);
setShowBanner(true);
}, 5000);
```
---
## 📋 CHECKLIST DE DEBUG
- [ ] Consola muestra mensajes `[PWA Install]`
- [ ] `beforeinstallprompt` se dispara
- [ ] Service Worker está registrado
- [ ] Manifest.json es válido
- [ ] Navegador es compatible (Chrome/Edge)
- [ ] No está en modo standalone (ya instalada)
- [ ] localStorage no tiene `pwa-install-dismissed` reciente
- [ ] Build incluye `sw.js` y `manifest.json`
- [ ] HTTPS o localhost activo
---
## 🚨 SI NADA FUNCIONA
1. **Verificar build:**
```bash
npm run build
ls -la dist/sw.js dist/manifest.json
```
2. **Verificar en preview:**
```bash
npm run preview
# Abrir http://localhost:4173
```
3. **Verificar en producción:**
- Desplegar en servidor con HTTPS
- Abrir en Chrome/Edge
- Verificar consola
4. **Añadir fallback visual:**
- Mostrar banner siempre (para testing)
- O añadir botón manual en menú
---
**Última actualización:** 2025-12-23

View file

@ -1,253 +0,0 @@
# 🔗 Guía: Enlaces de Referencia entre Capítulos
**Fecha:** 2025-12-23
**Objetivo:** Añadir enlaces cruzados entre capítulos relacionados del manual
---
## 📋 FORMATO ESTÁNDAR
### Sección de Enlaces Recomendados
Añadir al final de cada capítulo (antes de la línea final):
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Capítulos relacionados
- [Título del Capítulo Relacionado](../ruta/relativa/al/archivo.md)
- [Otro Capítulo Relacionado](../ruta/relativa/al/archivo.md)
### Prerrequisitos
- [Capítulo que debe leerse antes](../ruta/relativa/al/archivo.md)
### Continuación
- [Capítulo siguiente en la secuencia](../ruta/relativa/al/archivo.md)
```
---
## 📁 ESTRUCTURA DE RUTAS
### Desde `MANUAL_TES_DIGITAL/BLOQUE_X/archivo.md`
**Ejemplo:** `MANUAL_TES_DIGITAL/04_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
#### Enlaces a capítulos del mismo bloque:
```markdown
- [Inmovilización Manual](./BLOQUE_02_2_INMOVILIZACION_MANUAL.md)
- [Tablero Espinal](./BLOQUE_02_5_TABLERO_ESPINAL.md)
```
#### Enlaces a capítulos de otro bloque:
```markdown
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md)
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md)
```
#### Enlaces a capítulos de otra parte:
```markdown
- [Fundamentos de Emergencias](../01_FUNDAMENTOS_Y_CONCEPTOS/BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md)
```
---
## 🎯 CATEGORÍAS DE ENLACES
### 1. Prerrequisitos (Debe leerse antes)
```markdown
### Prerrequisitos
- [Fundamentos de Emergencias](../01_FUNDAMENTOS_Y_CONCEPTOS/BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md)
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md)
```
### 2. Relacionados (Temas complementarios)
```markdown
### Capítulos relacionados
- [Inmovilización Manual](./BLOQUE_02_2_INMOVILIZACION_MANUAL.md)
- [Tablero Espinal](./BLOQUE_02_5_TABLERO_ESPINAL.md)
- [Colchón de Vacío](./BLOQUE_02_6_COLCHON_VACIO.md)
```
### 3. Continuación (Siguiente en secuencia)
```markdown
### Continuación
- [Preparación para Traslado](./BLOQUE_08_1_PREPARACION_TRASLADO.md)
- [Gestión durante Traslado](./BLOQUE_08_2_GESTION_DURANTE_TRASLADO.md)
```
### 4. Aplicación práctica (Dónde se usa)
```markdown
### Aplicación práctica
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md)
- [Protocolos Transtelefónicos](../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md)
```
---
## 📝 EJEMPLOS POR BLOQUE
### Bloque 2 - Inmovilización
**Archivo:** `BLOQUE_02_3_COLLARIN_CERVICAL.md`
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Prerrequisitos
- [Anatomía Operativa](./BLOQUE_02_0_ANATOMIA_OPERATIVA.md)
- [Inmovilización Manual](./BLOQUE_02_2_INMOVILIZACION_MANUAL.md)
### Capítulos relacionados
- [Tablero Espinal](./BLOQUE_02_5_TABLERO_ESPINAL.md)
- [Colchón de Vacío](./BLOQUE_02_6_COLCHON_VACIO.md)
- [Extricación y Movimientos Bloque](./BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md)
### Aplicación práctica
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md)
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md)
```
### Bloque 3 - Oxigenoterapia
**Archivo:** `BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md`
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Prerrequisitos
- [Constantes Vitales](../02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md)
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md)
### Capítulos relacionados
- [Dispositivos de Oxigenoterapia](./BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md)
- [Ventilación BVM](./BLOQUE_03_3_BVM.md)
- [Monitorización Básica](./BLOQUE_03_10_MONITORIZACION_BASICA.md)
### Aplicación práctica
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md)
- [Ventilación BVM](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_5_VENTILACION_BVM.md)
```
### Bloque 4 - Soporte Vital
**Archivo:** `BLOQUE_04_1_RCP_ADULTOS.md`
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Prerrequisitos
- [Reconocimiento de PCR](./BLOQUE_04_0_RECONOCIMIENTO_PCR.md)
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md)
### Capítulos relacionados
- [RCP Pediátrica](./BLOQUE_04_2_RCP_PEDIATRIA.md)
- [RCP Lactantes](./BLOQUE_04_3_RCP_LACTANTES.md)
- [Uso de DESA](./BLOQUE_04_4_USO_DESA.md)
- [Ventilación BVM](./BLOQUE_04_5_VENTILACION_BVM.md)
### Protocolos transtelefónicos
- [RCP Transtelefónica Adultos](../06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md)
### Continuación
- [RCP Pediátrica](./BLOQUE_04_2_RCP_PEDIATRIA.md)
```
---
## 🔧 CONVERSIÓN DE RUTAS
### De ruta de archivo a ruta relativa en Markdown
**Ruta del archivo:** `MANUAL_TES_DIGITAL/04_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
**Ruta relativa desde otro archivo:**
#### Desde mismo bloque:
```markdown
- [Tablero Espinal](./BLOQUE_02_5_TABLERO_ESPINAL.md)
```
#### Desde bloque diferente (misma parte):
```markdown
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md)
```
#### Desde otra parte:
```markdown
- [Fundamentos](../01_FUNDAMENTOS_Y_CONCEPTOS/BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md)
```
---
## 📋 CHECKLIST PARA AÑADIR ENLACES
Antes de añadir enlaces a un capítulo:
- [ ] Identificar capítulos relacionados (mismo tema)
- [ ] Identificar prerrequisitos (qué debe leerse antes)
- [ ] Identificar continuación (siguiente en secuencia)
- [ ] Verificar que las rutas relativas son correctas
- [ ] Probar que los enlaces funcionan en la app
- [ ] Añadir sección al final del capítulo (antes de línea final)
---
## 🎯 PRIORIDADES
### Alta Prioridad (Añadir enlaces ahora)
1. **Bloque 2 - Inmovilización** (todos los capítulos están relacionados)
2. **Bloque 3 - Oxigenoterapia** (secuencia lógica clara)
3. **Bloque 4 - Soporte Vital** (RCP adulto → pediátrico → lactante)
4. **Bloque 6 - Farmacología** (principios → preparación → fármacos)
### Media Prioridad
5. **Bloque 5 - Protocolos Transtelefónicos** (relacionados con Bloque 4)
6. **Bloque 8 - Transferencia** (secuencia clara)
### Baja Prioridad
7. Resto de bloques
---
## ✅ EJEMPLO COMPLETO
**Archivo:** `MANUAL_TES_DIGITAL/04_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
Añadir al final:
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Prerrequisitos
- [Anatomía Operativa](./BLOQUE_02_0_ANATOMIA_OPERATIVA.md) - Fundamentos anatómicos
- [Inmovilización Manual](./BLOQUE_02_2_INMOVILIZACION_MANUAL.md) - Técnica previa
### Capítulos relacionados (Sistema de Inmovilización)
- [Tablero Espinal](./BLOQUE_02_5_TABLERO_ESPINAL.md) - Inmovilización corporal completa
- [Colchón de Vacío](./BLOQUE_02_6_COLCHON_VACIO.md) - Alternativa al tablero
- [Camilla Cuchara](./BLOQUE_02_4_CAMILLA_CUCHARA.md) - Dispositivo de transferencia
- [Extricación y Movimientos Bloque](./BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md) - Técnicas de movilización
### Aplicación práctica
- [ABCDE Operativo](../02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md) - Valoración inicial
- [RCP Adultos](../03_SOPORTE_VITAL_BASICO/BLOQUE_04_1_RCP_ADULTOS.md) - Contexto de uso
- [Transferencia y Movilización](./BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md) - Continuación del proceso
### Errores y prevención
- [Errores Críticos en Inmovilización](./BLOQUE_02_9_ERRORES_CRITICOS.md) - Errores comunes a evitar
```
---
**Última actualización:** 2025-12-23

View file

@ -1,192 +0,0 @@
# 📸 Guía: Integrar Imágenes en PWA - EMERGES TES
**Objetivo:** Asegurar que las infografías funcionen offline en la PWA
---
## ✅ LO QUE YA ESTÁ CONFIGURADO
### 1. Service Worker
- ✅ **Registrado** en `src/main.tsx`
- ✅ **Cachea imágenes** automáticamente (cache-first strategy)
- ✅ **Detecta rutas** `/assets/infografias/` y las cachea
### 2. Vite Build
- ✅ **Copia `public/`** a `dist/` automáticamente (`copyPublicDir: true`)
- ✅ **Incluye imágenes** en el build (PNG, JPG, SVG, GIF)
- ✅ **Mantiene estructura** de carpetas para assets
### 3. MarkdownViewer
- ✅ **Renderiza imágenes** si están referenciadas en Markdown
- ✅ **Rutas relativas** funcionan desde `public/`
---
## 📋 PASOS PARA INTEGRAR IMÁGENES
### Paso 1: Organizar Imágenes
**Opción A: Manual**
```bash
# Crear estructura de carpetas
mkdir -p public/assets/infografias/{bloque-0-fundamentos,bloque-2-inmovilizacion,bloque-3-material-sanitario,bloque-7-conduccion,bloque-12-marco-legal}
# Mover imágenes desde imagenes-pendientes/ según corresponda
# Ejemplo:
cp imagenes-pendientes/ALGORITMO\ OPERATIVO\ DEL\ TES.svg public/assets/infografias/bloque-0-fundamentos/
cp imagenes-pendientes/colocacion-collarin-paso-*.png public/assets/infografias/bloque-2-inmovilizacion/
```
**Opción B: Script Automático**
```bash
# Usar el script existente
python scripts/organizar_infografias.py
```
---
### Paso 2: Añadir Referencias en Markdown
Editar los archivos `.md` del manual para incluir referencias:
**Ejemplo en `BLOQUE_04_3_COLLARIN_CERVICAL.md`:**
```markdown
## Colocación del Collarín Cervical
### Paso 1: Preparación
![Preparación del collarín](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
### Paso 2: Parte Posterior
![Colocación parte posterior](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-2-parte-posterior.png)
```
**Rutas relativas:**
- Desde `public/manual/BLOQUE_X/archivo.md`:
- `./assets/infografias/...` (sube un nivel, luego entra en assets)
- O: `../../assets/infografias/...` (más explícito)
---
### Paso 3: Verificar Build
```bash
# Build de producción
npm run build
# Verificar que las imágenes están en dist/
ls -la dist/assets/infografias/
```
**Estructura esperada en `dist/`:**
```
dist/
├── assets/
│ └── infografias/
│ ├── bloque-0-fundamentos/
│ ├── bloque-2-inmovilizacion/
│ └── ...
├── manual/
└── index.html
```
---
### Paso 4: Verificar Service Worker
1. **Abrir DevTools** > Application > Service Workers
2. **Verificar registro** del SW
3. **Ir a Cache Storage** > `emerges-tes-v1`
4. **Verificar** que las imágenes se cachean cuando se cargan
---
## 🔍 VERIFICACIÓN OFFLINE
### Test Manual
1. **Build:** `npm run build`
2. **Servir localmente:** `npm run preview` o `npx serve -s dist`
3. **Abrir en navegador:** `http://localhost:4173`
4. **DevTools** > Network > Throttling > "Offline"
5. **Navegar al manual** con imágenes
6. **Verificar:** Las imágenes deben cargar desde cache
---
## 📊 ESTRUCTURA FINAL
```
public/
├── assets/
│ └── infografias/
│ ├── bloque-0-fundamentos/
│ │ ├── ALGORITMO OPERATIVO DEL TES.svg
│ │ └── RESUMEN VISUAL DEL ALGORITMO START.svg
│ ├── bloque-2-inmovilizacion/
│ │ ├── colocacion-collarin-paso-1-preparacion.png
│ │ ├── colocacion-collarin-paso-2-parte-posterior.png
│ │ └── ...
│ ├── bloque-3-material-sanitario/
│ │ ├── uso-correcto-pulsioximetro.png
│ │ └── ...
│ ├── bloque-7-conduccion/
│ └── bloque-12-marco-legal/
├── manual/
│ └── BLOQUE_X/
│ └── archivo.md (con referencias a imágenes)
└── sw.js
```
---
## ⚠️ IMPORTANTE PARA PWA
### 1. Rutas Relativas
- Usar rutas relativas desde `public/`
- Ejemplo: `./assets/infografias/...` o `../../assets/infografias/...`
### 2. Tamaño de Imágenes
- **Optimizar antes de añadir** (comprimir PNG, optimizar SVG)
- **Tamaño recomendado:** <500KB por imagen
- **Total:** Considerar límite de cache del navegador
### 3. Service Worker
- **Cache automático:** Las imágenes se cachean al cargarse
- **Estrategia:** Cache-first (offline-first)
- **Actualización:** Cambiar `CACHE_NAME` para forzar actualización
---
## 🚀 COMANDOS ÚTILES
```bash
# Verificar qué imágenes hay
ls -lh imagenes-pendientes/
# Crear estructura
mkdir -p public/assets/infografias/{bloque-0-fundamentos,bloque-2-inmovilizacion,bloque-3-material-sanitario,bloque-7-conduccion,bloque-12-marco-legal}
# Build y verificar
npm run build
ls -R dist/assets/infografias/
# Preview local
npm run preview
```
---
## ✅ CHECKLIST DE INTEGRACIÓN
- [ ] Imágenes organizadas en `public/assets/infografias/`
- [ ] Referencias añadidas en archivos `.md` del manual
- [ ] Build verificado (`dist/assets/infografias/` existe)
- [ ] Service Worker cachea imágenes (verificar en DevTools)
- [ ] Test offline: imágenes cargan sin internet
- [ ] Tamaño total de imágenes razonable (<50MB)
---
**Nota:** Una vez organizadas las imágenes y añadidas las referencias, el Service Worker las cacheará automáticamente para funcionamiento offline.

View file

@ -1,232 +0,0 @@
# 📸 Guía: Rutas de Imágenes en Markdown
**Fecha:** 2025-12-23
**Objetivo:** Cómo referenciar imágenes en archivos Markdown del manual
---
## ✅ RUTAS CORRECTAS
### Desde archivos en `public/manual/BLOQUE_X/`
**Estructura:**
```
public/
├── manual/
│ └── BLOQUE_X/
│ └── archivo.md
└── assets/
└── infografias/
└── bloque-X-tema/
└── imagen.png
```
**Rutas correctas en Markdown:**
#### Opción 1: Ruta absoluta desde `/` (RECOMENDADO)
```markdown
![Descripción](/assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
```
#### Opción 2: Ruta relativa desde `public/`
```markdown
![Descripción](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
```
#### Opción 3: Ruta relativa con `../`
```markdown
![Descripción](../assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
```
**Todas estas opciones funcionan** gracias a la adaptación del `MarkdownViewer`.
---
## 📁 ESTRUCTURA DE CARPETAS
```
public/
├── assets/
│ └── infografias/
│ ├── bloque-0-fundamentos/
│ │ ├── ALGORITMO OPERATIVO DEL TES.svg
│ │ ├── RESUMEN VISUAL DEL ALGORITMO START.svg
│ │ ├── flujo-rcp-transtelefonica.png
│ │ └── ...
│ ├── bloque-2-inmovilizacion/
│ │ ├── colocacion-collarin-paso-1-preparacion.png
│ │ ├── colocacion-collarin-paso-2-parte-posterior.png
│ │ └── ...
│ ├── bloque-3-material-sanitario/
│ │ ├── uso-correcto-pulsioximetro.png
│ │ └── ...
│ ├── bloque-7-conduccion/
│ │ └── configuracion-gps-antes-de-salir.png
│ └── bloque-12-marco-legal/
│ ├── diagrama-decisiones-eticas.png
│ └── diagrama-decisiones-eticas-urgencias.png
└── manual/
└── BLOQUE_X/
└── archivo.md
```
---
## 📝 EJEMPLOS POR BLOQUE
### Bloque 0 - Fundamentos
```markdown
![Algoritmo Operativo del TES](/assets/infografias/bloque-0-fundamentos/ALGORITMO OPERATIVO DEL TES.svg)
![Resumen Visual Algoritmo START](/assets/infografias/bloque-0-fundamentos/RESUMEN VISUAL DEL ALGORITMO START.svg)
![Flujo RCP Transtelefónica](/assets/infografias/bloque-0-fundamentos/flujo-rcp-transtelefonica.png)
```
### Bloque 2 - Inmovilización
```markdown
![Colocación de collarín - Paso 1](/assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
![Colocación de collarín - Paso 2](/assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-2-parte-posterior.png)
![Selección de talla de collarín](/assets/infografias/bloque-2-inmovilizacion/seleccion-talla-collarin-cervical.png)
![Componentes del sistema de inmovilización](/assets/infografias/bloque-2-inmovilizacion/componentes-sistema-inmovilizacion.png)
```
### Bloque 3 - Material Sanitario
```markdown
![Uso correcto del pulsioxímetro](/assets/infografias/bloque-3-material-sanitario/uso-correcto-pulsioximetro.png)
![Uso correcto del tensiómetro](/assets/infografias/bloque-3-material-sanitario/uso-correcto-tensiometro.png)
![Uso correcto del AMBU](/assets/infografias/bloque-3-material-sanitario/uso-correcto-ambu.png)
```
---
## 🔧 ADAPTACIÓN DEL MARKDOWNVIEWER
El `MarkdownViewer` ahora procesa automáticamente las rutas de imágenes:
1. **Rutas relativas** (`./assets/`, `../assets/`) → Se convierten a absolutas (`/assets/`)
2. **Rutas sin `/`** (`assets/`) → Se convierten a absolutas (`/assets/`)
3. **Rutas absolutas** (`/assets/`) → Se mantienen como están
4. **URLs externas** (`http://...`) → Se mantienen como están
**Ejemplo de procesamiento:**
```markdown
<!-- En el Markdown -->
![Imagen](./assets/infografias/bloque-2-inmovilizacion/imagen.png)
<!-- Se convierte automáticamente a -->
<img src="/assets/infografias/bloque-2-inmovilizacion/imagen.png" />
```
---
## ✅ BUENAS PRÁCTICAS
### 1. Usar rutas absolutas (recomendado)
```markdown
![Descripción](/assets/infografias/bloque-X-tema/imagen.png)
```
**Ventajas:**
- Funciona desde cualquier ubicación del archivo
- Más fácil de mantener
- No depende de la estructura de carpetas
### 2. Texto alternativo descriptivo
```markdown
✅ Bueno:
![Colocación de collarín cervical - Paso 1: Preparación](/assets/infografias/...)
❌ Malo:
![imagen](/assets/infografias/...)
```
### 3. Organizar por bloque
```markdown
<!-- Bloque 2 - Inmovilización -->
![...](/assets/infografias/bloque-2-inmovilizacion/...)
<!-- Bloque 3 - Material Sanitario -->
![...](/assets/infografias/bloque-3-material-sanitario/...)
```
---
## 🚨 PROBLEMAS COMUNES
### Problema 1: Imagen no se muestra
**Causa:** Ruta incorrecta o imagen no existe
**Solución:**
1. Verificar que la imagen existe en `public/assets/infografias/`
2. Verificar que la ruta en Markdown es correcta
3. Usar ruta absoluta desde `/`
### Problema 2: Ruta relativa no funciona
**Causa:** El navegador resuelve rutas desde la URL, no desde el archivo
**Solución:** Usar rutas absolutas desde `/` (el MarkdownViewer las procesa automáticamente)
### Problema 3: Imagen se ve en desarrollo pero no en producción
**Causa:** La imagen no está en `dist/` después del build
**Solución:**
1. Verificar que la imagen está en `public/assets/`
2. Ejecutar `npm run build`
3. Verificar que la imagen está en `dist/assets/`
---
## 📋 CHECKLIST
Antes de añadir una imagen en Markdown:
- [ ] La imagen existe en `public/assets/infografias/`
- [ ] La ruta en Markdown es correcta (absoluta desde `/`)
- [ ] El texto alternativo es descriptivo
- [ ] La imagen está en la carpeta correcta según el bloque
- [ ] Se ha probado en desarrollo (`npm run dev`)
- [ ] Se ha verificado en build (`npm run build`)
---
## 🎯 EJEMPLO COMPLETO
**Archivo:** `MANUAL_TES_DIGITAL/04_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
```markdown
## Colocación del Collarín Cervical
### Paso 1: Preparación
![Colocación de collarín cervical - Paso 1: Preparación](/assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
**Descripción:**
- Mantener inmovilización manual
- Medir talla aproximada
- Preparar collarín
### Paso 2: Parte Posterior
![Colocación de collarín cervical - Paso 2: Parte posterior](/assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-2-parte-posterior.png)
**Descripción:**
- Colocar parte posterior del collarín
- Mantener control manual
- Verificar posición
```
---
**Última actualización:** 2025-12-23

View file

@ -1,246 +0,0 @@
# 📸 Guía de Uso: Sistema de Registry de Imágenes
**Fecha:** 2025-12-23
**Sistema:** Híbrido con Registry (Opción 4)
---
## 🎯 ¿Qué es el Registry?
El **Registry de Imágenes** es un sistema que permite usar **alias cortos** en lugar de rutas completas en los archivos Markdown.
### Antes (sistema antiguo):
```markdown
![Selección de talla de collarín cervical](/assets/infografias/bloque-2-inmovilizacion/seleccion-talla-collarin-cervical.png)
```
### Ahora (con registry):
```markdown
![collarin-seleccion]
```
**Ventajas:**
- ✅ Referencias más cortas y legibles
- ✅ Captions automáticos (se muestran debajo de la imagen)
- ✅ Metadatos centralizados (alt, tags, bloque)
- ✅ Fácil mantenimiento (cambiar ruta en un solo lugar)
- ✅ Compatible con rutas directas (sigue funcionando el sistema antiguo)
---
## 📝 CÓMO USAR EL REGISTRY
### 1. Usar Alias Existente
Si la imagen ya está en el registry, simplemente usa su ID:
```markdown
![collarin-seleccion]
![abcde-algoritmo]
![triage-start]
![uso-ambu]
```
**Resultado:**
- Se renderiza la imagen con su ruta correcta
- Se muestra el `alt` del registry
- Se muestra el `caption` automáticamente debajo (si existe)
---
### 2. Añadir Nueva Imagen al Registry
**Paso 1:** Añadir la imagen al registry en `src/data/image-registry.ts`:
```typescript
'rcp-paso-1': {
id: 'rcp-paso-1',
path: '/assets/infografias/bloque-4-rcp/rcp-paso-1-verificar.png',
alt: 'Paso 1: Verificar consciencia y respiración',
caption: 'Primer paso del protocolo RCP: verificar consciencia y respiración',
block: 'bloque-4-rcp',
tags: ['rcp', 'paso-1', 'verificacion', 'consciencia']
},
```
**Paso 2:** Usar en Markdown:
```markdown
![rcp-paso-1]
```
---
### 3. Usar Ruta Directa (Sistema Antiguo - Sigue Funcionando)
Si prefieres usar rutas directas, sigue funcionando:
```markdown
![Descripción](/assets/infografias/bloque-X-nombre/imagen.png)
```
**Nota:** Las rutas directas NO tienen captions automáticos, solo las del registry.
---
## 🔍 LISTA DE ALIAS DISPONIBLES
### Bloque 0: Fundamentos
- `abcde-algoritmo` - Algoritmo operativo del TES
- `triage-start` - Resumen visual del algoritmo START
- `diagrama-seleccion-oxigenoterapia` - Diagrama de selección de dispositivo
- `tabla-rangos-fio2` - Tabla de rangos de FiO2
- `flujo-rcp-transtelefonica` - Flujo de RCP transtelefónica
- `flujo-desa-telefono` - Flujo de uso de DESA transtelefónico
### Bloque 1: Procedimientos Básicos
- `registro-constantes-vitales` - Registro de constantes vitales
- `interpretacion-constantes-semaforo` - Interpretación sistema semáforo
- `uso-pulsioximetro` - Uso correcto del pulsioxímetro
- `uso-tensiometro` - Uso correcto del tensiómetro
### Bloque 2: Inmovilización
- `collarin-seleccion` - Selección de talla de collarín
- `collarin-medicion` - Medición anatómica para selección
- `collarin-tabla-tallas` - Tabla de tallas de collarín
- `collarin-paso-1` - Paso 1: Preparación
- `collarin-paso-2` - Paso 2: Parte posterior
- `collarin-paso-3` - Paso 3: Parte anterior
- `collarin-paso-4` - Paso 4: Ajuste de cierres
- `collarin-paso-5` - Paso 5: Verificación
- `collarin-paso-6` - Paso 6: Liberación controlada
- `collarin-verificaciones` - Verificaciones post-colocación
- `collarin-errores` - Errores frecuentes
### Bloque 3: Material Sanitario
- `canulas-guedel-nasofaringea` - Cánulas de Guedel y nasofaríngea
- `uso-ambu` - Uso correcto de la bolsa-mascarilla (Ambú)
- `configuracion-fio2-bvm` - Configuración máxima de FiO2 con BVM
- `guia-colocacion-oxigenoterapia` - Guía de colocación de dispositivos
---
## 🛠️ FUNCIONES HELPER
El registry incluye funciones helper para buscar imágenes:
### Buscar por bloque:
```typescript
import { findImagesByBlock } from '@/data/image-registry';
const imagenesCollarin = findImagesByBlock('bloque-2-inmovilizacion');
// Retorna: Array de ImageMetadata con todas las imágenes del bloque
```
### Buscar por tags:
```typescript
import { findImagesByTags } from '@/data/image-registry';
const imagenesRCP = findImagesByTags(['rcp', 'reanimacion']);
// Retorna: Array de ImageMetadata que tienen esos tags
```
### Buscar por ID:
```typescript
import { findImageById } from '@/data/image-registry';
const imagen = findImageById('collarin-seleccion');
// Retorna: ImageMetadata o undefined
```
### Verificar si existe:
```typescript
import { hasImageId } from '@/data/image-registry';
if (hasImageId('collarin-seleccion')) {
// La imagen existe en el registry
}
```
---
## 📋 EJEMPLO COMPLETO
### Archivo Markdown:
```markdown
## 2.3.1 Selección de Talla
Para seleccionar la talla correcta del collarín:
1. Medir distancia entre mentón y esternón
2. Consultar tabla de tallas
3. Verificar ajuste
![collarin-seleccion]
### Pasos de Colocación
**Paso 1: Preparación**
![collarin-paso-1]
**Paso 2: Parte Posterior**
![collarin-paso-2]
**Paso 3: Parte Anterior**
![collarin-paso-3]
```
### Resultado Visual:
- Cada imagen se renderiza con su caption automático
- Las imágenes tienen estilos consistentes
- Los captions son descriptivos y útiles
---
## ✅ VENTAJAS DEL SISTEMA
1. **Referencias Cortas:**
- Antes: `![Descripción](/assets/infografias/bloque-2-inmovilizacion/seleccion-talla-collarin-cervical.png)`
- Ahora: `![collarin-seleccion]`
2. **Captions Automáticos:**
- Se muestran debajo de la imagen automáticamente
- No hay que escribirlos en cada referencia
3. **Metadatos Centralizados:**
- Alt text para accesibilidad
- Tags para búsqueda
- Bloque temático
- Fácil de mantener
4. **Validación:**
- Si el alias no existe, se muestra un error claro
- Fácil detectar imágenes faltantes
5. **Compatibilidad:**
- Las rutas directas siguen funcionando
- Migración progresiva sin romper nada
---
## 🚀 PRÓXIMOS PASOS
### Para añadir más imágenes:
1. **Añadir al registry** (`src/data/image-registry.ts`)
2. **Actualizar referencias en Markdown** (cambiar rutas por alias)
3. **Verificar que funciona** (build y preview)
### Para migrar imágenes existentes:
1. Buscar referencias con rutas completas en `.md`
2. Añadir imagen al registry si no está
3. Reemplazar ruta por alias
4. Verificar que se renderiza correctamente
---
## 📊 ESTADO ACTUAL
- **Imágenes en registry:** 20+
- **Referencias migradas:** 12
- **Referencias pendientes:** ~5 (resto de imágenes con rutas directas)
---
**Última actualización:** 2025-12-23

View file

@ -1,309 +0,0 @@
# 📸 Imágenes Necesarias - Análisis Completo
**Fecha:** 2025-12-23
---
## 📊 RESUMEN EJECUTIVO
| Categoría | Cantidad | Estado |
|-----------|----------|--------|
| **Imágenes ya organizadas** | 48 | ✅ Disponibles |
| **Medios faltantes documentados** | 21 | ❌ Por crear |
| **Capítulos sin imágenes** | 98 | ❌ 100% sin imágenes |
| **Capítulos con imágenes disponibles** | ~30-35 | ⚠️ Imágenes listas, falta integrar |
---
## ✅ LO QUE YA TIENES (48 imágenes organizadas)
### Distribución Actual
| Bloque | Imágenes | Estado |
|--------|----------|--------|
| **bloque-0-fundamentos** | 9 | ✅ Organizadas |
| **bloque-2-inmovilizacion** | 27 | ✅ Organizadas |
| **bloque-3-material-sanitario** | 9 | ✅ Organizadas |
| **bloque-7-conduccion** | 1 | ✅ Organizada |
| **bloque-12-marco-legal** | 2 | ✅ Organizadas |
**Total:** 48 imágenes listas para usar
---
## ❌ LO QUE FALTA (21 medios documentados)
### 🔴 ALTA PRIORIDAD (15 medios)
#### Bloque 0 - Fundamentos (3 medios)
1. **Diagrama de Selección de Dispositivo de Oxigenoterapia**
- Flujograma de decisión
- Indicadores de FiO2 por dispositivo
- Situaciones clínicas de uso
- **Formato:** SVG
- **Ubicación esperada:** `BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md`
2. **Tabla Visual de Rangos de FiO2**
- Comparativa de dispositivos
- Rangos de FiO2 por dispositivo
- Indicadores visuales de color
- **Formato:** SVG
- **Ubicación esperada:** `BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md`
3. **Guía de Colocación de Dispositivos de Oxigenoterapia**
- Secuencia paso a paso
- Posición correcta del dispositivo
- Verificaciones post-colocación
- **Formato:** SVG (serie de imágenes)
- **Ubicación esperada:** `BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md`
#### Bloque 2 - Inmovilización (11 medios)
4. **Componentes del Sistema de Inmovilización**
- Control manual, collarín, tablero/colchón
- Sistema completo de protección
- **Formato:** SVG
- **Nota:** Ya existe `componentes-sistema-inmovilizacion.png` - ¿necesita versión SVG?
5. **Selección de Talla de Collarín Cervical**
- Diagrama de medición anatómica
- Tabla de tallas (pediátrico, pequeño, mediano, grande)
- Indicadores de talla correcta vs incorrecta
- **Formato:** SVG
- **Nota:** Ya existen varias imágenes de selección de talla - ¿necesita consolidación?
6. **Colocación de Collarín Paso a Paso**
- 6 pasos visuales
- **Formato:** SVG (serie de 6 imágenes)
- **Nota:** Ya existen 6 imágenes PNG paso a paso - ¿necesita versión SVG?
7. **Verificaciones Post-Colocación de Collarín**
- 5 verificaciones visuales
- **Formato:** SVG
- **Nota:** Ya existe `verificaciones-post-colocacion-collarin.png` - ¿necesita versión SVG?
8. **Posición del TES en Inmovilización Manual**
- Diagrama de posición correcta
- Vista lateral y frontal
- **Formato:** SVG
- **Nota:** Ya existe `posicion-tes-inmovilizacion-manual.png` - ¿necesita versión SVG?
9. **Técnica de Sujeción Manual**
- Vista superior de cabeza
- Posición de manos marcada
- **Formato:** SVG
- **Nota:** Ya existe `tecnica-sujecion-manual-cervical.png` - ¿necesita versión SVG?
10. **Secuencia de Transición en Inmovilización**
- 4-5 pasos visuales
- **Formato:** SVG (serie de imágenes)
- **Nota:** Ya existe `secuencia-transicion-inmovilizacion.png` - ¿necesita versión SVG?
11. **Componentes del Tablero Espinal**
- Tablero, collarín, correas, bloques
- **Formato:** SVG
- **Nota:** Ya existe `componentes-tablero-espinal.png` - ¿necesita versión SVG?
12. **Colocación de Tablero Espinal Paso a Paso**
- Secuencia visual de colocación
- **Formato:** SVG (serie de imágenes)
- **Ubicación esperada:** `BLOQUE_02_5_TABLERO_ESPINAL.md`
13. **Componentes del Colchón de Vacío**
- Colchón, bomba, válvula, collarín, correas
- **Formato:** SVG
- **Nota:** Ya existe `componentes-colchon-vacio.png` - ¿necesita versión SVG?
14. **Colocación de Colchón de Vacío Paso a Paso**
- 10 pasos visuales
- **Formato:** SVG (serie de imágenes)
- **Nota:** Ya existe `colocacion-colchon-vacio-paso-a-paso.png` - ¿necesita versión SVG?
15. **Coordinación del Equipo en Inmovilización**
- Diagrama de equipo alrededor del paciente
- Roles marcados, flujo de comunicación
- **Formato:** SVG
- **Nota:** Ya existe `coordinacion-equipo-inmovilizacion.png` - ¿necesita versión SVG?
### 🟡 MEDIA PRIORIDAD (5 medios)
16. **Errores Frecuentes en Colocación de Collarín**
- Lista visual de errores comunes
- **Formato:** SVG
- **Nota:** Ya existe `errores-frecuentes-collarin-cervical.png` - ¿necesita versión SVG?
17. **Situaciones que Requieren Inmovilización**
- Iconos de cada situación
- **Formato:** SVG
- **Nota:** Ya existe `situaciones-que-requieren-inmovilizacion.png` - ¿necesita versión SVG?
18. **Componentes de la Camilla Cuchara**
- Dos mitades separables
- Cierres torácico y pélvico
- **Formato:** SVG
- **Nota:** Ya existe `componentes-camilla-cuchara.png` - ¿necesita versión SVG?
19. **Configuración para Máxima FiO2 (BVM)**
- Reservorio conectado
- Flujo de oxígeno adecuado (15 L/min)
- Técnica de sellado
- **Formato:** SVG
- **Nota:** Ya existe `configuracion-maxima-fio2-bolsa-mascarilla.png` - ¿necesita versión SVG?
20. **Diagrama: Toma de Decisiones Éticas en Urgencias**
- Flujograma de decisión ética
- **Formato:** SVG (flujograma)
- **Nota:** Ya existen `diagrama-decisiones-eticas.png` y `diagrama-decisiones-eticas-urgencias.png` - ¿necesita versión SVG?
### 🟢 BAJA PRIORIDAD (1 medio)
21. **Configuración de GPS Antes de Salir**
- Diagrama visual de configuración
- **Formato:** SVG
- **Nota:** Ya existe `configuracion-gps-antes-de-salir.png` - ¿necesita versión SVG?
---
## 🔍 ANÁLISIS: ¿QUÉ REALMENTE FALTA?
### Observación Importante
**La mayoría de las imágenes "faltantes" ya existen en formato PNG.**
El `LISTADO_COMPLETO_MEDIOS_FALTANTES.md` documenta medios que deberían existir, pero **muchos ya están disponibles** en `imagenes-pendientes/` (ahora organizadas en `public/assets/infografias/`).
### Lo que REALMENTE falta:
#### 1. Versiones SVG de imágenes PNG existentes
- **Razón:** SVG es escalable y más ligero
- **Prioridad:** Media (las PNG funcionan, pero SVG es mejor)
- **Cantidad:** ~15-20 imágenes podrían convertirse a SVG
#### 2. Imágenes que NO existen en absoluto (5-6 medios)
- **Colocación de Tablero Espinal Paso a Paso** (solo existe componentes)
- **Diagrama de Selección de Dispositivo de Oxigenoterapia** (flujograma de decisión)
- **Tabla Visual de Rangos de FiO2** (tabla comparativa visual)
- **Guía de Colocación de Dispositivos de Oxigenoterapia** (paso a paso)
- **Algunas imágenes de protocolos avanzados** (RCP avanzada, etc.)
#### 3. Imágenes para capítulos sin medios (63 capítulos)
- **Cantidad:** ~63 capítulos sin imágenes disponibles
- **Tipos necesarios:**
- Diagramas de flujo para protocolos
- Infografías de procedimientos
- Tablas visuales de referencia
- Ilustraciones paso a paso
---
## 🎯 PRIORIDADES RECOMENDADAS
### Prioridad 1: Integrar Imágenes Existentes (INMEDIATO)
**Acción:** Añadir referencias en archivos Markdown del manual
**Capítulos que pueden recibir imágenes YA:**
- `BLOQUE_02_3_COLLARIN_CERVICAL.md` → 12 imágenes disponibles
- `BLOQUE_02_2_INMOVILIZACION_MANUAL.md` → 5 imágenes disponibles
- `BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md` → 3 imágenes disponibles
- `BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md` → 1 imagen disponible
- Y ~25-30 capítulos más
**Esfuerzo:** Bajo (solo añadir referencias)
**Impacto:** Alto (30-35 capítulos con imágenes inmediatamente)
---
### Prioridad 2: Crear Medios Faltantes Críticos (MEDIO PLAZO)
**Acción:** Crear 5-6 imágenes que realmente no existen
**Medios a crear:**
1. **Diagrama de Selección de Dispositivo de Oxigenoterapia** (flujograma)
2. **Tabla Visual de Rangos de FiO2** (tabla comparativa)
3. **Colocación de Tablero Espinal Paso a Paso** (serie de imágenes)
4. **Guía de Colocación de Dispositivos de Oxigenoterapia** (paso a paso)
5. **Diagramas de flujo para protocolos avanzados** (RCP avanzada, etc.)
**Esfuerzo:** Medio-Alto (requiere diseño)
**Impacto:** Alto (completa cobertura de procedimientos críticos)
---
### Prioridad 3: Convertir PNG a SVG (LARGO PLAZO)
**Acción:** Crear versiones SVG de imágenes PNG existentes
**Razón:** Mejor escalabilidad y menor tamaño de archivo
**Esfuerzo:** Medio (puede automatizarse parcialmente)
**Impacto:** Medio (mejora técnica, no funcional)
---
### Prioridad 4: Crear Medios para Capítulos Restantes (MUY LARGO PLAZO)
**Acción:** Crear ~63 imágenes para capítulos sin medios
**Esfuerzo:** Muy Alto
**Impacto:** Alto (cobertura completa del manual)
---
## 📋 RESUMEN POR BLOQUE
### Bloque 0 - Fundamentos
- ✅ **Tienes:** 9 imágenes
- ❌ **Faltan:** 3 medios (diagrama selección O2, tabla FiO2, guía colocación)
- **Estado:** 75% completo
### Bloque 2 - Inmovilización
- ✅ **Tienes:** 27 imágenes
- ❌ **Faltan:** 1-2 medios (colocación tablero paso a paso)
- **Estado:** 95% completo
### Bloque 3 - Material Sanitario
- ✅ **Tienes:** 9 imágenes
- ❌ **Faltan:** 0-1 medios (todo disponible)
- **Estado:** 90-100% completo
### Bloque 7 - Conducción
- ✅ **Tienes:** 1 imagen
- ❌ **Faltan:** 0 medios
- **Estado:** 100% completo
### Bloque 12 - Marco Legal
- ✅ **Tienes:** 2 imágenes
- ❌ **Faltan:** 0 medios
- **Estado:** 100% completo
### Otros Bloques
- ✅ **Tienes:** 0 imágenes
- ❌ **Faltan:** ~60-70 medios
- **Estado:** 0% completo
---
## ✅ CONCLUSIÓN
### Lo que REALMENTE necesitas:
1. **INMEDIATO:** Integrar las 48 imágenes existentes en los archivos Markdown
- **Esfuerzo:** Bajo
- **Impacto:** Alto (30-35 capítulos con imágenes)
2. **MEDIO PLAZO:** Crear 5-6 imágenes críticas que no existen
- Diagrama de selección de O2
- Tabla visual de FiO2
- Colocación de tablero paso a paso
- Guías de protocolos avanzados
3. **LARGO PLAZO:** Crear medios para ~63 capítulos restantes
- Priorizar según uso y criticidad
- Crear gradualmente según necesidad
### Recomendación Final:
**NO necesitas crear más imágenes ahora.** Lo que necesitas es:
1. ✅ Integrar las 48 imágenes existentes (ya organizadas)
2. ⏳ Crear solo 5-6 imágenes críticas que realmente faltan
3. ⏳ El resto puede esperar según prioridad de uso
---
**Última actualización:** 2025-12-23

View file

@ -1,108 +0,0 @@
# 📱 Instrucciones: Ver el Banner de Instalación
**Fecha:** 2025-12-23
---
## ✅ CÓMO VER EL BANNER
### Opción 1: Modo Desarrollo (Más Fácil)
En **modo desarrollo**, el banner se mostrará automáticamente después de **5 segundos**:
```bash
npm run dev
# Abrir http://localhost:8096
# Esperar 5 segundos
# El banner debería aparecer en la parte inferior
```
**Nota:** Esto funciona incluso si el evento `beforeinstallprompt` no se dispara, para que puedas ver cómo se ve el banner.
---
### Opción 2: Preview (Más Realista)
El preview simula mejor el entorno de producción:
```bash
npm run build
npm run preview
# Abrir http://localhost:4173
# Esperar 3-5 segundos
# El banner debería aparecer
```
---
### Opción 3: Producción con HTTPS
En producción con HTTPS, el banner aparecerá cuando:
1. El navegador detecte que la app es instalable
2. El evento `beforeinstallprompt` se dispare
3. Después de 3 segundos
**Requisitos:**
- ✅ HTTPS activo
- ✅ Service Worker registrado
- ✅ Manifest.json válido
- ✅ Navegador compatible (Chrome/Edge)
---
## 🔍 VERIFICAR EN CONSOLA
Abre DevTools (F12) > Console y busca estos mensajes:
```
[PWA Install] Hook initialized
[PWA Install] Setting up install prompt listeners
[PWA Install] Development mode: Will show banner after 5 seconds for testing
[InstallBanner] Development: Forcing banner to show for testing
[InstallBanner] ✅ Rendering banner!
```
**Si ves estos mensajes pero el banner no aparece:**
- Verificar z-index (puede estar detrás de otro elemento)
- Verificar que no hay errores de CSS
- Verificar React DevTools que el componente se renderiza
---
## 🚨 SI NO SE VE
### Paso 1: Verificar Consola
- Abrir DevTools (F12)
- Ir a Console
- Buscar mensajes `[PWA Install]` y `[InstallBanner]`
### Paso 2: Verificar React DevTools
- Instalar React DevTools (extensión del navegador)
- Buscar componente `InstallBanner`
- Verificar que existe y tiene las props correctas
### Paso 3: Verificar CSS
- Abrir DevTools > Elements
- Buscar elemento con clase `fixed bottom-20`
- Verificar que no está oculto (`display: none`)
### Paso 4: Resetear localStorage
```javascript
// En consola del navegador
localStorage.removeItem('pwa-install-dismissed')
// Recargar página (F5)
```
---
## 📋 CHECKLIST
- [ ] Abrir `http://localhost:8096` (o preview)
- [ ] Abrir DevTools (F12) > Console
- [ ] Esperar 5 segundos
- [ ] Ver mensaje `[InstallBanner] ✅ Rendering banner!`
- [ ] Ver banner en la parte inferior de la pantalla
---
**Última actualización:** 2025-12-23

File diff suppressed because it is too large Load diff

View file

@ -1,345 +0,0 @@
# INVENTARIO COMPLETO DE ARCHIVOS MARKDOWN (.md)
**Fecha de generación:** 2025-12-23
**Total archivos:** 267
---
## 📁 ROOT
- `ASSETS_PLAN.md`
- `CAMBIOS_PENDIENTES_GITHUB.md`
- `COMANDOS_GIT.md`
- `DEPLOYMENT_GITHUB.md`
- `ESTADO_HERRAMIENTAS_ACTUALIZADO.md`
- `ESTADO_TOTAL_APLICACION.md`
- `ESTRUCTURACION_JERARQUICA_INTELIGENTE.md`
- `GITHUB_PAGES_FIX.md`
- `GUIA_ANADIR_PROTOCOLOS.md`
- `INVENTARIO_COMPLETO_ARCHIVOS_MD.md`
- `LIMPIEZA_COMPLETADA.md`
- `LISTADO_COMPLETO_MEDIOS_FALTANTES.md`
- `PAGINAS_PROTOCOLOS_CREADAS.md`
- `README.md`
- `REPORTE_LIMPIEZA_MANUAL.md`
## 📁 imagenes-pendientes
- `README.md`
## 📁 manual-tes
- `ANALISIS_REORGANIZACION.md`
- `AUDITORIA_ESTRUCTURAL_MANUAL_TES.md`
- `CAPITULOS_AFECTADOS_PROBLEMAS_ESTRUCTURALES.md`
- `CONTROL_PROYECTO.md`
- `ESTADO_BLOQUE_1_ACTUALIZADO.md`
- `ESTADO_PROPUESTA_BLOQUE_5_SVA.md`
- `INFORME_BLOQUE_1_BUSQUEDA.md`
- `INFORME_CAMBIOS_REORGANIZACION.md`
- `INFORME_CAPITULOS_SIN_ESTRUCTURA.md`
- `INFORME_REVISION_ESTRUCTURAL_COMPLETA.md`
- `MAPA_MAESTRO_MANUAL_TES_DIGITAL.md`
- `PLAN_DIVISION_NORMALIZACION_ESTRUCTURAL.md`
- `PLAN_REORGANIZACION_MANUAL.md`
- `PROGRESO_NORMALIZACION_ESTRUCTURAL.md`
- `PROPUESTA_ESTRUCTURA_HIBRIDA_BLOQUE_5_SVA.md`
- `RESUMEN_ATLS_CONCEPTUAL.md`
- `RESUMEN_CORRECCIONES_BLOQUE_1.md`
- `RESUMEN_CORRECCIONES_COMPLETAS.md`
- `RESUMEN_INTEGRACION_CONTENIDO.md`
- `RESUMEN_NORMALIZACION_ESTRUCTURAL_PRIORIDAD_ALTA.md`
- `RESUMEN_NORMALIZACION_FASE_2_3.md`
## 📁 manual-tes/01_FUNDAMENTOS
- `BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md`
## 📁 manual-tes/02_PROCEDIMIENTOS_BASICOS
- `1.1_constantes_vitales.md`
- `1.2_abcde_operativo.md`
- `1.3_glasgow_operativo.md`
- `1.4_triage_start.md`
- `BLOQUE_01_5_PULSIOXIMETRO.md`
- `BLOQUE_01_6_TENSIOMETRO.md`
- `BLOQUE_01_7_GLUCOMETRO.md`
- `BLOQUE_01_8_REGISTRO_OPERATIVO_CONSTANTES_VITALES.md`
- `BLOQUE_01_9_HERRAMIENTA_EVALUACION_AUTOMATICA_CONSTANTES.md`
## 📁 manual-tes/02_SOPORTE_VITAL
- `BLOQUE_02_0_RECONOCIMIENTO_PCR.md`
- `BLOQUE_02_1_RCP_ADULTOS.md`
- `BLOQUE_02_2_RCP_PEDIATRIA.md`
- `BLOQUE_02_3_RCP_LACTANTES.md`
- `BLOQUE_02_4_USO_DESA.md`
- `BLOQUE_02_5_VENTILACION_BVM.md`
- `BLOQUE_02_6_USO_CANULAS_OPA_NPA.md`
- `BLOQUE_02_7_ASPIRACION_SECRECIONES.md`
- `BLOQUE_02_8_POSICIONES_SEGURIDAD_MOVILIZACION.md`
## 📁 manual-tes/03_MATERIAL_E_INMOVILIZACION
- `BLOQUE_02_0_ANATOMIA_OPERATIVA.md`
- `BLOQUE_02_10_FERULAS.md`
- `BLOQUE_02_11_CINTURON_PELVICO.md`
- `BLOQUE_02_12_FERULA_TRACCION.md`
- `BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md`
- `BLOQUE_02_2_INMOVILIZACION_MANUAL.md`
- `BLOQUE_02_3_COLLARIN_CERVICAL.md`
- `BLOQUE_02_4_CAMILLA_CUCHARA.md`
- `BLOQUE_02_5_TABLERO_ESPINAL.md`
- `BLOQUE_02_6_COLCHON_VACIO.md`
- `BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`
- `BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md`
- `BLOQUE_02_9_ERRORES_CRITICOS.md`
- `BLOQUE_02_X_INVENTARIO_MATERIAL.md`
## 📁 manual-tes/04_OXIGENOTERAPIA
- `BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md`
- `BLOQUE_03_10_MONITORIZACION_BASICA.md`
- `BLOQUE_03_11_GLUCOMETRO.md`
- `BLOQUE_03_12_TERMOMETRIA.md`
- `BLOQUE_03_13_CONFORT_DOLOR.md`
- `BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md`
- `BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md`
- `BLOQUE_03_16_COMUNICACION_OPERATIVA.md`
- `BLOQUE_03_17_SENALIZACION_ILUMINACION.md`
- `BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md`
- `BLOQUE_03_19_GESTION_OPERATIVA_VIA_AEREA_AVANZADA.md`
- `BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md`
- `BLOQUE_03_20_RESOLUCION_PROBLEMAS_VIA_AEREA.md`
- `BLOQUE_03_21_MONITORIZACION_VIA_AEREA_TRASLADO.md`
- `BLOQUE_03_22_DISPOSITIVOS_SUPRAGLOTICOS.md`
- `BLOQUE_03_23_CANULAS_ORO_NASOFARINGEAS.md`
- `BLOQUE_03_24_USO_CORRECTO_BVM_AMBU.md`
- `BLOQUE_03_25_VENTILACION_MEDIOS_FORTUNA.md`
- `BLOQUE_03_2_ASPIRACION.md`
- `BLOQUE_03_3_BVM.md`
- `BLOQUE_03_4_CANULAS.md`
- `BLOQUE_03_5_ORGANIZACION_MALETIN.md`
- `BLOQUE_03_6_CONTROL_HEMORRAGIAS.md`
- `BLOQUE_03_7_QUEMADURAS.md`
- `BLOQUE_03_8_HERIDAS_VENDAJES.md`
- `BLOQUE_03_99_CIERRE_BLOQUE_3.md`
- `BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md`
- `BLOQUE_03_X2_MALETIN_CURAS.md`
- `BLOQUE_03_X3_BOLSA_MONITORIZACION.md`
- `BLOQUE_03_X4_INVENTARIO_GLOBAL.md`
- `BLOQUE_03_X5_CHECKLIST_MAESTRO.md`
- `BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md`
## 📁 manual-tes/05_SOPORTE_VITAL_RCP
- `BLOQUE_04_0_RECONOCIMIENTO_PCR.md`
- `BLOQUE_04_10_ALGORITMO_PCR_AVANZADA_EQUIPO_TES.md`
- `BLOQUE_04_11_ARITMIAS_AMENAZANTES.md`
- `BLOQUE_04_1_RCP_ADULTOS.md`
- `BLOQUE_04_2_RCP_PEDIATRIA.md`
- `BLOQUE_04_3_RCP_LACTANTES.md`
- `BLOQUE_04_4_USO_DESA.md`
- `BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md`
- `BLOQUE_04_6_OVACE_ADULTOS.md`
- `BLOQUE_04_7_OVACE_PEDIATRIA.md`
- `BLOQUE_04_8_OVACE_LACTANTES.md`
- `BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md`
## 📁 manual-tes/06_PROTOCOLOS_TRANSTELEFONICOS
- `BLOQUE_05_0_COMUNICACION_TRANSTELEFONICA_FUNDAMENTAL.md`
- `BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md`
- `BLOQUE_05_2_RCP_TRANSTELEFONICA_NINOS.md`
- `BLOQUE_05_3_RCP_TRANSTELEFONICA_LACTANTES.md`
- `BLOQUE_05_4_DESA_GUIADO_TELEFONO.md`
- `BLOQUE_05_5_DOLOR_TORACICO_TRANSTELEFONICO.md`
- `BLOQUE_05_6_SCA_TRANSTELEFONICO.md`
- `BLOQUE_05_7_ICTUS_TRANSTELEFONICO.md`
- `BLOQUE_05_8_COMUNICACION_COORDINADORES.md`
- `BLOQUE_05_9_OVACE_TRANSTELEFONICA.md`
## 📁 manual-tes/07_FARMACOLOGIA
- `BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md`
- `BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md`
- `BLOQUE_06_2_ANALGESICOS_SEDANTES.md`
- `BLOQUE_06_3_VASOACTIVOS_AMINAS.md`
- `BLOQUE_06_4_ANTIARRITMICOS.md`
- `BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md`
- `BLOQUE_06_6_FARMACOS_RESPIRATORIOS.md`
- `BLOQUE_06_7_FARMACOS_NEUROLOGICOS_METABOLICOS.md`
- `BLOQUE_06_8_SOLUCIONES_REPOSICION.md`
## 📁 manual-tes/08_TRANSFERENCIA_CONTINUIDAD_ASISTENCIAL
- `BLOQUE_08_0_FUNDAMENTOS_TRANSFERENCIA.md`
- `BLOQUE_08_1_PREPARACION_TRASLADO.md`
- `BLOQUE_08_2_GESTION_DURANTE_TRASLADO.md`
- `BLOQUE_08_3_COMUNICACION_PRE_HOSPITALARIA.md`
- `BLOQUE_08_4_DOCUMENTACION_TRASLADO.md`
- `BLOQUE_08_5_TRANSFERENCIA_AL_HOSPITAL.md`
## 📁 manual-tes/09_TRIAGE_MULTIPLES_VICTIMAS
- `BLOQUE_07_1_FUNDAMENTOS_TRIAGE.md`
- `BLOQUE_07_2_METODO_START.md`
- `BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md`
- `BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md`
- `BLOQUE_07_5_RE_TRIAGE_EVACUACION.md`
- `BLOQUE_07_6_CONSIDERACIONES_ESPECIALES_TMV.md`
- `BLOQUE_07_7_PUNTOS_CLAVE_ERRORES_FRECUENTES.md`
## 📁 manual-tes/BLOQUES
- `BLOQUE_01_OXIGENOTERAPIA.md`
- `BLOQUE_02_MATERIAL_E_INMOVILIZACION.md`
## 📁 scripts
- `README.md`
- `README_ORGANIZADOR_INFOGRAFIAS.md`
## 📁 src/components/content
- `README.md`
---
## ⚠️ PROBLEMAS DETECTADOS
### 🔴 Duplicado Crítico: BLOQUE_05_5
**Hay archivos con numeración 05_5:**
- `manual-tes/06_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_5_DOLOR_TORACICO_TRANSTELEFONICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md`
**Acción requerida:** Verificar numeración correcta según índice.
### 🟡 Duplicados Evidentes (mismo nombre, diferentes ubicaciones)
- **ANALISIS_REORGANIZACION.md** aparece en:
- `manual-tes/ANALISIS_REORGANIZACION.md`
- `manual-tes/TES_Manual_Digital/_DOCUMENTACION_INTERNA/01_ANALISIS_Y_AUDITORIA/ANALISIS_REORGANIZACION.md`
- **AUDITORIA_ESTRUCTURAL_MANUAL_TES.md** aparece en:
- `manual-tes/AUDITORIA_ESTRUCTURAL_MANUAL_TES.md`
- `manual-tes/TES_Manual_Digital/_DOCUMENTACION_INTERNA/01_ANALISIS_Y_AUDITORIA/AUDITORIA_ESTRUCTURAL_MANUAL_TES.md`
- **BLOQUE_01_OXIGENOTERAPIA.md** aparece en:
- `manual-tes/BLOQUES/BLOQUE_01_OXIGENOTERAPIA.md`
- `manual-tes/TES_Manual_Digital/_DOCUMENTACION_INTERNA/BLOQUES/BLOQUE_01_OXIGENOTERAPIA.md`
- **BLOQUE_02_0_ANATOMIA_OPERATIVA.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_0_ANATOMIA_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_0_ANATOMIA_OPERATIVA.md`
- **BLOQUE_02_10_FERULAS.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_10_FERULAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_10_FERULAS.md`
- **BLOQUE_02_11_CINTURON_PELVICO.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_11_CINTURON_PELVICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_11_CINTURON_PELVICO.md`
- **BLOQUE_02_12_FERULA_TRACCION.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_12_FERULA_TRACCION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_12_FERULA_TRACCION.md`
- **BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md`
- **BLOQUE_02_2_INMOVILIZACION_MANUAL.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md`
- **BLOQUE_02_3_COLLARIN_CERVICAL.md** aparece en:
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
*... y 49 duplicados más.*
### 🟠 Mezcla de Bloques en Carpetas
- `BLOQUES` contiene bloques: 1, 2
- `manual-tes` contiene bloques: 1, 5
---
## 📊 RESUMEN POR CARPETA PRINCIPAL
| Carpeta | Archivos .md | Observaciones |
|---------|--------------|---------------|
| `01_FUNDAMENTOS` | 1 | - |
| `02_PROCEDIMIENTOS_BASICOS` | 9 | - |
| `02_SOPORTE_VITAL` | 9 | - |
| `03_MATERIAL_E_INMOVILIZACION` | 14 | - |
| `04_OXIGENOTERAPIA` | 32 | - |
| `05_SOPORTE_VITAL_RCP` | 12 | - |
| `06_PROTOCOLOS_TRANSTELEFONICOS` | 10 | - |
| `07_FARMACOLOGIA` | 9 | - |
| `08_TRANSFERENCIA_CONTINUIDAD_ASISTENCIAL` | 6 | - |
| `09_TRIAGE_MULTIPLES_VICTIMAS` | 7 | - |
| `ANALISIS_REORGANIZACION.md` | 1 | - |
| `AUDITORIA_ESTRUCTURAL_MANUAL_TES.md` | 1 | - |
| `BLOQUES` | 2 | - |
| `CAPITULOS_AFECTADOS_PROBLEMAS_ESTRUCTURALES.md` | 1 | - |
| `CONTROL_PROYECTO.md` | 1 | - |
| `ESTADO_BLOQUE_1_ACTUALIZADO.md` | 1 | - |
| `ESTADO_PROPUESTA_BLOQUE_5_SVA.md` | 1 | - |
| `INFORME_BLOQUE_1_BUSQUEDA.md` | 1 | - |
| `INFORME_CAMBIOS_REORGANIZACION.md` | 1 | - |
| `INFORME_CAPITULOS_SIN_ESTRUCTURA.md` | 1 | - |
| `INFORME_REVISION_ESTRUCTURAL_COMPLETA.md` | 1 | - |
| `MAPA_MAESTRO_MANUAL_TES_DIGITAL.md` | 1 | - |
| `PLAN_DIVISION_NORMALIZACION_ESTRUCTURAL.md` | 1 | - |
| `PLAN_REORGANIZACION_MANUAL.md` | 1 | - |
| `PROGRESO_NORMALIZACION_ESTRUCTURAL.md` | 1 | - |
| `PROPUESTA_ESTRUCTURA_HIBRIDA_BLOQUE_5_SVA.md` | 1 | - |
| `RESUMEN_ATLS_CONCEPTUAL.md` | 1 | - |
| `RESUMEN_CORRECCIONES_BLOQUE_1.md` | 1 | - |
| `RESUMEN_CORRECCIONES_COMPLETAS.md` | 1 | - |
| `RESUMEN_INTEGRACION_CONTENIDO.md` | 1 | - |
| `RESUMEN_NORMALIZACION_ESTRUCTURAL_PRIORIDAD_ALTA.md` | 1 | - |
| `RESUMEN_NORMALIZACION_FASE_2_3.md` | 1 | - |
| `TES_Manual_Digital` | 116 | - |

View file

@ -1,143 +0,0 @@
# ✅ Limpieza e Integración Completa - COMPLETADA
**Fecha:** 2025-12-17
---
## 🎉 Resumen Ejecutivo
La limpieza e integración del Manual TES Digital se ha completado exitosamente:
- ✅ **93 archivos válidos** identificados y organizados
- ✅ **66 archivos obsoletos** identificados (listos para eliminar si se desea)
- ✅ **Backup completo** creado antes de cualquier cambio
- ✅ **Archivos copiados** a `public/manual/` con estructura correcta
- ✅ **Rutas actualizadas** en `manual-index.ts` para apuntar a `/manual/`
- ✅ **Componentes actualizados** para usar las nuevas rutas
---
## 📊 Estadísticas
| Métrica | Valor |
|---------|-------|
| Archivos válidos | 93 |
| Archivos obsoletos identificados | 66 |
| Archivos en `public/manual/` | 93 ✅ |
| Rutas actualizadas en índice | 93 ✅ |
| Backup creado | ✅ |
---
## 📁 Estructura Final
```
public/manual/
├── BLOQUE_0_FUNDAMENTOS/ (1 archivo)
├── BLOQUE_1_PROCEDIMIENTOS_BASICOS/ (4 archivos)
├── BLOQUE_2_MATERIAL_E_INMOVILIZACION/ (14 archivos)
├── BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/ (28 archivos)
├── BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/ (10 archivos)
├── BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/ (10 archivos)
├── BLOQUE_6_FARMACOLOGIA/ (8 archivos)
├── BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/ (6 archivos)
├── BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/ (5 archivos)
├── BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA/ (1 archivo)
├── BLOQUE_10_SITUACIONES_ESPECIALES/ (1 archivo)
├── BLOQUE_11_PROTOCOLOS_TRAUMA/ (1 archivo)
├── BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL/ (1 archivo)
├── BLOQUE_13_COMUNICACION_RELACION_PACIENTE/ (1 archivo)
└── BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES/ (1 archivo)
Total: 93 archivos .md
```
---
## 🔄 Cambios Realizados
### 1. Archivos
- ✅ Copiados 93 archivos válidos a `public/manual/`
- ✅ Organizados por bloques (BLOQUE_0, BLOQUE_1, etc.)
- ✅ Backup completo en `backup_manual_pre_limpieza/`
### 2. Rutas en `manual-index.ts`
- ✅ Actualizadas de `manual-tes/TES_Manual_Digital/BLOQUE_X/archivo.md`
- ✅ A `/manual/BLOQUE_X/archivo.md`
- ✅ Backup guardado en `manual-index.ts.backup`
### 3. Componentes React
- ✅ `ManualViewer.tsx` actualizado para usar rutas directas del índice
- ✅ `MarkdownViewer` ya estaba configurado para cargar desde `/manual/`
- ✅ `ManualIndex` muestra la estructura jerárquica completa
---
## 📋 Archivos Generados
1. **`REPORTE_LIMPIEZA_MANUAL.md`** - Reporte detallado de archivos válidos y obsoletos
2. **`RESUMEN_LIMPIEZA_COMPLETA.md`** - Resumen ejecutivo de la limpieza
3. **`backup_manual_pre_limpieza/`** - Backup completo de todos los archivos .md
4. **`manual-index.ts.backup`** - Backup del índice antes de actualizar rutas
5. **`scripts/limpiar_manual.py`** - Script de limpieza (reutilizable)
---
## ✅ Verificación
### Archivos en `public/manual/`
```bash
find public/manual -name "*.md" | wc -l
# Resultado: 93 ✅
```
### Rutas en `manual-index.ts`
```bash
grep -c 'rutaArchivo: "/manual/' src/data/manual-index.ts
# Resultado: 93 ✅
```
---
## 🚀 Próximos Pasos
### 1. Probar la Aplicación
```bash
npm run dev
# Abrir http://localhost:8096/manual
# Verificar que todos los capítulos se carguen correctamente
```
### 2. Opcional: Eliminar Archivos Obsoletos
Si deseas eliminar los 66 archivos obsoletos identificados:
- Revisar `REPORTE_LIMPIEZA_MANUAL.md` para ver la lista completa
- El backup está disponible en `backup_manual_pre_limpieza/` por si necesitas restaurar algo
### 3. Verificar Funcionalidad
- ✅ Navegación jerárquica en `/manual`
- ✅ Búsqueda de capítulos
- ✅ Carga de contenido markdown
- ✅ Navegación anterior/siguiente en capítulos
---
## 📝 Notas Importantes
1. **Backup:** Todos los archivos originales están respaldados en `backup_manual_pre_limpieza/`
2. **Rutas:** Las rutas ahora apuntan directamente a `/manual/` que se sirve desde `public/manual/`
3. **Estructura:** Los archivos están organizados por bloques para facilitar la navegación
4. **Índice:** El `manual-index.ts` está sincronizado con la estructura real de archivos
---
## 🎯 Estado Final
✅ **LIMPIEZA COMPLETADA**
✅ **INTEGRACIÓN COMPLETADA**
✅ **APP LISTA PARA USAR**
---
**Fecha de finalización:** 2025-12-17
**Archivos procesados:** 93/93 ✅
**Estado:** ✅ COMPLETADO

View file

@ -1,437 +0,0 @@
# LISTADO COMPLETO DE MEDIOS FALTANTES
**Fecha de análisis:** 2025-01-27
**Estado:** Documentación de medios mencionados pero no creados
---
## 📊 RESUMEN EJECUTIVO
- **Total de medios faltantes identificados:** 30+
- **Tipos:** Infografías, diagramas, tablas visuales, guías paso a paso
- **Ubicación esperada:** `public/assets/infografias/` o `public/assets/diagramas/`
- **Formato recomendado:** SVG (escalable) o PNG de alta resolución
---
## 📋 MEDIOS FALTANTES POR BLOQUE
### BLOQUE 0: FUNDAMENTOS
#### 1. Diagrama de Selección de Dispositivo de Oxigenoterapia
- **Ubicación en manual:** BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md
- **Descripción:** Diagrama visual que muestra el flujo de decisión para seleccionar el dispositivo de oxigenoterapia adecuado según la situación clínica
- **Elementos a incluir:**
- Flujograma de decisión
- Indicadores de FiO2 por dispositivo
- Situaciones clínicas de uso
- **Prioridad:** Alta
- **Formato:** SVG o PNG
#### 2. Tabla Visual de Rangos de FiO2
- **Ubicación en manual:** BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md
- **Descripción:** Tabla visual comparativa de los rangos de FiO2 de cada dispositivo de oxigenoterapia
- **Elementos a incluir:**
- Dispositivos: Cánula nasal, mascarilla simple, mascarilla con reservorio, mascarilla Venturi, mascarilla no reinhalación
- Rangos de FiO2 por dispositivo
- Indicadores visuales de color para rangos
- **Prioridad:** Alta
- **Formato:** SVG o PNG
#### 3. Guía de Colocación de Dispositivos de Oxigenoterapia
- **Ubicación en manual:** BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md
- **Descripción:** Secuencia visual paso a paso de cómo colocar cada dispositivo de oxigenoterapia
- **Elementos a incluir:**
- Pasos numerados con ilustraciones
- Posición correcta del dispositivo
- Verificaciones post-colocación
- **Prioridad:** Media
- **Formato:** SVG o PNG (serie de imágenes)
---
### BLOQUE 2: MATERIAL E INMOVILIZACIÓN
#### 4. Infografía: Componentes del Sistema de Inmovilización
- **Ubicación en manual:** BLOQUE_02_3_COLLARIN_CERVICAL.md (línea 647)
- **Descripción:** Diagrama mostrando todos los componentes del sistema completo de inmovilización
- **Elementos a incluir:**
- Control manual (inicial)
- Collarín cervical
- Inmovilización corporal (tablero/colchón)
- Sujeción completa
- Indicador visual: "Sistema completo = Protección real"
- **Texto a incluir:**
- "El collarín es parte de un sistema"
- "Collarín sin inmovilización corporal = protección incompleta"
- Lista de componentes
- **Prioridad:** Alta
- **Formato:** SVG
#### 5. Infografía: Selección de Talla de Collarín Cervical
- **Ubicación en manual:** BLOQUE_02_3_COLLARIN_CERVICAL.md (línea 662)
- **Descripción:** Diagrama de medición y tabla de tallas para seleccionar el collarín correcto
- **Elementos a incluir:**
- Diagrama de medición:
- Ángulo de la mandíbula (punto superior)
- Hombro/trapecio (punto inferior)
- Distancia entre ambos puntos
- Tabla de tallas (pediátrico, pequeño, mediano, grande)
- Indicadores de talla correcta vs incorrecta
- **Texto a incluir:**
- "Método estándar de medición"
- "Collarín demasiado grande → hiperextensión"
- "Collarín pequeño → flexión cervical"
- **Prioridad:** Alta
- **Formato:** SVG
#### 6. Infografía: Colocación de Collarín Paso a Paso
- **Ubicación en manual:** BLOQUE_02_3_COLLARIN_CERVICAL.md (línea 677)
- **Descripción:** Secuencia visual de 6 pasos para colocar el collarín cervical correctamente
- **Elementos a incluir:**
- Paso 1: Preparación
- Paso 2: Parte posterior
- Paso 3: Parte anterior
- Paso 4: Ajuste de cierres
- Paso 5: Verificación
- Paso 6: Liberación controlada
- Indicador visual: "Control manual durante todo el proceso"
- **Texto a incluir:**
- Títulos de cada paso
- Adverencia: "NUNCA soltar control manual hasta verificación completa"
- **Prioridad:** Alta
- **Formato:** SVG (serie de 6 imágenes)
#### 7. Infografía: Verificaciones Post-Colocación de Collarín
- **Ubicación en manual:** BLOQUE_02_3_COLLARIN_CERVICAL.md (línea 693)
- **Descripción:** Lista visual de 5 verificaciones después de colocar el collarín
- **Elementos a incluir:**
- Respiración normal
- No aumento de dolor
- No compromiso de vía aérea
- Collarín centrado
- Continúa inmovilización corporal
- Indicadores de verificación correcta
- **Texto a incluir:**
- "Verificaciones inmediatas después de colocar"
- "Si hay problemas: ajustar o reconsiderar"
- **Prioridad:** Media
- **Formato:** SVG
#### 8. Infografía: Errores Frecuentes en Colocación de Collarín
- **Ubicación en manual:** BLOQUE_02_3_COLLARIN_CERVICAL.md (línea 708)
- **Descripción:** Lista visual de errores comunes con iconos
- **Elementos a incluir:**
- Colocar sin control manual
- Soltar para ajustar
- Forzar alineación
- Talla incorrecta
- Colocar sobre ropa gruesa
- **Prioridad:** Media
- **Formato:** SVG
#### 9. Infografía: Posición del TES en Inmovilización Manual
- **Ubicación en manual:** BLOQUE_02_2_INMOVILIZACION_MANUAL.md (línea 530)
- **Descripción:** Diagrama de TES en posición correcta (cabecera del paciente)
- **Elementos a incluir:**
- Posición de rodillas o cuclillas
- Eje con el cuerpo del paciente
- Posición de las manos (vista lateral y frontal)
- **Texto a incluir:**
- "Posición: Cabecera del paciente, en eje con el cuerpo"
- "Manos: Palmas en laterales del cráneo, dedos extendidos"
- "Mantener posición cómoda para control prolongado"
- **Prioridad:** Alta
- **Formato:** SVG
#### 10. Infografía: Técnica de Sujeción Manual
- **Ubicación en manual:** BLOQUE_02_2_INMOVILIZACION_MANUAL.md (línea 543)
- **Descripción:** Vista superior de cabeza con posición de manos
- **Elementos a incluir:**
- Palmas en laterales del cráneo marcadas
- Zonas a evitar (pabellones auriculares, mandíbula)
- Indicadores de sujeción correcta
- **Texto a incluir:**
- "Sujeción: Palmas en laterales del cráneo"
- "Evitar: Pabellones auriculares, mandíbula"
- "Firme pero sin comprimir"
- **Prioridad:** Alta
- **Formato:** SVG
#### 11. Infografía: Situaciones que Requieren Inmovilización
- **Ubicación en manual:** BLOQUE_02_2_INMOVILIZACION_MANUAL.md (línea 556)
- **Descripción:** Iconos o símbolos de cada situación que requiere inmovilización
- **Elementos a incluir:**
- Politraumatizado
- Caída desde altura
- Accidente de tráfico
- Inconsciencia
- Dolor cervical
- Principio clave destacado
- **Texto a incluir:**
- Lista de situaciones
- "Principio: Toda víctima traumática se considera con lesión cervical hasta que se demuestre lo contrario"
- **Prioridad:** Media
- **Formato:** SVG
#### 12. Infografía: Secuencia de Transición en Inmovilización
- **Ubicación en manual:** BLOQUE_02_2_INMOVILIZACION_MANUAL.md (línea 572)
- **Descripción:** Secuencia visual de 4-5 pasos para transición de control manual a dispositivo
- **Elementos a incluir:**
- Paso 1: Control manual
- Paso 2: Preparación dispositivo
- Paso 3: Colocación (manteniendo control)
- Paso 4: Verificación
- Paso 5: Liberación controlada
- Indicador visual de "NO SOLTAR" en cada paso
- **Texto a incluir:**
- Títulos de cada paso
- Advertencia: "Mantener control manual hasta que dispositivo esté completamente fijado"
- **Prioridad:** Alta
- **Formato:** SVG (serie de imágenes)
#### 13. Infografía: Coordinación del Equipo en Inmovilización
- **Ubicación en manual:** BLOQUE_02_2_INMOVILIZACION_MANUAL.md (línea 587)
- **Descripción:** Diagrama de equipo alrededor del paciente
- **Elementos a incluir:**
- Roles marcados (control cabeza, control tronco, etc.)
- Flujo de comunicación
- Secuencia de órdenes
- **Prioridad:** Media
- **Formato:** SVG
#### 14. Infografía: Componentes del Tablero Espinal
- **Ubicación en manual:** BLOQUE_02_5_TABLERO_ESPINAL.md (línea 332)
- **Descripción:** Diagrama de tablero espinal con todos sus componentes
- **Elementos a incluir:**
- Tablero espinal
- Collarín cervical
- Correas de sujeción (tronco, pelvis)
- Bloques o cuñas para cabeza
- Indicador visual: "Sistema completo de inmovilización"
- **Texto a incluir:**
- "Tablero espinal: sistema completo"
- "Requiere: collarín, correas, bloques"
- "NO solo el tablero"
- **Prioridad:** Alta
- **Formato:** SVG
#### 15. Infografía: Colocación de Tablero Espinal Paso a Paso
- **Ubicación en manual:** BLOQUE_02_5_TABLERO_ESPINAL.md (línea 347)
- **Descripción:** Secuencia visual de colocación del tablero espinal
- **Elementos a incluir:**
- Pasos numerados con ilustraciones
- Posición del equipo
- Técnica de deslizamiento
- **Prioridad:** Alta
- **Formato:** SVG (serie de imágenes)
#### 16. Infografía: Componentes del Colchón de Vacío
- **Ubicación en manual:** BLOQUE_02_6_COLCHON_VACIO.md (línea 341)
- **Descripción:** Diagrama de colchón de vacío con todos sus componentes
- **Elementos a incluir:**
- Colchón de vacío desinflado
- Bomba de vacío
- Válvula de vacío
- Collarín cervical
- Correas de sujeción
- Indicador visual: "Sistema completo de inmovilización"
- **Texto a incluir:**
- "Colchón de vacío: sistema completo"
- "Requiere: bomba, collarín, correas"
- "Dispositivo de elección para transporte prolongado"
- **Prioridad:** Alta
- **Formato:** SVG
#### 17. Infografía: Colocación de Colchón de Vacío Paso a Paso
- **Ubicación en manual:** BLOQUE_02_6_COLCHON_VACIO.md (línea 355)
- **Descripción:** Secuencia visual de 10 pasos para colocar el colchón de vacío
- **Elementos a incluir:**
- Control cervical manual
- Colocación del colchón
- Moldeado
- Evacuación de aire
- Verificación
- **Prioridad:** Alta
- **Formato:** SVG (serie de imágenes)
#### 18. Infografía: Componentes de la Camilla Cuchara
- **Ubicación en manual:** BLOQUE_02_4_CAMILLA_CUCHARA.md (línea 298)
- **Descripción:** Diagrama de camilla cuchara separada en dos mitades
- **Elementos a incluir:**
- Dos mitades separables
- Indicadores de cierres (torácico y pélvico)
- Indicador visual: "Dispositivo de transferencia, no inmovilización definitiva"
- **Texto a incluir:**
- "Camilla cuchara: dos mitades separables"
- "Cierres: zona torácica y pélvica"
- **Prioridad:** Media
- **Formato:** SVG
---
### BLOQUE 3: MATERIAL SANITARIO Y OXIGENOTERAPIA
#### 19. Diagrama de Configuración para Máxima FiO2
- **Ubicación en manual:** BLOQUE_03_1B_VENTILACION_BOLSA_MASCARILLA.md (línea 290)
- **Descripción:** Diagrama mostrando la configuración óptima del sistema de ventilación con bolsa-mascarilla para obtener máxima FiO2
- **Elementos a incluir:**
- Reservorio conectado
- Flujo de oxígeno adecuado (15 L/min)
- Posición correcta de la mascarilla
- Técnica de sellado
- **Prioridad:** Media
- **Formato:** SVG
---
### BLOQUE 7: CONDUCCIÓN Y SEGURIDAD VIAL
#### 20. Diagrama de Configuración de GPS Antes de Salir
- **Ubicación en manual:** BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md (línea 101)
- **Descripción:** Diagrama visual mostrando la configuración correcta del GPS antes de iniciar la marcha
- **Elementos a incluir:**
- Configuración ANTES de iniciar marcha
- Uso solo de voz si no hay copiloto
- Advertencia: no manipular durante conducción
- **Prioridad:** Baja
- **Formato:** SVG
---
### BLOQUE 12: MARCO LEGAL ÉTICO PROFESIONAL
#### 21. Diagrama: Toma de Decisiones Éticas en Urgencias
- **Ubicación en manual:** BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md (línea 556)
- **Descripción:** Flujograma de decisión ética en situaciones de urgencia
- **Elementos a incluir:**
- Situación clínica inicial
- Valoración de urgencia vital
- Ramas: Urgencia vital / No urgencia vital
- Actuación inmediata vs contacto médico
- Consentimiento y documentación
- **Nota:** Ya existe una versión en texto ASCII en el archivo, pero necesita ser convertida a diagrama visual profesional
- **Prioridad:** Media
- **Formato:** SVG (flujograma)
---
## 📊 RESUMEN POR PRIORIDAD
### 🔴 Alta Prioridad (15 medios)
1. Diagrama de Selección de Dispositivo de Oxigenoterapia
2. Tabla Visual de Rangos de FiO2
3. Infografía: Componentes del Sistema de Inmovilización
4. Infografía: Selección de Talla de Collarín Cervical
5. Infografía: Colocación de Collarín Paso a Paso
6. Infografía: Posición del TES en Inmovilización Manual
7. Infografía: Técnica de Sujeción Manual
8. Infografía: Secuencia de Transición en Inmovilización
9. Infografía: Componentes del Tablero Espinal
10. Infografía: Colocación de Tablero Espinal Paso a Paso
11. Infografía: Componentes del Colchón de Vacío
12. Infografía: Colocación de Colchón de Vacío Paso a Paso
13. Guía de Colocación de Dispositivos de Oxigenoterapia
14. Infografía: Verificaciones Post-Colocación de Collarín
15. Infografía: Coordinación del Equipo en Inmovilización
### 🟡 Media Prioridad (5 medios)
16. Infografía: Errores Frecuentes en Colocación de Collarín
17. Infografía: Situaciones que Requieren Inmovilización
18. Infografía: Componentes de la Camilla Cuchara
19. Diagrama de Configuración para Máxima FiO2
20. Diagrama: Toma de Decisiones Éticas en Urgencias
### 🟢 Baja Prioridad (1 medio)
21. Diagrama de Configuración de GPS Antes de Salir
---
## 📁 ESTRUCTURA RECOMENDADA PARA ARCHIVOS
```
public/
└── assets/
├── infografias/
│ ├── bloque-0-fundamentos/
│ │ ├── diagrama-seleccion-dispositivo-oxigeno.svg
│ │ ├── tabla-rangos-fio2.svg
│ │ └── guia-colocacion-dispositivos-oxigeno.svg
│ ├── bloque-2-inmovilizacion/
│ │ ├── componentes-sistema-inmovilizacion.svg
│ │ ├── seleccion-talla-collarín.svg
│ │ ├── colocacion-collarín-paso-1.svg
│ │ ├── colocacion-collarín-paso-2.svg
│ │ ├── ... (más pasos)
│ │ ├── verificaciones-post-colocacion.svg
│ │ ├── errores-frecuentes-collarín.svg
│ │ ├── posicion-tes-inmovilizacion-manual.svg
│ │ ├── tecnica-sujecion-manual.svg
│ │ ├── situaciones-requieren-inmovilizacion.svg
│ │ ├── secuencia-transicion-inmovilizacion.svg
│ │ ├── coordinacion-equipo-inmovilizacion.svg
│ │ ├── componentes-tablero-espinal.svg
│ │ ├── colocacion-tablero-espinal-paso-1.svg
│ │ ├── ... (más pasos)
│ │ ├── componentes-colchon-vacio.svg
│ │ ├── colocacion-colchon-vacio-paso-1.svg
│ │ ├── ... (más pasos)
│ │ └── componentes-camilla-cuchara.svg
│ ├── bloque-3-material-sanitario/
│ │ └── configuracion-maxima-fio2.svg
│ ├── bloque-7-conduccion/
│ │ └── configuracion-gps.svg
│ └── bloque-12-marco-legal/
│ └── diagrama-decisiones-eticas.svg
└── diagramas/
└── (diagramas adicionales si se necesitan)
```
---
## 🎨 ESPECIFICACIONES TÉCNICAS
### Formato Recomendado
- **SVG** (preferido): Escalable, ligero, editable
- **PNG** (alternativa): Alta resolución (300 DPI mínimo)
### Dimensiones
- **Infografías completas:** 1200x800px mínimo
- **Diagramas paso a paso:** 800x600px por paso
- **Tablas visuales:** 1000x700px
### Estilo Visual
- **Colores:** Consistente con la paleta de la app (azul primario, rojo para emergencias)
- **Tipografía:** Sans-serif, legible en móvil
- **Iconos:** Estilo consistente (lucide-react o similar)
- **Contraste:** WCAG AA mínimo
### Accesibilidad
- Texto alternativo descriptivo para cada imagen
- Contraste adecuado para texto sobre fondos
- Versión en texto disponible para lectores de pantalla
---
## 📝 NOTAS IMPORTANTES
1. **No hay referencias a archivos multimedia existentes** en los archivos .md actuales
2. **Todas las infografías mencionadas están documentadas pero no creadas**
3. **Las descripciones detalladas están en los archivos .md** en las secciones "Puntos Clave TES" o "Contenido para Infografía"
4. **Prioridad alta** se asigna a medios relacionados con procedimientos críticos (inmovilización, oxigenoterapia)
5. **Formato SVG recomendado** para mejor escalabilidad y rendimiento en la app
---
## ✅ PRÓXIMOS PASOS
1. Crear estructura de carpetas `public/assets/infografias/`
2. Diseñar infografías de alta prioridad primero
3. Integrar referencias en archivos .md usando sintaxis Markdown estándar: `![Descripción](./assets/infografias/ruta.svg)`
4. Actualizar componentes React para mostrar infografías cuando estén disponibles
5. Validar accesibilidad y contraste de todas las imágenes
---
**Última actualización:** 2025-01-27
**Total de medios identificados:** 21 medios faltantes documentados

View file

@ -1,205 +0,0 @@
# ✅ Páginas de Protocolos Dedicadas - COMPLETADAS
**Fecha:** 2025-12-17
---
## 🎯 Objetivo
Crear páginas dedicadas para cada protocolo crítico mostrado en la página principal, reemplazando los enlaces con query parameters por rutas específicas y contenido completo.
---
## ✅ Páginas Creadas
### 1. `/rcp` - RCP / Parada Cardiorrespiratoria
**Archivo:** `src/pages/RCP.tsx`
**Características:**
- ✅ Tabs para alternar entre Adulto y Pediátrico
- ✅ Protocolo SVB (Soporte Vital Básico) completo
- ✅ Protocolo SVA (Soporte Vital Avanzado) completo
- ✅ Pasos detallados, advertencias y puntos clave
- ✅ Material necesario y fármacos relacionados
- ✅ Enlaces a protocolos relacionados
**Contenido:**
- Protocolo RCP Adulto SVB (10 pasos)
- Protocolo RCP Adulto SVA (10 pasos)
- Protocolo RCP Pediátrico (9 pasos)
- Advertencias específicas por edad
- Enlaces a Vía Aérea y otros protocolos
---
### 2. `/ictus` - Código Ictus
**Archivo:** `src/pages/Ictus.tsx`
**Características:**
- ✅ Test FAST explicado visualmente (F-A-S-T)
- ✅ Protocolo de activación paso a paso
- ✅ Criterios de exclusión
- ✅ Advertencias sobre tiempo crítico
- ✅ Enlaces a protocolo transtelefónico y RCP
**Contenido:**
- Test FAST (Face, Arms, Speech, Time)
- Protocolo de activación (4 pasos)
- Valoración inicial (hora síntomas, glucemia, TA, Glasgow)
- Manejo prehospitalario
- Criterios de exclusión
- Enlaces relacionados
---
### 3. `/shock` - Shock Hemorrágico
**Archivo:** `src/pages/Shock.tsx`
**Características:**
- ✅ Clasificación visual del shock (Clase I-IV)
- ✅ Protocolo completo paso a paso
- ✅ Explicación de hipotensión permisiva
- ✅ Material necesario y fármacos
- ✅ Enlaces relacionados
**Contenido:**
- Clasificación del shock hemorrágico (4 clases)
- Protocolo de actuación (9 pasos)
- Advertencias sobre hipotensión permisiva
- Excepciones (TCE)
- Material y fármacos
---
### 4. `/via-aerea` - Vía Aérea / OVACE
**Archivo:** `src/pages/ViaAerea.tsx`
**Características:**
- ✅ Valoración inicial (Leve vs Grave)
- ✅ Protocolo OVACE completo
- ✅ Variaciones por edad (Adultos vs Lactantes)
- ✅ Manejo si pierde consciencia
- ✅ Referencia a IOT (Intubación Orotraqueal)
- ✅ Enlaces a RCP y otros protocolos
**Contenido:**
- Valoración inicial (obstrucción leve/grave)
- Protocolo OVACE paso a paso
- Variaciones para adultos y lactantes
- Manejo si pierde consciencia
- Referencia a IOT en manual completo
---
## 🔄 Enlaces Actualizados
### Página Principal (`src/pages/Index.tsx`)
**Antes:**
- RCP: `/soporte-vital?id=rcp-adulto-svb`
- Ictus: `/patologias?tab=neurologicas`
- Shock: `/soporte-vital?id=shock-hemorragico`
- Vía Aérea: `/soporte-vital?id=obstruccion-via-aerea`
**Ahora:**
- ✅ RCP: `/rcp`
- ✅ Ictus: `/ictus`
- ✅ Shock: `/shock`
- ✅ Vía Aérea: `/via-aerea`
**También actualizado:**
- ✅ Botón flotante de emergencia → `/rcp`
- ✅ Quick Access chips → rutas actualizadas
---
## 📋 Rutas Agregadas
**Archivo:** `src/App.tsx`
```tsx
<Route path="/rcp" element={<RCP />} />
<Route path="/ictus" element={<Ictus />} />
<Route path="/shock" element={<Shock />} />
<Route path="/via-aerea" element={<ViaAerea />} />
```
---
## 🎨 Características de las Páginas
### Diseño Consistente:
- ✅ Header con icono y título
- ✅ Botón de retroceso en todas las páginas
- ✅ Cards con información estructurada
- ✅ Colores por prioridad (rojo crítico, naranja alto, etc.)
- ✅ Enlaces relacionados al final
### Contenido Completo:
- ✅ Protocolos paso a paso
- ✅ Advertencias importantes destacadas
- ✅ Puntos clave resaltados
- ✅ Material y fármacos necesarios
- ✅ Variaciones por edad cuando aplica
### Navegación:
- ✅ Botones de retroceso
- ✅ Enlaces a protocolos relacionados
- ✅ Enlaces al manual completo cuando aplica
---
## 📱 Estructura de Cada Página
1. **Header:**
- Icono con color temático
- Título principal
- Descripción breve
2. **Contenido Principal:**
- Protocolo paso a paso
- Información estructurada (clasificaciones, tests, etc.)
- Advertencias y puntos clave
3. **Secciones Especiales:**
- Clasificaciones (Shock)
- Tests (FAST en Ictus)
- Variaciones por edad (RCP, OVACE)
4. **Enlaces Relacionados:**
- Protocolos relacionados
- Manual completo
- Otras secciones relevantes
---
## ✅ Verificación
### Rutas Funcionando:
- ✅ `/rcp` - Página completa de RCP
- ✅ `/ictus` - Página completa de Código Ictus
- ✅ `/shock` - Página completa de Shock Hemorrágico
- ✅ `/via-aerea` - Página completa de Vía Aérea/OVACE
### Enlaces Actualizados:
- ✅ Botones de emergencia en página principal
- ✅ Quick Access chips
- ✅ Botón flotante de emergencia
---
## 🎯 Resultado Final
**4 páginas dedicadas creadas** con contenido completo
**Enlaces actualizados** en página principal
**Rutas configuradas** en App.tsx
**Navegación mejorada** con botones de retroceso
**Contenido estructurado** y fácil de leer
---
**Estado:** ✅ COMPLETADO Y LISTO PARA USAR

View file

@ -1,364 +0,0 @@
# 🧹 Plan de Limpieza Completo - EMERGES TES
**Fecha:** 2025-12-23
**Script:** `cleanup_completo.sh`
---
## 📋 Resumen Ejecutivo
Este plan ejecuta una limpieza completa del proyecto en **6 fases**, moviendo archivos innecesarios a carpetas de revisión y manteniendo solo lo esencial.
**Resultado esperado:**
- ~250 archivos (en lugar de 400+)
- ~150MB (en lugar de 250MB+)
- Estructura clara y organizada
- Todas las funcionalidades intactas
---
## 🔄 Fases de Limpieza
### **FASE 1: ARCHIVOS INNECESARIOS** (Eliminar inmediatamente)
**Acciones:**
- ✅ Eliminar archivos del sistema (.DS_Store, Thumbs.db)
- ✅ Eliminar logs (*.log, npm-debug.log*)
- ✅ Eliminar builds anteriores (dist/, build/, .next/)
- ✅ Eliminar node_modules/ (se reinstalarán)
**Impacto:** Limpieza inmediata, sin riesgo
---
### **FASE 2: BACKUPS Y DUPLICADOS** (Mover a revisión)
**Archivos movidos a `../EMERGES_REVISION_YYYYMMDD/`:**
1. **`_BACKUP_MD/`** (203 archivos)
- 129 archivos .md
- 62 archivos .docx
- 7 scripts Python
- **Acción:** Mover para revisión
2. **`MANUAL_TES_DIGITAL/`** (110 archivos .md)
- Duplicado de `public/manual/`
- **Acción:** Mover para revisión
3. **`imagenes-pendientes/`** (60 archivos)
- 50 imágenes PNG
- 9 imágenes SVG
- **Acción:** Mover para revisión
**Impacto:** Libera ~100MB, archivos disponibles para revisión
---
### **FASE 3: CONFIGURACIONES REDUNDANTES** (Simplificar)
**Configuraciones movidas a `config_backup/`:**
- `vercel.json` (si no usas Vercel)
- `netlify.toml` (si no usas Netlify)
- `nginx.conf.example` (solo ejemplo)
- `public/.htaccess` (si no usas Apache)
- `public/_redirects` (si no usas Netlify)
**Configuraciones mantenidas:**
- ✅ `Dockerfile`
- ✅ `docker-compose.yml`
- ✅ `docker-compose.prod.yml`
- ✅ `deploy-docker.sh`
- ✅ `ecosystem.config.js` (PM2)
- ✅ `deploy.sh`
- ✅ `webhook-deploy.sh`
- ✅ `.github/workflows/deploy.yml`
**Impacto:** Simplifica estructura, mantiene solo lo usado
---
### **FASE 4: DOCUMENTACIÓN** (Consolidar)
**Documentación esencial → `docs/consolidado/`:**
1. `DEPLOYMENT_SERVER.md`
2. `DEPLOYMENT_DOCKER.md`
3. `DEPLOYMENT_GITHUB.md`
4. `VERCEL_DEPLOYMENT.md`
5. `RESUMEN_DEPLOY_8607.md`
6. `VERIFICACION_PWA.md`
7. `ESTADO_FUNCIONALIDADES.md`
8. `SPA_ROUTING_CONFIG.md`
9. `CHECKLIST_PWA_COMPLETA.md`
10. `ANALISIS_TECNOLOGICO_PROYECTO.md`
11. `PLAN_ESTRUCTURA_PSIQUIATRIA.md`
12. `FASE_1_FALTANTE_DETALLADO.md`
13. `SISTEMA_MEDIOS_VISUALES.md`
**Resto de documentación → `docs/archivo/`:**
- Todos los demás archivos .md (excepto README.md)
**README.md:** Actualizado con información esencial
**Impacto:** Documentación organizada y accesible
---
### **FASE 5: SCRIPTS** (Limpiar)
**Scripts Python → `../EMERGES_REVISION_YYYYMMDD/scripts_python/`:**
- Todos los scripts .py de la raíz
- Scripts .py de `scripts/`
**Scripts mantenidos:**
- ✅ `deploy.sh`
- ✅ `deploy-docker.sh`
- ✅ `webhook-deploy.sh`
- ✅ `cleanup_completo.sh`
- ✅ `cleanup_project.sh`
- ✅ `scripts/verificar-manual.ts`
**Impacto:** Solo scripts esenciales visibles
---
### **FASE 6: REINSTALACIÓN Y VERIFICACIÓN**
**Acciones:**
- ✅ Reinstalar dependencias (`npm install`)
- ✅ Verificar build (`npm run build`)
- ✅ Mostrar resumen final
**Impacto:** Proyecto funcional y verificado
---
## 📊 Estructura Final Optimizada
```
protocolo-r-pido/
├── public/ # Archivos públicos
│ ├── assets/infografias/ # 46+ imágenes organizadas
│ ├── manual/ # 78 archivos .md
│ ├── manifest.json
│ ├── sw.js
│ └── favicon.svg
├── src/ # ~136 archivos TS/TSX
│ ├── components/ # 40+ componentes
│ ├── data/ # Datos TypeScript
│ ├── hooks/ # Custom hooks
│ ├── pages/ # 20+ páginas
│ └── [otros]
├── docs/
│ ├── consolidado/ # 13 documentos esenciales
│ └── archivo/ # 30+ documentos para referencia
├── scripts/
│ └── verificar-manual.ts # Script esencial
├── config_backup/ # Configuraciones no usadas
├── .github/
│ └── workflows/deploy.yml
├── Dockerfile # ✅ Mantenido
├── docker-compose.yml # ✅ Mantenido
├── docker-compose.prod.yml # ✅ Mantenido
├── deploy-docker.sh # ✅ Mantenido
├── ecosystem.config.js # ✅ Mantenido (PM2)
├── deploy.sh # ✅ Mantenido
├── webhook-deploy.sh # ✅ Mantenido
├── cleanup_completo.sh # ✅ Nuevo
├── package.json
├── vite.config.ts
├── tailwind.config.ts
└── README.md # ✅ Actualizado
```
---
## 🚀 Uso del Script
### Ejecutar Limpieza Completa
```bash
# Hacer ejecutable (si no lo está)
chmod +x cleanup_completo.sh
# Ejecutar limpieza
./cleanup_completo.sh
```
El script:
1. ✅ Crea backup completo automático
2. ✅ Pide confirmación antes de continuar
3. ✅ Ejecuta las 6 fases secuencialmente
4. ✅ Muestra progreso detallado
5. ✅ Verifica build al final
6. ✅ Muestra resumen completo
---
## ✅ Verificaciones Post-Limpieza
### 1. Build del Proyecto
```bash
npm run build
```
**Esperado:** Build exitoso sin errores
---
### 2. Desarrollo Local
```bash
npm run dev
```
**Esperado:** App funciona en `http://localhost:8096`
---
### 3. Docker
```bash
docker-compose up --build
```
**Esperado:** Contenedor inicia correctamente en puerto 8607
---
### 4. PWA Funcionalidad
```bash
npm run build
npx serve -s dist -l 3000
```
**Verificar en navegador:**
- ✅ Service Worker registrado
- ✅ Manifest funciona
- ✅ Modo offline funciona
- ✅ Instalación PWA disponible
---
### 5. Funcionalidades Clave
**Verificar:**
- ✅ Manual médico (todos los .md accesibles)
- ✅ Vademécum de fármacos
- ✅ Protocolos de emergencia
- ✅ Calculadoras médicas
- ✅ Favoritos y búsqueda
- ✅ Navegación entre páginas
---
## 📊 Espacio Liberado Estimado
| Elemento | Archivos | Espacio | Acción |
|----------|----------|---------|--------|
| `_BACKUP_MD/` | 203 | ~50MB | Mover a revisión |
| `MANUAL_TES_DIGITAL/` | 110 | ~30MB | Mover a revisión |
| `imagenes-pendientes/` | 60 | ~20MB | Mover a revisión |
| Documentación .md | 40+ | ~5MB | Consolidar |
| Configuraciones | 10+ | ~1MB | Mover a backup |
| Logs y temporales | Varios | ~5MB | Eliminar |
| **TOTAL** | **400+** | **~110MB** | **Optimizado** |
---
## ⚠️ Precauciones
### Antes de Ejecutar
1. ✅ **Backup manual extra** (recomendado):
```bash
cp -r /home/planetazuzu/protocolo-r-pido /home/planetazuzu/protocolo-backup-manual
```
2. ✅ **Verificar que no hay cambios sin commit**:
```bash
git status
```
3. ✅ **Commit de cambios pendientes** (si los hay):
```bash
git add -A
git commit -m "backup antes de limpieza"
```
### Después de Ejecutar
1. ✅ **Revisar `../EMERGES_REVISION_YYYYMMDD/`** antes de eliminar
2. ✅ **Verificar todas las funcionalidades**
3. ✅ **Probar build y deploy**
4. ✅ **Si todo está bien, eliminar backups antiguos** (mantener solo el más reciente)
---
## 🔄 Mantenimiento Recomendado
### Script de Mantenimiento Mensual
Crear `monthly_cleanup.sh`:
```bash
#!/bin/bash
echo "🧼 Mantenimiento mensual del proyecto"
# 1. Limpiar node_modules y reinstalar
rm -rf node_modules package-lock.json
npm install
# 2. Limpiar builds
rm -rf dist/
# 3. Verificar dependencias
npm outdated
npm audit
# 4. Rebuild
npm run build
echo "✅ Mantenimiento completado"
```
---
## 🎯 Resultado Final
Después de la limpieza, el proyecto tendrá:
- ✅ **~250 archivos** (en lugar de 400+)
- ✅ **~150MB** (en lugar de 250MB+)
- ✅ **Estructura clara y organizada**
- ✅ **Todas las funcionalidades intactas**
- ✅ **PWA completamente funcional**
- ✅ **Deployment simplificado**
- ✅ **Documentación accesible**
---
## 📞 Soporte
Si algo falla después de la limpieza:
1. **Restaurar desde backup:**
```bash
cd ..
tar -xzf EMERGES_BACKUP_YYYYMMDD_HHMMSS/proyecto_completo.tar.gz
```
2. **Revisar logs del script** (si hay errores)
3. **Verificar que todas las dependencias están instaladas**
---
**Última actualización:** 2025-12-23

View file

@ -1,176 +0,0 @@
# 📋 Reporte de Limpieza del Manual TES Digital
**Fecha:** 2025-12-17 12:17:55
## 📊 Resumen
- **Archivos válidos encontrados:** 93
- **Archivos obsoletos identificados:** 66
- **Total archivos .md en proyecto:** 159
## ✅ Archivos Válidos (93 esperados)
- `manual-tes/TES_Manual_Digital/BLOQUE_0_FUNDAMENTOS/BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_10_SITUACIONES_ESPECIALES/BLOQUE_10_0_SITUACIONES_ESPECIALES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_11_PROTOCOLOS_TRAUMA/BLOQUE_11_0_PROTOCOLOS_TRAUMA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL/BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_13_COMUNICACION_RELACION_PACIENTE/BLOQUE_13_0_COMUNICACION_RELACION_PACIENTE.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES/BLOQUE_14_0_SEGURIDAD_PERSONAL_SALUD_TES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_1_CONSTANTES_VITALES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_2_ABCDE_OPERATIVO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_3_GLASGOW_OPERATIVO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_4_TRIAGE_START.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_0_ANATOMIA_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_10_FERULAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_11_CINTURON_PELVICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_12_FERULA_TRACCION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_4_CAMILLA_CUCHARA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_5_TABLERO_ESPINAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_6_COLCHON_VACIO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_9_ERRORES_CRITICOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_X_INVENTARIO_MATERIAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_0B_OXIGENOTERAPIA_FUNDAMENTOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_10_MONITORIZACION_BASICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_11_GLUCOMETRO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_12_TERMOMETRIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_13_CONFORT_DOLOR.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_16_COMUNICACION_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_17_SENALIZACION_ILUMINACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_1B_VENTILACION_BOLSA_MASCARILLA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_2B_CANULA_OROFARINGEA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_2_ASPIRACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_3_BVM.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_4_CANULAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_5_ORGANIZACION_MALETIN.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_6_CONTROL_HEMORRAGIAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_7_QUEMADURAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_8_HERIDAS_VENDAJES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_99_CIERRE_BLOQUE_3.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X2_MALETIN_CURAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X3_BOLSA_MONITORIZACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X4_INVENTARIO_GLOBAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X5_CHECKLIST_MAESTRO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_0B_RECONOCIMIENTO_PCR.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_0_ACCESO_VASCULAR_BASICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_1_RCP_ADULTOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_2_RCP_PEDIATRIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_3_RCP_LACTANTES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_4_USO_DESA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_6_OVACE_ADULTOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_7_OVACE_PEDIATRIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_8_OVACE_LACTANTES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_0B_PROTOCOLOS_EMERGENCIAS_ESPECIFICAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_1_PCR_TRANSTELEFONICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_2_OVACE_TRANSTELEFONICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_3_SCA_TRANSTELEFONICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_8_COMUNICACION_COORDINADOR.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_1_VADEMECUM_OPERATIVO.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_4_ASPIRINA_USO_SCA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_6_FARMACOLOGIA/BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_0_FUNDAMENTOS_CONDUCCION_URGENCIAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_1_USO_LUCES_Y_SIRENA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_2_TECNICAS_CONDUCCION_EMERGENCIAS.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_3_SEGURIDAD_VIAL_Y_PREVENCION_ACCIDENTES.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_5_PROTOCOLOS_SEGURIDAD_EN_ESCENA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_0_INTRODUCCION_GESTION_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_1_DOCUMENTACION_CLINICA_PREHOSPITALARIA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_2_COORDINACION_Y_COMUNICACION_OPERATIVA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_3_GESTION_RECURSOS_Y_MATERIAL.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_4_CALIDAD_Y_MEJORA_CONTINUA.md`
- `manual-tes/TES_Manual_Digital/BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA/BLOQUE_09_0_MEDICINA_EMERGENCIAS_APLICADA.md`
## 🗑️ Archivos Obsoletos Identificados
**NOTA:** Estos archivos pueden ser eliminados de forma segura.
- `manual-tes/01_FUNDAMENTOS/BLOQUE_00_FUNDAMENTOS_EMERGENCIAS.md`
- `manual-tes/02_PROCEDIMIENTOS_BASICOS/1.1_constantes_vitales.md`
- `manual-tes/02_PROCEDIMIENTOS_BASICOS/1.2_abcde_operativo.md`
- `manual-tes/02_PROCEDIMIENTOS_BASICOS/1.3_glasgow_operativo.md`
- `manual-tes/02_PROCEDIMIENTOS_BASICOS/1.4_triage_start.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_0_ANATOMIA_OPERATIVA.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_10_FERULAS.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_11_CINTURON_PELVICO.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_12_FERULA_TRACCION.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_1_COLLARIN_CERVICAL.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_4_CAMILLA_CUCHARA.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_5_TABLERO_ESPINAL.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_6_COLCHON_VACIO.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_9_ERRORES_CRITICOS.md`
- `manual-tes/03_MATERIAL_E_INMOVILIZACION/BLOQUE_02_X_INVENTARIO_MATERIAL.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_10_MONITORIZACION_BASICA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_11_GLUCOMETRO.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_12_TERMOMETRIA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_13_CONFORT_DOLOR.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_16_COMUNICACION_OPERATIVA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_17_SENALIZACION_ILUMINACION.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_2_ASPIRACION.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_3_BVM.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_4_CANULAS.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_5_ORGANIZACION_MALETIN.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_6_CONTROL_HEMORRAGIAS.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_7_QUEMADURAS.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_8_HERIDAS_VENDAJES.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_99_CIERRE_BLOQUE_3.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_X2_MALETIN_CURAS.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_X3_BOLSA_MONITORIZACION.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_X4_INVENTARIO_GLOBAL.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_X5_CHECKLIST_MAESTRO.md`
- `manual-tes/04_OXIGENOTERAPIA/BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_0_RECONOCIMIENTO_PCR.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_1_RCP_ADULTOS.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_2_RCP_PEDIATRIA.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_3_RCP_LACTANTES.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_4_USO_DESA.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_6_OVACE_ADULTOS.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_7_OVACE_PEDIATRIA.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_8_OVACE_LACTANTES.md`
- `manual-tes/05_SOPORTE_VITAL_RCP/BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md`
- `manual-tes/ANALISIS_REORGANIZACION.md`
- `manual-tes/AUDITORIA_ESTRUCTURAL_MANUAL_TES.md`
- `manual-tes/BLOQUES/BLOQUE_01_OXIGENOTERAPIA.md`
- `manual-tes/BLOQUES/BLOQUE_02_MATERIAL_E_INMOVILIZACION.md`
- `manual-tes/CONTROL_PROYECTO.md`
- `manual-tes/INFORME_BLOQUE_1_BUSQUEDA.md`
- `manual-tes/MAPA_MAESTRO_MANUAL_TES_DIGITAL.md`
- `manual-tes/PROPUESTA_ESTRUCTURA_HIBRIDA_BLOQUE_5_SVA.md`
- `manual-tes/RESUMEN_ATLS_CONCEPTUAL.md`
- `manual-tes/RESUMEN_CORRECCIONES_BLOQUE_1.md`
- `manual-tes/RESUMEN_CORRECCIONES_COMPLETAS.md`

View file

@ -1,119 +0,0 @@
# 📋 Resumen de Cambios - EMERGES TES v2.0
## ✅ OBJETIVO 1: DONACIONES MINIMALISTAS
### Cambios Realizados
1. **Componente Footer creado** (`src/components/layout/Footer.tsx`)
- Footer minimalista y no intrusivo
- Visible solo en desktop (hidden en móvil)
- Enlace a Ko-fi: "☕ Apóyanos"
- Estilos consistentes con el resto de la app
2. **Integrado en App.tsx**
- Footer añadido al layout principal
- Layout ajustado con flexbox para posicionamiento correcto
### Archivos Modificados
- `src/App.tsx` - Añadido Footer al layout
- `src/components/layout/Footer.tsx` - Nuevo componente
### Verificación
- ✅ Enlace visible en desktop
- ✅ No intrusivo (hidden en móvil)
- ✅ Abre Ko-fi en nueva pestaña
- ✅ Estilos consistentes
---
## ✅ OBJETIVO 2: DEPLOY EN SERVIDOR PROPIO
### Cambios Realizados
1. **Scripts de producción** (`package.json`)
- `build:production`: Build optimizado para producción
- `start:production`: Servidor de preview (opcional)
2. **Configuración PM2** (`ecosystem.config.js`)
- Configuración para servidor Node.js (opcional)
- Solo necesario si no usas Nginx estático
3. **Script de deploy** (`deploy.sh`)
- Automatiza: git pull, npm ci, build, PM2 restart
- Ejecutable y comentado
4. **Configuración Nginx** (`nginx.conf.example`)
- Configuración completa para servir SPA estática
- Soporte para SSL/HTTPS
- Cache optimizado
- Redirección SPA (try_files)
5. **Documentación**
- `DEPLOYMENT.md`: Guía completa de deployment
- `TEST_CHECKLIST.md`: Checklist pre-deploy
- `env.example`: Variables de entorno
6. **Gitignore actualizado**
- Añadidos archivos .env
### Archivos Creados
- `ecosystem.config.js`
- `deploy.sh`
- `nginx.conf.example`
- `DEPLOYMENT.md`
- `TEST_CHECKLIST.md`
- `env.example`
### Archivos Modificados
- `package.json` - Scripts de producción
- `.gitignore` - Variables de entorno
---
## 🎯 Estado Final
### Funcionalidad
- ✅ App funciona exactamente igual
- ✅ Footer con donaciones añadido (discreto)
- ✅ Configuración de deploy completa
- ✅ Documentación exhaustiva
### Próximos Pasos para Deploy
1. **En el servidor:**
```bash
# Clonar repositorio
git clone <repo> /var/www/emerges-tes
cd /var/www/emerges-tes
# Instalar dependencias
npm ci
# Build
npm run build
# Configurar Nginx (ver DEPLOYMENT.md)
sudo cp nginx.conf.example /etc/nginx/sites-available/emerges-tes
sudo ln -s /etc/nginx/sites-available/emerges-tes /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
2. **Para actualizaciones:**
```bash
./deploy.sh
```
---
## 📝 Notas Importantes
- **No se añadió complejidad innecesaria**
- **No se modificó lógica existente**
- **Todos los cambios son reversibles**
- **Documentación completa incluida**
---
**Fecha:** 2025-12-23
**Versión:** 2.0

View file

@ -1,101 +0,0 @@
# ✅ Configuración PWA para Imágenes - COMPLETADA
**Fecha:** 2025-12-23
---
## ✅ CAMBIOS REALIZADOS
### 1. Service Worker (`public/sw.js`)
- ✅ **Actualizado** para cachear rutas `/assets/infografias/`
- ✅ **Estrategia cache-first** para imágenes (offline-first)
- ✅ **Cache automático** cuando se cargan imágenes
### 2. Vite Config (`vite.config.ts`)
- ✅ **Incluye imágenes** en build (PNG, JPG, SVG, GIF)
- ✅ **Mantiene estructura** de carpetas para assets
- ✅ **Copia `public/`** completo a `dist/`
### 3. Estructura de Carpetas
- ✅ **Creada** en `public/assets/infografias/`
- ✅ **5 bloques** organizados:
- `bloque-0-fundamentos/`
- `bloque-2-inmovilizacion/`
- `bloque-3-material-sanitario/`
- `bloque-7-conduccion/`
- `bloque-12-marco-legal/`
### 4. Documentación
- ✅ `GUIA_INTEGRAR_IMAGENES_PWA.md` - Guía completa
- ✅ `RESUMEN_PWA_IMAGENES.md` - Resumen técnico
- ✅ `ESTADO_INFOGRAFIAS_MEDIOS.md` - Estado actual
---
## 📋 QUÉ FALTA (Próximos Pasos)
### Paso 1: Organizar Imágenes
```bash
# Opción A: Script Python (interactivo)
python scripts/organizar_infografias.py
# Opción B: Manual
# Mover imágenes desde imagenes-pendientes/ a public/assets/infografias/
```
### Paso 2: Añadir Referencias en Markdown
Editar archivos `.md` del manual para incluir:
```markdown
![Descripción](./assets/infografias/bloque-X-tema/imagen.png)
```
### Paso 3: Build y Verificar
```bash
npm run build
# Verificar que dist/assets/infografias/ contiene las imágenes
```
---
## 🎯 CÓMO FUNCIONARÁ
1. **Usuario carga página** con imagen en Markdown
2. **Navegador solicita** imagen desde `/assets/infografias/...`
3. **Service Worker intercepta** y cachea la imagen
4. **Siguiente visita offline:** Imagen se sirve desde cache
5. **Resultado:** PWA funciona completamente offline con imágenes
---
## ✅ VERIFICACIÓN
### Build Actual
```bash
npm run build
# ✅ Build exitoso
# ✅ Estructura de carpetas se copia a dist/
```
### Test Offline (cuando haya imágenes)
1. Cargar app con imágenes
2. DevTools > Network > Offline
3. Recargar página
4. ✅ Imágenes deben cargar desde cache
---
## 📊 ESTADO FINAL
| Componente | Estado |
|------------|--------|
| Service Worker | ✅ Configurado |
| Vite Build | ✅ Configurado |
| Estructura carpetas | ✅ Creada |
| Imágenes organizadas | ⏳ Pendiente (48 en `imagenes-pendientes/`) |
| Referencias Markdown | ⏳ Pendiente |
| **Funciona offline** | ✅ **Sí, cuando se completen pasos 1-2** |
---
**Conclusión:** La PWA está configurada para funcionar offline con imágenes. Solo falta organizar las imágenes y añadir referencias en el manual.

View file

@ -1,112 +0,0 @@
# 🔗 Resumen: Enlaces de Referencia Añadidos
**Fecha:** 2025-12-23
---
## ✅ ENLACES AÑADIDOS
### Capítulos Actualizados (6 capítulos)
1. **BLOQUE_02_3_COLLARIN_CERVICAL.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (4 enlaces)
- ✅ Aplicación práctica (3 enlaces)
- ✅ Errores y prevención (1 enlace)
2. **BLOQUE_04_1_RCP_ADULTOS.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (4 enlaces)
- ✅ Protocolos transtelefónicos (1 enlace)
- ✅ Continuación (1 enlace)
3. **BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (3 enlaces)
- ✅ Aplicación práctica (2 enlaces)
4. **BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (3 enlaces)
- ✅ Aplicación práctica (2 enlaces)
5. **BLOQUE_02_2_INMOVILIZACION_MANUAL.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (4 enlaces)
- ✅ Continuación (1 enlace)
6. **BLOQUE_02_5_TABLERO_ESPINAL.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (3 enlaces)
- ✅ Continuación (2 enlaces)
7. **BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md**
- ✅ Prerrequisitos (2 enlaces)
- ✅ Capítulos relacionados (4 enlaces)
- ✅ Aplicación práctica (2 enlaces)
8. **BLOQUE_04_0_RECONOCIMIENTO_PCR.md**
- ✅ Prerrequisitos (1 enlace)
- ✅ Continuación (2 enlaces)
- ✅ Protocolos transtelefónicos (1 enlace)
---
## 📊 ESTADÍSTICAS
- **Capítulos actualizados:** 8
- **Total de enlaces añadidos:** ~40 enlaces
- **Categorías:** Prerrequisitos, Relacionados, Aplicación práctica, Continuación, Protocolos transtelefónicos
---
## 📋 FORMATO ESTÁNDAR
Todos los enlaces siguen el formato:
```markdown
---
## 🔗 Enlaces recomendados / Guía de referencia
### Prerrequisitos
- [Título del Capítulo](../ruta/relativa/al/archivo.md) - Descripción breve
### Capítulos relacionados
- [Título del Capítulo](./archivo.md) - Descripción breve
### Aplicación práctica
- [Título del Capítulo](../ruta/relativa/al/archivo.md) - Descripción breve
```
---
## 🎯 PRÓXIMOS PASOS
### Capítulos pendientes de actualizar (alta prioridad)
1. **BLOQUE_04_2_RCP_PEDIATRIA.md** - Añadir enlaces a RCP adulto, lactantes, DESA
2. **BLOQUE_04_3_RCP_LACTANTES.md** - Añadir enlaces a RCP pediátrica, adulto
3. **BLOQUE_04_4_USO_DESA.md** - Añadir enlaces a RCP, protocolos transtelefónicos
4. **BLOQUE_04_5_VENTILACION_BVM.md** - Añadir enlaces a RCP, oxigenoterapia
5. **BLOQUE_02_6_COLCHON_VACIO.md** - Añadir enlaces a tablero, collarín
6. **BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md** - Añadir enlaces a fundamentos, BVM
### Script disponible
- `scripts/anadir_enlaces_referencia.py` - Script para añadir enlaces automáticamente
- Requiere definir relaciones en el diccionario `RELACIONES`
---
## ✅ VERIFICACIÓN
Los enlaces añadidos:
- ✅ Usan rutas relativas correctas
- ✅ Siguen formato estándar
- ✅ Están organizados por categorías
- ✅ Incluyen descripciones breves
---
**Última actualización:** 2025-12-23

View file

@ -1,181 +0,0 @@
# ✅ Resumen: Script de Limpieza Completa Creado
**Fecha:** 2025-12-23
**Script:** `cleanup_completo.sh`
---
## 🎯 Lo que se ha creado
### 1. **Script de Limpieza Completa** (`cleanup_completo.sh`)
Script bash que ejecuta **6 fases** de limpieza de forma segura:
#### **FASE 1: Archivos Innecesarios**
- ✅ Elimina archivos del sistema (.DS_Store, Thumbs.db)
- ✅ Elimina logs (*.log, npm-debug.log*)
- ✅ Elimina builds anteriores (dist/, build/, .next/)
- ✅ Elimina node_modules/ (se reinstalarán después)
#### **FASE 2: Backups y Duplicados**
- ✅ Mueve `_BACKUP_MD/` (203 archivos) → `../EMERGES_REVISION_YYYYMMDD/`
- ✅ Mueve `MANUAL_TES_DIGITAL/` (110 archivos) → `../EMERGES_REVISION_YYYYMMDD/`
- ✅ Mueve `imagenes-pendientes/` (60 archivos) → `../EMERGES_REVISION_YYYYMMDD/`
#### **FASE 3: Configuraciones Redundantes**
- ✅ Mueve configuraciones no usadas → `config_backup/`
- ✅ Mantiene Docker, PM2 y GitHub Actions
#### **FASE 4: Documentación**
- ✅ Mueve 13 documentos esenciales → `docs/consolidado/`
- ✅ Mueve resto de documentación → `docs/archivo/`
- ✅ Actualiza README.md con información esencial
#### **FASE 5: Scripts**
- ✅ Mueve scripts Python → `../EMERGES_REVISION_YYYYMMDD/scripts_python/`
- ✅ Mantiene scripts esenciales (deploy.sh, deploy-docker.sh, etc.)
#### **FASE 6: Reinstalación y Verificación**
- ✅ Reinstala dependencias (`npm install`)
- ✅ Verifica build (`npm run build`)
- ✅ Muestra resumen completo
---
### 2. **Documentación** (`PLAN_LIMPIEZA_FASES.md`)
Guía completa que incluye:
- ✅ Descripción detallada de cada fase
- ✅ Estructura final optimizada
- ✅ Verificaciones post-limpieza
- ✅ Precauciones y mantenimiento
---
## 🚀 Cómo Usar
### Ejecutar Limpieza
```bash
# Hacer ejecutable (si no lo está)
chmod +x cleanup_completo.sh
# Ejecutar limpieza
./cleanup_completo.sh
```
**El script:**
1. ✅ Crea backup completo automático
2. ✅ Pide confirmación antes de continuar
3. ✅ Ejecuta las 6 fases secuencialmente
4. ✅ Muestra progreso detallado con colores
5. ✅ Verifica build al final
6. ✅ Muestra resumen completo
---
## 📊 Resultado Esperado
### Antes de Limpieza
- ~400+ archivos
- ~250MB+ de espacio
- Estructura desorganizada
### Después de Limpieza
- ~250 archivos
- ~150MB de espacio
- Estructura clara y organizada
- Todas las funcionalidades intactas
---
## ⚠️ Precauciones
### Antes de Ejecutar
1. **Backup manual extra** (recomendado):
```bash
cp -r /home/planetazuzu/protocolo-r-pido /home/planetazuzu/protocolo-backup-manual
```
2. **Verificar cambios sin commit**:
```bash
git status
```
3. **Commit de cambios pendientes** (si los hay):
```bash
git add -A
git commit -m "backup antes de limpieza"
```
### Después de Ejecutar
1. ✅ Revisar `../EMERGES_REVISION_YYYYMMDD/` antes de eliminar
2. ✅ Verificar todas las funcionalidades
3. ✅ Probar build y deploy
4. ✅ Si todo está bien, eliminar backups antiguos
---
## ✅ Verificaciones Post-Limpieza
### 1. Build
```bash
npm run build
```
### 2. Desarrollo
```bash
npm run dev
# Verificar en http://localhost:8096
```
### 3. Docker
```bash
docker-compose up --build
# Verificar en http://localhost:8607
```
### 4. PWA
- Service Worker registrado
- Manifest funciona
- Modo offline funciona
### 5. Funcionalidades
- Manual médico accesible
- Vademécum funciona
- Protocolos funcionan
- Calculadoras funcionan
- Búsqueda funciona
---
## 📁 Archivos Creados
1. ✅ `cleanup_completo.sh` - Script de limpieza (ejecutable)
2. ✅ `PLAN_LIMPIEZA_FASES.md` - Documentación completa
3. ✅ `RESUMEN_LIMPIEZA_COMPLETA.md` - Este resumen
---
## 🎯 Próximos Pasos
1. **Revisar el script:**
```bash
cat cleanup_completo.sh
```
2. **Revisar la documentación:**
```bash
cat PLAN_LIMPIEZA_FASES.md
```
3. **Ejecutar limpieza cuando estés listo:**
```bash
./cleanup_completo.sh
```
---
**Todo está listo para ejecutar la limpieza completa del proyecto! 🎉**

View file

@ -1,114 +0,0 @@
# 📋 RESUMEN - LIMPIEZA ESTRUCTURAL SEGURA
**Fecha:** 2025-12-23
**Proceso:** Limpieza estructural segura del proyecto Markdown
---
## ✅ FASE 1 - COPIA DE SEGURIDAD (COMPLETADA)
### Carpetas creadas:
- `_BACKUP_MD/` (raíz del proyecto)
- `TES_Manual_Digital/` - Carpeta completa movida desde `manual-tes/`
- `SOPORTE_VITAL_RCP_ANTIGUO/` - Carpeta `05_SOPORTE_VITAL_RCP/` movida desde `manual-tes/`
- `DUPLICADOS_VARIOS/` - Reservada para futuros duplicados
- `README.md` - Documentación del backup
### Archivos movidos (NO eliminados):
- ✅ `manual-tes/TES_Manual_Digital/``_BACKUP_MD/TES_Manual_Digital/`
- ✅ `manual-tes/05_SOPORTE_VITAL_RCP/``_BACKUP_MD/SOPORTE_VITAL_RCP_ANTIGUO/`
### Estado:
- ✅ Copia de seguridad completa y reversible
- ✅ README.md creado con documentación
- ✅ Ningún archivo eliminado
---
## ✅ FASE 2 - LIMPIEZA VISUAL (COMPLETADA)
### Estructura activa confirmada:
```
manual-tes/
├── 01_FUNDAMENTOS/ (1 archivo)
├── 02_PROCEDIMIENTOS_BASICOS/ (9 archivos)
├── 02_SOPORTE_VITAL/ (9 archivos)
├── 03_MATERIAL_E_INMOVILIZACION/ (14 archivos)
├── 04_OXIGENOTERAPIA/ (32 archivos)
├── 06_PROTOCOLOS_TRANSTELEFONICOS/ (10 archivos)
├── 07_FARMACOLOGIA/ (9 archivos)
├── 08_TRANSFERENCIA_CONTINUIDAD_ASISTENCIAL/ (6 archivos)
└── 09_TRIAGE_MULTIPLES_VICTIMAS/ (7 archivos)
```
### Total archivos activos: 97 archivos .md
---
## ✅ FASE 3 - ENLACES RECOMENDADOS (COMPLETADA)
### Resultados:
- ✅ **90 archivos** con enlaces añadidos automáticamente
- ⚠️ **28 archivos** sin enlaces (archivos de documentación/inventarios sin numeración estándar)
- ✅ **1 archivo** (BLOQUE_00) con enlaces añadidos manualmente
### Sección añadida:
Todos los archivos activos ahora incluyen al final:
```markdown
## 🔗 Enlaces recomendados / Guía de referencia
- [Enlace 1](ruta_relativa)
- [Enlace 2](ruta_relativa)
...
```
### Tipos de enlaces incluidos:
- Capítulos previos lógicos (fundamentos)
- Capítulos siguientes lógicos (continuidad)
- Capítulos de soporte transversal (ABCDE, RCP, farmacología, traslado)
- Protocolos relacionados
---
## 📊 ESTADÍSTICAS FINALES
| Métrica | Valor |
|---------|-------|
| Archivos activos | 97 |
| Archivos con enlaces | 91 |
| Archivos en backup | ~130+ (estimado) |
| Carpetas movidas | 2 |
| Enlaces añadidos | ~450+ (estimado) |
---
## ✅ RESULTADO ESPERADO (LOGROS)
- ✅ Copia de seguridad completa y reversible
- ✅ Estructura activa limpia y clara
- ✅ Manual navegable como red de conocimiento
- ✅ Base sólida para normalización y publicación futura
- ✅ Proyecto preparado para siguientes fases sin riesgo
---
## 🔍 VERIFICACIÓN
Para verificar el estado:
1. Revisar `_BACKUP_MD/README.md` para información del backup
2. Revisar cualquier archivo en `manual-tes/` para ver sección de enlaces al final
3. Consultar `INVENTARIO_COMPLETO_ARCHIVOS_MD.md` para estructura completa
---
## 📝 NOTAS
- **Ningún archivo fue eliminado** - Solo movidos a backup
- **Todos los enlaces son relativos** - Funcionan en cualquier entorno
- **Los archivos de documentación** (informes, planes) no tienen enlaces (esperado)
- **La estructura está lista** para normalización y publicación
---
**Última actualización:** 2025-12-23

View file

@ -1,146 +0,0 @@
# ✅ Organización de Imágenes - COMPLETADA
**Fecha:** 2025-12-23
---
## 📊 RESULTADO
### ✅ Imágenes Organizadas: **48 de 49**
| Bloque | Imágenes | Estado |
|--------|----------|--------|
| **bloque-0-fundamentos** | 9 | ✅ Organizadas |
| **bloque-2-inmovilizacion** | 28 | ✅ Organizadas |
| **bloque-3-material-sanitario** | 9 | ✅ Organizadas |
| **bloque-7-conduccion** | 1 | ✅ Organizada |
| **bloque-12-marco-legal** | 2 | ✅ Organizadas |
| **No mapeada** | 1 | ⚠️ Requiere revisión |
---
## 📁 ESTRUCTURA CREADA
```
public/assets/infografias/
├── bloque-0-fundamentos/ (9 imágenes)
│ ├── ALGORITMO OPERATIVO DEL TES.svg
│ ├── RESUMEN VISUAL DEL ALGORITMO START.svg
│ ├── flujo-rcp-transtelefonica.png
│ ├── flujo-desa-telefono.png
│ ├── fast-transtelefonico.png
│ ├── diagrama-seleccion-dispositivo-oxigenoterapia.png
│ ├── tabla-rangos-fio2-oxigenoterapia.png
│ ├── tabla-rangos-fio2-oxigenoterapia1.png
│ └── guia-colocacion-dispositivos-oxigenoterapia.png
├── bloque-2-inmovilizacion/ (28 imágenes)
│ ├── colocacion-collarin-paso-1-preparacion.png
│ ├── colocacion-collarin-paso-2-parte-posterior.png
│ ├── colocacion-collarin-paso-3-parte-anterior.png
│ ├── colocacion-collarin-paso-4-ajuste-cierres.png
│ ├── colocacion-collarin-paso-5-verificacion.png
│ ├── colocacion-collarin-paso-6-liberacion-controlada.png
│ ├── seleccion-talla-collarin-cervical.png
│ ├── seleccion-talla-collarin-cervical1.png
│ ├── seleccion-talla-collarin 2.png
│ ├── seleccion-talla-collarin-tabla-tallas.png
│ ├── seleccion-talla-collarin-medicion-anatomica.png
│ ├── seleccion-talla-collarin-error-demasiado-grande.png
│ ├── errores-frecuentes-collarin-cervical.png
│ ├── verificaciones-post-colocacion-collarin.png
│ ├── componentes-sistema-inmovilizacion.png
│ ├── componentes-sistema-inmovilizacion 1.png
│ ├── posicion-tes-inmovilizacion-manual.png
│ ├── posicion-tes-inmovilizacion-manual 1.png
│ ├── tecnica-sujecion-manual-cervical.png
│ ├── tecnica-sujecion-manual 1.png
│ ├── componentes-tablero-espinal.png
│ ├── componentes-colchon-vacio.png
│ ├── colocacion-colchon-vacio-paso-a-paso.png
│ ├── componentes-camilla-cuchara.png
│ ├── situaciones-que-requieren-inmovilizacion.png
│ ├── secuencia-transicion-inmovilizacion.png
│ └── coordinacion-equipo-inmovilizacion.png
├── bloque-3-material-sanitario/ (9 imágenes)
│ ├── uso-correcto-pulsioximetro.png
│ ├── uso-correcto-tensiometro.png
│ ├── registro-constantes-vitales.png
│ ├── interpretacion-constantes-semaforo.png
│ ├── configuracion-maxima-fio2-bolsa-mascarilla.png
│ ├── uso-correcto-ambu.png
│ ├── canulas-guedel-nasofaringea.png
│ ├── dispositivos-supragloticos-guia.png
│ └── ventilacion-medios-fortuna.png
├── bloque-7-conduccion/ (1 imagen)
│ └── configuracion-gps-antes-de-salir.png
└── bloque-12-marco-legal/ (2 imágenes)
├── diagrama-decisiones-eticas.png
└── diagrama-decisiones-eticas-urgencias.png
```
---
## ⚠️ IMAGEN NO MAPEADA
**Archivo:** `7 Mandamientos Movilización Segura Paciente.png`
**Ubicación actual:** `imagenes-pendientes/`
**Acción requerida:**
- Revisar el contenido de la imagen
- Decidir a qué bloque pertenece (probablemente `bloque-2-inmovilizacion`)
- Mover manualmente o añadir al mapeo en `scripts/organizar_imagenes_auto.py`
---
## ✅ PRÓXIMOS PASOS
### 1. Verificar Build
```bash
npm run build
# Verificar que dist/assets/infografias/ contiene las imágenes
```
### 2. Añadir Referencias en Markdown
Editar archivos `.md` del manual para incluir referencias a las imágenes:
**Ejemplo:**
```markdown
![Colocación de collarín - Paso 1](./assets/infografias/bloque-2-inmovilizacion/colocacion-collarin-paso-1-preparacion.png)
```
### 3. Test PWA Offline
1. Cargar app con imágenes
2. DevTools > Network > Offline
3. Verificar que las imágenes cargan desde cache
---
## 📝 NOTAS
- ✅ Todas las imágenes están en `public/assets/infografias/`
- ✅ El Service Worker cacheará automáticamente estas imágenes
- ✅ Vite copiará estas imágenes al build (`dist/`)
- ⏳ Falta añadir referencias en archivos Markdown del manual
- ⏳ Falta decidir ubicación de la imagen no mapeada
---
## 🎯 ESTADO FINAL
| Aspecto | Estado |
|---------|--------|
| **Imágenes organizadas** | ✅ 48/49 (98%) |
| **Estructura creada** | ✅ Completa |
| **Service Worker** | ✅ Configurado |
| **Vite Build** | ✅ Configurado |
| **Referencias Markdown** | ⏳ Pendiente |
| **Funciona offline** | ✅ Sí (cuando se añadan referencias) |
---
**Conclusión:** Las imágenes están organizadas y listas para usar en la PWA. Solo falta añadir las referencias en los archivos Markdown del manual.

View file

@ -1,125 +0,0 @@
# ✅ Resumen: PWA y Sistema de Actualizaciones
**Fecha:** 2025-12-23
---
## ✅ MEJORAS IMPLEMENTADAS
### 1. Service Worker Mejorado (`public/sw.js`)
- ✅ **Versión de cache:** `CACHE_VERSION = 'v1.0.1'` (incrementar para forzar actualización)
- ✅ **Cache First** para assets estáticos (offline-first)
- ✅ **Network First** para HTML (permite actualizaciones)
- ✅ **Cache automático** de imágenes en `/assets/infografias/`
- ✅ **Limpieza automática** de caches antiguos
### 2. Sistema de Actualizaciones (`src/main.tsx`)
- ✅ **Registro mejorado:** `updateViaCache: 'none'` (siempre verifica actualizaciones)
- ✅ **Verificación periódica:** Cada hora
- ✅ **Verificación al recuperar foco:** Cuando vuelves a la app
- ✅ **Detección de nueva versión:** Escucha eventos `updatefound`
### 3. Hook `useServiceWorker` (`src/hooks/useServiceWorker.ts`)
- ✅ **Estado del SW:** registration, updateAvailable, offline
- ✅ **Funciones:** updateServiceWorker(), reloadPage()
- ✅ **Detección automática** de actualizaciones
### 4. Componente `UpdateNotification` (`src/components/layout/UpdateNotification.tsx`)
- ✅ **Banner visual** cuando hay actualización
- ✅ **Botón "Actualizar ahora"** para aplicar actualización
- ✅ **Botón "Más tarde"** para posponer
- ✅ **Integrado** en `App.tsx`
### 5. Manifest Mejorado (`public/manifest.json`)
- ✅ **Iconos adicionales** (192x192, 512x512)
- ✅ **Configuración completa** para instalación PWA
---
## 🔄 CÓMO FUNCIONA
### Flujo de Actualización
1. **Desarrollo:**
- Cambias código
- Cambias `CACHE_VERSION` en `sw.js` (ej: `v1.0.1``v1.0.2`)
- Haces build: `npm run build`
- Subes a servidor
2. **Usuario abre la app:**
- El navegador detecta que `sw.js` cambió
- Descarga la nueva versión del SW
- La instala en segundo plano
3. **Nueva versión instalada:**
- El hook `useServiceWorker` detecta `updateAvailable = true`
- Se muestra el banner de actualización
- El usuario puede actualizar ahora o más tarde
4. **Usuario hace clic en "Actualizar ahora":**
- Se envía mensaje `SKIP_WAITING` al SW
- El SW se activa inmediatamente
- Se recarga la página
- Se crea nuevo cache con nueva versión
- Se elimina cache antiguo
---
## 🧪 VERIFICACIÓN
### Test Rápido
```bash
# 1. Build actual
npm run build
# 2. Preview
npm run preview
# 3. Abrir en navegador
# 4. DevTools > Application > Service Workers
# Verificar: SW registrado y activo
# 5. Cambiar CACHE_VERSION en public/sw.js
# 6. Build de nuevo
npm run build
# 7. Recargar página en navegador
# Verificar: Aparece banner de actualización
```
---
## 📋 CHECKLIST
- [x] Service Worker configurado
- [x] Sistema de actualizaciones implementado
- [x] Hook useServiceWorker creado
- [x] Componente UpdateNotification creado
- [x] Integrado en App.tsx
- [x] Manifest mejorado
- [x] Build funciona correctamente
- [ ] Test en navegador (requiere servidor)
- [ ] Test offline (requiere servidor)
- [ ] Test de actualización (requiere servidor)
---
## 🎯 PRÓXIMOS PASOS
1. **Probar en servidor real:**
- Desplegar en servidor
- Verificar que SW se registra
- Verificar que actualizaciones funcionan
2. **Opcional: Indicador offline:**
- Añadir indicador visual cuando está offline
- Mostrar en Header o BottomNav
3. **Opcional: Sincronización:**
- Sincronizar datos cuando vuelve la conexión
- (Requiere backend)
---
**Estado:** ✅ **COMPLETADO** - Sistema de actualizaciones implementado y listo para probar

View file

@ -1,91 +0,0 @@
# 📸 Resumen: Imágenes en PWA - EMERGES TES
**Fecha:** 2025-12-23
---
## ✅ CONFIGURACIÓN COMPLETADA PARA PWA
### 1. Service Worker Actualizado
- ✅ **Cachea imágenes automáticamente** (cache-first strategy)
- ✅ **Detecta rutas** `/assets/infografias/` y las cachea
- ✅ **Funciona offline** una vez que las imágenes se cargan
### 2. Vite Build Configurado
- ✅ **Copia `public/`** a `dist/` (incluye imágenes)
- ✅ **Mantiene estructura** de carpetas para assets
- ✅ **Incluye PNG, JPG, SVG, GIF** en el build
### 3. Estructura de Carpetas Creada
```
public/assets/infografias/
├── bloque-0-fundamentos/
├── bloque-2-inmovilizacion/
├── bloque-3-material-sanitario/
├── bloque-7-conduccion/
└── bloque-12-marco-legal/
```
---
## 📋 PRÓXIMOS PASOS
### Paso 1: Mover Imágenes (Manual o Script)
**Opción A: Script Python (Recomendado)**
```bash
python scripts/organizar_infografias.py
```
**Opción B: Manual**
```bash
# Ejemplo: Mover imágenes de collarín
cp imagenes-pendientes/colocacion-collarin-paso-*.png public/assets/infografias/bloque-2-inmovilizacion/
```
### Paso 2: Añadir Referencias en Markdown
Editar archivos `.md` del manual:
```markdown
![Descripción](./assets/infografias/bloque-2-inmovilizacion/imagen.png)
```
### Paso 3: Build y Verificar
```bash
npm run build
ls -R dist/assets/infografias/ # Verificar que están en el build
```
### Paso 4: Test Offline
1. Abrir app en navegador
2. Cargar páginas con imágenes (para cachear)
3. DevTools > Network > Offline
4. Verificar que las imágenes cargan
---
## 🎯 ESTADO ACTUAL
| Aspecto | Estado |
|---------|--------|
| **Service Worker** | ✅ Configurado para cachear imágenes |
| **Vite Build** | ✅ Incluye imágenes en build |
| **Estructura carpetas** | ✅ Creada |
| **Imágenes organizadas** | ❌ Pendiente (48 en `imagenes-pendientes/`) |
| **Referencias en Markdown** | ❌ Pendiente (0 referencias) |
| **Funciona offline** | ⚠️ Cuando se completen pasos 1-2 |
---
## 📝 NOTAS IMPORTANTES
1. **Las imágenes se cachean automáticamente** cuando se cargan por primera vez
2. **No necesitas precachear manualmente** - el SW las cachea bajo demanda
3. **Una vez organizadas y referenciadas**, funcionarán offline automáticamente
4. **El tamaño total** de imágenes (~8.5MB) es aceptable para PWA
---
**Conclusión:** La infraestructura está lista. Solo falta organizar las imágenes y añadir referencias en el manual.

View file

@ -1,164 +0,0 @@
# ✅ Resumen: Banner de Instalación PWA
**Fecha:** 2025-12-23
---
## ✅ IMPLEMENTACIÓN COMPLETADA
### 1. Hook `usePWAInstall`
- ✅ **Detección de `beforeinstallprompt`** - Captura el evento del navegador
- ✅ **Detección de instalación** - Detecta cuando la app ya está instalada
- ✅ **Estado de instalabilidad** - `isInstallable`, `isInstalled`, `showBanner`
- ✅ **Función `install()`** - Muestra el prompt de instalación
- ✅ **Dismissal tracking** - Guarda en localStorage cuando el usuario cierra el banner
- ✅ **Re-mostrar después de 7 días** - Si el usuario cerró el banner, se muestra de nuevo después de 7 días
### 2. Componente `InstallBanner`
- ✅ **Banner visual** - Diseño atractivo con gradiente
- ✅ **Botón "Instalar"** - Llama a la función `install()`
- ✅ **Botón cerrar** - Permite cerrar el banner
- ✅ **Posicionamiento** - Fixed bottom, no se solapa con otros elementos
- ✅ **Responsive** - Funciona en móvil y desktop
- ✅ **Animación** - Slide-in desde abajo
### 3. Integración
- ✅ **Añadido a App.tsx** - Integrado en la aplicación
- ✅ **Z-index correcto** - No se solapa con UpdateNotification
- ✅ **Build exitoso** - Sin errores
---
## 🎯 CÓMO FUNCIONA
### Flujo de Instalación
1. **Usuario abre la app** en navegador compatible (Chrome, Edge, etc.)
2. **Navegador detecta** que la app es instalable (manifest + SW + HTTPS)
3. **Evento `beforeinstallprompt`** se dispara
4. **Hook captura el evento** y guarda el prompt
5. **Banner aparece** después de 3 segundos (mejor UX)
6. **Usuario hace clic en "Instalar"**
7. **Se muestra el prompt nativo** del navegador
8. **Usuario acepta** → App se instala
9. **App se abre** en modo standalone
### Detección de Instalación
- **Modo standalone:** `window.matchMedia('(display-mode: standalone)')`
- **iOS:** `window.navigator.standalone === true`
- **Evento `appinstalled`:** Se dispara cuando se instala
---
## 📱 COMPATIBILIDAD
### Navegadores que Soportan `beforeinstallprompt`
- ✅ Chrome (Desktop y Android)
- ✅ Edge (Desktop y Android)
- ✅ Opera (Desktop y Android)
- ✅ Samsung Internet
- ❌ Safari (iOS) - Usa método manual (Compartir → Añadir a pantalla de inicio)
- ❌ Firefox - No soporta `beforeinstallprompt` (en desarrollo)
### Requisitos para que Aparezca el Banner
1. ✅ **Manifest.json** presente y válido
2. ✅ **Service Worker** registrado
3. ✅ **HTTPS** (o localhost para desarrollo)
4. ✅ **Iconos** configurados (192x192 y 512x512 recomendados)
5. ✅ **No estar ya instalada** - Si ya está instalada, no aparece
---
## 🧪 CÓMO PROBAR
### Test Local (Desarrollo)
```bash
# 1. Build
npm run build
# 2. Preview (simula HTTPS con localhost)
npm run preview
# 3. Abrir en Chrome/Edge
# http://localhost:4173
# 4. Verificar:
# - Banner aparece después de 3 segundos
# - Botón "Instalar" funciona
# - Prompt nativo aparece
```
### Test en Producción
1. Desplegar en servidor con HTTPS
2. Abrir en Chrome/Edge (móvil o desktop)
3. Verificar que el banner aparece
4. Hacer clic en "Instalar"
5. Verificar que se instala correctamente
### Test iOS (Safari)
1. Abrir en Safari iOS
2. El banner NO aparecerá (Safari no soporta `beforeinstallprompt`)
3. Usar método manual: Compartir → Añadir a pantalla de inicio
4. Verificar que funciona en modo standalone
---
## ⚙️ CONFIGURACIÓN
### Personalización del Delay
En `src/hooks/usePWAInstall.ts`:
```ts
setTimeout(() => {
setShowBanner(true);
}, 3000); // Cambiar a otro valor (en milisegundos)
```
### Personalización del Tiempo de Re-mostrar
En `src/hooks/usePWAInstall.ts`:
```ts
if (daysSinceDismissed >= 7) { // Cambiar a otro número de días
```
### Personalización del Banner
En `src/components/layout/InstallBanner.tsx`:
- Cambiar colores, texto, posición, etc.
---
## 📋 CHECKLIST PWA COMPLETA
### Requisitos Esenciales ✅
- [x] Manifest.json configurado
- [x] Service Worker registrado
- [x] HTTPS (en producción)
- [x] Meta tags PWA
- [x] Banner de instalación
- [x] Funciona offline
### Mejoras Opcionales
- [ ] Iconos PNG específicos (192x192, 512x512)
- [ ] Screenshots en manifest
- [ ] Notificaciones push
---
## ✅ ESTADO FINAL
**Banner de Instalación:** ✅ **IMPLEMENTADO Y FUNCIONAL**
- ✅ Hook `usePWAInstall` creado
- ✅ Componente `InstallBanner` creado
- ✅ Integrado en App.tsx
- ✅ Build exitoso
- ✅ Sin errores de linter
**La PWA ahora tiene:**
- ✅ Banner de instalación funcional
- ✅ Detección automática de instalabilidad
- ✅ Tracking de dismissal
- ✅ Re-mostrar después de 7 días
---
**Última actualización:** 2025-12-23

View file

@ -1,109 +0,0 @@
# ✅ Resumen: Configuración SPA Routing
**Fecha:** 2025-12-23
---
## ✅ PROBLEMA RESUELTO
**Problema:** Al acceder directamente a rutas o refrescar la página, el servidor devolvía 404 en lugar de servir `index.html`.
**Solución:** Configurado fallback a `index.html` para todos los servidores comunes.
---
## 📁 ARCHIVOS CREADOS/MODIFICADOS
### Archivos Nuevos
- ✅ `public/_redirects` - Para Netlify
- ✅ `public/.htaccess` - Para Apache
- ✅ `SPA_ROUTING_CONFIG.md` - Documentación completa
- ✅ `RESUMEN_SPA_ROUTING.md` - Este resumen
### Archivos Modificados
- ✅ `vite.config.ts` - Añadida configuración de preview
- ✅ `vercel.json` - Actualizado con rewrites y headers de cache
- ✅ `nginx.conf.example` - Ya tenía configuración correcta (comentarios añadidos)
- ✅ `package.json` - Añadido `--host` a preview
---
## 🔧 CONFIGURACIONES POR SERVIDOR
| Servidor | Archivo | Estado |
|----------|---------|--------|
| **Vite Dev** | `vite.config.ts` | ✅ Automático |
| **Vite Preview** | `vite.config.ts` | ✅ Configurado |
| **Nginx** | `nginx.conf.example` | ✅ `try_files $uri $uri/ /index.html;` |
| **Apache** | `public/.htaccess` | ✅ `mod_rewrite` configurado |
| **Netlify** | `public/_redirects` | ✅ `/* /index.html 200` |
| **Vercel** | `vercel.json` | ✅ Rewrites configurados |
| **GitHub Pages** | `vite.config.ts` | ✅ Base path configurado |
---
## ✅ VERIFICACIONES
### 1. React Router
- ✅ Usa `BrowserRouter` (no HashRouter)
- ✅ Rutas configuradas correctamente
### 2. Build
- ✅ Build exitoso
- ✅ Archivos de configuración copiados a `dist/`
- ✅ `_redirects` y `.htaccess` presentes en `dist/`
### 3. Archivos en dist/
```bash
dist/
├── _redirects # Para Netlify
├── .htaccess # Para Apache
├── index.html # Punto de entrada
└── ...
```
---
## 🧪 CÓMO PROBAR
### Test Local (Preview)
```bash
npm run build
npm run preview
# Abrir http://localhost:4173/favoritos
# Debe cargar correctamente (no 404)
```
### Test en Producción
1. Desplegar en servidor (Nginx/Apache/Netlify/Vercel)
2. Acceder directamente a una ruta: `https://tu-app.com/favoritos`
3. Refrescar la página en esa ruta
4. Debe cargar correctamente (no 404)
---
## 📝 NOTAS IMPORTANTES
1. **Archivos Estáticos:** Las reglas excluyen archivos estáticos (JS, CSS, imágenes) para que se sirvan correctamente.
2. **Cache:**
- `index.html` → NO cachear (permite actualizaciones)
- Assets estáticos → Cachear (mejor performance)
3. **Base Path:** Si la app está en subdirectorio (GitHub Pages), el `base` en `vite.config.ts` debe coincidir.
---
## ✅ ESTADO FINAL
**Configuración:** ✅ **COMPLETA**
Todas las rutas ahora funcionan correctamente:
- ✅ Acceso directo a rutas
- ✅ Refresh en cualquier ruta
- ✅ Enlaces compartidos funcionan
- ✅ Compatible con todos los servidores comunes
---
**Última actualización:** 2025-12-23

View file

@ -1,147 +0,0 @@
# 🔧 Solución: Banner de Instalación No Se Ve
**Fecha:** 2025-12-23
---
## 🐛 PROBLEMA
El banner de instalación PWA no aparece.
---
## ✅ SOLUCIONES IMPLEMENTADAS
### 1. Modo Desarrollo (Testing)
**En desarrollo (`npm run dev`), el banner se mostrará automáticamente después de 5 segundos** incluso si el evento `beforeinstallprompt` no se dispara.
**Esto permite:**
- Ver cómo se ve el banner
- Probar la UI
- Verificar que el componente funciona
**Para probar:**
```bash
npm run dev
# Abrir http://localhost:8096
# Esperar 5 segundos
# El banner debería aparecer
```
### 2. Logs de Debug
Se añadieron logs en consola para debugging:
```
[PWA Install] Hook initialized
[PWA Install] Setting up install prompt listeners
[PWA Install] Development mode: Will show banner after 5 seconds for testing
[PWA Install] Development: Showing banner for testing
[InstallBanner] Render - State: { isInstallable: true, showBanner: true }
[InstallBanner] ✅ Rendering banner!
```
**Abre DevTools (F12) > Console para ver estos mensajes.**
---
## 🔍 VERIFICACIONES
### 1. Abrir Consola del Navegador
Abre DevTools (F12) > Console y busca:
```
[PWA Install] Hook initialized
```
**Si NO ves este mensaje:**
- El hook no se está ejecutando
- Verificar que `InstallBanner` está en `App.tsx`
### 2. Verificar Estado
En la consola deberías ver:
```
[InstallBanner] Render - State: { isInstallable: false, showBanner: false }
```
**Después de 5 segundos en desarrollo:**
```
[PWA Install] Development: Showing banner for testing
[InstallBanner] Render - State: { isInstallable: true, showBanner: true }
[InstallBanner] ✅ Rendering banner!
```
### 3. Verificar que el Componente se Renderiza
Abre React DevTools:
1. Buscar componente `InstallBanner`
2. Verificar que existe en el árbol
3. Verificar props: `isInstallable`, `showBanner`
---
## 🚨 SI SIGUE SIN APARECER
### Solución Temporal: Forzar Mostrar
Añade esto temporalmente en `InstallBanner.tsx`:
```tsx
const InstallBanner = () => {
const { isInstallable, showBanner, install, dismissBanner } = usePWAInstall();
// TEMPORAL: Forzar mostrar para testing
if (import.meta.env.DEV) {
return (
<div className="fixed bottom-20 left-0 right-0 z-50 bg-red-500 p-4">
<p className="text-white">BANNER DE PRUEBA - Debería verse</p>
<p className="text-white text-sm">isInstallable: {String(isInstallable)}</p>
<p className="text-white text-sm">showBanner: {String(showBanner)}</p>
</div>
);
}
// ... resto del código
};
```
Si este banner de prueba SÍ se ve, entonces el problema es la lógica del hook.
Si NO se ve, entonces el problema es que el componente no se está renderizando.
---
## 📋 CHECKLIST RÁPIDO
- [ ] Abrir consola del navegador (F12)
- [ ] Ver mensajes `[PWA Install]`
- [ ] En desarrollo, esperar 5 segundos
- [ ] Ver mensaje `[InstallBanner] ✅ Rendering banner!`
- [ ] Verificar React DevTools que `InstallBanner` existe
- [ ] Verificar que no está en modo standalone (ya instalada)
- [ ] Verificar localStorage: `localStorage.getItem('pwa-install-dismissed')`
---
## 🧪 TEST RÁPIDO
```bash
# 1. Limpiar localStorage
# En consola del navegador:
localStorage.removeItem('pwa-install-dismissed')
# 2. Recargar página
# F5 o Ctrl+R
# 3. Esperar 5 segundos
# 4. Verificar consola
# Deberías ver: [InstallBanner] ✅ Rendering banner!
```
---
**Última actualización:** 2025-12-23

View file

@ -1,396 +0,0 @@
# 📸 Sugerencias de Medios Visuales por Tema
**Fecha:** 2025-12-23
**Objetivo:** Sugerir al menos 1 medio visual para cada tema crítico sin imágenes
---
## 📊 RESUMEN
| Prioridad | Temas | Medios Sugeridos |
|-----------|-------|-----------------|
| **🔴 ALTA** | 25 temas | 25-30 medios |
| **🟡 MEDIA** | 35 temas | 35-40 medios |
| **🟢 BAJA** | 38 temas | 38-45 medios |
| **TOTAL** | **98 temas** | **~100 medios** |
---
## 🔴 PRIORIDAD ALTA (25 temas críticos)
### BLOQUE 1: FUNDAMENTOS Y PROCEDIMIENTOS BÁSICOS
#### 1.1 Constantes Vitales (`1.1_constantes_vitales.md`)
- ✅ **Tienes:** `interpretacion-constantes-semaforo.png`
- ❌ **Falta:**
- **Tabla visual de rangos normales** (adulto/pediátrico)
- **Diagrama de puntos de medición** (pulso, TA, etc.)
- **Guía visual de frecuencia de registro** según situación
#### 1.2 ABCDE Operativo (`1.2_abcde_operativo.md`)
- ✅ **Tienes:** `ALGORITMO OPERATIVO DEL TES.svg`
- ❌ **Falta:**
- **Diagrama de flujo ABCDE** paso a paso
- **Infografía de signos de alarma** por letra (A, B, C, D, E)
- **Tabla visual de prioridades** (qué hacer primero)
#### 1.3 Glasgow Operativo (`1.3_glasgow_operativo.md`)
- ❌ **Falta:**
- **Tabla visual de escala Glasgow** (ojo, verbal, motor)
- **Diagrama de interpretación** (leve, moderado, grave)
- **Guía visual de evaluación** paso a paso
#### 1.4 Triage START (`1.4_triage_start.md`)
- ✅ **Tienes:** `RESUMEN VISUAL DEL ALGORITMO START.svg`
- ❌ **Falta:**
- **Diagrama de flujo START** completo
- **Infografía de categorías** (rojo, amarillo, verde, negro)
- **Guía visual de decisión rápida**
---
### BLOQUE 2: SOPORTE VITAL BÁSICO
#### 2.1 Reconocimiento PCR (`BLOQUE_04_0_RECONOCIMIENTO_PCR.md`)
- ❌ **Falta:**
- **Infografía de signos de PCR** (inconsciencia, ausencia respiración, etc.)
- **Diagrama de verificación** (mirar, escuchar, sentir)
- **Guía visual de decisión** (¿PCR? → RCP)
#### 2.2 RCP Adultos (`BLOQUE_04_1_RCP_ADULTOS.md`)
- ✅ **Tienes:** `flujo-rcp-transtelefonica.png` (transtelefónica)
- ❌ **Falta:**
- **Diagrama de flujo RCP básica** (30:2, posición, etc.)
- **Infografía de técnica de compresión** (posición manos, profundidad, frecuencia)
- **Guía visual paso a paso** (verificar → comprimir → ventilar)
- **Diagrama de posicionamiento** (paciente, reanimador)
#### 2.3 RCP Pediátrica (`BLOQUE_04_2_RCP_PEDIATRIA.md`)
- ❌ **Falta:**
- **Diagrama de flujo RCP pediátrica** (15:2, diferencias con adulto)
- **Infografía de técnica pediátrica** (una mano, dos dedos según edad)
- **Tabla visual de diferencias** (adulto vs pediátrico vs lactante)
- **Guía visual de profundidad** según edad
#### 2.4 RCP Lactantes (`BLOQUE_04_3_RCP_LACTANTES.md`)
- ❌ **Falta:**
- **Diagrama de flujo RCP lactante** (15:2, técnica específica)
- **Infografía de técnica lactante** (dos dedos, posición)
- **Guía visual de diferencias** con pediátrico
#### 2.5 Uso DESA (`BLOQUE_04_4_USO_DESA.md`)
- ✅ **Tienes:** `flujo-desa-telefono.png` (transtelefónica)
- ❌ **Falta:**
- **Diagrama de flujo DESA** (encender → colocar → analizar → descargar)
- **Infografía de colocación de electrodos** (posición correcta)
- **Guía visual paso a paso** DESA
- **Diagrama de zonas de seguridad** (no tocar durante análisis)
#### 2.6 Ventilación BVM (`BLOQUE_04_5_VENTILACION_BVM.md`)
- ✅ **Tienes:** `uso-correcto-ambu.png`, `configuracion-maxima-fio2-bolsa-mascarilla.png`
- ❌ **Falta:**
- **Diagrama de técnica de sellado** (posición manos, sellado correcto)
- **Infografía de frecuencia ventilatoria** (adulto vs pediátrico)
- **Guía visual de problemas comunes** (fugas, resistencia, etc.)
#### 2.7 Canulas OPA/NPA (`BLOQUE_04_6_USO_CANULAS_OPA_NPA.md`)
- ✅ **Tienes:** `canulas-guedel-nasofaringea.png`
- ❌ **Falta:**
- **Diagrama de selección de talla** (medición, tabla)
- **Infografía de colocación OPA** paso a paso
- **Infografía de colocación NPA** paso a paso
- **Guía visual de contraindicaciones** (OPA vs NPA)
#### 2.8 Aspiración Secreciones (`BLOQUE_04_7_ASPIRACION_SECRECIONES.md`)
- ❌ **Falta:**
- **Diagrama de técnica de aspiración** (posición, profundidad)
- **Infografía de material necesario** (sonda, aspirador, etc.)
- **Guía visual de precauciones** (tiempo, presión, etc.)
#### 2.9 Posiciones Seguridad (`BLOQUE_04_8_POSICIONES_SEGURIDAD_MOVILIZACION.md`)
- ❌ **Falta:**
- **Infografía de posición lateral de seguridad** (PLS)
- **Diagrama de posicionamiento** según situación
- **Guía visual de movilización segura**
---
### BLOQUE 3: MATERIAL E INMOVILIZACIÓN
#### 3.1 Anatomía Operativa (`BLOQUE_02_0_ANATOMIA_OPERATIVA.md`)
- ✅ **Tienes:** `situaciones-que-requieren-inmovilizacion.png`
- ❌ **Falta:**
- **Diagrama anatómico básico** (columna cervical, puntos clave)
- **Infografía de mecanismos lesionales** (hiperextensión, flexión, etc.)
- **Guía visual de indicaciones** de inmovilización
#### 3.2 Inmovilización Manual (`BLOQUE_02_2_INMOVILIZACION_MANUAL.md`)
- ✅ **Tienes:** `posicion-tes-inmovilizacion-manual.png`, `tecnica-sujecion-manual-cervical.png`
- ❌ **Falta:**
- **Diagrama de transición** manual → dispositivo (ya existe parcialmente)
- **Infografía de coordinación equipo** (ya existe)
#### 3.3 Collarín Cervical (`BLOQUE_02_3_COLLARIN_CERVICAL.md`)
- ✅ **Tienes:** 12 imágenes (pasos, selección, errores, verificaciones)
- ❌ **Falta:** Nada crítico (muy completo)
#### 3.4 Tablero Espinal (`BLOQUE_02_5_TABLERO_ESPINAL.md`)
- ✅ **Tienes:** `componentes-tablero-espinal.png`
- ❌ **Falta:**
- **Infografía de colocación paso a paso** (serie de imágenes)
- **Diagrama de posicionamiento correas** (mínimo 4, zonas)
- **Guía visual de acolchado** (espacios vacíos)
#### 3.5 Colchón Vacío (`BLOQUE_02_6_COLCHON_VACIO.md`)
- ✅ **Tienes:** `componentes-colchon-vacio.png`, `colocacion-colchon-vacio-paso-a-paso.png`
- ❌ **Falta:** Nada crítico
#### 3.6 Férulas (`BLOQUE_02_10_FERULAS.md`)
- ❌ **Falta:**
- **Infografía de tipos de férulas** (neumática, rígida, etc.)
- **Diagrama de selección** según lesión
- **Guía visual de colocación** paso a paso
- **Tabla visual de indicaciones** por tipo
#### 3.7 Extricación (`BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`)
- ✅ **Tienes:** `coordinacion-equipo-inmovilizacion.png`
- ❌ **Falta:**
- **Diagrama de técnicas de extricación** (rápida, lenta)
- **Infografía de movimientos bloque** (log roll, etc.)
- **Guía visual de coordinación** equipo
---
### BLOQUE 4: OXIGENOTERAPIA Y MATERIAL SANITARIO
#### 4.1 Oxigenoterapia Fundamentos (`BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md`)
- ✅ **Tienes:** `tabla-rangos-fio2-oxigenoterapia.png`
- ❌ **Falta:**
- **Diagrama de selección de dispositivo** (flujograma de decisión)
- **Infografía de indicaciones** de oxigenoterapia
- **Tabla visual de contraindicaciones** relativas
#### 4.2 Dispositivos Oxigenoterapia (`BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md`)
- ✅ **Tienes:** `guia-colocacion-dispositivos-oxigenoterapia.png`, `diagrama-seleccion-dispositivo-oxigenoterapia.png`
- ❌ **Falta:**
- **Infografía comparativa** de dispositivos (cánula, mascarilla, etc.)
- **Tabla visual de FiO2** por dispositivo (ya existe parcialmente)
#### 4.3 Control Hemorragias (`BLOQUE_03_6_CONTROL_HEMORRAGIAS.md`)
- ❌ **Falta:**
- **Diagrama de técnicas de control** (compresión directa, elevación, etc.)
- **Infografía de puntos de presión** anatómicos
- **Guía visual paso a paso** control hemorragia
- **Tabla visual de tipos** de hemorragia
#### 4.4 Quemaduras (`BLOQUE_03_7_QUEMADURAS.md`)
- ❌ **Falta:**
- **Diagrama de regla de los 9** (superficie corporal)
- **Infografía de profundidad** (1º, 2º, 3º grado)
- **Tabla visual de clasificación** (superficial, profunda, etc.)
- **Guía visual de primeros auxilios**
#### 4.5 Heridas y Vendajes (`BLOQUE_03_8_HERIDAS_VENDAJES.md`)
- ❌ **Falta:**
- **Infografía de tipos de vendajes** (circular, espiral, etc.)
- **Diagrama de técnicas de vendaje** paso a paso
- **Guía visual de limpieza** de heridas
#### 4.6 Dispositivos Supraglóticos (`BLOQUE_03_22_DISPOSITIVOS_SUPRAGLOTICOS.md`)
- ✅ **Tienes:** `dispositivos-supragloticos-guia.png`
- ❌ **Falta:**
- **Diagrama de tipos** (LMA, i-gel, etc.)
- **Infografía de indicaciones** y contraindicaciones
- **Guía visual de colocación** paso a paso
#### 4.7 Ventilación Medios Fortuna (`BLOQUE_03_25_VENTILACION_MEDIOS_FORTUNA.md`)
- ✅ **Tienes:** `ventilacion-medios-fortuna.png`
- ❌ **Falta:** Nada crítico
---
### BLOQUE 5: PROTOCOLOS TRANSTELEFÓNICOS
#### 5.1 RCP Transtelefónica (`BLOQUE_05_1_RCP_TRANSTELEFONICA_ADULTOS.md`)
- ✅ **Tienes:** `flujo-rcp-transtelefonica.png`
- ❌ **Falta:**
- **Diagrama de flujo completo** (incluyendo pediátrico/lactante)
- **Infografía de guía telefónica** paso a paso
#### 5.2 DESA Transtelefónico (`BLOQUE_05_4_DESA_GUIADO_TELEFONO.md`)
- ✅ **Tienes:** `flujo-desa-telefono.png`
- ❌ **Falta:** Nada crítico
#### 5.3 ICTUS Transtelefónico (`BLOQUE_05_7_ICTUS_TRANSTELEFONICO.md`)
- ✅ **Tienes:** `fast-transtelefonico.png`
- ❌ **Falta:**
- **Infografía de escala FAST** (Face, Arm, Speech, Time)
- **Diagrama de decisión** (¿ictus? → activar código)
---
### BLOQUE 6: FARMACOLOGÍA
#### 6.1 Principios Administración (`BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION.md`)
- ❌ **Falta:**
- **Infografía de 5 correctos** (paciente, fármaco, dosis, vía, tiempo)
- **Diagrama de verificación** antes de administrar
- **Guía visual de seguridad** farmacológica
#### 6.2 Del Vial a la Vena (`BLOQUE_06_1_DEL_VIAL_A_LA_VENA.md`)
- ❌ **Falta:**
- **Infografía de preparación** paso a paso (vial → jeringa → vena)
- **Diagrama de técnicas de extracción** (vial, ampolla)
- **Guía visual de eliminación de aire** (burbujas)
- **Infografía de verificación** (nombre, fecha, dosis)
#### 6.3 Vías de Administración (`BLOQUE_06_X_VIAS_ADMINISTRACION.md` - si existe)
- ❌ **Falta:**
- **Diagrama de vías** (IV, IO, IM, sublingual, etc.)
- **Infografía de selección** según situación
- **Tabla visual de ventajas/desventajas** por vía
#### 6.4 Fármacos Cardiológicos (`BLOQUE_06_5_FARMACOS_CARDIOLOGICOS.md`)
- ❌ **Falta:**
- **Tabla visual de fármacos** (adrenalina, atropina, etc.)
- **Infografía de indicaciones** por fármaco
- **Diagrama de dosis** (adulto vs pediátrico)
#### 6.5 Fármacos Respiratorios (`BLOQUE_06_6_FARMACOS_RESPIRATORIOS.md`)
- ❌ **Falta:**
- **Tabla visual de fármacos** (salbutamol, etc.)
- **Infografía de administración** (nebulización, etc.)
---
### BLOQUE 7: TRANSFERENCIA Y TRASLADO
#### 7.1 Preparación Traslado (`BLOQUE_08_1_PREPARACION_TRASLADO.md`)
- ✅ **Tienes:** `configuracion-gps-antes-de-salir.png`
- ❌ **Falta:**
- **Checklist visual** pre-traslado
- **Infografía de verificación** material y paciente
#### 7.2 Transferencia al Hospital (`BLOQUE_08_5_TRANSFERENCIA_AL_HOSPITAL.md`)
- ❌ **Falta:**
- **Diagrama de flujo de transferencia** (comunicación → entrega → documentación)
- **Infografía de información crítica** a transmitir
- **Guía visual de entrega** (SBAR, IMIST-AMBO)
---
## 🟡 PRIORIDAD MEDIA (35 temas)
### BLOQUE 8: TRIAGE Y MÚLTIPLES VÍCTIMAS
#### 8.1 Fundamentos Triage (`BLOQUE_07_1_FUNDAMENTOS_TRIAGE.md`)
- ❌ **Falta:**
- **Infografía de principios** de triage
- **Diagrama de objetivos** (máximo beneficio, mínimo tiempo)
#### 8.2 Método START (`BLOQUE_07_2_METODO_START.md`)
- ✅ **Tienes:** `RESUMEN VISUAL DEL ALGORITMO START.svg`
- ❌ **Falta:**
- **Diagrama de flujo START** detallado
- **Infografía de categorías** con ejemplos
#### 8.3 Etiquetado y Zonificación (`BLOQUE_07_3_ETIQUETADO_ZONIFICACION.md`)
- ❌ **Falta:**
- **Infografía de colores** (rojo, amarillo, verde, negro)
- **Diagrama de zonas** (triage, tratamiento, evacuación)
- **Guía visual de etiquetas** (qué información incluir)
#### 8.4 Roles y Funciones (`BLOQUE_07_4_ROLES_FUNCIONES_TES_TMV.md`)
- ❌ **Falta:**
- **Diagrama de organización** del equipo
- **Infografía de roles** (triage, tratamiento, evacuación)
---
### BLOQUE 9: SITUACIONES ESPECIALES
#### 9.1 Patologías por Sistemas (varios capítulos)
- ❌ **Falta:**
- **Infografías de patologías** (IAM, ictus, shock, etc.)
- **Diagramas de signos y síntomas** por patología
- **Tablas visuales de actuación** rápida
#### 9.2 Poblaciones Especiales
- ❌ **Falta:**
- **Infografías pediátricas** (diferencias con adulto)
- **Infografías geriátricas** (consideraciones especiales)
- **Infografías embarazadas** (modificaciones técnicas)
---
## 🟢 PRIORIDAD BAJA (38 temas)
### BLOQUE 10: COMUNICACIÓN Y DOCUMENTACIÓN
#### 10.1 Comunicación Operativa
- ❌ **Falta:**
- **Infografía de técnicas** de comunicación
- **Diagrama de SBAR/IMIST-AMBO** (estructura)
#### 10.2 Documentación
- ❌ **Falta:**
- **Infografía de información esencial** a documentar
- **Guía visual de formato** de informe
---
## 📋 RESUMEN POR TIPO DE MEDIO
### Diagramas de Flujo (30-35 medios)
- RCP (adulto, pediátrico, lactante)
- ABCDE completo
- START detallado
- Protocolos transtelefónicos
- Transferencia hospitalaria
- Triage
### Infografías Paso a Paso (25-30 medios)
- Colocación de dispositivos
- Técnicas de procedimientos
- Preparación de fármacos
- Técnicas de inmovilización
### Tablas Visuales (20-25 medios)
- Rangos de constantes vitales
- Dosis de fármacos
- FiO2 por dispositivo
- Clasificaciones (quemaduras, Glasgow, etc.)
### Diagramas Anatómicos/Técnicos (15-20 medios)
- Anatomía básica
- Posicionamiento
- Técnicas manuales
- Puntos de presión
---
## 🎯 RECOMENDACIÓN FINAL
### Fase 1: Integrar 48 imágenes existentes (INMEDIATO)
- **Esfuerzo:** Bajo
- **Impacto:** Alto (30-35 capítulos con imágenes)
### Fase 2: Crear 25 medios críticos (MEDIO PLAZO)
- **Prioridad ALTA:** 25 medios
- **Esfuerzo:** Medio-Alto
- **Impacto:** Muy Alto (cobertura de procedimientos críticos)
### Fase 3: Crear 35 medios operativos (LARGO PLAZO)
- **Prioridad MEDIA:** 35 medios
- **Esfuerzo:** Alto
- **Impacto:** Alto (cobertura completa de temas operativos)
### Fase 4: Crear 38 medios complementarios (MUY LARGO PLAZO)
- **Prioridad BAJA:** 38 medios
- **Esfuerzo:** Muy Alto
- **Impacto:** Medio (mejora formativa)
---
**Total sugerido:** ~100 medios visuales
**Prioridad inmediata:** 25 medios críticos + integrar 48 existentes

View file

@ -1,191 +0,0 @@
# 🧪 Test: Banner de Instalación PWA
**Fecha:** 2025-12-23
---
## 🔍 DEBUGGING: Banner No Se Ve
Si el banner no aparece, sigue estos pasos:
---
## ✅ PASO 1: Verificar Consola
Abre DevTools (F12) > Console y busca estos mensajes:
```
[PWA Install] Hook initialized
[PWA Install] Setting up install prompt listeners
[InstallBanner] Render - State: { isInstallable: false, showBanner: false }
```
**Si ves estos mensajes pero el banner no aparece:**
- El evento `beforeinstallprompt` no se está disparando
- Verifica los requisitos (ver abajo)
---
## ✅ PASO 2: Modo Desarrollo (Testing)
En **modo desarrollo**, el banner se mostrará automáticamente después de 5 segundos **incluso si no hay prompt real**, para que puedas ver cómo se ve.
**Para probar:**
```bash
npm run dev
# Abrir http://localhost:8096
# Esperar 5 segundos
# El banner debería aparecer
```
---
## ✅ PASO 3: Verificar Requisitos PWA
El banner solo aparece si se cumplen TODOS estos requisitos:
### 1. Manifest.json ✅
```bash
# Verificar que existe
ls -la public/manifest.json
ls -la dist/manifest.json
```
### 2. Service Worker ✅
```bash
# Verificar que existe
ls -la public/sw.js
ls -la dist/sw.js
# En DevTools > Application > Service Workers
# Debe estar "activated and is running"
```
### 3. HTTPS o Localhost ✅
- **Desarrollo:** `localhost` funciona
- **Preview:** `npm run preview` usa localhost
- **Producción:** Debe estar en HTTPS
### 4. Navegador Compatible ✅
- ✅ Chrome (Desktop y Android)
- ✅ Edge (Desktop y Android)
- ✅ Opera
- ❌ Safari - NO soporta `beforeinstallprompt`
- ❌ Firefox - NO soporta `beforeinstallprompt`
### 5. No Estar Ya Instalada ✅
Si la app ya está instalada, el banner NO aparece.
**Verificar:**
```javascript
// En consola del navegador
window.matchMedia('(display-mode: standalone)').matches
// Si es true, la app ya está instalada
```
---
## 🧪 TEST MANUAL
### Test 1: Verificar Evento en Consola
Abre la consola del navegador y ejecuta:
```javascript
// Escuchar el evento
window.addEventListener('beforeinstallprompt', (e) => {
console.log('✅ beforeinstallprompt detected!', e);
e.preventDefault();
});
// Recargar la página
// Si ves el mensaje, el evento se está disparando
```
### Test 2: Forzar Mostrar Banner (Desarrollo)
El código ya tiene un fallback en desarrollo que muestra el banner después de 5 segundos incluso sin prompt real.
**Para verificar:**
1. Abrir `http://localhost:8096`
2. Esperar 5 segundos
3. El banner debería aparecer
4. Verificar consola para mensajes `[PWA Install]`
### Test 3: Verificar Estado del Hook
Abre React DevTools y busca el componente `InstallBanner`:
- Verifica las props: `isInstallable`, `showBanner`
- Si ambos son `true`, el banner debería mostrarse
---
## 🔧 SOLUCIONES RÁPIDAS
### Solución 1: Resetear localStorage
Si cerraste el banner antes, puede estar guardado:
```javascript
// En consola del navegador
localStorage.removeItem('pwa-install-dismissed')
// Recargar página
```
### Solución 2: Usar Preview en lugar de Dev
El evento `beforeinstallprompt` puede no dispararse en `npm run dev`:
```bash
npm run build
npm run preview
# Abrir http://localhost:4173
```
### Solución 3: Verificar Build
Asegúrate de que el build incluye los archivos necesarios:
```bash
npm run build
ls -la dist/sw.js dist/manifest.json
# Ambos deben existir
```
---
## 📋 CHECKLIST RÁPIDO
- [ ] Consola muestra `[PWA Install] Hook initialized`
- [ ] Consola muestra `[InstallBanner] Render`
- [ ] Navegador es Chrome/Edge (no Safari/Firefox)
- [ ] Service Worker está registrado (DevTools > Application)
- [ ] Manifest es válido (DevTools > Application > Manifest)
- [ ] No está en modo standalone (ya instalada)
- [ ] localStorage no tiene `pwa-install-dismissed` reciente
- [ ] En desarrollo, esperar 5 segundos para fallback
---
## 🚨 SI SIGUE SIN APARECER
1. **Verificar que el componente se renderiza:**
- Abrir React DevTools
- Buscar `InstallBanner`
- Verificar que existe en el árbol de componentes
2. **Añadir banner de prueba siempre visible:**
- Temporalmente, cambiar la condición en `InstallBanner.tsx`:
```tsx
if (true) { // Cambiar esto temporalmente
return <div>BANNER DE PRUEBA</div>;
}
```
3. **Verificar z-index:**
- El banner tiene `z-40`
- Verificar que no hay otros elementos con z-index mayor
---
**Última actualización:** 2025-12-23

View file

@ -1,115 +0,0 @@
# ✅ Checklist Pre-Deploy
Usa este checklist antes de cada deploy para asegurar que todo funciona correctamente.
## 🔨 Build
- [ ] `npm ci` ejecutado sin errores
- [ ] `npm run build` completado exitosamente
- [ ] Directorio `dist/` creado y contiene archivos
- [ ] No hay errores en consola durante build
- [ ] Tamaño de `dist/` es razonable (<50MB típicamente)
## 📁 Archivos Críticos
- [ ] `dist/index.html` existe
- [ ] `dist/manifest.json` existe
- [ ] `dist/sw.js` existe (si usas service worker)
- [ ] Assets (JS, CSS) están en `dist/assets/`
- [ ] Archivos `.md` del manual están en `dist/manual/` (si aplica)
## 🌐 Nginx
- [ ] Configuración creada en `/etc/nginx/sites-available/`
- [ ] Symlink creado en `/etc/nginx/sites-enabled/`
- [ ] `sudo nginx -t` pasa sin errores
- [ ] Permisos correctos en directorio `dist/`
- [ ] Nginx reiniciado: `sudo systemctl reload nginx`
## 🔒 SSL (si aplica)
- [ ] Certificado SSL válido
- [ ] Redirección HTTP → HTTPS configurada
- [ ] Certbot renovación automática configurada
## 🧪 Pruebas Funcionales
### Desktop
- [ ] Página principal carga correctamente
- [ ] Navegación entre páginas funciona
- [ ] Calculadoras funcionan
- [ ] Búsqueda funciona
- [ ] Footer visible (desktop)
- [ ] Enlace de donaciones funciona
### Móvil
- [ ] Responsive funciona
- [ ] BottomNav visible y funcional
- [ ] Touch funciona correctamente
- [ ] PWA instalable
- [ ] Offline funciona (service worker)
### Rutas SPA
- [ ] `/herramientas` carga
- [ ] `/farmacos` carga
- [ ] `/manual` carga
- [ ] Rutas anidadas funcionan (ej: `/manual/parte/bloque/capitulo`)
- [ ] 404 redirige a página principal
## 🔍 Verificación Técnica
- [ ] Service Worker registrado (DevTools > Application)
- [ ] Cache funciona (offline mode)
- [ ] Console sin errores críticos
- [ ] Network tab: recursos cargan correctamente
- [ ] Lighthouse score >90 (Performance, PWA)
## 📊 Performance
- [ ] First Contentful Paint < 2s
- [ ] Time to Interactive < 3s
- [ ] Assets comprimidos (gzip)
- [ ] Imágenes optimizadas
## 🔐 Seguridad
- [ ] Headers de seguridad configurados (si aplica)
- [ ] HTTPS funcionando (si aplica)
- [ ] No hay información sensible en código cliente
- [ ] Service Worker no cachea datos sensibles
## 📱 PWA
- [ ] Manifest válido
- [ ] Iconos presentes y correctos
- [ ] Instalable en Android
- [ ] Instalable en iOS
- [ ] Splash screen funciona
## 🎯 Funcionalidad Específica
- [ ] Calculadoras: Glasgow, Parkland, Pediátricas, etc.
- [ ] Protocolos: RCP, Ictus, Shock
- [ ] Fármacos: búsqueda y visualización
- [ ] Manual: navegación y visualización
## 📝 Post-Deploy
- [ ] Monitorear logs: `sudo tail -f /var/log/nginx/error.log`
- [ ] Verificar métricas (si tienes analytics)
- [ ] Probar en diferentes dispositivos
- [ ] Documentar cualquier problema encontrado
## 🚨 Rollback Plan
Si algo falla:
1. Restaurar `dist/` desde backup
2. O hacer `git checkout <commit-anterior>` + rebuild
3. Verificar logs de Nginx
4. Revisar cambios recientes
---
**Fecha de verificación:** _______________
**Verificado por:** _______________
**Notas:** _______________

View file

@ -1,178 +0,0 @@
# 🧪 Test de PWA y Actualizaciones
**Fecha:** 2025-12-23
---
## ✅ VERIFICACIONES REALIZADAS
### 1. Service Worker
- ✅ **Registrado** correctamente en `src/main.tsx`
- ✅ **Ruta correcta:** `${base}sw.js`
- ✅ **Configuración:** `updateViaCache: 'none'` (siempre verifica actualizaciones)
- ✅ **Verificación periódica:** Cada hora + al recuperar foco
### 2. Cache Strategy
- ✅ **Cache First** para assets estáticos (offline-first)
- ✅ **Network First** para HTML (permite actualizaciones)
- ✅ **Cache de imágenes** automático
- ✅ **Versión de cache:** `v1.0.1` (incrementar para forzar actualización)
### 3. Sistema de Actualizaciones
- ✅ **Hook `useServiceWorker`** creado
- ✅ **Componente `UpdateNotification`** creado
- ✅ **Detección automática** de nuevas versiones
- ✅ **Notificación al usuario** cuando hay actualización
### 4. Manifest
- ✅ **Configurado** correctamente
- ✅ **Iconos** definidos
- ✅ **Display:** standalone
- ✅ **Shortcuts** para acceso rápido
---
## 🧪 CÓMO PROBAR
### Test 1: Verificar Registro del SW
```bash
# 1. Iniciar servidor de desarrollo
npm run dev
# 2. Abrir en navegador: http://localhost:8096
# 3. Abrir DevTools > Application > Service Workers
# Verificar:
# - ✅ SW registrado y activo
# - ✅ Estado: "activated and is running"
# - ✅ Scope: "/"
```
### Test 2: Verificar Cache
```bash
# 1. Cargar la app en navegador
# 2. DevTools > Application > Cache Storage
# Verificar:
# - ✅ Cache `emerges-tes-v1.0.1` existe
# - ✅ Contiene index.html, manifest.json
# - ✅ Contiene assets (JS, CSS)
```
### Test 3: Test Offline
```bash
# 1. Cargar la app (para cachear recursos)
# 2. DevTools > Network > Throttling > "Offline"
# 3. Recargar la página (F5)
# Verificar:
# - ✅ La app carga correctamente
# - ✅ Las imágenes cargan desde cache
# - ✅ La navegación funciona
```
### Test 4: Test de Actualización
```bash
# 1. Cambiar CACHE_VERSION en public/sw.js
# De: const CACHE_VERSION = 'v1.0.1';
# A: const CACHE_VERSION = 'v1.0.2';
# 2. Hacer build
npm run build
# 3. Servir (preview o servidor)
npm run preview
# O subir dist/ a servidor
# 4. Abrir la app en navegador
# 5. Verificar:
# - ✅ El SW detecta la nueva versión
# - ✅ Se muestra banner de actualización
# - ✅ Al hacer clic en "Actualizar", se recarga
# - ✅ El nuevo cache se crea
# - ✅ El cache antiguo se elimina
```
---
## 🔍 VERIFICACIÓN EN CONSOLA
### Mensajes Esperados
**Al cargar la app:**
```
[SW] Registered: http://localhost:8096/
```
**Cuando hay actualización:**
```
[SW] New version available
```
**Al actualizar:**
```
[SW] Installing service worker...
[SW] Caching static assets
[SW] Activating service worker...
[SW] Deleting old cache: emerges-tes-v1.0.1
```
---
## 📋 CHECKLIST DE VERIFICACIÓN
### Instalación PWA
- [ ] La app se puede instalar (Add to Home Screen)
- [ ] El icono aparece correctamente
- [ ] El nombre aparece correctamente
- [ ] Se abre en modo standalone
### Funcionamiento Offline
- [ ] La app carga sin internet
- [ ] Las imágenes cargan desde cache
- [ ] Los archivos Markdown cargan desde cache
- [ ] La navegación funciona offline
### Actualizaciones
- [ ] El SW detecta nuevas versiones
- [ ] Se muestra notificación de actualización
- [ ] La actualización funciona correctamente
- [ ] El cache se actualiza correctamente
---
## 🚨 PROBLEMAS COMUNES
### Problema: SW no se registra
**Solución:**
1. Verificar que `sw.js` está en `public/`
2. Verificar que se copia a `dist/` en el build
3. Limpiar cache del navegador
4. Verificar consola para errores
### Problema: Actualizaciones no se detectan
**Solución:**
1. Incrementar `CACHE_VERSION` en `sw.js`
2. Hacer nuevo build
3. Verificar que el nuevo `sw.js` está en el servidor
4. Forzar actualización: DevTools > Application > Service Workers > "Update"
### Problema: Cache no se actualiza
**Solución:**
1. Cambiar `CACHE_VERSION` en `sw.js`
2. Hacer build y desplegar
3. Limpiar cache manualmente si es necesario
---
**Última actualización:** 2025-12-23

View file

@ -2,7 +2,7 @@
**Proyecto:** EMERGES TES - Protocolo Rápido
**Fecha de Análisis:** 2025-12-23
**Ruta del Proyecto:** `/home/planetazuzu/protocolo-r-pido`
**Ruta del Proyecto:** `/home/planetazuzu/guia-tes`
---

View file

@ -13,10 +13,11 @@
- [x] **display** - `standalone` configurado
- [x] **theme_color** - `#1a1f2e` configurado
- [x] **background_color** - `#1a1f2e` configurado
- [x] **icons** - Configurados (favicon.svg, favicon.ico)
- [x] **icons** - Configurados (favicon.svg, favicon.ico, icon-192.png, icon-512.png)
- [x] **scope** - `/` configurado
- [x] **shortcuts** - Configurado (Manual Completo)
- [ ] **Iconos 192x192 y 512x512** - ⚠️ Usando favicon.svg (funciona pero ideal tener PNGs específicos)
- [x] **Iconos 192x192 y 512x512** - ✅ PNGs específicos generados
- [x] **Iconos maskable** - ✅ Para Android generados
### 2. Service Worker ✅
- [x] **Archivo presente** - `public/sw.js`
@ -53,17 +54,25 @@
## ⚠️ MEJORAS OPCIONALES
### Iconos Específicos
- [ ] Crear iconos PNG 192x192 y 512x512 específicos
- [ ] Añadir iconos maskable para Android
- [ ] Optimizar iconos para diferentes dispositivos
### Iconos Específicos ✅
- [x] Crear iconos PNG 192x192 y 512x512 específicos
- [x] Añadir iconos maskable para Android
- [x] Optimizar iconos para diferentes dispositivos
- **Estado:** ✅ Completado - Iconos generados con `scripts/generar_iconos_pwa.py`
- **Archivos:** `public/icon-192.png`, `public/icon-512.png`, `public/icon-192-maskable.png`, `public/icon-512-maskable.png`
### Screenshots
- [ ] Añadir screenshots al manifest para mejor presentación en stores
### Screenshots ⏳
- [x] Añadir screenshots al manifest para mejor presentación en stores
- [ ] Generar screenshots reales de la aplicación
- **Estado:** ⏳ Manifest actualizado, pendiente generar screenshots
- **Guía:** Ver `scripts/generar_screenshots.md` para instrucciones
- **Nota:** Los screenshots se pueden generar manualmente usando DevTools del navegador o herramientas automatizadas
### Notificaciones Push
### Notificaciones Push ⏸️
- [ ] Implementar notificaciones push (requiere backend)
- [ ] Configurar permisos de notificaciones
- **Estado:** ⏸️ Pendiente - Requiere backend y servicio de notificaciones
- **Nota:** No es crítico para funcionalidad básica de PWA
---
@ -109,12 +118,15 @@
| Requisito | Estado | Notas |
|-----------|--------|-------|
| **Manifest** | ✅ Completo | Falta iconos PNG específicos (opcional) |
| **Manifest** | ✅ Completo | Iconos PNG y maskable añadidos |
| **Service Worker** | ✅ Completo | Funcionando correctamente |
| **HTTPS** | ✅ Requerido | En producción |
| **Meta Tags** | ✅ Completo | Todos configurados |
| **Instalación** | ✅ Completo | Banner implementado |
| **Offline** | ✅ Completo | Funciona correctamente |
| **Iconos PNG** | ✅ Completo | 192x192, 512x512 generados |
| **Iconos Maskable** | ✅ Completo | Para Android generados |
| **Screenshots** | ⏳ Pendiente | Manifest configurado, pendiente imágenes |
---
@ -130,9 +142,10 @@ La aplicación cumple con todos los requisitos esenciales para ser una PWA compl
- ✅ Banner de instalación implementado
**Mejoras opcionales:**
- Iconos PNG específicos (192x192, 512x512)
- Screenshots para manifest
- Notificaciones push (requiere backend)
- ✅ Iconos PNG específicos (192x192, 512x512) - **COMPLETADO**
- ✅ Iconos maskable para Android - **COMPLETADO**
- ⏳ Screenshots para manifest - **Manifest actualizado, pendiente generar imágenes**
- ⏸️ Notificaciones push (requiere backend) - **Pendiente**
---

View file

@ -1,464 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para generar documento Word del Manual TES Digital
FASE 3: Generación de documento Word con hipervínculos internos
"""
import os
import re
from pathlib import Path
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
from docx.shared import Length
# Configuración
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido/manual-tes/TES_Manual_Digital")
OUTPUT_FILE = Path("/home/planetazuzu/protocolo-r-pido/MANUAL_TES_DIGITAL_COMPLETO.docx")
# Mapeo de archivos según estructura jerárquica (rutas relativas desde BASE_DIR)
ESTRUCTURA_ARCHIVOS = {
"PARTE I: FUNDAMENTOS Y EVALUACIÓN INICIAL": {
"BLOQUE 0 - Fundamentos de Emergencias Prehospitalarias": [
"./BLOQUE_0_FUNDAMENTOS/BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md"
],
"BLOQUE 1 - Procedimientos Básicos": [
"./BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_1_CONSTANTES_VITALES.md",
"./BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_2_ABCDE_OPERATIVO.md",
"./BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_3_GLASGOW_OPERATIVO.md",
"./BLOQUE_1_PROCEDIMIENTOS_BASICOS/BLOQUE_01_4_TRIAGE_START.md"
]
},
"PARTE II: SOPORTE VITAL Y PROCEDIMIENTOS CRÍTICOS": {
"BLOQUE 4 - Soporte Vital Básico y RCP": [
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_0_ACCESO_VASCULAR_BASICO.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_0B_RECONOCIMIENTO_PCR.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_1_RCP_ADULTOS.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_2_RCP_PEDIATRIA.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_3_RCP_LACTANTES.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_4_USO_DESA.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_6_OVACE_ADULTOS.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_7_OVACE_PEDIATRIA.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_8_OVACE_LACTANTES.md",
"./BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP/BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md"
],
"BLOQUE 9 - Medicina de Emergencias Aplicada": [
"./BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA/BLOQUE_09_0_MEDICINA_EMERGENCIAS_APLICADA.md"
]
},
"PARTE III: MATERIAL Y EQUIPAMIENTO": {
"BLOQUE 2 - Material e Inmovilización": [
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_3_COLLARIN_CERVICAL.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_4_CAMILLA_CUCHARA.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_5_TABLERO_ESPINAL.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_6_COLCHON_VACIO.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_9_ERRORES_CRITICOS.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_10_FERULAS.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_11_CINTURON_PELVICO.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_12_FERULA_TRACCION.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md",
"./BLOQUE_2_MATERIAL_E_INMOVILIZACION/BLOQUE_02_X_INVENTARIO_MATERIAL.md"
],
"BLOQUE 3 - Material Sanitario y Oxigenoterapia": [
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_0_OXIGENOTERAPIA_BASICA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_0_OXIGENOTERAPIA_FUNDAMENTOS.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_1_VENTILACION_BOLSA_MASCARILLA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_2_ASPIRACION.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_2_CANULA_OROFARINGEA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_3_BVM.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_4_CANULAS.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_5_ORGANIZACION_MALETIN.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_7_QUEMADURAS.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_8_HERIDAS_VENDAJES.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_10_MONITORIZACION_BASICA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_11_GLUCOMETRO.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_12_TERMOMETRIA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_13_CONFORT_DOLOR.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_16_COMUNICACION_OPERATIVA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_17_SENALIZACION_ILUMINACION.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_99_CIERRE_BLOQUE_3.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X2_MALETIN_CURAS.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X3_BOLSA_MONITORIZACION.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X4_INVENTARIO_GLOBAL.md",
"./BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA/BLOQUE_03_X5_CHECKLIST_MAESTRO.md"
]
},
"PARTE IV: FARMACOLOGÍA Y MEDICAMENTOS": {
"BLOQUE 6 - Farmacología y Vademécum Operativo": [
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_1_VADEMECUM_OPERATIVO.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_4_ASPIRINA_USO_SCA.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md",
"./BLOQUE_6_FARMACOLOGIA/BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md"
]
},
"PARTE V: PROTOCOLOS Y GESTIÓN OPERATIVA": {
"BLOQUE 5 - Protocolos Transtelefónicos": [
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_0_PROTOCOLOS_EMERGENCIAS_ESPECIFICAS.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_1_PCR_TRANSTELEFONICA.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_2_OVACE_TRANSTELEFONICA.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_3_SCA_TRANSTELEFONICO.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md",
"./BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS/BLOQUE_05_8_COMUNICACION_COORDINADOR.md"
],
"BLOQUE 8 - Gestión Operativa y Documentación": [
"./BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_0_INTRODUCCION_GESTION_OPERATIVA.md",
"./BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_1_DOCUMENTACION_CLINICA_PREHOSPITALARIA.md",
"./BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_2_COORDINACION_Y_COMUNICACION_OPERATIVA.md",
"./BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_3_GESTION_RECURSOS_Y_MATERIAL.md",
"./BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION/BLOQUE_08_4_CALIDAD_Y_MEJORA_CONTINUA.md"
]
},
"PARTE VI: CONDUCCIÓN Y SEGURIDAD VIAL": {
"BLOQUE 7 - Conducción y Seguridad Vial": [
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_0_FUNDAMENTOS_CONDUCCION_URGENCIAS.md",
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_1_USO_LUCES_Y_SIRENA.md",
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_2_TECNICAS_CONDUCCION_EMERGENCIAS.md",
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_3_SEGURIDAD_VIAL_Y_PREVENCION_ACCIDENTES.md",
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md",
"./BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL/BLOQUE_07_5_PROTOCOLOS_SEGURIDAD_EN_ESCENA.md"
]
},
"PARTE VII: SITUACIONES ESPECIALES Y TRAUMA": {
"BLOQUE 10 - Situaciones Especiales y Protocolos Avanzados": [
"./BLOQUE_10_SITUACIONES_ESPECIALES/BLOQUE_10_0_SITUACIONES_ESPECIALES.md"
],
"BLOQUE 11 - Protocolos de Trauma y Escenarios de Riesgo": [
"./BLOQUE_11_PROTOCOLOS_TRAUMA/BLOQUE_11_0_PROTOCOLOS_TRAUMA.md"
]
},
"PARTE VIII: HABILIDADES PROFESIONALES": {
"BLOQUE 12 - Marco Legal, Ético y Profesional del TES": [
"./BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL/BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md"
],
"BLOQUE 13 - Comunicación y Relación con el Paciente": [
"./BLOQUE_13_COMUNICACION_RELACION_PACIENTE/BLOQUE_13_0_COMUNICACION_RELACION_PACIENTE.md"
],
"BLOQUE 14 - Seguridad Personal y Salud del TES": [
"./BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES/BLOQUE_14_0_SEGURIDAD_PERSONAL_SALUD_TES.md"
]
}
}
def sanitize_bookmark(text):
"""Sanitiza texto para usar como bookmark"""
# Elimina caracteres especiales y espacios
text = re.sub(r'[^\w\s-]', '', text)
text = re.sub(r'[-\s]+', '_', text)
return text[:50] # Limita longitud
def process_markdown_content(doc, content, file_name):
"""Procesa contenido Markdown y lo añade al documento Word con formato compacto"""
lines = content.split('\n')
in_code_block = False
last_was_empty = False
for line in lines:
# Detectar bloques de código
if line.strip().startswith('```'):
in_code_block = not in_code_block
continue
if in_code_block:
p = doc.add_paragraph(line, style='Normal')
p.style.font.name = 'Courier New'
p.style.font.size = Pt(10)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(3)
p.paragraph_format.line_spacing = 1.15
last_was_empty = False
continue
# Saltos de página explícitos - eliminar completamente
if line.strip() == '---' and len(line.strip()) == 3:
continue
# Títulos
if line.startswith('#'):
level = len(line) - len(line.lstrip('#'))
title_text = line.lstrip('#').strip()
# Limpiar formato markdown del título
title_text = re.sub(r'\*\*(.+?)\*\*', r'\1', title_text)
title_text = re.sub(r'\*(.+?)\*', r'\1', title_text)
if level == 1:
p = doc.add_heading(title_text, level=1)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(3)
elif level == 2:
p = doc.add_heading(title_text, level=2)
p.paragraph_format.space_before = Pt(6)
p.paragraph_format.space_after = Pt(3)
elif level == 3:
p = doc.add_heading(title_text, level=3)
p.paragraph_format.space_before = Pt(4)
p.paragraph_format.space_after = Pt(2)
elif level == 4:
p = doc.add_heading(title_text, level=4)
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(2)
elif level == 5:
p = doc.add_heading(title_text, level=5)
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(1)
else:
p = doc.add_heading(title_text, level=6)
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(1)
last_was_empty = False
continue
# Listas con guiones
if line.strip().startswith('-') or line.strip().startswith('*'):
list_text = line.strip().lstrip('-*').strip()
# Procesar formato dentro de la lista
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(0)
p.paragraph_format.line_spacing = 1.15
process_text_formatting(p, list_text)
last_was_empty = False
continue
# Listas numeradas
match = re.match(r'^(\d+)\.\s*(.+)', line.strip())
if match:
list_text = match.group(2)
p = doc.add_paragraph(style='List Number')
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(0)
p.paragraph_format.line_spacing = 1.15
process_text_formatting(p, list_text)
last_was_empty = False
continue
# Líneas vacías - máximo una seguida
if not line.strip():
if not last_was_empty:
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(0)
last_was_empty = True
continue
# Texto normal
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(3)
p.paragraph_format.line_spacing = 1.15
process_text_formatting(p, line.strip())
last_was_empty = False
def process_text_formatting(paragraph, text):
"""Procesa formato Markdown en texto (negritas, cursivas, etc.)"""
# Patrón para negritas **texto**
parts = re.split(r'(\*\*[^*]+\*\*)', text)
for part in parts:
if part.startswith('**') and part.endswith('**'):
# Negrita
run = paragraph.add_run(part[2:-2])
run.bold = True
elif part.startswith('*') and part.endswith('*') and len(part) > 2:
# Cursiva (solo si no es negrita)
run = paragraph.add_run(part[1:-1])
run.italic = True
elif part.strip():
# Texto normal
paragraph.add_run(part)
def process_markdown_file(file_path):
"""Lee un archivo Markdown"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
except Exception as e:
print(f" ⚠️ Error leyendo {file_path}: {e}")
return None
def main():
"""Función principal"""
print("=" * 70)
print("GENERACIÓN DE DOCUMENTO WORD - MANUAL TES DIGITAL")
print("FASE 3: Documento Word con hipervínculos internos")
print("=" * 70)
# Crear documento
doc = Document()
# Configurar estilos base
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
style.paragraph_format.line_spacing = 1.15
style.paragraph_format.space_before = Pt(0)
style.paragraph_format.space_after = Pt(3)
# Configurar estilos de títulos
for i in range(1, 7):
heading_style = doc.styles[f'Heading {i}']
heading_style.font.name = 'Calibri'
heading_style.font.size = Pt(max(16 - i, 12)) # Título 1: 16pt, Título 2: 15pt, etc.
heading_style.paragraph_format.line_spacing = 1.15
if i == 1:
heading_style.paragraph_format.space_before = Pt(6)
heading_style.paragraph_format.space_after = Pt(3)
elif i == 2:
heading_style.paragraph_format.space_before = Pt(6)
heading_style.paragraph_format.space_after = Pt(3)
else:
heading_style.paragraph_format.space_before = Pt(4)
heading_style.paragraph_format.space_after = Pt(2)
# Configurar estilo de listas
for list_style_name in ['List Bullet', 'List Number']:
if list_style_name in doc.styles:
list_style = doc.styles[list_style_name]
list_style.font.size = Pt(11)
list_style.paragraph_format.line_spacing = 1.15
list_style.paragraph_format.space_before = Pt(0)
list_style.paragraph_format.space_after = Pt(0)
# Configurar márgenes (compactos: 2cm = ~0.79 pulgadas)
sections = doc.sections
for section in sections:
section.top_margin = Inches(0.79)
section.bottom_margin = Inches(0.79)
section.left_margin = Inches(0.79)
section.right_margin = Inches(0.79)
# PORTADA (compacta)
print("\n📄 Creando portada...")
title = doc.add_heading('MANUAL TES DIGITAL', level=1)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
title.paragraph_format.space_after = Pt(6)
p = doc.add_paragraph('Versión 1.0')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(3)
p = doc.add_paragraph('Fecha: 2024-12-15')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(3)
p = doc.add_paragraph('Tipo: Manual Operativo Completo')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.paragraph_format.space_after = Pt(6)
doc.add_page_break()
# ÍNDICE GENERAL (compacto)
print("📑 Creando índice general...")
doc.add_heading('ÍNDICE GENERAL', level=1)
for parte, bloques in ESTRUCTURA_ARCHIVOS.items():
p = doc.add_paragraph(parte, style='Normal')
p.style.font.bold = True
p.style.font.size = Pt(12)
p.paragraph_format.space_before = Pt(3)
p.paragraph_format.space_after = Pt(1)
for bloque, archivos in bloques.items():
p = doc.add_paragraph(f" {bloque}", style='Normal')
p.style.font.size = Pt(11)
p.style.font.italic = True
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(1)
doc.add_page_break()
# PROCESAR CADA PARTE
total_archivos = sum(len(archivos) for bloques in ESTRUCTURA_ARCHIVOS.values() for archivos in bloques.values())
archivo_actual = 0
partes_list = list(ESTRUCTURA_ARCHIVOS.items())
for idx, (parte, bloques) in enumerate(partes_list):
print(f"\n📚 Procesando {parte}...")
# Título de parte
parte_heading = doc.add_heading(parte, level=1)
parte_heading.paragraph_format.space_before = Pt(6)
parte_heading.paragraph_format.space_after = Pt(3)
for bloque, archivos in bloques.items():
print(f" 📖 Procesando {bloque}...")
# Título de bloque
bloque_heading = doc.add_heading(bloque, level=2)
bloque_heading.paragraph_format.space_before = Pt(6)
bloque_heading.paragraph_format.space_after = Pt(3)
# Procesar cada archivo del bloque
for archivo_relativo in archivos:
archivo_actual += 1
archivo_path = BASE_DIR / archivo_relativo.lstrip('./')
if not archivo_path.exists():
print(f" ⚠️ Archivo no encontrado: {archivo_relativo}")
p = doc.add_paragraph(f"[ARCHIVO NO ENCONTRADO: {archivo_relativo}]")
p.style.font.color.rgb = RGBColor(255, 0, 0)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(3)
continue
print(f" 📄 [{archivo_actual}/{total_archivos}] {archivo_path.name}")
# Título del capítulo (nombre del archivo sin extensión y formato)
chapter_title = archivo_path.stem.replace('BLOQUE_', '').replace('_', ' ')
heading = doc.add_heading(chapter_title, level=3)
heading.paragraph_format.space_before = Pt(4)
heading.paragraph_format.space_after = Pt(2)
# Procesar contenido
content = process_markdown_file(archivo_path)
if content:
process_markdown_content(doc, content, archivo_path.name)
else:
p = doc.add_paragraph("[Error al leer el contenido del archivo]")
p.style.font.color.rgb = RGBColor(255, 0, 0)
p.paragraph_format.space_before = Pt(0)
p.paragraph_format.space_after = Pt(3)
# Salto de página solo entre partes principales (no después de la última)
if idx < len(partes_list) - 1:
doc.add_page_break()
# Guardar documento
print(f"\n💾 Guardando documento en {OUTPUT_FILE}...")
doc.save(str(OUTPUT_FILE))
file_size_mb = OUTPUT_FILE.stat().st_size / 1024 / 1024
print(f"\n✅ Documento generado exitosamente!")
print(f" 📁 Archivo: {OUTPUT_FILE}")
print(f" 📊 Tamaño: {file_size_mb:.2f} MB")
print(f" 📄 Archivos procesados: {archivo_actual}/{total_archivos}")
print("\n" + "=" * 70)
if __name__ == "__main__":
main()

View file

@ -1,544 +0,0 @@
#!/usr/bin/env python3
"""
Genera el archivo manual-index.ts desde la estructura real de archivos
"""
import json
from pathlib import Path
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
# Mapeo del índice
INDICE_ESPERADO = {
"1.1.1": {"nombre": "Fundamentos de Emergencias", "bloque": 0, "parte": 1},
"1.2.1": {"nombre": "Constantes Vitales", "bloque": 1, "parte": 1},
"1.2.2": {"nombre": "ABCDE Operativo", "bloque": 1, "parte": 1},
"1.2.3": {"nombre": "Glasgow Operativo", "bloque": 1, "parte": 1},
"1.2.4": {"nombre": "Triage START", "bloque": 1, "parte": 1},
"2.1.1": {"nombre": "Acceso Vascular Básico", "bloque": 4, "parte": 2},
"2.1.2": {"nombre": "Reconocimiento PCR", "bloque": 4, "parte": 2},
"2.1.3": {"nombre": "RCP Adultos", "bloque": 4, "parte": 2},
"2.1.4": {"nombre": "RCP Pediatría", "bloque": 4, "parte": 2},
"2.1.5": {"nombre": "RCP Lactantes", "bloque": 4, "parte": 2},
"2.1.6": {"nombre": "Uso DESA", "bloque": 4, "parte": 2},
"2.1.7": {"nombre": "RCP Dos Intervinientes", "bloque": 4, "parte": 2},
"2.1.8": {"nombre": "OVACE Adultos", "bloque": 4, "parte": 2},
"2.1.9": {"nombre": "OVACE Pediatría", "bloque": 4, "parte": 2},
"2.1.10": {"nombre": "OVACE Lactantes", "bloque": 4, "parte": 2},
"2.1.11": {"nombre": "Posición Lateral de Seguridad", "bloque": 4, "parte": 2},
"2.2.1": {"nombre": "Medicina de Emergencias Aplicada", "bloque": 9, "parte": 2},
"3.1.1": {"nombre": "Anatomía Operativa", "bloque": 2, "parte": 3},
"3.1.2": {"nombre": "Inmovilización Manual", "bloque": 2, "parte": 3},
"3.1.3": {"nombre": "Collarín Cervical", "bloque": 2, "parte": 3},
"3.1.4": {"nombre": "Camilla Cuchara", "bloque": 2, "parte": 3},
"3.1.5": {"nombre": "Tablero Espinal", "bloque": 2, "parte": 3},
"3.1.6": {"nombre": "Colchón Vacío", "bloque": 2, "parte": 3},
"3.1.7": {"nombre": "Extricación y Movimientos en Bloque", "bloque": 2, "parte": 3},
"3.1.8": {"nombre": "Transferencias y Movilización", "bloque": 2, "parte": 3},
"3.1.9": {"nombre": "Errores Críticos", "bloque": 2, "parte": 3},
"3.1.10": {"nombre": "Férulas", "bloque": 2, "parte": 3},
"3.1.11": {"nombre": "Cinturón Pélvico", "bloque": 2, "parte": 3},
"3.1.12": {"nombre": "Férula de Tracción", "bloque": 2, "parte": 3},
"3.1.13": {"nombre": "Camillas y Sillas de Evacuación", "bloque": 2, "parte": 3},
"3.1.14": {"nombre": "Inventario de Material", "bloque": 2, "parte": 3},
"3.2.1": {"nombre": "Oxigenoterapia Básica", "bloque": 3, "parte": 3},
"3.2.2": {"nombre": "Oxigenoterapia - Fundamentos", "bloque": 3, "parte": 3},
"3.2.3": {"nombre": "Dispositivos de Oxigenoterapia", "bloque": 3, "parte": 3},
"3.2.4": {"nombre": "Ventilación con Bolsa-Mascarilla", "bloque": 3, "parte": 3},
"3.2.5": {"nombre": "Aspiración", "bloque": 3, "parte": 3},
"3.2.6": {"nombre": "Cánula Orofaringea", "bloque": 3, "parte": 3},
"3.2.7": {"nombre": "BVM (Bolsa Válvula Mascarilla)", "bloque": 3, "parte": 3},
"3.2.8": {"nombre": "Cánulas", "bloque": 3, "parte": 3},
"3.2.9": {"nombre": "Organización del Maletín", "bloque": 3, "parte": 3},
"3.2.10": {"nombre": "Control de Hemorragias", "bloque": 3, "parte": 3},
"3.2.11": {"nombre": "Quemaduras", "bloque": 3, "parte": 3},
"3.2.12": {"nombre": "Heridas y Vendajes", "bloque": 3, "parte": 3},
"3.2.13": {"nombre": "Exposición y Aislamiento Térmico", "bloque": 3, "parte": 3},
"3.2.14": {"nombre": "Monitorización Básica", "bloque": 3, "parte": 3},
"3.2.15": {"nombre": "Glucometro", "bloque": 3, "parte": 3},
"3.2.16": {"nombre": "Termometría", "bloque": 3, "parte": 3},
"3.2.17": {"nombre": "Confort y Dolor", "bloque": 3, "parte": 3},
"3.2.18": {"nombre": "Bioseguridad y Descontaminación", "bloque": 3, "parte": 3},
"3.2.19": {"nombre": "Gestión de Material en Escena", "bloque": 3, "parte": 3},
"3.2.20": {"nombre": "Comunicación Operativa", "bloque": 3, "parte": 3},
"3.2.21": {"nombre": "Señalización e Iluminación", "bloque": 3, "parte": 3},
"3.2.22": {"nombre": "Documentación Operativa", "bloque": 3, "parte": 3},
"3.2.23": {"nombre": "Cierre Bloque 3", "bloque": 3, "parte": 3},
"3.2.24": {"nombre": "Inventario Material Sanitario", "bloque": 3, "parte": 3},
"3.2.25": {"nombre": "Maletín de Curas", "bloque": 3, "parte": 3},
"3.2.26": {"nombre": "Bolsa de Monitorización", "bloque": 3, "parte": 3},
"3.2.27": {"nombre": "Inventario Global", "bloque": 3, "parte": 3},
"3.2.28": {"nombre": "Checklist Maestro", "bloque": 3, "parte": 3},
"4.1.1": {"nombre": "Principios de Administración de Fármacos", "bloque": 6, "parte": 4},
"4.1.2": {"nombre": "Vademécum Operativo", "bloque": 6, "parte": 4},
"4.1.3": {"nombre": "Oxígeno - Administración y Seguridad", "bloque": 6, "parte": 4},
"4.1.4": {"nombre": "Adrenalina - Uso en Anafilaxia y RCP", "bloque": 6, "parte": 4},
"4.1.5": {"nombre": "Aspirina - Uso en SCA", "bloque": 6, "parte": 4},
"4.1.6": {"nombre": "Glucagón - Uso en Hipoglucemia", "bloque": 6, "parte": 4},
"4.1.7": {"nombre": "Salbutamol - Uso en Crisis Asmática", "bloque": 6, "parte": 4},
"4.1.8": {"nombre": "Abreviaturas y Terminología Farmacológica", "bloque": 6, "parte": 4},
"5.1.1": {"nombre": "Introducción a Protocolos Transtelefónicos", "bloque": 5, "parte": 5},
"5.1.2": {"nombre": "Protocolos de Emergencias Específicas", "bloque": 5, "parte": 5},
"5.1.3": {"nombre": "PCR Transtelefónica", "bloque": 5, "parte": 5},
"5.1.4": {"nombre": "OVACE Transtelefónica", "bloque": 5, "parte": 5},
"5.1.5": {"nombre": "SCA Transtelefónico", "bloque": 5, "parte": 5},
"5.1.6": {"nombre": "ICTUS Transtelefónico", "bloque": 5, "parte": 5},
"5.1.7": {"nombre": "Anafilaxia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.8": {"nombre": "Crisis Asmática Transtelefónica", "bloque": 5, "parte": 5},
"5.1.9": {"nombre": "Hipoglucemia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.10": {"nombre": "Comunicación con Coordinador", "bloque": 5, "parte": 5},
"5.2.1": {"nombre": "Introducción a Gestión Operativa", "bloque": 8, "parte": 5},
"5.2.2": {"nombre": "Documentación Clínica Prehospitalaria", "bloque": 8, "parte": 5},
"5.2.3": {"nombre": "Coordinación y Comunicación Operativa", "bloque": 8, "parte": 5},
"5.2.4": {"nombre": "Gestión de Recursos y Material", "bloque": 8, "parte": 5},
"5.2.5": {"nombre": "Calidad y Mejora Continua", "bloque": 8, "parte": 5},
"6.1.1": {"nombre": "Fundamentos de Conducción en Urgencias", "bloque": 7, "parte": 6},
"6.1.2": {"nombre": "Uso de Luces y Sirena", "bloque": 7, "parte": 6},
"6.1.3": {"nombre": "Técnicas de Conducción en Emergencias", "bloque": 7, "parte": 6},
"6.1.4": {"nombre": "Seguridad Vial y Prevención de Accidentes", "bloque": 7, "parte": 6},
"6.1.5": {"nombre": "Gestión de Rutas y Navegación", "bloque": 7, "parte": 6},
"6.1.6": {"nombre": "Protocolos de Seguridad en Escena", "bloque": 7, "parte": 6},
"7.1.1": {"nombre": "Situaciones Especiales", "bloque": 10, "parte": 7},
"7.2.1": {"nombre": "Protocolos de Trauma", "bloque": 11, "parte": 7},
"8.1.1": {"nombre": "Marco Legal, Ético y Profesional del TES", "bloque": 12, "parte": 8},
"8.2.1": {"nombre": "Comunicación y Relación con el Paciente", "bloque": 13, "parte": 8},
"8.3.1": {"nombre": "Seguridad Personal y Salud del TES", "bloque": 14, "parte": 8},
}
MAPEO_REAL = {
"1.1.1": "BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md",
"1.2.1": "BLOQUE_01_1_CONSTANTES_VITALES.md",
"1.2.2": "BLOQUE_01_2_ABCDE_OPERATIVO.md",
"1.2.3": "BLOQUE_01_3_GLASGOW_OPERATIVO.md",
"1.2.4": "BLOQUE_01_4_TRIAGE_START.md",
"2.1.1": "BLOQUE_04_0_ACCESO_VASCULAR_BASICO.md",
"2.1.2": "BLOQUE_04_0B_RECONOCIMIENTO_PCR.md",
"2.1.3": "BLOQUE_04_1_RCP_ADULTOS.md",
"2.1.4": "BLOQUE_04_2_RCP_PEDIATRIA.md",
"2.1.5": "BLOQUE_04_3_RCP_LACTANTES.md",
"2.1.6": "BLOQUE_04_4_USO_DESA.md",
"2.1.7": "BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md",
"2.1.8": "BLOQUE_04_6_OVACE_ADULTOS.md",
"2.1.9": "BLOQUE_04_7_OVACE_PEDIATRIA.md",
"2.1.10": "BLOQUE_04_8_OVACE_LACTANTES.md",
"2.1.11": "BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md",
"2.2.1": "BLOQUE_09_0_MEDICINA_EMERGENCIAS_APLICADA.md",
"3.1.1": "BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
"3.1.2": "BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
"3.1.3": "BLOQUE_02_3_COLLARIN_CERVICAL.md",
"3.1.4": "BLOQUE_02_4_CAMILLA_CUCHARA.md",
"3.1.5": "BLOQUE_02_5_TABLERO_ESPINAL.md",
"3.1.6": "BLOQUE_02_6_COLCHON_VACIO.md",
"3.1.7": "BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md",
"3.1.8": "BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
"3.1.9": "BLOQUE_02_9_ERRORES_CRITICOS.md",
"3.1.10": "BLOQUE_02_10_FERULAS.md",
"3.1.11": "BLOQUE_02_11_CINTURON_PELVICO.md",
"3.1.12": "BLOQUE_02_12_FERULA_TRACCION.md",
"3.1.13": "BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md",
"3.1.14": "BLOQUE_02_X_INVENTARIO_MATERIAL.md",
"3.2.1": "BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md",
"3.2.2": "BLOQUE_03_0B_OXIGENOTERAPIA_FUNDAMENTOS.md",
"3.2.3": "BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md",
"3.2.4": "BLOQUE_03_1B_VENTILACION_BOLSA_MASCARILLA.md",
"3.2.5": "BLOQUE_03_2_ASPIRACION.md",
"3.2.6": "BLOQUE_03_2B_CANULA_OROFARINGEA.md",
"3.2.7": "BLOQUE_03_3_BVM.md",
"3.2.8": "BLOQUE_03_4_CANULAS.md",
"3.2.9": "BLOQUE_03_5_ORGANIZACION_MALETIN.md",
"3.2.10": "BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
"3.2.11": "BLOQUE_03_7_QUEMADURAS.md",
"3.2.12": "BLOQUE_03_8_HERIDAS_VENDAJES.md",
"3.2.13": "BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md",
"3.2.14": "BLOQUE_03_10_MONITORIZACION_BASICA.md",
"3.2.15": "BLOQUE_03_11_GLUCOMETRO.md",
"3.2.16": "BLOQUE_03_12_TERMOMETRIA.md",
"3.2.17": "BLOQUE_03_13_CONFORT_DOLOR.md",
"3.2.18": "BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md",
"3.2.19": "BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md",
"3.2.20": "BLOQUE_03_16_COMUNICACION_OPERATIVA.md",
"3.2.21": "BLOQUE_03_17_SENALIZACION_ILUMINACION.md",
"3.2.22": "BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md",
"3.2.23": "BLOQUE_03_99_CIERRE_BLOQUE_3.md",
"3.2.24": "BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md",
"3.2.25": "BLOQUE_03_X2_MALETIN_CURAS.md",
"3.2.26": "BLOQUE_03_X3_BOLSA_MONITORIZACION.md",
"3.2.27": "BLOQUE_03_X4_INVENTARIO_GLOBAL.md",
"3.2.28": "BLOQUE_03_X5_CHECKLIST_MAESTRO.md",
"4.1.1": "BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md",
"4.1.2": "BLOQUE_06_1_VADEMECUM_OPERATIVO.md",
"4.1.3": "BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md",
"4.1.4": "BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md",
"4.1.5": "BLOQUE_06_4_ASPIRINA_USO_SCA.md",
"4.1.6": "BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md",
"4.1.7": "BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md",
"4.1.8": "BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md",
"5.1.1": "BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md",
"5.1.2": "BLOQUE_05_0B_PROTOCOLOS_EMERGENCIAS_ESPECIFICAS.md",
"5.1.3": "BLOQUE_05_1_PCR_TRANSTELEFONICA.md",
"5.1.4": "BLOQUE_05_2_OVACE_TRANSTELEFONICA.md",
"5.1.5": "BLOQUE_05_3_SCA_TRANSTELEFONICO.md",
"5.1.6": "BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md",
"5.1.7": "BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md",
"5.1.8": "BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md",
"5.1.9": "BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md",
"5.1.10": "BLOQUE_05_8_COMUNICACION_COORDINADOR.md",
"5.2.1": "BLOQUE_08_0_INTRODUCCION_GESTION_OPERATIVA.md",
"5.2.2": "BLOQUE_08_1_DOCUMENTACION_CLINICA_PREHOSPITALARIA.md",
"5.2.3": "BLOQUE_08_2_COORDINACION_Y_COMUNICACION_OPERATIVA.md",
"5.2.4": "BLOQUE_08_3_GESTION_RECURSOS_Y_MATERIAL.md",
"5.2.5": "BLOQUE_08_4_CALIDAD_Y_MEJORA_CONTINUA.md",
"6.1.1": "BLOQUE_07_0_FUNDAMENTOS_CONDUCCION_URGENCIAS.md",
"6.1.2": "BLOQUE_07_1_USO_LUCES_Y_SIRENA.md",
"6.1.3": "BLOQUE_07_2_TECNICAS_CONDUCCION_EMERGENCIAS.md",
"6.1.4": "BLOQUE_07_3_SEGURIDAD_VIAL_Y_PREVENCION_ACCIDENTES.md",
"6.1.5": "BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md",
"6.1.6": "BLOQUE_07_5_PROTOCOLOS_SEGURIDAD_EN_ESCENA.md",
"7.1.1": "BLOQUE_10_0_SITUACIONES_ESPECIALES.md",
"7.2.1": "BLOQUE_11_0_PROTOCOLOS_TRAUMA.md",
"8.1.1": "BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md",
"8.2.1": "BLOQUE_13_0_COMUNICACION_RELACION_PACIENTE.md",
"8.3.1": "BLOQUE_14_0_SEGURIDAD_PERSONAL_SALUD_TES.md",
}
BLOQUE_TO_FOLDER = {
0: "BLOQUE_0_FUNDAMENTOS",
1: "BLOQUE_1_PROCEDIMIENTOS_BASICOS",
2: "BLOQUE_2_MATERIAL_E_INMOVILIZACION",
3: "BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA",
4: "BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP",
5: "BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS",
6: "BLOQUE_6_FARMACOLOGIA",
7: "BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL",
8: "BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION",
9: "BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA",
10: "BLOQUE_10_SITUACIONES_ESPECIALES",
11: "BLOQUE_11_PROTOCOLOS_TRAUMA",
12: "BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL",
13: "BLOQUE_13_COMUNICACION_RELACION_PACIENTE",
14: "BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES",
}
PARTES_INFO = {
1: {"nombre": "Fundamentos y Evaluación Inicial", "icono": "BookOpen"},
2: {"nombre": "Soporte Vital y Procedimientos Críticos", "icono": "Heart"},
3: {"nombre": "Material y Equipamiento", "icono": "Package"},
4: {"nombre": "Farmacología y Medicamentos", "icono": "Pill"},
5: {"nombre": "Protocolos y Gestión Operativa", "icono": "Phone"},
6: {"nombre": "Conducción y Seguridad Vial", "icono": "Car"},
7: {"nombre": "Situaciones Especiales y Trauma", "icono": "AlertTriangle"},
8: {"nombre": "Habilidades Profesionales", "icono": "User"},
}
BLOQUES_INFO = {
0: {"nombre": "Fundamentos de Emergencias Prehospitalarias", "icono": "BookOpen"},
1: {"nombre": "Procedimientos Básicos", "icono": "ClipboardCheck"},
2: {"nombre": "Material e Inmovilización", "icono": "Package"},
3: {"nombre": "Material Sanitario y Oxigenoterapia", "icono": "Wind"},
4: {"nombre": "Soporte Vital Básico y RCP", "icono": "Heart"},
5: {"nombre": "Protocolos Transtelefónicos", "icono": "Phone"},
6: {"nombre": "Farmacología y Vademécum Operativo", "icono": "Pill"},
7: {"nombre": "Conducción y Seguridad Vial", "icono": "Car"},
8: {"nombre": "Gestión Operativa y Documentación", "icono": "FileText"},
9: {"nombre": "Medicina de Emergencias Aplicada", "icono": "Stethoscope"},
10: {"nombre": "Situaciones Especiales", "icono": "AlertTriangle"},
11: {"nombre": "Protocolos de Trauma", "icono": "Activity"},
12: {"nombre": "Marco Legal, Ético y Profesional", "icono": "Scale"},
13: {"nombre": "Comunicación y Relación con el Paciente", "icono": "MessageSquare"},
14: {"nombre": "Seguridad Personal y Salud del TES", "icono": "Shield"},
}
def generar_ruta_url(codigo: str, parte: int, bloque: int) -> str:
"""Genera ruta URL amigable"""
parte_nombres = {
1: "parte-i-fundamentos",
2: "parte-ii-soporte-vital",
3: "parte-iii-material",
4: "parte-iv-farmacologia",
5: "parte-v-protocolos",
6: "parte-vi-conduccion",
7: "parte-vii-situaciones-especiales",
8: "parte-viii-habilidades",
}
bloque_nombres = {
0: "bloque-0-fundamentos",
1: "bloque-1-procedimientos-basicos",
2: "bloque-2-inmovilizacion",
3: "bloque-3-oxigenoterapia",
4: "bloque-4-rcp",
5: "bloque-5-transtelefonicos",
6: "bloque-6-farmacologia",
7: "bloque-7-conduccion",
8: "bloque-8-gestion",
9: "bloque-9-medicina-emergencias",
10: "bloque-10-situaciones-especiales",
11: "bloque-11-trauma",
12: "bloque-12-marco-legal",
13: "bloque-13-comunicacion",
14: "bloque-14-seguridad",
}
return f"/manual/{parte_nombres[parte]}/{bloque_nombres[bloque]}/{codigo}"
def determinar_nivel_dificultad(codigo: str, bloque: int) -> str:
"""Determina nivel de dificultad basado en bloque y código"""
if bloque == 0 or codigo.startswith("1."):
return "basico"
elif bloque in [4, 5] or codigo.startswith("2."):
return "avanzado"
else:
return "intermedio"
def determinar_importancia(codigo: str, bloque: int) -> str:
"""Determina importancia basado en contenido"""
protocolos_criticos = ["2.1.3", "2.1.8", "2.1.6", "1.2.2"] # RCP, OVACE, DESA, ABCDE
if codigo in protocolos_criticos or bloque == 4:
return "alta"
elif bloque in [0, 1, 2, 3]:
return "alta"
else:
return "media"
def extraer_palabras_clave(nombre: str, bloque: int) -> list:
"""Extrae palabras clave del nombre"""
palabras = nombre.lower().split()
palabras_clave = []
# Agregar palabras relevantes
terminos_importantes = [
"rcp", "ovace", "abcde", "glasgow", "triage", "oxigenoterapia",
"farmacologia", "trauma", "inmovilizacion", "protocolo", "emergencia"
]
for termino in terminos_importantes:
if termino in nombre.lower():
palabras_clave.append(termino)
return palabras_clave[:5] # Máximo 5 palabras clave
def calcular_tiempo_lectura(ruta_archivo: Path) -> int:
"""Calcula tiempo estimado de lectura"""
try:
with open(ruta_archivo, 'r', encoding='utf-8') as f:
contenido = f.read()
palabras = len(contenido.split())
# Promedio: 200 palabras por minuto
return max(5, palabras // 200)
except:
return 10 # Default
def obtener_capitulos_relacionados(codigo: str, parte: int, bloque: int) -> list:
"""Obtiene IDs de capítulos relacionados"""
relacionados = []
# Misma parte
for cod, info in INDICE_ESPERADO.items():
if info["parte"] == parte and cod != codigo:
relacionados.append(cod)
# Limitar a 5 relacionados
return relacionados[:5]
def generar_indice():
"""Genera el archivo manual-index.ts"""
# Organizar por partes y bloques
partes_estructura = {}
for codigo, info in INDICE_ESPERADO.items():
parte_num = info["parte"]
bloque_num = info["bloque"]
if parte_num not in partes_estructura:
partes_estructura[parte_num] = {
"bloques": {}
}
if bloque_num not in partes_estructura[parte_num]["bloques"]:
partes_estructura[parte_num]["bloques"][bloque_num] = {
"capitulos": []
}
# Obtener archivo real
nombre_archivo = MAPEO_REAL.get(codigo)
if nombre_archivo:
folder_name = BLOQUE_TO_FOLDER[bloque_num]
ruta_archivo = MANUAL_DIR / folder_name / nombre_archivo
# Calcular navegación
codigos_ordenados = sorted(INDICE_ESPERADO.keys())
indice_actual = codigos_ordenados.index(codigo)
anterior = codigos_ordenados[indice_actual - 1] if indice_actual > 0 else None
siguiente = codigos_ordenados[indice_actual + 1] if indice_actual < len(codigos_ordenados) - 1 else None
capitulo = {
"id": codigo,
"titulo": info["nombre"],
"parte": parte_num,
"parteNombre": PARTES_INFO[parte_num]["nombre"],
"bloque": bloque_num,
"bloqueNombre": BLOQUES_INFO[bloque_num]["nombre"],
"rutaArchivo": f"manual-tes/TES_Manual_Digital/{folder_name}/{nombre_archivo}",
"rutaUrl": generar_ruta_url(codigo, parte_num, bloque_num),
"nivelDificultad": determinar_nivel_dificultad(codigo, bloque_num),
"importancia": determinar_importancia(codigo, bloque_num),
"palabrasClave": extraer_palabras_clave(info["nombre"], bloque_num),
"tipoContenido": "operativo" if bloque_num in [1, 2, 3, 4] else "formativo",
"tiempoLectura": calcular_tiempo_lectura(ruta_archivo),
"navegacion": {
"anterior": anterior,
"siguiente": siguiente,
"relacionados": obtener_capitulos_relacionados(codigo, parte_num, bloque_num)
},
"metadata": {
"version": "1.0",
"fechaActualizacion": "2024-12-13",
"autor": "Manual TES Digital"
}
}
partes_estructura[parte_num]["bloques"][bloque_num]["capitulos"].append(capitulo)
# Generar código TypeScript
ts_code = []
ts_code.append("// Índice del Manual TES Digital")
ts_code.append("// Generado automáticamente desde estructura de archivos")
ts_code.append("// Fecha: 2025-12-17")
ts_code.append("")
ts_code.append("export interface Capitulo {")
ts_code.append(" id: string;")
ts_code.append(" titulo: string;")
ts_code.append(" parte: number;")
ts_code.append(" parteNombre: string;")
ts_code.append(" bloque: number;")
ts_code.append(" bloqueNombre: string;")
ts_code.append(" rutaArchivo: string;")
ts_code.append(" rutaUrl: string;")
ts_code.append(" nivelDificultad: 'basico' | 'intermedio' | 'avanzado';")
ts_code.append(" importancia: 'alta' | 'media' | 'baja';")
ts_code.append(" palabrasClave: string[];")
ts_code.append(" tipoContenido: 'formativo' | 'operativo' | 'referencia';")
ts_code.append(" tiempoLectura: number;")
ts_code.append(" navegacion: {")
ts_code.append(" anterior: string | null;")
ts_code.append(" siguiente: string | null;")
ts_code.append(" relacionados: string[];")
ts_code.append(" };")
ts_code.append(" metadata: {")
ts_code.append(" version: string;")
ts_code.append(" fechaActualizacion: string;")
ts_code.append(" autor: string;")
ts_code.append(" };")
ts_code.append("}")
ts_code.append("")
ts_code.append("export interface Bloque {")
ts_code.append(" id: number;")
ts_code.append(" nombre: string;")
ts_code.append(" descripcion: string;")
ts_code.append(" icono?: string;")
ts_code.append(" capitulos: Capitulo[];")
ts_code.append("}")
ts_code.append("")
ts_code.append("export interface Parte {")
ts_code.append(" id: number;")
ts_code.append(" nombre: string;")
ts_code.append(" descripcion: string;")
ts_code.append(" icono?: string;")
ts_code.append(" bloques: Bloque[];")
ts_code.append("}")
ts_code.append("")
ts_code.append("export const manualIndex: Parte[] = [")
# Generar estructura de partes
for parte_num in sorted(partes_estructura.keys()):
parte_info = PARTES_INFO[parte_num]
ts_code.append(f" {{")
ts_code.append(f" id: {parte_num},")
ts_code.append(f" nombre: \"{parte_info['nombre']}\",")
ts_code.append(f" descripcion: \"\",")
ts_code.append(f" icono: \"{parte_info['icono']}\",")
ts_code.append(f" bloques: [")
# Generar bloques
for bloque_num in sorted(partes_estructura[parte_num]["bloques"].keys()):
bloque_info = BLOQUES_INFO[bloque_num]
capitulos = sorted(partes_estructura[parte_num]["bloques"][bloque_num]["capitulos"],
key=lambda x: x["id"])
ts_code.append(f" {{")
ts_code.append(f" id: {bloque_num},")
ts_code.append(f" nombre: \"{bloque_info['nombre']}\",")
ts_code.append(f" descripcion: \"\",")
ts_code.append(f" icono: \"{bloque_info['icono']}\",")
ts_code.append(f" capitulos: [")
# Generar capítulos
for cap in capitulos:
ts_code.append(f" {{")
ts_code.append(f" id: \"{cap['id']}\",")
ts_code.append(f" titulo: \"{cap['titulo']}\",")
ts_code.append(f" parte: {cap['parte']},")
ts_code.append(f" parteNombre: \"{cap['parteNombre']}\",")
ts_code.append(f" bloque: {cap['bloque']},")
ts_code.append(f" bloqueNombre: \"{cap['bloqueNombre']}\",")
ts_code.append(f" rutaArchivo: \"{cap['rutaArchivo']}\",")
ts_code.append(f" rutaUrl: \"{cap['rutaUrl']}\",")
ts_code.append(f" nivelDificultad: \"{cap['nivelDificultad']}\",")
ts_code.append(f" importancia: \"{cap['importancia']}\",")
ts_code.append(f" palabrasClave: {json.dumps(cap['palabrasClave'])},")
ts_code.append(f" tipoContenido: \"{cap['tipoContenido']}\",")
ts_code.append(f" tiempoLectura: {cap['tiempoLectura']},")
ts_code.append(f" navegacion: {{")
ts_code.append(f" anterior: {json.dumps(cap['navegacion']['anterior'])},",)
ts_code.append(f" siguiente: {json.dumps(cap['navegacion']['siguiente'])},",)
ts_code.append(f" relacionados: {json.dumps(cap['navegacion']['relacionados'])}")
ts_code.append(f" }},")
ts_code.append(f" metadata: {{")
ts_code.append(f" version: \"{cap['metadata']['version']}\",")
ts_code.append(f" fechaActualizacion: \"{cap['metadata']['fechaActualizacion']}\",")
ts_code.append(f" autor: \"{cap['metadata']['autor']}\"")
ts_code.append(f" }}")
ts_code.append(f" }},")
ts_code.append(f" ]")
ts_code.append(f" }},")
ts_code.append(f" ]")
ts_code.append(f" }},")
ts_code.append("];")
ts_code.append("")
ts_code.append("// Función helper para obtener capítulo por ID")
ts_code.append("export function getCapituloById(id: string): Capitulo | null {")
ts_code.append(" for (const parte of manualIndex) {")
ts_code.append(" for (const bloque of parte.bloques) {")
ts_code.append(" const capitulo = bloque.capitulos.find(c => c.id === id);")
ts_code.append(" if (capitulo) return capitulo;")
ts_code.append(" }")
ts_code.append(" }")
ts_code.append(" return null;")
ts_code.append("}")
ts_code.append("")
ts_code.append("// Función helper para obtener todos los capítulos")
ts_code.append("export function getAllCapitulos(): Capitulo[] {")
ts_code.append(" const capitulos: Capitulo[] = [];")
ts_code.append(" for (const parte of manualIndex) {")
ts_code.append(" for (const bloque of parte.bloques) {")
ts_code.append(" capitulos.push(...bloque.capitulos);")
ts_code.append(" }")
ts_code.append(" }")
ts_code.append(" return capitulos;")
ts_code.append("}")
# Guardar archivo
output_path = BASE_DIR / "src" / "data" / "manual-index.ts"
with open(output_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(ts_code))
print(f"✅ Índice generado: {output_path}")
print(f" Total de capítulos: {len(INDICE_ESPERADO)}")
if __name__ == "__main__":
generar_indice()

View file

@ -1,632 +0,0 @@
#!/usr/bin/env python3
"""
Script para generar reportes completos para conversión a app digital
Genera 3 reportes:
1. Archivos .md faltantes del índice
2. Medios/multimedia faltantes
3. Recomendaciones para estructura de app
"""
import os
import re
from pathlib import Path
from collections import defaultdict
from typing import Dict, List, Set, Tuple
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
# Mapeo del índice esperado (del INDICE_COMPLETO_MANUAL_TES.md)
INDICE_ESPERADO = {
"1.1.1": {"nombre": "Fundamentos de Emergencias", "bloque": 0, "parte": 1},
"1.2.1": {"nombre": "Constantes Vitales", "bloque": 1, "parte": 1},
"1.2.2": {"nombre": "ABCDE Operativo", "bloque": 1, "parte": 1},
"1.2.3": {"nombre": "Glasgow Operativo", "bloque": 1, "parte": 1},
"1.2.4": {"nombre": "Triage START", "bloque": 1, "parte": 1},
"2.1.1": {"nombre": "Acceso Vascular Básico", "bloque": 4, "parte": 2},
"2.1.2": {"nombre": "Reconocimiento PCR", "bloque": 4, "parte": 2},
"2.1.3": {"nombre": "RCP Adultos", "bloque": 4, "parte": 2},
"2.1.4": {"nombre": "RCP Pediatría", "bloque": 4, "parte": 2},
"2.1.5": {"nombre": "RCP Lactantes", "bloque": 4, "parte": 2},
"2.1.6": {"nombre": "Uso DESA", "bloque": 4, "parte": 2},
"2.1.7": {"nombre": "RCP Dos Intervinientes", "bloque": 4, "parte": 2},
"2.1.8": {"nombre": "OVACE Adultos", "bloque": 4, "parte": 2},
"2.1.9": {"nombre": "OVACE Pediatría", "bloque": 4, "parte": 2},
"2.1.10": {"nombre": "OVACE Lactantes", "bloque": 4, "parte": 2},
"2.1.11": {"nombre": "Posición Lateral de Seguridad", "bloque": 4, "parte": 2},
"2.2.1": {"nombre": "Medicina de Emergencias Aplicada", "bloque": 9, "parte": 2},
"3.1.1": {"nombre": "Anatomía Operativa", "bloque": 2, "parte": 3},
"3.1.2": {"nombre": "Inmovilización Manual", "bloque": 2, "parte": 3},
"3.1.3": {"nombre": "Collarín Cervical", "bloque": 2, "parte": 3},
"3.1.4": {"nombre": "Camilla Cuchara", "bloque": 2, "parte": 3},
"3.1.5": {"nombre": "Tablero Espinal", "bloque": 2, "parte": 3},
"3.1.6": {"nombre": "Colchón Vacío", "bloque": 2, "parte": 3},
"3.1.7": {"nombre": "Extricación y Movimientos en Bloque", "bloque": 2, "parte": 3},
"3.1.8": {"nombre": "Transferencias y Movilización", "bloque": 2, "parte": 3},
"3.1.9": {"nombre": "Errores Críticos", "bloque": 2, "parte": 3},
"3.1.10": {"nombre": "Férulas", "bloque": 2, "parte": 3},
"3.1.11": {"nombre": "Cinturón Pélvico", "bloque": 2, "parte": 3},
"3.1.12": {"nombre": "Férula de Tracción", "bloque": 2, "parte": 3},
"3.1.13": {"nombre": "Camillas y Sillas de Evacuación", "bloque": 2, "parte": 3},
"3.1.14": {"nombre": "Inventario de Material", "bloque": 2, "parte": 3},
"3.2.1": {"nombre": "Oxigenoterapia Básica", "bloque": 3, "parte": 3},
"3.2.2": {"nombre": "Oxigenoterapia - Fundamentos", "bloque": 3, "parte": 3},
"3.2.3": {"nombre": "Dispositivos de Oxigenoterapia", "bloque": 3, "parte": 3},
"3.2.4": {"nombre": "Ventilación con Bolsa-Mascarilla", "bloque": 3, "parte": 3},
"3.2.5": {"nombre": "Aspiración", "bloque": 3, "parte": 3},
"3.2.6": {"nombre": "Cánula Orofaringea", "bloque": 3, "parte": 3},
"3.2.7": {"nombre": "BVM (Bolsa Válvula Mascarilla)", "bloque": 3, "parte": 3},
"3.2.8": {"nombre": "Cánulas", "bloque": 3, "parte": 3},
"3.2.9": {"nombre": "Organización del Maletín", "bloque": 3, "parte": 3},
"3.2.10": {"nombre": "Control de Hemorragias", "bloque": 3, "parte": 3},
"3.2.11": {"nombre": "Quemaduras", "bloque": 3, "parte": 3},
"3.2.12": {"nombre": "Heridas y Vendajes", "bloque": 3, "parte": 3},
"3.2.13": {"nombre": "Exposición y Aislamiento Térmico", "bloque": 3, "parte": 3},
"3.2.14": {"nombre": "Monitorización Básica", "bloque": 3, "parte": 3},
"3.2.15": {"nombre": "Glucometro", "bloque": 3, "parte": 3},
"3.2.16": {"nombre": "Termometría", "bloque": 3, "parte": 3},
"3.2.17": {"nombre": "Confort y Dolor", "bloque": 3, "parte": 3},
"3.2.18": {"nombre": "Bioseguridad y Descontaminación", "bloque": 3, "parte": 3},
"3.2.19": {"nombre": "Gestión de Material en Escena", "bloque": 3, "parte": 3},
"3.2.20": {"nombre": "Comunicación Operativa", "bloque": 3, "parte": 3},
"3.2.21": {"nombre": "Señalización e Iluminación", "bloque": 3, "parte": 3},
"3.2.22": {"nombre": "Documentación Operativa", "bloque": 3, "parte": 3},
"3.2.23": {"nombre": "Cierre Bloque 3", "bloque": 3, "parte": 3},
"3.2.24": {"nombre": "Inventario Material Sanitario", "bloque": 3, "parte": 3},
"3.2.25": {"nombre": "Maletín de Curas", "bloque": 3, "parte": 3},
"3.2.26": {"nombre": "Bolsa de Monitorización", "bloque": 3, "parte": 3},
"3.2.27": {"nombre": "Inventario Global", "bloque": 3, "parte": 3},
"3.2.28": {"nombre": "Checklist Maestro", "bloque": 3, "parte": 3},
"4.1.1": {"nombre": "Principios de Administración de Fármacos", "bloque": 6, "parte": 4},
"4.1.2": {"nombre": "Vademécum Operativo", "bloque": 6, "parte": 4},
"4.1.3": {"nombre": "Oxígeno - Administración y Seguridad", "bloque": 6, "parte": 4},
"4.1.4": {"nombre": "Adrenalina - Uso en Anafilaxia y RCP", "bloque": 6, "parte": 4},
"4.1.5": {"nombre": "Aspirina - Uso en SCA", "bloque": 6, "parte": 4},
"4.1.6": {"nombre": "Glucagón - Uso en Hipoglucemia", "bloque": 6, "parte": 4},
"4.1.7": {"nombre": "Salbutamol - Uso en Crisis Asmática", "bloque": 6, "parte": 4},
"4.1.8": {"nombre": "Abreviaturas y Terminología Farmacológica", "bloque": 6, "parte": 4},
"5.1.1": {"nombre": "Introducción a Protocolos Transtelefónicos", "bloque": 5, "parte": 5},
"5.1.2": {"nombre": "Protocolos de Emergencias Específicas", "bloque": 5, "parte": 5},
"5.1.3": {"nombre": "PCR Transtelefónica", "bloque": 5, "parte": 5},
"5.1.4": {"nombre": "OVACE Transtelefónica", "bloque": 5, "parte": 5},
"5.1.5": {"nombre": "SCA Transtelefónico", "bloque": 5, "parte": 5},
"5.1.6": {"nombre": "ICTUS Transtelefónico", "bloque": 5, "parte": 5},
"5.1.7": {"nombre": "Anafilaxia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.8": {"nombre": "Crisis Asmática Transtelefónica", "bloque": 5, "parte": 5},
"5.1.9": {"nombre": "Hipoglucemia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.10": {"nombre": "Comunicación con Coordinador", "bloque": 5, "parte": 5},
"5.2.1": {"nombre": "Introducción a Gestión Operativa", "bloque": 8, "parte": 5},
"5.2.2": {"nombre": "Documentación Clínica Prehospitalaria", "bloque": 8, "parte": 5},
"5.2.3": {"nombre": "Coordinación y Comunicación Operativa", "bloque": 8, "parte": 5},
"5.2.4": {"nombre": "Gestión de Recursos y Material", "bloque": 8, "parte": 5},
"5.2.5": {"nombre": "Calidad y Mejora Continua", "bloque": 8, "parte": 5},
"6.1.1": {"nombre": "Fundamentos de Conducción en Urgencias", "bloque": 7, "parte": 6},
"6.1.2": {"nombre": "Uso de Luces y Sirena", "bloque": 7, "parte": 6},
"6.1.3": {"nombre": "Técnicas de Conducción en Emergencias", "bloque": 7, "parte": 6},
"6.1.4": {"nombre": "Seguridad Vial y Prevención de Accidentes", "bloque": 7, "parte": 6},
"6.1.5": {"nombre": "Gestión de Rutas y Navegación", "bloque": 7, "parte": 6},
"6.1.6": {"nombre": "Protocolos de Seguridad en Escena", "bloque": 7, "parte": 6},
"7.1.1": {"nombre": "Situaciones Especiales", "bloque": 10, "parte": 7},
"7.2.1": {"nombre": "Protocolos de Trauma", "bloque": 11, "parte": 7},
"8.1.1": {"nombre": "Marco Legal, Ético y Profesional del TES", "bloque": 12, "parte": 8},
"8.2.1": {"nombre": "Comunicación y Relación con el Paciente", "bloque": 13, "parte": 8},
"8.3.1": {"nombre": "Seguridad Personal y Salud del TES", "bloque": 14, "parte": 8},
}
BLOQUE_TO_FOLDER = {
0: "BLOQUE_0_FUNDAMENTOS",
1: "BLOQUE_1_PROCEDIMIENTOS_BASICOS",
2: "BLOQUE_2_MATERIAL_E_INMOVILIZACION",
3: "BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA",
4: "BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP",
5: "BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS",
6: "BLOQUE_6_FARMACOLOGIA",
7: "BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL",
8: "BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION",
9: "BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA",
10: "BLOQUE_10_SITUACIONES_ESPECIALES",
11: "BLOQUE_11_PROTOCOLOS_TRAUMA",
12: "BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL",
13: "BLOQUE_13_COMUNICACION_RELACION_PACIENTE",
14: "BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES",
}
def obtener_archivos_md_existentes() -> Dict[str, Path]:
"""Obtiene todos los archivos .md existentes mapeados por nombre"""
archivos = {}
for bloque_dir in MANUAL_DIR.iterdir():
if bloque_dir.is_dir() and bloque_dir.name.startswith("BLOQUE_"):
for archivo in bloque_dir.glob("*.md"):
archivos[archivo.name] = archivo
return archivos
def buscar_referencias_multimedia(archivo: Path) -> List[Dict]:
"""Busca referencias a medios/multimedia en un archivo"""
referencias = []
try:
with open(archivo, 'r', encoding='utf-8') as f:
contenido = f.read()
lineas = contenido.split('\n')
for num_linea, linea in enumerate(lineas, 1):
# Buscar imágenes: ![texto](ruta)
patron_imagen = r'!\[([^\]]*)\]\(([^\)]+)\)'
matches = re.findall(patron_imagen, linea)
for texto_alt, ruta in matches:
referencias.append({
'tipo': 'imagen',
'texto_alt': texto_alt,
'ruta': ruta,
'linea': num_linea,
'archivo': archivo.name,
'ruta_completa': str(archivo)
})
# Buscar enlaces a archivos multimedia
patron_multimedia = r'\[([^\]]+)\]\(([^\)]+\.(jpg|jpeg|png|gif|svg|pdf|mp4|mp3|avi|mov|wav))\)'
matches = re.findall(patron_multimedia, linea, re.IGNORECASE)
for texto, ruta, ext in matches:
referencias.append({
'tipo': 'multimedia',
'texto': texto,
'ruta': ruta,
'extension': ext,
'linea': num_linea,
'archivo': archivo.name,
'ruta_completa': str(archivo)
})
# Buscar referencias a videos
if 'video' in linea.lower() or 'youtube' in linea.lower() or 'vimeo' in linea.lower():
referencias.append({
'tipo': 'video_referencia',
'linea': num_linea,
'contenido': linea.strip(),
'archivo': archivo.name,
'ruta_completa': str(archivo)
})
except Exception as e:
print(f"Error leyendo {archivo}: {e}")
return referencias
def verificar_existencia_medio(ruta: str, archivo_origen: Path) -> bool:
"""Verifica si un archivo multimedia existe"""
# Si es ruta absoluta
if os.path.isabs(ruta):
return os.path.exists(ruta)
# Si es ruta relativa
archivo_dir = archivo_origen.parent
ruta_completa = (archivo_dir / ruta).resolve()
# Verificar si existe
if ruta_completa.exists():
return True
# Buscar en otras ubicaciones comunes
posibles_rutas = [
MANUAL_DIR / ruta,
BASE_DIR / ruta,
BASE_DIR / "public" / ruta,
BASE_DIR / "src" / "assets" / ruta,
]
return any(os.path.exists(r) for r in posibles_rutas)
def generar_reporte_1_archivos_faltantes():
"""Genera reporte 1: Archivos .md faltantes del índice"""
archivos_existentes = obtener_archivos_md_existentes()
# Mapear archivos esperados según el índice
archivos_esperados = {}
for codigo, info in INDICE_ESPERADO.items():
bloque_num = info["bloque"]
folder_name = BLOQUE_TO_FOLDER[bloque_num]
# Generar nombre esperado basado en el patrón observado
nombre_base = info["nombre"].upper().replace(" ", "_").replace("-", "_")
nombre_archivo = f"BLOQUE_{bloque_num:02d}_{codigo.split('.')[-1]}_{nombre_base}.md"
archivos_esperados[codigo] = {
'nombre': info["nombre"],
'archivo_esperado': nombre_archivo,
'bloque': bloque_num,
'folder': folder_name
}
# Verificar qué archivos existen realmente
archivos_encontrados = []
archivos_faltantes = []
# Buscar archivos por bloque y nombre aproximado
for codigo, info_esperado in archivos_esperados.items():
bloque_num = info_esperado['bloque']
folder_name = info_esperado['folder']
bloque_dir = MANUAL_DIR / folder_name
encontrado = False
archivo_real = None
if bloque_dir.exists():
# Buscar archivos que coincidan con el patrón
nombre_buscar = info_esperado['nombre'].upper().replace(" ", "_")
for archivo in bloque_dir.glob("*.md"):
if nombre_buscar in archivo.name.upper() or f"BLOQUE_{bloque_num:02d}" in archivo.name:
encontrado = True
archivo_real = archivo.name
break
if encontrado:
archivos_encontrados.append({
'codigo': codigo,
'nombre': info_esperado['nombre'],
'archivo_real': archivo_real,
'bloque': bloque_num
})
else:
archivos_faltantes.append({
'codigo': codigo,
'nombre': info_esperado['nombre'],
'archivo_esperado': info_esperado['archivo_esperado'],
'bloque': bloque_num,
'folder': folder_name
})
# Generar reporte
reporte = []
reporte.append("# REPORTE 1: ARCHIVOS .MD FALTANTES DEL ÍNDICE\n")
reporte.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte.append("---\n")
reporte.append("## 📊 RESUMEN EJECUTIVO\n")
reporte.append(f"- **Total de capítulos según índice:** {len(INDICE_ESPERADO)}\n")
reporte.append(f"- **Archivos encontrados:** {len(archivos_encontrados)}\n")
reporte.append(f"- **Archivos faltantes:** {len(archivos_faltantes)}\n")
reporte.append(f"- **Porcentaje de completitud:** {(len(archivos_encontrados)/len(INDICE_ESPERADO)*100):.1f}%\n")
reporte.append("---\n")
if archivos_faltantes:
reporte.append("## ❌ ARCHIVOS FALTANTES\n")
reporte.append(f"**Total:** {len(archivos_faltantes)} archivos\n\n")
por_parte = defaultdict(list)
for archivo in archivos_faltantes:
parte_num = archivo['codigo'].split('.')[0]
por_parte[parte_num].append(archivo)
for parte_num in sorted(por_parte.keys(), key=int):
reporte.append(f"\n### Parte {parte_num}\n")
for archivo in sorted(por_parte[parte_num], key=lambda x: x['codigo']):
reporte.append(f"- **{archivo['codigo']}** - {archivo['nombre']}")
reporte.append(f" - Bloque: {archivo['bloque']}")
reporte.append(f" - Carpeta esperada: `{archivo['folder']}/`")
reporte.append(f" - Archivo esperado: `{archivo['archivo_esperado']}`\n")
else:
reporte.append("## ✅ TODOS LOS ARCHIVOS ESTÁN PRESENTES\n")
reporte.append("Todos los 93 capítulos del índice tienen archivos .md correspondientes.\n")
reporte.append("\n---\n")
reporte.append("## 📋 LISTADO COMPLETO DE ARCHIVOS ENCONTRADOS\n")
reporte.append(f"**Total:** {len(archivos_encontrados)} archivos\n\n")
por_parte_encontrados = defaultdict(list)
for archivo in archivos_encontrados:
parte_num = archivo['codigo'].split('.')[0]
por_parte_encontrados[parte_num].append(archivo)
for parte_num in sorted(por_parte_encontrados.keys(), key=int):
reporte.append(f"\n### Parte {parte_num}\n")
for archivo in sorted(por_parte_encontrados[parte_num], key=lambda x: x['codigo']):
reporte.append(f"- ✅ `{archivo['codigo']}` - {archivo['nombre']}")
reporte.append(f" - Archivo: `{archivo['archivo_real']}`\n")
return "\n".join(reporte), len(archivos_faltantes)
def generar_reporte_2_multimedia_faltante():
"""Genera reporte 2: Medios/multimedia faltantes"""
archivos_md = obtener_archivos_md_existentes()
todas_referencias = []
medios_faltantes = []
for nombre_archivo, ruta_archivo in archivos_md.items():
referencias = buscar_referencias_multimedia(ruta_archivo)
todas_referencias.extend(referencias)
for ref in referencias:
if ref['tipo'] in ['imagen', 'multimedia']:
if not verificar_existencia_medio(ref['ruta'], ruta_archivo):
medios_faltantes.append(ref)
# Generar reporte
reporte = []
reporte.append("# REPORTE 2: MEDIOS/MULTIMEDIA FALTANTES\n")
reporte.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte.append("---\n")
reporte.append("## 📊 RESUMEN EJECUTIVO\n")
reporte.append(f"- **Total de referencias a medios encontradas:** {len(todas_referencias)}\n")
reporte.append(f"- **Medios faltantes:** {len(medios_faltantes)}\n")
reporte.append(f"- **Medios existentes:** {len(todas_referencias) - len(medios_faltantes)}\n")
reporte.append("---\n")
if medios_faltantes:
reporte.append("## ❌ MEDIOS FALTANTES\n")
reporte.append(f"**Total:** {len(medios_faltantes)} referencias a medios que no existen\n\n")
por_tipo = defaultdict(list)
for medio in medios_faltantes:
por_tipo[medio['tipo']].append(medio)
for tipo in sorted(por_tipo.keys()):
reporte.append(f"\n### {tipo.upper()}\n")
for medio in por_tipo[tipo]:
reporte.append(f"- **Archivo:** `{medio['archivo']}`")
reporte.append(f" - **Línea:** {medio['linea']}")
reporte.append(f" - **Ruta referenciada:** `{medio['ruta']}`")
if 'texto_alt' in medio:
reporte.append(f" - **Texto alternativo:** {medio['texto_alt']}")
reporte.append(f" - **Ubicación:** `{medio['ruta_completa']}`\n")
else:
reporte.append("## ✅ NO SE ENCONTRARON REFERENCIAS A MEDIOS FALTANTES\n")
reporte.append("No se encontraron referencias a imágenes, videos u otros medios multimedia en los archivos.\n")
reporte.append("\n---\n")
reporte.append("## 📋 TODAS LAS REFERENCIAS A MEDIOS ENCONTRADAS\n")
reporte.append(f"**Total:** {len(todas_referencias)} referencias\n\n")
if todas_referencias:
por_archivo = defaultdict(list)
for ref in todas_referencias:
por_archivo[ref['archivo']].append(ref)
for archivo in sorted(por_archivo.keys()):
reporte.append(f"\n### `{archivo}`\n")
for ref in por_archivo[archivo]:
reporte.append(f"- **Línea {ref['linea']}:** {ref['tipo']}")
if 'ruta' in ref:
reporte.append(f" - Ruta: `{ref['ruta']}`")
reporte.append("")
else:
reporte.append("No se encontraron referencias a medios multimedia en ningún archivo.\n")
return "\n".join(reporte), len(medios_faltantes)
def generar_reporte_3_recomendaciones_app():
"""Genera reporte 3: Recomendaciones para estructura de app"""
reporte = []
reporte.append("# REPORTE 3: RECOMENDACIONES PARA ESTRUCTURA DE APP\n")
reporte.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte.append("---\n")
reporte.append("## 📱 ESTRUCTURA DE CARPETAS IDEAL PARA APP\n")
reporte.append("\n### Propuesta de Estructura:\n")
reporte.append("```\n")
reporte.append("app-manual-tes/\n")
reporte.append("├── contenido/\n")
reporte.append("│ ├── parte-i-fundamentos/\n")
reporte.append("│ │ ├── bloque-0-fundamentos/\n")
reporte.append("│ │ │ ├── 1.1.1-fundamentos-emergencias.md\n")
reporte.append("│ │ │ └── metadata.json\n")
reporte.append("│ │ └── bloque-1-procedimientos-basicos/\n")
reporte.append("│ │ ├── 1.2.1-constantes-vitales.md\n")
reporte.append("│ │ ├── 1.2.2-abcde-operativo.md\n")
reporte.append("│ │ ├── 1.2.3-glasgow-operativo.md\n")
reporte.append("│ │ ├── 1.2.4-triage-start.md\n")
reporte.append("│ │ └── metadata.json\n")
reporte.append("│ ├── parte-ii-soporte-vital/\n")
reporte.append("│ │ ├── bloque-4-rcp/\n")
reporte.append("│ │ └── bloque-9-medicina-emergencias/\n")
reporte.append("│ ├── parte-iii-material/\n")
reporte.append("│ │ ├── bloque-2-inmovilizacion/\n")
reporte.append("│ │ └── bloque-3-oxigenoterapia/\n")
reporte.append("│ ├── parte-iv-farmacologia/\n")
reporte.append("│ │ └── bloque-6-farmacologia/\n")
reporte.append("│ ├── parte-v-protocolos/\n")
reporte.append("│ │ ├── bloque-5-transtelefonicos/\n")
reporte.append("│ │ └── bloque-8-gestion/\n")
reporte.append("│ ├── parte-vi-conduccion/\n")
reporte.append("│ │ └── bloque-7-conduccion/\n")
reporte.append("│ ├── parte-vii-situaciones-especiales/\n")
reporte.append("│ │ ├── bloque-10-situaciones-especiales/\n")
reporte.append("│ │ └── bloque-11-trauma/\n")
reporte.append("│ └── parte-viii-habilidades/\n")
reporte.append("│ ├── bloque-12-marco-legal/\n")
reporte.append("│ ├── bloque-13-comunicacion/\n")
reporte.append("│ └── bloque-14-seguridad/\n")
reporte.append("├── assets/\n")
reporte.append("│ ├── imagenes/\n")
reporte.append("│ ├── videos/\n")
reporte.append("│ └── iconos/\n")
reporte.append("├── data/\n")
reporte.append("│ ├── indice.json\n")
reporte.append("│ └── metadata-global.json\n")
reporte.append("└── public/\n")
reporte.append(" └── (archivos estáticos)\n")
reporte.append("```\n")
reporte.append("\n---\n")
reporte.append("## 📋 METADATOS NECESARIOS EN CADA .MD\n")
reporte.append("\n### Front Matter Propuesto (YAML):\n")
reporte.append("```yaml\n")
reporte.append("---\n")
reporte.append("id: '1.1.1'\n")
reporte.append("titulo: 'Fundamentos de Emergencias'\n")
reporte.append("subtitulo: 'Marco conceptual y operativo'\n")
reporte.append("parte: 1\n")
reporte.append("bloque: 0\n")
reporte.append("bloque_nombre: 'Fundamentos de Emergencias Prehospitalarias'\n")
reporte.append("parte_nombre: 'Fundamentos y Evaluación Inicial'\n")
reporte.append("nivel_dificultad: 'basico'\n")
reporte.append("importancia: 'alta'\n")
reporte.append("palabras_clave:\n")
reporte.append(" - 'emergencias'\n")
reporte.append(" - 'soporte vital'\n")
reporte.append(" - 'cadena supervivencia'\n")
reporte.append("tipo_contenido: 'formativo'\n")
reporte.append("tiempo_lectura: 15\n")
reporte.append("version: '1.0'\n")
reporte.append("fecha_actualizacion: '2024-12-13'\n")
reporte.append("autor: 'Manual TES Digital'\n")
reporte.append("navegacion:\n")
reporte.append(" anterior: null\n")
reporte.append(" siguiente: '1.2.1'\n")
reporte.append(" relacionados:\n")
reporte.append(" - '1.2.1'\n")
reporte.append(" - '2.1.1'\n")
reporte.append("---\n")
reporte.append("```\n")
reporte.append("\n### Campos Explicados:\n")
reporte.append("- **id**: Identificador único del capítulo (formato X.Y.Z)\n")
reporte.append("- **titulo**: Título principal del capítulo\n")
reporte.append("- **subtitulo**: Descripción breve\n")
reporte.append("- **parte/bloque**: Números para organización jerárquica\n")
reporte.append("- **nivel_dificultad**: 'basico', 'intermedio', 'avanzado'\n")
reporte.append("- **importancia**: 'alta', 'media', 'baja'\n")
reporte.append("- **palabras_clave**: Array de términos para búsqueda\n")
reporte.append("- **tipo_contenido**: 'formativo', 'operativo', 'referencia'\n")
reporte.append("- **tiempo_lectura**: Minutos estimados\n")
reporte.append("- **navegacion**: Enlaces a capítulos relacionados\n")
reporte.append("\n---\n")
reporte.append("## 🧭 SISTEMA DE NAVEGACIÓN RECOMENDADO\n")
reporte.append("\n### 1. Menú Lateral Jerárquico\n")
reporte.append("```\n")
reporte.append("📚 Manual TES Digital\n")
reporte.append("├── 📖 Parte I: Fundamentos\n")
reporte.append("│ ├── 🔹 Bloque 0: Fundamentos\n")
reporte.append("│ │ └── 1.1.1 Fundamentos de Emergencias\n")
reporte.append("│ └── 🔹 Bloque 1: Procedimientos Básicos\n")
reporte.append("│ ├── 1.2.1 Constantes Vitales\n")
reporte.append("│ ├── 1.2.2 ABCDE Operativo\n")
reporte.append("│ ├── 1.2.3 Glasgow Operativo\n")
reporte.append("│ └── 1.2.4 Triage START\n")
reporte.append("├── 💉 Parte II: Soporte Vital\n")
reporte.append("│ ├── 🔹 Bloque 4: RCP\n")
reporte.append("│ └── 🔹 Bloque 9: Medicina Emergencias\n")
reporte.append("└── ... (resto de partes)\n")
reporte.append("```\n")
reporte.append("\n**Características:**\n")
reporte.append("- Expandible/colapsable por niveles\n")
reporte.append("- Indicador visual del capítulo actual\n")
reporte.append("- Búsqueda rápida integrada\n")
reporte.append("- Favoritos/marcadores\n")
reporte.append("\n### 2. Breadcrumbs (Migas de Pan)\n")
reporte.append("```\n")
reporte.append("Inicio > Parte I > Bloque 1 > 1.2.1 Constantes Vitales\n")
reporte.append("```\n")
reporte.append("\n**Funcionalidad:**\n")
reporte.append("- Navegación rápida a niveles superiores\n")
reporte.append("- Contexto visual de ubicación\n")
reporte.append("- Click en cualquier nivel para ir directamente\n")
reporte.append("\n### 3. Navegación Anterior/Siguiente\n")
reporte.append("```\n")
reporte.append("← Capítulo Anterior: 1.1.1 Fundamentos\n")
reporte.append("Capítulo Siguiente: 1.2.2 ABCDE Operativo →\n")
reporte.append("```\n")
reporte.append("\n**Funcionalidad:**\n")
reporte.append("- Botones flotantes o en footer\n")
reporte.append("- Navegación secuencial lógica\n")
reporte.append("- Atajos de teclado (← →)\n")
reporte.append("\n### 4. Índice Rápido\n")
reporte.append("**Características:**\n")
reporte.append("- Modal o sidebar deslizable\n")
reporte.append("- Búsqueda instantánea\n")
reporte.append("- Filtros por parte/bloque\n")
reporte.append("- Acceso desde cualquier página\n")
reporte.append("\n---\n")
reporte.append("## 🔍 FUNCIONALIDADES ADICIONALES RECOMENDADAS\n")
reporte.append("\n### Búsqueda Avanzada\n")
reporte.append("- Búsqueda por texto completo\n")
reporte.append("- Filtros por parte, bloque, tipo de contenido\n")
reporte.append("- Búsqueda por palabras clave\n")
reporte.append("- Historial de búsquedas\n")
reporte.append("\n### Modo Offline\n")
reporte.append("- Cache de contenido para acceso offline\n")
reporte.append("- Service Worker para PWA\n")
reporte.append("- Sincronización cuando hay conexión\n")
reporte.append("\n### Personalización\n")
reporte.append("- Modo oscuro/claro\n")
reporte.append("- Tamaño de fuente ajustable\n")
reporte.append("- Favoritos personalizados\n")
reporte.append("- Notas/annotaciones por capítulo\n")
reporte.append("\n### Tests/Autoevaluaciones\n")
reporte.append("- Preguntas por capítulo\n")
reporte.append("- Tests por bloque/parte\n")
reporte.append("- Historial de resultados\n")
reporte.append("- Modo estudio vs modo examen\n")
reporte.append("\n---\n")
reporte.append("## 📐 ESTRUCTURA DE DATOS JSON RECOMENDADA\n")
reporte.append("\n### indice.json\n")
reporte.append("```json\n")
reporte.append("{\n")
reporte.append(" \"version\": \"1.0\",\n")
reporte.append(" \"fecha\": \"2024-12-15\",\n")
reporte.append(" \"partes\": [\n")
reporte.append(" {\n")
reporte.append(" \"id\": 1,\n")
reporte.append(" \"nombre\": \"Fundamentos y Evaluación Inicial\",\n")
reporte.append(" \"bloques\": [\n")
reporte.append(" {\n")
reporte.append(" \"id\": 0,\n")
reporte.append(" \"nombre\": \"Fundamentos de Emergencias\",\n")
reporte.append(" \"capitulos\": [\n")
reporte.append(" {\n")
reporte.append(" \"id\": \"1.1.1\",\n")
reporte.append(" \"titulo\": \"Fundamentos de Emergencias\",\n")
reporte.append(" \"ruta\": \"parte-i-fundamentos/bloque-0-fundamentos/1.1.1-fundamentos-emergencias.md\"\n")
reporte.append(" }\n")
reporte.append(" ]\n")
reporte.append(" }\n")
reporte.append(" ]\n")
reporte.append(" }\n")
reporte.append(" ]\n")
reporte.append("}\n")
reporte.append("```\n")
reporte.append("\n---\n")
reporte.append("## ✅ CHECKLIST DE IMPLEMENTACIÓN\n")
reporte.append("\n### Fase 1: Estructura Base\n")
reporte.append("- [ ] Crear estructura de carpetas propuesta\n")
reporte.append("- [ ] Migrar archivos .md a nueva estructura\n")
reporte.append("- [ ] Agregar front matter a todos los archivos\n")
reporte.append("- [ ] Generar indice.json desde estructura\n")
reporte.append("\n### Fase 2: Navegación\n")
reporte.append("- [ ] Implementar menú lateral jerárquico\n")
reporte.append("- [ ] Agregar breadcrumbs\n")
reporte.append("- [ ] Implementar navegación anterior/siguiente\n")
reporte.append("- [ ] Crear índice rápido con búsqueda\n")
reporte.append("\n### Fase 3: Funcionalidades\n")
reporte.append("- [ ] Implementar búsqueda avanzada\n")
reporte.append("- [ ] Agregar modo offline (PWA)\n")
reporte.append("- [ ] Implementar personalización\n")
reporte.append("- [ ] Crear sistema de tests/autoevaluaciones\n")
reporte.append("\n---\n")
return "\n".join(reporte)
if __name__ == "__main__":
print("Generando reportes para conversión a app digital...")
# Reporte 1
print("\n1. Generando reporte de archivos faltantes...")
reporte1, num_faltantes = generar_reporte_1_archivos_faltantes()
with open(BASE_DIR / "REPORTE_1_ARCHIVOS_FALTANTES.md", "w", encoding="utf-8") as f:
f.write(reporte1)
print(f" ✅ Reporte 1 generado: {num_faltantes} archivos faltantes")
# Reporte 2
print("\n2. Generando reporte de medios faltantes...")
reporte2, num_medios_faltantes = generar_reporte_2_multimedia_faltante()
with open(BASE_DIR / "REPORTE_2_MEDIOS_FALTANTES.md", "w", encoding="utf-8") as f:
f.write(reporte2)
print(f" ✅ Reporte 2 generado: {num_medios_faltantes} medios faltantes")
# Reporte 3
print("\n3. Generando reporte de recomendaciones...")
reporte3 = generar_reporte_3_recomendaciones_app()
with open(BASE_DIR / "REPORTE_3_RECOMENDACIONES_APP.md", "w", encoding="utf-8") as f:
f.write(reporte3)
print(f" ✅ Reporte 3 generado")
print("\n✅ Todos los reportes generados exitosamente!")

View file

@ -12,7 +12,7 @@ import json
# Configuración
EXCEL_PATH = "/home/planetazuzu/Imágenes/medios de app/Manual_TES_Assets_Tracker.xlsx"
REPO_ROOT = Path("/home/planetazuzu/protocolo-r-pido")
REPO_ROOT = Path("/home/planetazuzu/guia-tes")
EXCEL_DEST = REPO_ROOT / "Manual_TES_Assets_Tracker.xlsx"
ASSETS_PLAN = REPO_ROOT / "ASSETS_PLAN.md"
MANIFEST_PATH = REPO_ROOT / "manifest.json"

View file

@ -1,701 +0,0 @@
# BLOQUE 01 Oxigenoterapia Básica en Emergencias Prehospitalarias (TES)
## Manual TES Digital Uso formativo y procedimental
**Versión:** 1.0
**Fecha:** 2025-12-23
**Fuente:** Manual TES Digital - Sección 3.8.2
---
## 1. OBJETIVO DEL BLOQUE
Proporcionar a los Técnicos de Emergencias Sanitarias (TES) los conocimientos y procedimientos básicos para la administración segura y efectiva de oxígeno en situaciones de emergencia prehospitalaria, incluyendo:
- Identificación de situaciones que requieren oxigenoterapia
- Selección del dispositivo adecuado según la situación clínica
- Aplicación correcta de cada dispositivo
- Monitorización y ajuste según respuesta del paciente
- Cálculo de duración de botellas de oxígeno
- Prevención de errores frecuentes y garantía de seguridad
**Uso del bloque:**
- ✅ Referencia rápida durante intervención
- ✅ Formación y actualización de conocimientos
- ✅ Apoyo al criterio profesional
- ❌ NO sustituye formación reglada ni protocolos oficiales
---
## 2. INDICACIONES DE OXIGENOTERAPIA
### Indicaciones Generales
**Situaciones que requieren administración de oxígeno:**
1. **Hipoxia**
- SpO2 <94% en pacientes sin EPOC
- Dificultad respiratoria
- Signos de hipoxia
2. **Shock**
- Cualquier tipo de shock
- Hipotensión con signos de hipoperfusión
3. **Parada Cardiorrespiratoria (PCR)**
- Durante RCP
- Apoyo ventilatorio
4. **Traumatismo Grave**
- Politraumatismo
- Traumatismo torácico
- Traumatismo craneoencefálico
5. **Intoxicación por Monóxido de Carbono**
- Sospecha o confirmación
- Alta concentración de O2 necesaria
6. **Crisis Asmática Severa**
- Disnea severa
- Uso de musculatura accesoria
- SpO2 baja
7. **EPOC Reagudizado**
- Con precaución
- Objetivo SpO2 88-92% (NO 94-98%)
- Usar O2 controlado (Venturi o flujo bajo)
### Contraindicaciones Relativas
**Situaciones que requieren precaución:**
- **EPOC crónico:** Usar O2 controlado, objetivo SpO2 88-92%
- **Pacientes con riesgo de retención de CO2:** Monitorización estrecha
- **Pacientes con náuseas/vómitos:** Evitar mascarilla con reservorio
---
## 3. SIGNOS CLÍNICOS QUE JUSTIFICAN SU USO
### Signos de Hipoxia
**Signos Objetivos:**
- SpO2 <94% (en pacientes sin EPOC)
- Taquipnea (FR >20/min en adultos)
- Bradipnea (FR <12/min en adultos)
- Uso de musculatura accesoria
- Cianosis
- Confusión o alteración del nivel de consciencia
**Signos Subjetivos (si paciente consciente):**
- Disnea
- Sensación de ahogo
- Dificultad para hablar en frases completas
### Signos de Shock
- Hipotensión
- Taquicardia
- Piel pálida, fría, sudorosa
- Relleno capilar >2 segundos
- Alteración del nivel de consciencia
### Signos de Insuficiencia Respiratoria
- Respiración superficial
- Asimetría torácica
- Sonidos respiratorios anormales
- Dificultad para mantener vía aérea
**Criterio de Activación:**
Si el paciente presenta cualquiera de estos signos, considerar administración de oxígeno según gravedad y situación clínica.
---
## 4. OBJETIVOS DE SATURACIÓN DE OXÍGENO
### Objetivos Generales
**Pacientes sin EPOC:**
- **Objetivo:** SpO2 94-98%
- **Mínimo aceptable:** SpO2 ≥94%
- **Máximo recomendado:** SpO2 ≤98% (evitar hiperoxia innecesaria)
**Pacientes con EPOC:**
- **Objetivo:** SpO2 88-92%
- **Razón:** Prevenir retención de CO2
- **Método:** O2 controlado (Venturi o flujo bajo con gafas nasales)
### Ajuste Según Respuesta
**Si SpO2 no alcanza objetivo:**
1. Verificar que dispositivo está bien colocado
2. Aumentar flujo (si dispositivo lo permite)
3. Cambiar a dispositivo con mayor FiO2
4. Revalorar necesidad de ventilación asistida
**Si SpO2 supera objetivo (en EPOC):**
1. Reducir flujo
2. Cambiar a dispositivo con menor FiO2
3. Monitorizar estrechamente
**Monitorización Continua:**
- ⚠️ Monitorizar SpO2 continuamente durante oxigenoterapia
- ⚠️ Ajustar flujo/FiO2 según respuesta del paciente
- ⚠️ Verificar que el dispositivo está bien colocado y funcionando
---
## 5. DISPOSITIVOS DE ADMINISTRACIÓN DE OXÍGENO
### Gafas Nasales
**Características:**
- **Flujo:** 1-6 L/min
- **FiO2 aproximada:** 24-44%
- **Comodidad:** Alta
- **Portabilidad:** Alta
**Indicaciones:**
- Hipoxia leve
- Pacientes conscientes que toleran
- Necesidad de O2 de bajo flujo
**Ventajas:**
- Cómodo para el paciente
- No interfiere con alimentación
- Permite comunicación
**Limitaciones:**
- FiO2 limitada (máximo ~44%)
- Depende de respiración nasal
- No adecuado para hipoxia severa
**Consideraciones:**
- Humedecer si flujo >4 L/min
- Verificar que cánulas están en fosas nasales
- No usar si paciente respira solo por boca
### Mascarilla Simple
**Características:**
- **Flujo:** 6-10 L/min
- **FiO2 aproximada:** 40-60%
- **Comodidad:** Media
- **Portabilidad:** Alta
**Indicaciones:**
- Hipoxia moderada
- Pacientes que no toleran gafas nasales
- Necesidad de FiO2 intermedia
**Ventajas:**
- Mayor FiO2 que gafas nasales
- Fácil de colocar
- Disponible en la mayoría de ambulancias
**Limitaciones:**
- Menos cómoda que gafas nasales
- Puede causar claustrofobia
- FiO2 limitada
**Consideraciones:**
- Flujo mínimo 6 L/min para evitar reinhalación de CO2
- Verificar sellado adecuado
- No usar si paciente tiene náuseas/vómitos
### Mascarilla con Reservorio (No Re-inhalación)
**Características:**
- **Flujo:** 10-15 L/min
- **FiO2 aproximada:** 60-90%
- **Comodidad:** Baja
- **Portabilidad:** Alta
**Indicaciones:**
- Hipoxia severa
- Shock
- Parada cardiorrespiratoria
- Necesidad de alta FiO2
**Ventajas:**
- Alta FiO2 (hasta 90%)
- Válvula unidireccional (evita reinhalación)
- Adecuada para situaciones críticas
**Limitaciones:**
- Requiere flujo alto (10-15 L/min)
- Reservorio debe estar inflado
- Menos cómoda para el paciente
- Consume más O2
**Consideraciones:**
- Verificar que reservorio está inflado antes de usar
- Flujo mínimo 10 L/min
- No usar si paciente tiene náuseas/vómitos
- Verificar válvula unidireccional funcionando
### Venturi
**Características:**
- **Flujo:** Variable según dispositivo
- **FiO2 aproximada:** 24%, 28%, 35%, 40% (según color/ajuste)
- **Comodidad:** Media
- **Portabilidad:** Media
**Indicaciones:**
- EPOC (requiere FiO2 precisa)
- Necesidad de FiO2 controlada y predecible
- Pacientes con riesgo de retención de CO2
**Ventajas:**
- FiO2 controlada y predecible
- Adecuada para EPOC
- Evita hiperoxia
**Limitaciones:**
- Requiere flujo alto
- Menos portátil
- Menos disponible en algunas ambulancias
**Consideraciones:**
- Seleccionar color/ajuste según FiO2 deseada
- Verificar que dispositivo está correctamente conectado
- Seguir instrucciones del fabricante para cada color
**Colores Comunes:**
- **Azul:** 24% FiO2
- **Blanco:** 28% FiO2
- **Amarillo:** 35% FiO2
- **Rojo:** 40% FiO2
### Bolsa Autoinflable (Ambú)
**Características:**
- **Uso:** Ventilación manual asistida
- **FiO2:** Depende de conexión a O2 (con O2: hasta 90-100%)
- **Comodidad:** N/A (paciente inconsciente)
- **Portabilidad:** Alta
**Indicaciones:**
- Paciente inconsciente con respiración inadecuada
- Apoyo ventilatorio durante RCP
- Ventilación de rescate
- Necesidad de ventilación controlada
**Ventajas:**
- Permite ventilación controlada
- Alta FiO2 con O2 conectado (90-100%)
- Control de frecuencia y volumen
- Disponible en todas las ambulancias
**Limitaciones:**
- Requiere técnica adecuada
- Puede causar distensión gástrica
- Requiere cánula orofaríngea si paciente inconsciente
- Consume mucho O2
**Consideraciones:**
- Conectar a O2 (15 L/min) para máxima FiO2
- Usar cánula orofaríngea si paciente inconsciente
- Ventilar con frecuencia adecuada (10-12/min en adultos, 12-20/min en niños)
- Observar elevación del pecho
- Técnica C-E para sellado de mascarilla
### Tabla de Referencia Rápida
| Dispositivo | Flujo (L/min) | FiO2 Aproximada | Indicación Principal |
|-------------|---------------|-----------------|----------------------|
| Gafas nasales | 1-2 | 24-28% | Hipoxia leve |
| Gafas nasales | 3-4 | 32-36% | Hipoxia leve-moderada |
| Gafas nasales | 5-6 | 40-44% | Hipoxia moderada |
| Mascarilla simple | 6-8 | 40-50% | Hipoxia moderada |
| Mascarilla simple | 9-10 | 50-60% | Hipoxia moderada-severa |
| Mascarilla con reservorio | 10-12 | 60-80% | Hipoxia severa, shock |
| Mascarilla con reservorio | 13-15 | 80-90% | Hipoxia severa, PCR |
| Venturi 24% | Variable | 24% | EPOC |
| Venturi 28% | Variable | 28% | EPOC |
| Venturi 35% | Variable | 35% | EPOC moderado |
| Venturi 40% | Variable | 40% | EPOC severo |
| Ambú con O2 | 15 | 90-100% | Ventilación asistida, PCR |
---
## 6. PROCEDIMIENTO BÁSICO PASO A PASO (TES)
### Procedimiento General de Administración de Oxígeno
**Paso 1: Valoración Inicial**
1. Valorar nivel de consciencia del paciente
2. Medir SpO2 con pulsioxímetro
3. Observar signos clínicos de hipoxia
4. Identificar si paciente tiene EPOC conocido
**Paso 2: Selección del Dispositivo**
1. Según SpO2 y situación clínica:
- SpO2 90-94%, paciente consciente → Gafas nasales
- SpO2 85-90%, paciente consciente → Mascarilla simple
- SpO2 <85% o shock Mascarilla con reservorio
- EPOC → Venturi (FiO2 24-28%)
- Paciente inconsciente, respiración inadecuada → Ambú
2. Verificar disponibilidad del dispositivo
3. Verificar disponibilidad de O2 suficiente
**Paso 3: Preparación del Dispositivo**
1. Conectar dispositivo a fuente de O2
2. Ajustar flujo según dispositivo:
- Gafas nasales: 1-6 L/min
- Mascarilla simple: 6-10 L/min
- Mascarilla con reservorio: 10-15 L/min
- Venturi: Según instrucciones del dispositivo
- Ambú: 15 L/min
3. Verificar que O2 fluye correctamente
4. Si mascarilla con reservorio: verificar que reservorio se infla
**Paso 4: Colocación del Dispositivo**
**Gafas Nasales:**
1. Colocar cánulas en fosas nasales
2. Ajustar tubo sobre orejas
3. Ajustar clip nasal para fijación
4. Verificar que cánulas están en posición correcta
**Mascarilla Simple:**
1. Colocar mascarilla sobre boca y nariz
2. Ajustar goma elástica detrás de la cabeza
3. Verificar sellado adecuado
4. Ajustar flujo a mínimo 6 L/min
**Mascarilla con Reservorio:**
1. Verificar que reservorio está inflado
2. Colocar mascarilla sobre boca y nariz
3. Ajustar goma elástica detrás de la cabeza
4. Verificar sellado adecuado
5. Ajustar flujo a mínimo 10 L/min
6. Verificar que reservorio se mantiene inflado
**Venturi:**
1. Seleccionar color/ajuste según FiO2 deseada
2. Conectar a fuente de O2
3. Ajustar flujo según instrucciones del dispositivo
4. Colocar mascarilla sobre boca y nariz
5. Verificar que dispositivo está correctamente conectado
**Ambú:**
1. Conectar a fuente de O2 (15 L/min)
2. Si paciente inconsciente: colocar cánula orofaríngea
3. Colocar mascarilla sobre boca y nariz
4. Técnica C-E para sellado:
- **C:** Pulgar e índice forman "C" sobre mascarilla
- **E:** Dedos restantes forman "E" bajo mandíbula
- Elevar mandíbula hacia mascarilla
5. Comprimir bolsa observando elevación del pecho
6. Frecuencia: 10-12/min en adultos, 12-20/min en niños
**Paso 5: Verificación y Ajuste**
1. Medir SpO2 después de 1-2 minutos
2. Observar respuesta clínica del paciente
3. Verificar que dispositivo está bien colocado
4. Ajustar flujo según respuesta:
- Si SpO2 no alcanza objetivo: aumentar flujo o cambiar dispositivo
- Si SpO2 supera objetivo (EPOC): reducir flujo o cambiar dispositivo
5. Verificar que O2 sigue fluyendo
**Paso 6: Monitorización Continua**
1. Monitorizar SpO2 continuamente
2. Observar signos clínicos de mejora o empeoramiento
3. Verificar presión de botella periódicamente
4. Calcular duración restante de botella si uso prolongado
5. Preparar recambio de botella si es necesario
---
## 7. ADVERTENCIAS, ERRORES FRECUENTES Y SEGURIDAD
### Advertencias de Seguridad
**Generales:**
- ⚠️ **No fumar** cerca de fuentes de oxígeno
- ⚠️ **Verificar conexiones** antes de usar
- ⚠️ **No apurar botellas** (dejar margen de seguridad del 20%)
- ⚠️ **Verificar presión** de botella antes de usar
- ⚠️ **Tener botella de repuesto** disponible
**Específicas para EPOC:**
- ⚠️ **EPOC:** Usar O2 controlado (Venturi o flujo bajo)
- ⚠️ **Objetivo SpO2 88-92%** (NO 94-98%)
- ⚠️ **Monitorización estrecha** de nivel de consciencia
- ⚠️ **No usar mascarilla con reservorio** en EPOC (riesgo de retención CO2)
**Específicas para Dispositivos:**
- ⚠️ **Mascarilla con reservorio:** Verificar que reservorio está inflado
- ⚠️ **Mascarilla simple:** Flujo mínimo 6 L/min
- ⚠️ **Mascarilla con reservorio:** Flujo mínimo 10 L/min
- ⚠️ **Gafas nasales:** No usar si paciente respira solo por boca
- ⚠️ **Ambú:** Conectar siempre a O2 para máxima FiO2
### Errores Frecuentes
**Selección de Dispositivo:**
- ❌ Usar dispositivo con FiO2 insuficiente para la situación
- ❌ Usar mascarilla con reservorio en EPOC
- ❌ No considerar si paciente tiene EPOC conocido
- ❌ No verificar disponibilidad de dispositivo antes de seleccionar
**Colocación:**
- ❌ Dispositivo mal colocado (fugas de aire)
- ❌ Mascarilla con reservorio sin verificar que está inflado
- ❌ Gafas nasales en paciente que respira solo por boca
- ❌ Ambú sin conectar a O2 (FiO2 baja)
**Flujo:**
- ❌ Flujo insuficiente para el dispositivo
- ❌ Flujo excesivo en EPOC
- ❌ No ajustar flujo según respuesta del paciente
- ❌ No verificar que O2 fluye correctamente
**Monitorización:**
- ❌ No medir SpO2 antes de iniciar oxigenoterapia
- ❌ No monitorizar SpO2 durante oxigenoterapia
- ❌ No ajustar según respuesta del paciente
- ❌ No verificar presión de botella
**Seguridad:**
- ❌ Apurar botellas hasta el final
- ❌ No calcular duración de botella
- ❌ No tener botella de repuesto
- ❌ No verificar conexiones antes de usar
### Consideraciones Especiales
**Pacientes con Náuseas/Vómitos:**
- No usar mascarilla con reservorio
- Considerar gafas nasales o posición lateral si es seguro
- Preparar aspiración si es necesario
**Pacientes Agitados:**
- Puede ser difícil mantener dispositivo colocado
- Considerar necesidad de sedación (según protocolo)
- Priorizar seguridad del paciente y del equipo
**Uso Prolongado:**
- Calcular duración de botella al inicio
- Verificar presión periódicamente
- Planificar recambio antes de agotar botella
- Tener botella de repuesto disponible
---
## 8. CONTENIDO APTO PARA APP
### Checklists Interactivos
**Selección de Dispositivo:**
- [ ] Valorar SpO2 inicial
- [ ] Identificar si paciente tiene EPOC
- [ ] Seleccionar dispositivo según algoritmo
- [ ] Verificar disponibilidad de dispositivo
- [ ] Verificar disponibilidad de O2
**Colocación de Dispositivo:**
- [ ] Conectar dispositivo a O2
- [ ] Ajustar flujo según dispositivo
- [ ] Verificar que O2 fluye
- [ ] Colocar dispositivo correctamente
- [ ] Verificar sellado (si mascarilla)
- [ ] Verificar inflado de reservorio (si aplica)
**Verificación Post-Colocación:**
- [ ] Medir SpO2 después de 1-2 min
- [ ] Observar respuesta clínica
- [ ] Verificar dispositivo bien colocado
- [ ] Ajustar flujo según respuesta
- [ ] Verificar presión de botella
### Calculadoras
**Cálculo de Duración de Botella:**
- Fórmula: (Presión en bar × Volumen en L) ÷ Flujo en L/min
- Entrada: Presión, volumen, flujo
- Salida: Duración en minutos
- Incluir margen de seguridad del 20%
**Tabla de Referencia Rápida:**
- Botellas: 2L, 5L, 10L
- Flujos: 10, 15, 20 L/min
- Tiempos con margen de seguridad
### Guías Visuales
**Selección de Dispositivo según SpO2:**
- Diagrama de flujo visual
- Indicaciones por dispositivo
- Consideraciones especiales (EPOC)
**Colocación de Dispositivos:**
- Imágenes/diagramas de colocación correcta
- Técnica C-E para Ambú
- Verificación de sellado
**Rangos de FiO2:**
- Tabla visual interactiva
- Selección según dispositivo y flujo
- Objetivos de SpO2
### Alertas y Recordatorios
**Alertas de Seguridad:**
- Verificar presión de botella antes de usar
- No apurar botellas (margen 20%)
- EPOC: objetivo SpO2 88-92%
- Flujo mínimo según dispositivo
**Recordatorios de Verificación:**
- Medir SpO2 después de 1-2 min
- Verificar dispositivo bien colocado
- Ajustar flujo según respuesta
- Calcular duración de botella si uso prolongado
---
## 9. CONTENIDO SOLO DOCUMENTAL
### Fundamentos Teóricos
**Fisiología de la Oxigenación:**
- Transporte de oxígeno
- Saturación de hemoglobina
- Difusión alveolo-capilar
- Factores que afectan la oxigenación
**Fisiopatología de la Hipoxia:**
- Tipos de hipoxia
- Compensación del organismo
- Signos y síntomas
- Consecuencias de la hipoxia prolongada
### Consideraciones Avanzadas
**EPOC y Retención de CO2:**
- Mecanismo de retención de CO2
- Por qué evitar alta FiO2 en EPOC
- Monitorización de nivel de consciencia
- Signos de retención de CO2
**Hiperoxia:**
- Efectos de la hiperoxia
- Cuándo evitar hiperoxia innecesaria
- Objetivos de SpO2 según situación
**Ventilación Mecánica:**
- Indicaciones de ventilación mecánica
- Diferencia con oxigenoterapia
- Consideraciones para TES
### Contexto y Referencias
**Guías Oficiales:**
- Referencias a guías ERC, AHA, SEMES
- Protocolos institucionales
- Evidencia científica
**Formación Continua:**
- Actualización de conocimientos
- Práctica supervisada
- Simulaciones
---
## 10. PUNTOS CLAVE PARA TES
### Resumen Ejecutivo
**1. Valoración Inicial:**
- Medir SpO2 siempre antes de iniciar oxigenoterapia
- Identificar si paciente tiene EPOC conocido
- Observar signos clínicos de hipoxia
**2. Selección de Dispositivo:**
- SpO2 90-94%, consciente → Gafas nasales
- SpO2 85-90%, consciente → Mascarilla simple
- SpO2 <85% o shock Mascarilla con reservorio
- EPOC → Venturi (FiO2 24-28%)
- Inconsciente, respiración inadecuada → Ambú
**3. Objetivos de SpO2:**
- Pacientes sin EPOC: 94-98%
- Pacientes con EPOC: 88-92%
**4. Flujos Mínimos:**
- Gafas nasales: 1-6 L/min
- Mascarilla simple: 6 L/min mínimo
- Mascarilla con reservorio: 10 L/min mínimo
- Ambú: 15 L/min
**5. Verificaciones Obligatorias:**
- SpO2 después de 1-2 minutos
- Dispositivo bien colocado
- O2 fluyendo correctamente
- Presión de botella (si uso prolongado)
**6. Errores a Evitar:**
- No verificar SpO2 antes y durante
- Usar dispositivo con FiO2 insuficiente
- Mascarilla con reservorio en EPOC
- Flujo insuficiente para el dispositivo
- Apurar botellas hasta el final
**7. Seguridad:**
- No fumar cerca de O2
- Verificar conexiones antes de usar
- Margen de seguridad 20% en botellas
- Tener botella de repuesto disponible
**8. Cálculo de Duración:**
- Fórmula: (Presión × Volumen) ÷ Flujo
- Incluir margen de seguridad 20%
- Planificar recambio antes de agotar
### Checklist Rápido TES
**Antes de Iniciar:**
- [ ] Medir SpO2 inicial
- [ ] Identificar EPOC
- [ ] Seleccionar dispositivo adecuado
- [ ] Verificar disponibilidad de O2
- [ ] Verificar presión de botella
**Durante Uso:**
- [ ] Dispositivo bien colocado
- [ ] Flujo correcto según dispositivo
- [ ] O2 fluyendo correctamente
- [ ] Monitorizar SpO2 continuamente
- [ ] Ajustar según respuesta
**Seguridad:**
- [ ] No fumar cerca de O2
- [ ] Verificar conexiones
- [ ] Calcular duración de botella
- [ ] Tener botella de repuesto
- [ ] No apurar botellas
---
## NOTA FINAL DE SEGURIDAD
Este contenido es de **uso exclusivo como apoyo** y **NO sustituye**:
- ❌ La formación reglada del profesional
- ❌ Los protocolos oficiales de la institución
- ❌ El criterio clínico del TES o médico
- ❌ La práctica supervisada y experiencia
El profesional que utiliza este contenido mantiene la **responsabilidad completa** de sus actuaciones y debe adaptar las técnicas a cada situación específica.
**Validación Médica:** Pendiente de validación médica profesional antes de uso en producción.
---
**Versión:** 1.0
**Última actualización:** 2025-12-23
**Fuente:** Manual TES Digital - Sección 3.8.2

File diff suppressed because it is too large Load diff

View file

@ -1,304 +0,0 @@
#!/usr/bin/env python3
"""
Mejora del reporte 1 con mapeo correcto de archivos
"""
import os
from pathlib import Path
from collections import defaultdict
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
# Mapeo real de archivos según auditoría previa
MAPEO_REAL = {
"1.1.1": "BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md",
"1.2.1": "BLOQUE_01_1_CONSTANTES_VITALES.md",
"1.2.2": "BLOQUE_01_2_ABCDE_OPERATIVO.md",
"1.2.3": "BLOQUE_01_3_GLASGOW_OPERATIVO.md",
"1.2.4": "BLOQUE_01_4_TRIAGE_START.md",
"2.1.1": "BLOQUE_04_0_ACCESO_VASCULAR_BASICO.md",
"2.1.2": "BLOQUE_04_0B_RECONOCIMIENTO_PCR.md",
"2.1.3": "BLOQUE_04_1_RCP_ADULTOS.md",
"2.1.4": "BLOQUE_04_2_RCP_PEDIATRIA.md",
"2.1.5": "BLOQUE_04_3_RCP_LACTANTES.md",
"2.1.6": "BLOQUE_04_4_USO_DESA.md",
"2.1.7": "BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md",
"2.1.8": "BLOQUE_04_6_OVACE_ADULTOS.md",
"2.1.9": "BLOQUE_04_7_OVACE_PEDIATRIA.md",
"2.1.10": "BLOQUE_04_8_OVACE_LACTANTES.md",
"2.1.11": "BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md",
"2.2.1": "BLOQUE_09_0_MEDICINA_EMERGENCIAS_APLICADA.md",
"3.1.1": "BLOQUE_02_0_ANATOMIA_OPERATIVA.md",
"3.1.2": "BLOQUE_02_2_INMOVILIZACION_MANUAL.md",
"3.1.3": "BLOQUE_02_3_COLLARIN_CERVICAL.md",
"3.1.4": "BLOQUE_02_4_CAMILLA_CUCHARA.md",
"3.1.5": "BLOQUE_02_5_TABLERO_ESPINAL.md",
"3.1.6": "BLOQUE_02_6_COLCHON_VACIO.md",
"3.1.7": "BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md",
"3.1.8": "BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md",
"3.1.9": "BLOQUE_02_9_ERRORES_CRITICOS.md",
"3.1.10": "BLOQUE_02_10_FERULAS.md",
"3.1.11": "BLOQUE_02_11_CINTURON_PELVICO.md",
"3.1.12": "BLOQUE_02_12_FERULA_TRACCION.md",
"3.1.13": "BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md",
"3.1.14": "BLOQUE_02_X_INVENTARIO_MATERIAL.md",
"3.2.1": "BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md",
"3.2.2": "BLOQUE_03_0B_OXIGENOTERAPIA_FUNDAMENTOS.md",
"3.2.3": "BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md",
"3.2.4": "BLOQUE_03_1B_VENTILACION_BOLSA_MASCARILLA.md",
"3.2.5": "BLOQUE_03_2_ASPIRACION.md",
"3.2.6": "BLOQUE_03_2B_CANULA_OROFARINGEA.md",
"3.2.7": "BLOQUE_03_3_BVM.md",
"3.2.8": "BLOQUE_03_4_CANULAS.md",
"3.2.9": "BLOQUE_03_5_ORGANIZACION_MALETIN.md",
"3.2.10": "BLOQUE_03_6_CONTROL_HEMORRAGIAS.md",
"3.2.11": "BLOQUE_03_7_QUEMADURAS.md",
"3.2.12": "BLOQUE_03_8_HERIDAS_VENDAJES.md",
"3.2.13": "BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md",
"3.2.14": "BLOQUE_03_10_MONITORIZACION_BASICA.md",
"3.2.15": "BLOQUE_03_11_GLUCOMETRO.md",
"3.2.16": "BLOQUE_03_12_TERMOMETRIA.md",
"3.2.17": "BLOQUE_03_13_CONFORT_DOLOR.md",
"3.2.18": "BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md",
"3.2.19": "BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md",
"3.2.20": "BLOQUE_03_16_COMUNICACION_OPERATIVA.md",
"3.2.21": "BLOQUE_03_17_SENALIZACION_ILUMINACION.md",
"3.2.22": "BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md",
"3.2.23": "BLOQUE_03_99_CIERRE_BLOQUE_3.md",
"3.2.24": "BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md",
"3.2.25": "BLOQUE_03_X2_MALETIN_CURAS.md",
"3.2.26": "BLOQUE_03_X3_BOLSA_MONITORIZACION.md",
"3.2.27": "BLOQUE_03_X4_INVENTARIO_GLOBAL.md",
"3.2.28": "BLOQUE_03_X5_CHECKLIST_MAESTRO.md",
"4.1.1": "BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md",
"4.1.2": "BLOQUE_06_1_VADEMECUM_OPERATIVO.md",
"4.1.3": "BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md",
"4.1.4": "BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md",
"4.1.5": "BLOQUE_06_4_ASPIRINA_USO_SCA.md",
"4.1.6": "BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md",
"4.1.7": "BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md",
"4.1.8": "BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md",
"5.1.1": "BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md",
"5.1.2": "BLOQUE_05_0B_PROTOCOLOS_EMERGENCIAS_ESPECIFICAS.md",
"5.1.3": "BLOQUE_05_1_PCR_TRANSTELEFONICA.md",
"5.1.4": "BLOQUE_05_2_OVACE_TRANSTELEFONICA.md",
"5.1.5": "BLOQUE_05_3_SCA_TRANSTELEFONICO.md",
"5.1.6": "BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md",
"5.1.7": "BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md",
"5.1.8": "BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md",
"5.1.9": "BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md",
"5.1.10": "BLOQUE_05_8_COMUNICACION_COORDINADOR.md",
"5.2.1": "BLOQUE_08_0_INTRODUCCION_GESTION_OPERATIVA.md",
"5.2.2": "BLOQUE_08_1_DOCUMENTACION_CLINICA_PREHOSPITALARIA.md",
"5.2.3": "BLOQUE_08_2_COORDINACION_Y_COMUNICACION_OPERATIVA.md",
"5.2.4": "BLOQUE_08_3_GESTION_RECURSOS_Y_MATERIAL.md",
"5.2.5": "BLOQUE_08_4_CALIDAD_Y_MEJORA_CONTINUA.md",
"6.1.1": "BLOQUE_07_0_FUNDAMENTOS_CONDUCCION_URGENCIAS.md",
"6.1.2": "BLOQUE_07_1_USO_LUCES_Y_SIRENA.md",
"6.1.3": "BLOQUE_07_2_TECNICAS_CONDUCCION_EMERGENCIAS.md",
"6.1.4": "BLOQUE_07_3_SEGURIDAD_VIAL_Y_PREVENCION_ACCIDENTES.md",
"6.1.5": "BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md",
"6.1.6": "BLOQUE_07_5_PROTOCOLOS_SEGURIDAD_EN_ESCENA.md",
"7.1.1": "BLOQUE_10_0_SITUACIONES_ESPECIALES.md",
"7.2.1": "BLOQUE_11_0_PROTOCOLOS_TRAUMA.md",
"8.1.1": "BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md",
"8.2.1": "BLOQUE_13_0_COMUNICACION_RELACION_PACIENTE.md",
"8.3.1": "BLOQUE_14_0_SEGURIDAD_PERSONAL_SALUD_TES.md",
}
BLOQUE_TO_FOLDER = {
0: "BLOQUE_0_FUNDAMENTOS",
1: "BLOQUE_1_PROCEDIMIENTOS_BASICOS",
2: "BLOQUE_2_MATERIAL_E_INMOVILIZACION",
3: "BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA",
4: "BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP",
5: "BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS",
6: "BLOQUE_6_FARMACOLOGIA",
7: "BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL",
8: "BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION",
9: "BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA",
10: "BLOQUE_10_SITUACIONES_ESPECIALES",
11: "BLOQUE_11_PROTOCOLOS_TRAUMA",
12: "BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL",
13: "BLOQUE_13_COMUNICACION_RELACION_PACIENTE",
14: "BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES",
}
INDICE_ESPERADO = {
"1.1.1": {"nombre": "Fundamentos de Emergencias", "bloque": 0, "parte": 1},
"1.2.1": {"nombre": "Constantes Vitales", "bloque": 1, "parte": 1},
"1.2.2": {"nombre": "ABCDE Operativo", "bloque": 1, "parte": 1},
"1.2.3": {"nombre": "Glasgow Operativo", "bloque": 1, "parte": 1},
"1.2.4": {"nombre": "Triage START", "bloque": 1, "parte": 1},
"2.1.1": {"nombre": "Acceso Vascular Básico", "bloque": 4, "parte": 2},
"2.1.2": {"nombre": "Reconocimiento PCR", "bloque": 4, "parte": 2},
"2.1.3": {"nombre": "RCP Adultos", "bloque": 4, "parte": 2},
"2.1.4": {"nombre": "RCP Pediatría", "bloque": 4, "parte": 2},
"2.1.5": {"nombre": "RCP Lactantes", "bloque": 4, "parte": 2},
"2.1.6": {"nombre": "Uso DESA", "bloque": 4, "parte": 2},
"2.1.7": {"nombre": "RCP Dos Intervinientes", "bloque": 4, "parte": 2},
"2.1.8": {"nombre": "OVACE Adultos", "bloque": 4, "parte": 2},
"2.1.9": {"nombre": "OVACE Pediatría", "bloque": 4, "parte": 2},
"2.1.10": {"nombre": "OVACE Lactantes", "bloque": 4, "parte": 2},
"2.1.11": {"nombre": "Posición Lateral de Seguridad", "bloque": 4, "parte": 2},
"2.2.1": {"nombre": "Medicina de Emergencias Aplicada", "bloque": 9, "parte": 2},
"3.1.1": {"nombre": "Anatomía Operativa", "bloque": 2, "parte": 3},
"3.1.2": {"nombre": "Inmovilización Manual", "bloque": 2, "parte": 3},
"3.1.3": {"nombre": "Collarín Cervical", "bloque": 2, "parte": 3},
"3.1.4": {"nombre": "Camilla Cuchara", "bloque": 2, "parte": 3},
"3.1.5": {"nombre": "Tablero Espinal", "bloque": 2, "parte": 3},
"3.1.6": {"nombre": "Colchón Vacío", "bloque": 2, "parte": 3},
"3.1.7": {"nombre": "Extricación y Movimientos en Bloque", "bloque": 2, "parte": 3},
"3.1.8": {"nombre": "Transferencias y Movilización", "bloque": 2, "parte": 3},
"3.1.9": {"nombre": "Errores Críticos", "bloque": 2, "parte": 3},
"3.1.10": {"nombre": "Férulas", "bloque": 2, "parte": 3},
"3.1.11": {"nombre": "Cinturón Pélvico", "bloque": 2, "parte": 3},
"3.1.12": {"nombre": "Férula de Tracción", "bloque": 2, "parte": 3},
"3.1.13": {"nombre": "Camillas y Sillas de Evacuación", "bloque": 2, "parte": 3},
"3.1.14": {"nombre": "Inventario de Material", "bloque": 2, "parte": 3},
"3.2.1": {"nombre": "Oxigenoterapia Básica", "bloque": 3, "parte": 3},
"3.2.2": {"nombre": "Oxigenoterapia - Fundamentos", "bloque": 3, "parte": 3},
"3.2.3": {"nombre": "Dispositivos de Oxigenoterapia", "bloque": 3, "parte": 3},
"3.2.4": {"nombre": "Ventilación con Bolsa-Mascarilla", "bloque": 3, "parte": 3},
"3.2.5": {"nombre": "Aspiración", "bloque": 3, "parte": 3},
"3.2.6": {"nombre": "Cánula Orofaringea", "bloque": 3, "parte": 3},
"3.2.7": {"nombre": "BVM (Bolsa Válvula Mascarilla)", "bloque": 3, "parte": 3},
"3.2.8": {"nombre": "Cánulas", "bloque": 3, "parte": 3},
"3.2.9": {"nombre": "Organización del Maletín", "bloque": 3, "parte": 3},
"3.2.10": {"nombre": "Control de Hemorragias", "bloque": 3, "parte": 3},
"3.2.11": {"nombre": "Quemaduras", "bloque": 3, "parte": 3},
"3.2.12": {"nombre": "Heridas y Vendajes", "bloque": 3, "parte": 3},
"3.2.13": {"nombre": "Exposición y Aislamiento Térmico", "bloque": 3, "parte": 3},
"3.2.14": {"nombre": "Monitorización Básica", "bloque": 3, "parte": 3},
"3.2.15": {"nombre": "Glucometro", "bloque": 3, "parte": 3},
"3.2.16": {"nombre": "Termometría", "bloque": 3, "parte": 3},
"3.2.17": {"nombre": "Confort y Dolor", "bloque": 3, "parte": 3},
"3.2.18": {"nombre": "Bioseguridad y Descontaminación", "bloque": 3, "parte": 3},
"3.2.19": {"nombre": "Gestión de Material en Escena", "bloque": 3, "parte": 3},
"3.2.20": {"nombre": "Comunicación Operativa", "bloque": 3, "parte": 3},
"3.2.21": {"nombre": "Señalización e Iluminación", "bloque": 3, "parte": 3},
"3.2.22": {"nombre": "Documentación Operativa", "bloque": 3, "parte": 3},
"3.2.23": {"nombre": "Cierre Bloque 3", "bloque": 3, "parte": 3},
"3.2.24": {"nombre": "Inventario Material Sanitario", "bloque": 3, "parte": 3},
"3.2.25": {"nombre": "Maletín de Curas", "bloque": 3, "parte": 3},
"3.2.26": {"nombre": "Bolsa de Monitorización", "bloque": 3, "parte": 3},
"3.2.27": {"nombre": "Inventario Global", "bloque": 3, "parte": 3},
"3.2.28": {"nombre": "Checklist Maestro", "bloque": 3, "parte": 3},
"4.1.1": {"nombre": "Principios de Administración de Fármacos", "bloque": 6, "parte": 4},
"4.1.2": {"nombre": "Vademécum Operativo", "bloque": 6, "parte": 4},
"4.1.3": {"nombre": "Oxígeno - Administración y Seguridad", "bloque": 6, "parte": 4},
"4.1.4": {"nombre": "Adrenalina - Uso en Anafilaxia y RCP", "bloque": 6, "parte": 4},
"4.1.5": {"nombre": "Aspirina - Uso en SCA", "bloque": 6, "parte": 4},
"4.1.6": {"nombre": "Glucagón - Uso en Hipoglucemia", "bloque": 6, "parte": 4},
"4.1.7": {"nombre": "Salbutamol - Uso en Crisis Asmática", "bloque": 6, "parte": 4},
"4.1.8": {"nombre": "Abreviaturas y Terminología Farmacológica", "bloque": 6, "parte": 4},
"5.1.1": {"nombre": "Introducción a Protocolos Transtelefónicos", "bloque": 5, "parte": 5},
"5.1.2": {"nombre": "Protocolos de Emergencias Específicas", "bloque": 5, "parte": 5},
"5.1.3": {"nombre": "PCR Transtelefónica", "bloque": 5, "parte": 5},
"5.1.4": {"nombre": "OVACE Transtelefónica", "bloque": 5, "parte": 5},
"5.1.5": {"nombre": "SCA Transtelefónico", "bloque": 5, "parte": 5},
"5.1.6": {"nombre": "ICTUS Transtelefónico", "bloque": 5, "parte": 5},
"5.1.7": {"nombre": "Anafilaxia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.8": {"nombre": "Crisis Asmática Transtelefónica", "bloque": 5, "parte": 5},
"5.1.9": {"nombre": "Hipoglucemia Transtelefónica", "bloque": 5, "parte": 5},
"5.1.10": {"nombre": "Comunicación con Coordinador", "bloque": 5, "parte": 5},
"5.2.1": {"nombre": "Introducción a Gestión Operativa", "bloque": 8, "parte": 5},
"5.2.2": {"nombre": "Documentación Clínica Prehospitalaria", "bloque": 8, "parte": 5},
"5.2.3": {"nombre": "Coordinación y Comunicación Operativa", "bloque": 8, "parte": 5},
"5.2.4": {"nombre": "Gestión de Recursos y Material", "bloque": 8, "parte": 5},
"5.2.5": {"nombre": "Calidad y Mejora Continua", "bloque": 8, "parte": 5},
"6.1.1": {"nombre": "Fundamentos de Conducción en Urgencias", "bloque": 7, "parte": 6},
"6.1.2": {"nombre": "Uso de Luces y Sirena", "bloque": 7, "parte": 6},
"6.1.3": {"nombre": "Técnicas de Conducción en Emergencias", "bloque": 7, "parte": 6},
"6.1.4": {"nombre": "Seguridad Vial y Prevención de Accidentes", "bloque": 7, "parte": 6},
"6.1.5": {"nombre": "Gestión de Rutas y Navegación", "bloque": 7, "parte": 6},
"6.1.6": {"nombre": "Protocolos de Seguridad en Escena", "bloque": 7, "parte": 6},
"7.1.1": {"nombre": "Situaciones Especiales", "bloque": 10, "parte": 7},
"7.2.1": {"nombre": "Protocolos de Trauma", "bloque": 11, "parte": 7},
"8.1.1": {"nombre": "Marco Legal, Ético y Profesional del TES", "bloque": 12, "parte": 8},
"8.2.1": {"nombre": "Comunicación y Relación con el Paciente", "bloque": 13, "parte": 8},
"8.3.1": {"nombre": "Seguridad Personal y Salud del TES", "bloque": 14, "parte": 8},
}
def verificar_archivos():
"""Verifica que todos los archivos existan"""
archivos_encontrados = []
archivos_faltantes = []
for codigo, nombre_archivo in MAPEO_REAL.items():
info = INDICE_ESPERADO[codigo]
bloque_num = info["bloque"]
folder_name = BLOQUE_TO_FOLDER[bloque_num]
ruta_completa = MANUAL_DIR / folder_name / nombre_archivo
if ruta_completa.exists():
archivos_encontrados.append({
'codigo': codigo,
'nombre': info['nombre'],
'archivo': nombre_archivo,
'bloque': bloque_num,
'ruta': str(ruta_completa.relative_to(BASE_DIR))
})
else:
archivos_faltantes.append({
'codigo': codigo,
'nombre': info['nombre'],
'archivo_esperado': nombre_archivo,
'bloque': bloque_num,
'folder': folder_name
})
return archivos_encontrados, archivos_faltantes
def generar_reporte_corregido():
"""Genera reporte corregido con mapeo real"""
archivos_encontrados, archivos_faltantes = verificar_archivos()
reporte = []
reporte.append("# REPORTE 1: ARCHIVOS .MD FALTANTES DEL ÍNDICE\n")
reporte.append(f"**Fecha:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
reporte.append("---\n")
reporte.append("## 📊 RESUMEN EJECUTIVO\n")
reporte.append(f"- **Total de capítulos según índice:** {len(INDICE_ESPERADO)}\n")
reporte.append(f"- **Archivos encontrados:** {len(archivos_encontrados)}\n")
reporte.append(f"- **Archivos faltantes:** {len(archivos_faltantes)}\n")
reporte.append(f"- **Porcentaje de completitud:** {(len(archivos_encontrados)/len(INDICE_ESPERADO)*100):.1f}%\n")
reporte.append("---\n")
if archivos_faltantes:
reporte.append("## ❌ ARCHIVOS FALTANTES\n")
reporte.append(f"**Total:** {len(archivos_faltantes)} archivos\n\n")
for archivo in archivos_faltantes:
reporte.append(f"- **{archivo['codigo']}** - {archivo['nombre']}")
reporte.append(f" - Bloque: {archivo['bloque']}")
reporte.append(f" - Carpeta: `{archivo['folder']}/`")
reporte.append(f" - Archivo esperado: `{archivo['archivo_esperado']}`\n")
else:
reporte.append("## ✅ TODOS LOS ARCHIVOS ESTÁN PRESENTES\n")
reporte.append("Todos los 93 capítulos del índice tienen archivos .md correspondientes.\n")
reporte.append("\n---\n")
reporte.append("## 📋 LISTADO COMPLETO DE ARCHIVOS ENCONTRADOS\n")
reporte.append(f"**Total:** {len(archivos_encontrados)} archivos\n\n")
por_parte = defaultdict(list)
for archivo in archivos_encontrados:
parte_num = archivo['codigo'].split('.')[0]
por_parte[parte_num].append(archivo)
for parte_num in sorted(por_parte.keys(), key=int):
reporte.append(f"\n### Parte {parte_num}\n")
for archivo in sorted(por_parte[parte_num], key=lambda x: x['codigo']):
reporte.append(f"- ✅ `{archivo['codigo']}` - **{archivo['nombre']}**")
reporte.append(f" - Archivo: `{archivo['archivo']}`")
reporte.append(f" - Ruta: `{archivo['ruta']}`\n")
return "\n".join(reporte)
if __name__ == "__main__":
reporte = generar_reporte_corregido()
with open(BASE_DIR / "REPORTE_1_ARCHIVOS_FALTANTES.md", "w", encoding="utf-8") as f:
f.write(reporte)
print("✅ Reporte 1 corregido generado")

59
mostrar-estructura.sh Executable file
View file

@ -0,0 +1,59 @@
#!/bin/bash
# Script para mostrar la estructura del proyecto
echo "═══════════════════════════════════════════════════════════"
echo " ESTRUCTURA DEL PROYECTO: guia-tes"
echo "═══════════════════════════════════════════════════════════"
echo ""
CARPETA="/home/planetazuzu/guia-tes"
cd "$CARPETA"
echo "📁 CARPETAS PRINCIPALES:"
echo "───────────────────────────────────────────────────────────"
for dir in */; do
if [ -d "$dir" ]; then
count=$(find "$dir" -type f 2>/dev/null | wc -l)
size=$(du -sh "$dir" 2>/dev/null | cut -f1)
echo " 📂 $dir ($count archivos, $size)"
fi
done
echo ""
echo "📄 ARCHIVOS PRINCIPALES EN LA RAÍZ:"
echo "───────────────────────────────────────────────────────────"
ls -lh *.json *.ts *.tsx *.sh *.py *.md *.yml *.yaml *.config.* 2>/dev/null | awk '{print " 📄 " $9 " (" $5 ")"}'
echo ""
echo "═══════════════════════════════════════════════════════════"
echo " ESTRUCTURA DETALLADA DE CARPETAS IMPORTANTES"
echo "═══════════════════════════════════════════════════════════"
echo ""
echo "📁 src/ (código fuente):"
if [ -d "src" ]; then
find src -type d -maxdepth 2 | sort | sed 's|^| |'
fi
echo ""
echo "📁 public/ (archivos públicos):"
if [ -d "public" ]; then
find public -type d -maxdepth 2 | sort | sed 's|^| |'
fi
echo ""
echo "📁 assets/ (recursos multimedia):"
if [ -d "assets" ]; then
find assets -type d -maxdepth 2 | sort | sed 's|^| |'
fi
echo ""
echo "═══════════════════════════════════════════════════════════"
echo " RESUMEN"
echo "═══════════════════════════════════════════════════════════"
total_files=$(find . -type f ! -path "./node_modules/*" ! -path "./.git/*" ! -path "./dist/*" 2>/dev/null | wc -l)
total_dirs=$(find . -type d ! -path "./node_modules/*" ! -path "./.git/*" ! -path "./dist/*" 2>/dev/null | wc -l)
echo " Total archivos: $total_files"
echo " Total carpetas: $total_dirs"
echo ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
public/icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
public/icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

View file

@ -16,28 +16,62 @@
"src": "/favicon.svg",
"sizes": "any",
"type": "image/svg+xml",
"purpose": "any maskable"
"purpose": "any"
},
{
"src": "/icon-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/icon-192-maskable.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icon-512-maskable.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/favicon.ico",
"sizes": "256x256",
"type": "image/x-icon",
"purpose": "any maskable"
},
{
"src": "/favicon.svg",
"sizes": "192x192",
"type": "image/svg+xml",
"purpose": "any"
},
{
"src": "/favicon.svg",
"sizes": "512x512",
"type": "image/svg+xml",
"purpose": "any"
}
],
"screenshots": [],
"screenshots": [
{
"src": "/screenshots/home.png",
"sizes": "1280x720",
"type": "image/png",
"form_factor": "wide",
"label": "Página principal de EMERGES TES"
},
{
"src": "/screenshots/manual.png",
"sizes": "1280x720",
"type": "image/png",
"form_factor": "wide",
"label": "Manual completo navegable"
},
{
"src": "/screenshots/mobile-home.png",
"sizes": "750x1334",
"type": "image/png",
"form_factor": "narrow",
"label": "Vista móvil - Página principal"
}
],
"shortcuts": [
{
"name": "Manual Completo",

View file

@ -33,9 +33,25 @@ self.addEventListener('install', (event) => {
caches.open(CACHE_NAME)
.then((cache) => {
console.log('[SW] Caching static assets');
return cache.addAll(STATIC_ASSETS);
// Cachear recursos uno por uno para manejar errores individualmente
return Promise.allSettled(
STATIC_ASSETS.map(url =>
cache.add(url).catch(err => {
console.warn(`[SW] Failed to cache ${url}:`, err);
return null; // Continuar aunque falle uno
})
)
);
})
.then(() => {
console.log('[SW] Static assets cached');
self.skipWaiting(); // Activar inmediatamente
})
.catch((error) => {
console.error('[SW] Installation failed:', error);
// Continuar aunque falle la instalación
self.skipWaiting();
})
.then(() => self.skipWaiting()) // Activar inmediatamente
);
});

View file

@ -2,7 +2,7 @@
# Script de reorganización del Manual TES Digital
# FASE 5: Reorganización del Proyecto MD
BASE_DIR="/home/planetazuzu/protocolo-r-pido/manual-tes/TES_Manual_Digital"
BASE_DIR="/home/planetazuzu/guia-tes/manual-tes/TES_Manual_Digital"
cd "$BASE_DIR" || exit 1
echo "======================================================================"

View file

@ -0,0 +1,348 @@
# 🔍 Diagnóstico de Errores - EMERGES TES
Guía de diagnóstico y solución de problemas específicos para el proyecto **EMERGES TES - Guía de Protocolos de Emergencias**.
---
## 🧹 Limpieza Rápida
### Script Automatizado
```bash
./scripts/limpiar_errores_desarrollo.sh
```
Este script:
- ✅ Limpia caché de Vite
- ✅ Elimina builds anteriores
- ✅ Verifica TypeScript
- ✅ Proporciona instrucciones para limpiar almacenamiento
---
## 🔧 Problemas Comunes y Soluciones
### 1. Error: "Cannot destructure property 'basename' of 'React2.useContext(...)' as it is null"
**Causa:** Componente `<Link>` o `<NavLink>` renderizado fuera del contexto de `<BrowserRouter>`
**Solución aplicada:**
- ✅ `ErrorBoundary` movido dentro de `<BrowserRouter>` en `src/App.tsx`
- ✅ Eliminado import de `Link` de `ErrorBoundary.tsx` (no se usa)
**Verificación:**
```typescript
// ✅ CORRECTO (ErrorBoundary dentro de BrowserRouter)
<BrowserRouter>
<ErrorBoundary>
{/* ... */}
</ErrorBoundary>
</BrowserRouter>
// ❌ INCORRECTO (ErrorBoundary fuera de BrowserRouter)
<ErrorBoundary>
<BrowserRouter>
{/* ... */}
</BrowserRouter>
</ErrorBoundary>
```
---
### 2. Error: "Failed to execute 'addAll' on 'Cache': Request failed"
**Causa:** Service Worker intenta cachear recursos que no existen o no son accesibles
**Solución aplicada:**
- ✅ Service Worker actualizado para usar `Promise.allSettled` en lugar de `cache.addAll`
- ✅ Manejo de errores individual para cada recurso
- ✅ El Service Worker continúa aunque algunos recursos fallen
**Código aplicado:**
```javascript
// En public/sw.js
return Promise.allSettled(
STATIC_ASSETS.map(url =>
cache.add(url).catch(err => {
console.warn(`[SW] Failed to cache ${url}:`, err);
return null;
})
)
);
```
---
### 3. Error: "Objects are not valid as a React child"
**Causa:** Componente React pasado como objeto en lugar de JSX
**Solución:**
- Verificar que los componentes lazy se rendericen correctamente
- Asegurar que los iconos se pasen como componentes, no como objetos
- Verificar que `Suspense` envuelva correctamente los componentes lazy
**Verificación:**
```typescript
// ✅ CORRECTO
const Icon = tab.icon;
<Icon className="w-4 h-4" />
// ❌ INCORRECTO
{tab.icon} // Si tab.icon es un componente, debe ser <tab.icon />
```
---
### 4. Errores de Almacenamiento Local (localStorage/sessionStorage)
**Síntomas:**
- Favoritos no se guardan
- Historial no funciona
- Errores en consola relacionados con storage
**Solución:**
```javascript
// En la consola del navegador (F12):
// Limpiar solo las claves de esta app
localStorage.removeItem('emerges-tes-favorites');
sessionStorage.removeItem('emerges-tes-search-history');
localStorage.removeItem('pwa-install-dismissed');
// O limpiar todo (cuidado: afecta otras apps)
localStorage.clear();
sessionStorage.clear();
```
**Desde DevTools:**
1. Abre DevTools (F12)
2. Pestaña "Application" → "Storage"
3. Limpia "Local Storage" y "Session Storage" para tu dominio
---
### 2. Service Worker Desactualizado
**Síntomas:**
- La app no carga offline
- Cambios no se reflejan después del deploy
- Errores en consola sobre service worker
**Solución:**
```javascript
// En la consola del navegador:
// 1. Desregistrar service worker
navigator.serviceWorker.getRegistrations().then(registrations => {
registrations.forEach(registration => {
registration.unregister();
console.log('Service Worker desregistrado');
});
});
// 2. Limpiar caché
caches.keys().then(names => {
names.forEach(name => {
caches.delete(name);
console.log('Caché eliminada:', name);
});
});
// 3. Recargar página con Ctrl+Shift+R (hard refresh)
```
---
### 3. Errores de Build
**Síntomas:**
- `npm run build` falla
- Errores de TypeScript
- Errores de módulos no encontrados
**Solución:**
```bash
# 1. Limpiar completamente
rm -rf node_modules dist node_modules/.vite package-lock.json
# 2. Reinstalar dependencias
npm install
# 3. Verificar TypeScript
npx tsc --noEmit
# 4. Rebuild
npm run build
```
---
### 4. Errores de HMR (Hot Module Replacement)
**Síntomas:**
- Cambios no se reflejan en desarrollo
- Errores de recarga en caliente
- Variables duplicadas
**Solución:**
```bash
# 1. Limpiar caché de Vite
rm -rf node_modules/.vite
# 2. Reiniciar servidor de desarrollo
# Ctrl+C para detener
npm run dev
```
---
### 5. Errores de React Router
**Síntomas:**
- Warnings sobre future flags
- Rutas no funcionan correctamente
- Navegación falla
**Solución:**
Ya está configurado en `src/App.tsx`:
```typescript
<BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
```
Si persisten warnings, verifica que la versión de react-router-dom sea compatible:
```bash
npm list react-router-dom
```
---
## ✅ Verificación del Proyecto
### Checklist de Diagnóstico
```bash
# 1. Verificar que estás en el proyecto correcto
pwd # Debe ser: /home/planetazuzu/guia-tes
# 2. Verificar Node.js
node -v # Debe ser >= 18
# 3. Verificar build
npm run build # Debe compilar sin errores
# 4. Verificar TypeScript
npx tsc --noEmit # No debe mostrar errores
# 5. Verificar linter
npm run lint # Revisar warnings
# 6. Verificar servidor de desarrollo
npm run dev # Debe iniciar en puerto 8096
```
---
## 🐛 Errores Específicos del Proyecto
### Error: "Cannot find module '@/...'"
**Causa:** Alias de TypeScript no configurado
**Solución:**
Verifica `tsconfig.json` y `vite.config.ts`:
```json
// tsconfig.json debe tener:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
```
---
### Error: "Markdown files not loading"
**Causa:** Archivos .md no están en `public/manual/`
**Solución:**
```bash
# Verificar que existen los archivos
ls -la public/manual/
# Debe haber 94 archivos .md en subdirectorios
find public/manual -name "*.md" | wc -l
```
---
### Error: "Service Worker registration failed"
**Causa:** `sw.js` no existe o está mal configurado
**Solución:**
```bash
# Verificar que existe
ls -la public/sw.js
# Si no existe, verifica src/main.tsx para el registro
```
---
## 📊 Estado Actual del Proyecto
### Almacenamiento Usado
- ✅ `localStorage`: Favoritos (`emerges-tes-favorites`)
- ✅ `sessionStorage`: Historial (`emerges-tes-search-history`)
- ✅ `localStorage`: Banner PWA (`pwa-install-dismissed`)
- ❌ **NO usa IndexedDB ni Dexie**
### Base de Datos
- ❌ Este proyecto **NO usa** bases de datos
- ❌ **NO usa** Dexie, IndexedDB, ni ninguna BD
- ✅ Solo usa almacenamiento del navegador (localStorage/sessionStorage)
---
## 🆘 Si Persisten los Errores
1. **Verifica el proyecto correcto**
```bash
pwd
cat package.json | grep name
# Debe mostrar: "vite_react_shadcn_ts"
```
2. **Limpia completamente**
```bash
./scripts/limpiar_errores_desarrollo.sh
rm -rf node_modules dist
npm install
```
3. **Reconstruye**
```bash
npm run build
npm run dev
```
4. **Verifica en el navegador**
- Abre DevTools (F12)
- Revisa la pestaña "Console" para errores
- Revisa la pestaña "Network" para recursos fallidos
---
## 📝 Notas Importantes
- Este proyecto **NO usa Dexie** ni IndexedDB
- Este proyecto **NO tiene** NominaUploader ni pdf-parser
- Este proyecto usa **localStorage/sessionStorage** para persistencia
- El proyecto compila **sin errores** actualmente
---
**Última actualización:** 2025-12-23
**Proyecto:** EMERGES TES - Guía de Protocolos de Emergencias

114
scripts/generar_iconos_pwa.py Executable file
View file

@ -0,0 +1,114 @@
#!/usr/bin/env python3
"""
Script para generar iconos PWA desde favicon.svg
Crea iconos PNG 192x192, 512x512 y maskable para Android
"""
import subprocess
import sys
from pathlib import Path
PROJECT_ROOT = Path(__file__).parent.parent
PUBLIC_DIR = PROJECT_ROOT / "public"
FAVICON_SVG = PUBLIC_DIR / "favicon.svg"
def check_dependencies():
"""Verifica que ImageMagick esté instalado"""
try:
result = subprocess.run(
["convert", "-version"],
capture_output=True,
text=True
)
if result.returncode == 0:
print("✅ ImageMagick encontrado")
return True
except FileNotFoundError:
pass
print("❌ ImageMagick no encontrado")
print(" Instala con: sudo apt-get install imagemagick")
return False
def generar_icono_png(tamaño, nombre_archivo, maskable=False):
"""Genera un icono PNG desde el SVG"""
output_path = PUBLIC_DIR / nombre_archivo
# Comando ImageMagick para convertir SVG a PNG
cmd = [
"convert",
"-background", "none", # Fondo transparente
"-resize", f"{tamaño}x{tamaño}",
str(FAVICON_SVG),
str(output_path)
]
# Para iconos maskable, añadir padding seguro (80% del tamaño)
if maskable:
safe_size = int(tamaño * 0.8)
padding = int((tamaño - safe_size) / 2)
cmd = [
"convert",
"-background", "none",
"-resize", f"{safe_size}x{safe_size}",
"-gravity", "center",
"-extent", f"{tamaño}x{tamaño}",
str(FAVICON_SVG),
str(output_path)
]
try:
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f"✅ Generado: {nombre_archivo} ({tamaño}x{tamaño})")
return True
else:
print(f"❌ Error generando {nombre_archivo}: {result.stderr}")
return False
except Exception as e:
print(f"❌ Error: {e}")
return False
def main():
print("🎨 Generando iconos PWA...")
print(f"📁 SVG fuente: {FAVICON_SVG}")
print()
if not FAVICON_SVG.exists():
print(f"❌ Error: No se encuentra {FAVICON_SVG}")
sys.exit(1)
if not check_dependencies():
sys.exit(1)
print()
print("📦 Generando iconos...")
# Iconos estándar
iconos = [
(192, "icon-192.png", False),
(512, "icon-512.png", False),
# Iconos maskable para Android
(192, "icon-192-maskable.png", True),
(512, "icon-512-maskable.png", True),
]
exitosos = 0
for tamaño, nombre, maskable in iconos:
if generar_icono_png(tamaño, nombre, maskable):
exitosos += 1
print()
if exitosos == len(iconos):
print(f"✅ Todos los iconos generados exitosamente ({exitosos}/{len(iconos)})")
print()
print("📝 Próximos pasos:")
print(" 1. Actualizar public/manifest.json con los nuevos iconos")
print(" 2. Verificar que los iconos se vean correctamente")
else:
print(f"⚠️ Solo se generaron {exitosos}/{len(iconos)} iconos")
sys.exit(1)
if __name__ == "__main__":
main()

View file

@ -0,0 +1,101 @@
# 📸 Guía para Generar Screenshots de la PWA
Los screenshots son importantes para mostrar la aplicación en las tiendas de aplicaciones y mejorar la presentación de la PWA.
## 📋 Screenshots Requeridos
Según el manifest.json, necesitamos:
1. **Desktop (Wide):**
- `screenshots/home.png` - 1280x720px - Página principal
- `screenshots/manual.png` - 1280x720px - Manual completo
2. **Mobile (Narrow):**
- `screenshots/mobile-home.png` - 750x1334px - Vista móvil
## 🛠️ Métodos para Generar Screenshots
### Opción 1: Herramientas del Navegador (Recomendado)
1. **Chrome DevTools:**
```bash
# Abre la aplicación en Chrome
# Presiona F12 para abrir DevTools
# Presiona Ctrl+Shift+P (Cmd+Shift+P en Mac)
# Busca "Capture screenshot"
# Selecciona "Capture full size screenshot"
```
2. **Firefox DevTools:**
```bash
# Abre la aplicación en Firefox
# Presiona F12
# Presiona Ctrl+Shift+S (Cmd+Shift+S en Mac)
# Selecciona "Screenshot"
```
### Opción 2: Herramientas de Línea de Comando
#### Usando Puppeteer (Node.js)
```bash
npm install -g puppeteer-cli
puppeteer screenshot --url http://localhost:8607 --width 1280 --height 720 --output screenshots/home.png
```
#### Usando Playwright
```bash
npx playwright install chromium
npx playwright screenshot --url http://localhost:8607 --width 1280 --height 720 --output screenshots/home.png
```
#### Usando wkhtmltoimage
```bash
# Instalar: sudo apt-get install wkhtmltopdf
wkhtmltoimage --width 1280 --height 720 http://localhost:8607 screenshots/home.png
```
### Opción 3: Script Automatizado
Crea un script que capture las páginas automáticamente:
```javascript
// scripts/capturar_screenshots.js
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Desktop screenshot
await page.setViewport({ width: 1280, height: 720 });
await page.goto('http://localhost:8607');
await page.screenshot({ path: 'public/screenshots/home.png' });
// Manual page
await page.goto('http://localhost:8607/manual');
await page.screenshot({ path: 'public/screenshots/manual.png' });
// Mobile screenshot
await page.setViewport({ width: 375, height: 667 });
await page.goto('http://localhost:8607');
await page.screenshot({ path: 'public/screenshots/mobile-home.png' });
await browser.close();
})();
```
## 📝 Notas
- Los screenshots deben mostrar las mejores características de la aplicación
- Usa contenido real, no placeholders
- Asegúrate de que la aplicación esté corriendo antes de capturar
- Los screenshots se actualizarán automáticamente cuando cambies el contenido
## ✅ Verificación
Después de generar los screenshots:
1. Verifica que los archivos existan en `public/screenshots/`
2. Verifica que el manifest.json tenga las rutas correctas
3. Prueba la instalación de la PWA y verifica que los screenshots se muestren

81
scripts/generar_screenshots.sh Executable file
View file

@ -0,0 +1,81 @@
#!/bin/bash
# Script para generar screenshots de la PWA
# Requiere: wkhtmltoimage o herramientas del navegador
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
APP_URL="${1:-http://localhost:8607}"
SCREENSHOTS_DIR="public/screenshots"
echo -e "${GREEN}📸 Generando screenshots de la PWA${NC}"
echo -e "URL: ${APP_URL}"
echo ""
# Crear directorio si no existe
mkdir -p "$SCREENSHOTS_DIR"
# Verificar herramientas disponibles
HAS_WKHTML=false
HAS_PUPPETEER=false
if command -v wkhtmltoimage &> /dev/null; then
HAS_WKHTML=true
echo -e "${GREEN}✅ wkhtmltoimage encontrado${NC}"
fi
if command -v node &> /dev/null && npm list -g puppeteer &> /dev/null 2>&1; then
HAS_PUPPETEER=true
echo -e "${GREEN}✅ Puppeteer encontrado${NC}"
fi
if [ "$HAS_WKHTML" = false ] && [ "$HAS_PUPPETEER" = false ]; then
echo -e "${YELLOW}⚠️ No se encontraron herramientas automatizadas${NC}"
echo ""
echo "Opciones:"
echo "1. Instalar wkhtmltoimage: sudo apt-get install wkhtmltopdf"
echo "2. Usar DevTools del navegador (ver scripts/generar_screenshots.md)"
echo "3. Instalar Puppeteer: npm install -g puppeteer-cli"
echo ""
echo "Por ahora, puedes generar screenshots manualmente:"
echo " - Abre ${APP_URL} en Chrome/Firefox"
echo " - Presiona F12 para DevTools"
echo " - Usa 'Capture screenshot' o 'Screenshot'"
echo " - Guarda en ${SCREENSHOTS_DIR}/"
exit 0
fi
echo ""
echo "Generando screenshots..."
# Desktop screenshots (1280x720)
if [ "$HAS_WKHTML" = true ]; then
echo "📸 Generando home.png (Desktop)..."
wkhtmltoimage --width 1280 --height 720 --quality 90 \
"${APP_URL}" "${SCREENSHOTS_DIR}/home.png" 2>/dev/null || true
echo "📸 Generando manual.png (Desktop)..."
wkhtmltoimage --width 1280 --height 720 --quality 90 \
"${APP_URL}/manual" "${SCREENSHOTS_DIR}/manual.png" 2>/dev/null || true
fi
# Mobile screenshot (750x1334)
if [ "$HAS_WKHTML" = true ]; then
echo "📸 Generando mobile-home.png (Mobile)..."
wkhtmltoimage --width 375 --height 667 --quality 90 \
"${APP_URL}" "${SCREENSHOTS_DIR}/mobile-home.png" 2>/dev/null || true
fi
echo ""
if [ -f "${SCREENSHOTS_DIR}/home.png" ]; then
echo -e "${GREEN}✅ Screenshots generados en ${SCREENSHOTS_DIR}/${NC}"
ls -lh "${SCREENSHOTS_DIR}"/*.png 2>/dev/null || true
else
echo -e "${YELLOW}⚠️ No se generaron screenshots automáticamente${NC}"
echo " Usa las herramientas del navegador (ver scripts/generar_screenshots.md)"
fi

View file

@ -0,0 +1,81 @@
#!/bin/bash
# Script para limpiar errores comunes de desarrollo
# Uso: ./scripts/limpiar_errores_desarrollo.sh
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo -e "${BLUE}🧹 Limpieza de Errores de Desarrollo${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}"
echo ""
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$PROJECT_ROOT"
# 1. Limpiar caché de Vite
echo -e "${YELLOW}[1/5] Limpiando caché de Vite...${NC}"
if [ -d "node_modules/.vite" ]; then
rm -rf node_modules/.vite
echo -e "${GREEN}✅ Caché de Vite eliminada${NC}"
else
echo -e "${GREEN}✅ No hay caché de Vite${NC}"
fi
# 2. Limpiar build anterior
echo -e "${YELLOW}[2/5] Limpiando build anterior...${NC}"
if [ -d "dist" ]; then
rm -rf dist
echo -e "${GREEN}✅ Build anterior eliminado${NC}"
else
echo -e "${GREEN}✅ No hay build anterior${NC}"
fi
# 3. Verificar TypeScript
echo -e "${YELLOW}[3/5] Verificando TypeScript...${NC}"
if npx tsc --noEmit 2>&1 | grep -q "error"; then
echo -e "${RED}⚠️ Se encontraron errores de TypeScript${NC}"
npx tsc --noEmit 2>&1 | grep "error" | head -10
else
echo -e "${GREEN}✅ Sin errores de TypeScript${NC}"
fi
# 4. Limpiar localStorage del navegador (instrucciones)
echo -e "${YELLOW}[4/5] Instrucciones para limpiar almacenamiento del navegador...${NC}"
echo ""
echo -e "${BLUE}Para limpiar localStorage/sessionStorage en el navegador:${NC}"
echo -e " 1. Abre DevTools (F12)"
echo -e " 2. Ve a la pestaña 'Application' o 'Aplicación'"
echo -e " 3. En 'Storage' → 'Local Storage' → Selecciona tu dominio"
echo -e " 4. Haz clic derecho → 'Clear' o 'Limpiar'"
echo -e " 5. Repite para 'Session Storage'"
echo ""
echo -e "${BLUE}O ejecuta en la consola del navegador:${NC}"
echo -e " localStorage.clear();"
echo -e " sessionStorage.clear();"
echo ""
# 5. Verificar dependencias
echo -e "${YELLOW}[5/5] Verificando dependencias...${NC}"
if [ ! -d "node_modules" ]; then
echo -e "${YELLOW}⚠️ node_modules no existe. Ejecuta: npm install${NC}"
else
echo -e "${GREEN}✅ Dependencias instaladas${NC}"
fi
echo ""
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}✅ Limpieza completada${NC}"
echo -e "${GREEN}═══════════════════════════════════════════════════════════${NC}"
echo ""
echo -e "${BLUE}Próximos pasos:${NC}"
echo -e " 1. Limpia el almacenamiento del navegador (ver arriba)"
echo -e " 2. Reinicia el servidor de desarrollo: npm run dev"
echo -e " 3. Recarga la página con Ctrl+Shift+R (hard refresh)"
echo ""

View file

@ -2,5 +2,5 @@
echo "🚀 Iniciando servidor de desarrollo..."
echo "📍 URL: http://localhost:8096"
echo ""
cd /home/planetazuzu/protocolo-r-pido
cd /home/planetazuzu/guia-tes
npm run dev

View file

@ -52,13 +52,13 @@ const App = () => {
const [isMenuOpen, setIsMenuOpen] = useState(false);
return (
<ErrorBoundary>
<QueryClientProvider client={queryClient}>
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
<TooltipProvider>
<Toaster />
<Sonner />
<BrowserRouter>
<QueryClientProvider client={queryClient}>
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
<TooltipProvider>
<Toaster />
<Sonner />
<BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
<ErrorBoundary>
<div className="min-h-screen bg-background flex flex-col">
<Header
onSearchClick={() => setIsSearchOpen(true)}
@ -118,11 +118,11 @@ const App = () => {
onClose={() => setIsMenuOpen(false)}
/>
</div>
</BrowserRouter>
</TooltipProvider>
</ThemeProvider>
</QueryClientProvider>
</ErrorBoundary>
</ErrorBoundary>
</BrowserRouter>
</TooltipProvider>
</ThemeProvider>
</QueryClientProvider>
);
};

View file

@ -1,6 +1,5 @@
import React, { Component, ErrorInfo, ReactNode } from 'react';
import { AlertTriangle, Home, RefreshCw } from 'lucide-react';
import { Link } from 'react-router-dom';
import { Button } from '@/components/ui/button';
interface Props {

View file

@ -1,829 +0,0 @@
#!/usr/bin/env python3
"""
Script para verificar la estructura completa del Manual TES Digital
Compara el índice esperado con los archivos reales existentes
"""
import os
import re
from pathlib import Path
from collections import defaultdict
from typing import Dict, List, Tuple, Set
# Ruta base del proyecto
BASE_DIR = Path("/home/planetazuzu/protocolo-r-pido")
MANUAL_DIR = BASE_DIR / "manual-tes" / "TES_Manual_Digital"
# Mapeo del índice esperado según INDICE_COMPLETO_MANUAL_TES.md
INDICE_ESPERADO = {
# PARTE I: FUNDAMENTOS Y EVALUACIÓN INICIAL
"1.1.1": {
"nombre": "Fundamentos de Emergencias",
"bloque": 0,
"parte": 1,
"archivo_esperado": "BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md"
},
"1.2.1": {
"nombre": "Constantes Vitales",
"bloque": 1,
"parte": 1,
"archivo_esperado": "BLOQUE_01_1_CONSTANTES_VITALES.md"
},
"1.2.2": {
"nombre": "ABCDE Operativo",
"bloque": 1,
"parte": 1,
"archivo_esperado": "BLOQUE_01_2_ABCDE_OPERATIVO.md"
},
"1.2.3": {
"nombre": "Glasgow Operativo",
"bloque": 1,
"parte": 1,
"archivo_esperado": "BLOQUE_01_3_GLASGOW_OPERATIVO.md"
},
"1.2.4": {
"nombre": "Triage START",
"bloque": 1,
"parte": 1,
"archivo_esperado": "BLOQUE_01_4_TRIAGE_START.md"
},
# PARTE II: SOPORTE VITAL Y PROCEDIMIENTOS CRÍTICOS
"2.1.1": {
"nombre": "Acceso Vascular Básico",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_0_ACCESO_VASCULAR_BASICO.md"
},
"2.1.2": {
"nombre": "Reconocimiento PCR",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_0B_RECONOCIMIENTO_PCR.md"
},
"2.1.3": {
"nombre": "RCP Adultos",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_1_RCP_ADULTOS.md"
},
"2.1.4": {
"nombre": "RCP Pediatría",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_2_RCP_PEDIATRIA.md"
},
"2.1.5": {
"nombre": "RCP Lactantes",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_3_RCP_LACTANTES.md"
},
"2.1.6": {
"nombre": "Uso DESA",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_4_USO_DESA.md"
},
"2.1.7": {
"nombre": "RCP Dos Intervinientes",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md"
},
"2.1.8": {
"nombre": "OVACE Adultos",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_6_OVACE_ADULTOS.md"
},
"2.1.9": {
"nombre": "OVACE Pediatría",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_7_OVACE_PEDIATRIA.md"
},
"2.1.10": {
"nombre": "OVACE Lactantes",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_8_OVACE_LACTANTES.md"
},
"2.1.11": {
"nombre": "Posición Lateral de Seguridad",
"bloque": 4,
"parte": 2,
"archivo_esperado": "BLOQUE_04_9_POSICION_LATERAL_SEGURIDAD.md"
},
"2.2.1": {
"nombre": "Medicina de Emergencias Aplicada",
"bloque": 9,
"parte": 2,
"archivo_esperado": "BLOQUE_09_0_MEDICINA_EMERGENCIAS_APLICADA.md"
},
# PARTE III: MATERIAL Y EQUIPAMIENTO
"3.1.1": {
"nombre": "Anatomía Operativa",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_0_ANATOMIA_OPERATIVA.md"
},
"3.1.2": {
"nombre": "Inmovilización Manual",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_2_INMOVILIZACION_MANUAL.md"
},
"3.1.3": {
"nombre": "Collarín Cervical",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_3_COLLARIN_CERVICAL.md"
},
"3.1.4": {
"nombre": "Camilla Cuchara",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_4_CAMILLA_CUCHARA.md"
},
"3.1.5": {
"nombre": "Tablero Espinal",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_5_TABLERO_ESPINAL.md"
},
"3.1.6": {
"nombre": "Colchón Vacío",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_6_COLCHON_VACIO.md"
},
"3.1.7": {
"nombre": "Extricación y Movimientos en Bloque",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md"
},
"3.1.8": {
"nombre": "Transferencias y Movilización",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_8_TRANSFERENCIAS_MOVILIZACION.md"
},
"3.1.9": {
"nombre": "Errores Críticos",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_9_ERRORES_CRITICOS.md"
},
"3.1.10": {
"nombre": "Férulas",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_10_FERULAS.md"
},
"3.1.11": {
"nombre": "Cinturón Pélvico",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_11_CINTURON_PELVICO.md"
},
"3.1.12": {
"nombre": "Férula de Tracción",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_12_FERULA_TRACCION.md"
},
"3.1.13": {
"nombre": "Camillas y Sillas de Evacuación",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_13_CAMILLAS_SILLAS_EVACUACION.md"
},
"3.1.14": {
"nombre": "Inventario de Material",
"bloque": 2,
"parte": 3,
"archivo_esperado": "BLOQUE_02_X_INVENTARIO_MATERIAL.md"
},
"3.2.1": {
"nombre": "Oxigenoterapia Básica",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_0A_OXIGENOTERAPIA_BASICA.md"
},
"3.2.2": {
"nombre": "Oxigenoterapia - Fundamentos",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_0B_OXIGENOTERAPIA_FUNDAMENTOS.md"
},
"3.2.3": {
"nombre": "Dispositivos de Oxigenoterapia",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_1_DISPOSITIVOS_OXIGENOTERAPIA.md"
},
"3.2.4": {
"nombre": "Ventilación con Bolsa-Mascarilla",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_1B_VENTILACION_BOLSA_MASCARILLA.md"
},
"3.2.5": {
"nombre": "Aspiración",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_2_ASPIRACION.md"
},
"3.2.6": {
"nombre": "Cánula Orofaringea",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_2B_CANULA_OROFARINGEA.md"
},
"3.2.7": {
"nombre": "BVM (Bolsa Válvula Mascarilla)",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_3_BVM.md"
},
"3.2.8": {
"nombre": "Cánulas",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_4_CANULAS.md"
},
"3.2.9": {
"nombre": "Organización del Maletín",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_5_ORGANIZACION_MALETIN.md"
},
"3.2.10": {
"nombre": "Control de Hemorragias",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_6_CONTROL_HEMORRAGIAS.md"
},
"3.2.11": {
"nombre": "Quemaduras",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_7_QUEMADURAS.md"
},
"3.2.12": {
"nombre": "Heridas y Vendajes",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_8_HERIDAS_VENDAJES.md"
},
"3.2.13": {
"nombre": "Exposición y Aislamiento Térmico",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_9_EXPOSICION_AISLAMIENTO_TERMICO.md"
},
"3.2.14": {
"nombre": "Monitorización Básica",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_10_MONITORIZACION_BASICA.md"
},
"3.2.15": {
"nombre": "Glucometro",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_11_GLUCOMETRO.md"
},
"3.2.16": {
"nombre": "Termometría",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_12_TERMOMETRIA.md"
},
"3.2.17": {
"nombre": "Confort y Dolor",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_13_CONFORT_DOLOR.md"
},
"3.2.18": {
"nombre": "Bioseguridad y Descontaminación",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_14_BIOSEGURIDAD_DESCONTAMINACION.md"
},
"3.2.19": {
"nombre": "Gestión de Material en Escena",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_15_GESTION_MATERIAL_ESCENA.md"
},
"3.2.20": {
"nombre": "Comunicación Operativa",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_16_COMUNICACION_OPERATIVA.md"
},
"3.2.21": {
"nombre": "Señalización e Iluminación",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_17_SENALIZACION_ILUMINACION.md"
},
"3.2.22": {
"nombre": "Documentación Operativa",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_18_DOCUMENTACION_OPERATIVA.md"
},
"3.2.23": {
"nombre": "Cierre Bloque 3",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_99_CIERRE_BLOQUE_3.md"
},
"3.2.24": {
"nombre": "Inventario Material Sanitario",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_X_INVENTARIO_MATERIAL_SANITARIO.md"
},
"3.2.25": {
"nombre": "Maletín de Curas",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_X2_MALETIN_CURAS.md"
},
"3.2.26": {
"nombre": "Bolsa de Monitorización",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_X3_BOLSA_MONITORIZACION.md"
},
"3.2.27": {
"nombre": "Inventario Global",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_X4_INVENTARIO_GLOBAL.md"
},
"3.2.28": {
"nombre": "Checklist Maestro",
"bloque": 3,
"parte": 3,
"archivo_esperado": "BLOQUE_03_X5_CHECKLIST_MAESTRO.md"
},
# PARTE IV: FARMACOLOGÍA Y MEDICAMENTOS
"4.1.1": {
"nombre": "Principios de Administración de Fármacos",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_0_PRINCIPIOS_ADMINISTRACION_FARMACOS.md"
},
"4.1.2": {
"nombre": "Vademécum Operativo",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_1_VADEMECUM_OPERATIVO.md"
},
"4.1.3": {
"nombre": "Oxígeno - Administración y Seguridad",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_2_OXIGENO_ADMINISTRACION_Y_SEGURIDAD.md"
},
"4.1.4": {
"nombre": "Adrenalina - Uso en Anafilaxia y RCP",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_3_ADRENALINA_USO_ANAFILAXIA_Y_RCP.md"
},
"4.1.5": {
"nombre": "Aspirina - Uso en SCA",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_4_ASPIRINA_USO_SCA.md"
},
"4.1.6": {
"nombre": "Glucagón - Uso en Hipoglucemia",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_5_GLUCAGON_USO_HIPOGLUCEMIA.md"
},
"4.1.7": {
"nombre": "Salbutamol - Uso en Crisis Asmática",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_6_SALBUTAMOL_USO_CRISIS_ASMATICA.md"
},
"4.1.8": {
"nombre": "Abreviaturas y Terminología Farmacológica",
"bloque": 6,
"parte": 4,
"archivo_esperado": "BLOQUE_06_7_ABREVIATURAS_TERMINOLOGIA_FARMACOLOGICA.md"
},
# PARTE V: PROTOCOLOS Y GESTIÓN OPERATIVA
"5.1.1": {
"nombre": "Introducción a Protocolos Transtelefónicos",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md"
},
"5.1.2": {
"nombre": "Protocolos de Emergencias Específicas",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_0B_PROTOCOLOS_EMERGENCIAS_ESPECIFICAS.md"
},
"5.1.3": {
"nombre": "PCR Transtelefónica",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_1_PCR_TRANSTELEFONICA.md"
},
"5.1.4": {
"nombre": "OVACE Transtelefónica",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_2_OVACE_TRANSTELEFONICA.md"
},
"5.1.5": {
"nombre": "SCA Transtelefónico",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_3_SCA_TRANSTELEFONICO.md"
},
"5.1.6": {
"nombre": "ICTUS Transtelefónico",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_4_ICTUS_TRANSTELEFONICO.md"
},
"5.1.7": {
"nombre": "Anafilaxia Transtelefónica",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_5_ANAFILAXIA_TRANSTELEFONICA.md"
},
"5.1.8": {
"nombre": "Crisis Asmática Transtelefónica",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_6_CRISIS_ASMATICA_TRANSTELEFONICA.md"
},
"5.1.9": {
"nombre": "Hipoglucemia Transtelefónica",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_7_HIPOGLUCEMIA_TRANSTELEFONICA.md"
},
"5.1.10": {
"nombre": "Comunicación con Coordinador",
"bloque": 5,
"parte": 5,
"archivo_esperado": "BLOQUE_05_8_COMUNICACION_COORDINADOR.md"
},
"5.2.1": {
"nombre": "Introducción a Gestión Operativa",
"bloque": 8,
"parte": 5,
"archivo_esperado": "BLOQUE_08_0_INTRODUCCION_GESTION_OPERATIVA.md"
},
"5.2.2": {
"nombre": "Documentación Clínica Prehospitalaria",
"bloque": 8,
"parte": 5,
"archivo_esperado": "BLOQUE_08_1_DOCUMENTACION_CLINICA_PREHOSPITALARIA.md"
},
"5.2.3": {
"nombre": "Coordinación y Comunicación Operativa",
"bloque": 8,
"parte": 5,
"archivo_esperado": "BLOQUE_08_2_COORDINACION_Y_COMUNICACION_OPERATIVA.md"
},
"5.2.4": {
"nombre": "Gestión de Recursos y Material",
"bloque": 8,
"parte": 5,
"archivo_esperado": "BLOQUE_08_3_GESTION_RECURSOS_Y_MATERIAL.md"
},
"5.2.5": {
"nombre": "Calidad y Mejora Continua",
"bloque": 8,
"parte": 5,
"archivo_esperado": "BLOQUE_08_4_CALIDAD_Y_MEJORA_CONTINUA.md"
},
# PARTE VI: CONDUCCIÓN Y SEGURIDAD VIAL
"6.1.1": {
"nombre": "Fundamentos de Conducción en Urgencias",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_0_FUNDAMENTOS_CONDUCCION_URGENCIAS.md"
},
"6.1.2": {
"nombre": "Uso de Luces y Sirena",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_1_USO_LUCES_Y_SIRENA.md"
},
"6.1.3": {
"nombre": "Técnicas de Conducción en Emergencias",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_2_TECNICAS_CONDUCCION_EMERGENCIAS.md"
},
"6.1.4": {
"nombre": "Seguridad Vial y Prevención de Accidentes",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_3_SEGURIDAD_VIAL_Y_PREVENCION_ACCIDENTES.md"
},
"6.1.5": {
"nombre": "Gestión de Rutas y Navegación",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_4_GESTION_RUTAS_Y_NAVEGACION.md"
},
"6.1.6": {
"nombre": "Protocolos de Seguridad en Escena",
"bloque": 7,
"parte": 6,
"archivo_esperado": "BLOQUE_07_5_PROTOCOLOS_SEGURIDAD_EN_ESCENA.md"
},
# PARTE VII: SITUACIONES ESPECIALES Y TRAUMA
"7.1.1": {
"nombre": "Situaciones Especiales",
"bloque": 10,
"parte": 7,
"archivo_esperado": "BLOQUE_10_0_SITUACIONES_ESPECIALES.md"
},
"7.2.1": {
"nombre": "Protocolos de Trauma",
"bloque": 11,
"parte": 7,
"archivo_esperado": "BLOQUE_11_0_PROTOCOLOS_TRAUMA.md"
},
# PARTE VIII: HABILIDADES PROFESIONALES
"8.1.1": {
"nombre": "Marco Legal, Ético y Profesional del TES",
"bloque": 12,
"parte": 8,
"archivo_esperado": "BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md"
},
"8.2.1": {
"nombre": "Comunicación y Relación con el Paciente",
"bloque": 13,
"parte": 8,
"archivo_esperado": "BLOQUE_13_0_COMUNICACION_RELACION_PACIENTE.md"
},
"8.3.1": {
"nombre": "Seguridad Personal y Salud del TES",
"bloque": 14,
"parte": 8,
"archivo_esperado": "BLOQUE_14_0_SEGURIDAD_PERSONAL_SALUD_TES.md"
},
}
# Mapeo de bloques a carpetas
BLOQUE_TO_FOLDER = {
0: "BLOQUE_0_FUNDAMENTOS",
1: "BLOQUE_1_PROCEDIMIENTOS_BASICOS",
2: "BLOQUE_2_MATERIAL_E_INMOVILIZACION",
3: "BLOQUE_3_MATERIAL_SANITARIO_Y_OXIGENOTERAPIA",
4: "BLOQUE_4_SOPORTE_VITAL_BASICO_Y_RCP",
5: "BLOQUE_5_PROTOCOLOS_TRANSTELEFONICOS",
6: "BLOQUE_6_FARMACOLOGIA",
7: "BLOQUE_7_CONDUCCION_Y_SEGURIDAD_VIAL",
8: "BLOQUE_8_GESTION_OPERATIVA_Y_DOCUMENTACION",
9: "BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA",
10: "BLOQUE_10_SITUACIONES_ESPECIALES",
11: "BLOQUE_11_PROTOCOLOS_TRAUMA",
12: "BLOQUE_12_MARCO_LEGAL_ETICO_PROFESIONAL",
13: "BLOQUE_13_COMUNICACION_RELACION_PACIENTE",
14: "BLOQUE_14_SEGURIDAD_PERSONAL_SALUD_TES",
}
def obtener_archivos_existentes() -> Dict[str, List[str]]:
"""Obtiene todos los archivos .md existentes organizados por bloque"""
archivos_por_bloque = defaultdict(list)
for bloque_num, folder_name in BLOQUE_TO_FOLDER.items():
bloque_dir = MANUAL_DIR / folder_name
if bloque_dir.exists():
for archivo in bloque_dir.glob("*.md"):
archivos_por_bloque[bloque_num].append(archivo.name)
return archivos_por_bloque
def verificar_estructura():
"""Verifica la estructura completa del proyecto"""
archivos_existentes = obtener_archivos_existentes()
reporte = {
"capitulos_encontrados": [],
"capitulos_faltantes": [],
"archivos_huérfanos": [],
"inconsistencias_nombres": [],
"errores_estructura": [],
"estadisticas": {
"total_esperado": len(INDICE_ESPERADO),
"total_encontrado": 0,
"total_faltante": 0,
"total_huérfanos": 0,
}
}
# Verificar cada capítulo esperado
archivos_verificados = set()
for codigo, info in INDICE_ESPERADO.items():
bloque_num = info["bloque"]
archivo_esperado = info["archivo_esperado"]
folder_name = BLOQUE_TO_FOLDER[bloque_num]
ruta_completa = MANUAL_DIR / folder_name / archivo_esperado
if ruta_completa.exists():
reporte["capitulos_encontrados"].append({
"codigo": codigo,
"nombre": info["nombre"],
"archivo": archivo_esperado,
"ruta": str(ruta_completa.relative_to(BASE_DIR))
})
archivos_verificados.add((bloque_num, archivo_esperado))
reporte["estadisticas"]["total_encontrado"] += 1
else:
reporte["capitulos_faltantes"].append({
"codigo": codigo,
"nombre": info["nombre"],
"archivo_esperado": archivo_esperado,
"bloque": bloque_num,
"carpeta": folder_name
})
reporte["estadisticas"]["total_faltante"] += 1
# Buscar archivos huérfanos (existen pero no están en el índice)
for bloque_num, archivos in archivos_existentes.items():
folder_name = BLOQUE_TO_FOLDER[bloque_num]
for archivo in archivos:
if (bloque_num, archivo) not in archivos_verificados:
# Verificar si es documentación interna
if not archivo.startswith("_") and "DOCUMENTACION" not in str(MANUAL_DIR / folder_name):
reporte["archivos_huérfanos"].append({
"archivo": archivo,
"bloque": bloque_num,
"carpeta": folder_name,
"ruta": str((MANUAL_DIR / folder_name / archivo).relative_to(BASE_DIR))
})
reporte["estadisticas"]["total_huérfanos"] += 1
# Verificar estructura de carpetas
for bloque_num, folder_name in BLOQUE_TO_FOLDER.items():
bloque_dir = MANUAL_DIR / folder_name
if not bloque_dir.exists():
reporte["errores_estructura"].append({
"tipo": "carpeta_faltante",
"bloque": bloque_num,
"carpeta_esperada": folder_name
})
return reporte
def generar_reporte_markdown(reporte: dict) -> str:
"""Genera un reporte detallado en formato Markdown"""
md = []
md.append("# REPORTE DE VERIFICACIÓN DE ESTRUCTURA - MANUAL TES DIGITAL\n")
md.append(f"**Fecha de verificación:** {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
md.append("---\n")
# Estadísticas generales
md.append("## 📊 ESTADÍSTICAS GENERALES\n")
stats = reporte["estadisticas"]
md.append(f"- **Total de capítulos esperados:** {stats['total_esperado']}")
md.append(f"- **Total de capítulos encontrados:** {stats['total_encontrado']}")
md.append(f"- **Total de capítulos faltantes:** {stats['total_faltante']}")
md.append(f"- **Total de archivos huérfanos:** {stats['total_huérfanos']}")
md.append(f"- **Porcentaje de completitud:** {(stats['total_encontrado']/stats['total_esperado']*100):.1f}%\n")
md.append("---\n")
# Capítulos encontrados (resumen por parte)
md.append("## ✅ CAPÍTULOS ENCONTRADOS\n")
md.append(f"**Total:** {len(reporte['capitulos_encontrados'])} capítulos\n")
# Agrupar por parte
por_parte = defaultdict(list)
for cap in reporte["capitulos_encontrados"]:
codigo = cap["codigo"]
parte_num = codigo.split(".")[0]
por_parte[parte_num].append(cap)
for parte_num in sorted(por_parte.keys(), key=int):
md.append(f"\n### Parte {parte_num}")
md.append(f"**Capítulos encontrados:** {len(por_parte[parte_num])}")
for cap in sorted(por_parte[parte_num], key=lambda x: x["codigo"]):
md.append(f"- `{cap['codigo']}` - {cap['nombre']}")
md.append("\n---\n")
# Capítulos faltantes
if reporte["capitulos_faltantes"]:
md.append("## ❌ CAPÍTULOS FALTANTES\n")
md.append(f"**Total:** {len(reporte['capitulos_faltantes'])} capítulos\n")
por_parte_faltante = defaultdict(list)
for cap in reporte["capitulos_faltantes"]:
codigo = cap["codigo"]
parte_num = codigo.split(".")[0]
por_parte_faltante[parte_num].append(cap)
for parte_num in sorted(por_parte_faltante.keys(), key=int):
md.append(f"\n### Parte {parte_num}")
for cap in sorted(por_parte_faltante[parte_num], key=lambda x: x["codigo"]):
md.append(f"- `{cap['codigo']}` - **{cap['nombre']}**")
md.append(f" - Archivo esperado: `{cap['archivo_esperado']}`")
md.append(f" - Ubicación esperada: `{cap['carpeta']}/`")
else:
md.append("## ✅ TODOS LOS CAPÍTULOS ESTÁN PRESENTES\n")
md.append("\n---\n")
# Archivos huérfanos
if reporte["archivos_huérfanos"]:
md.append("## ⚠️ ARCHIVOS HUÉRFANOS (no listados en el índice)\n")
md.append(f"**Total:** {len(reporte['archivos_huérfanos'])} archivos\n")
por_bloque_huérfano = defaultdict(list)
for archivo in reporte["archivos_huérfanos"]:
por_bloque_huérfano[archivo["bloque"]].append(archivo)
for bloque_num in sorted(por_bloque_huérfano.keys()):
md.append(f"\n### Bloque {bloque_num} - {por_bloque_huérfano[bloque_num][0]['carpeta']}")
for archivo in por_bloque_huérfano[bloque_num]:
md.append(f"- `{archivo['archivo']}`")
md.append(f" - Ruta: `{archivo['ruta']}`")
else:
md.append("## ✅ NO HAY ARCHIVOS HUÉRFANOS\n")
md.append("\n---\n")
# Errores de estructura
if reporte["errores_estructura"]:
md.append("## 🔴 ERRORES DE ESTRUCTURA\n")
for error in reporte["errores_estructura"]:
if error["tipo"] == "carpeta_faltante":
md.append(f"- ❌ Carpeta faltante: `{error['carpeta_esperada']}` (Bloque {error['bloque']})")
else:
md.append("## ✅ ESTRUCTURA DE CARPETAS CORRECTA\n")
md.append("\n---\n")
# Resumen por bloques
md.append("## 📁 RESUMEN POR BLOQUES\n")
archivos_existentes = obtener_archivos_existentes()
for bloque_num in sorted(BLOQUE_TO_FOLDER.keys()):
folder_name = BLOQUE_TO_FOLDER[bloque_num]
bloque_dir = MANUAL_DIR / folder_name
md.append(f"\n### Bloque {bloque_num}: {folder_name}")
if bloque_dir.exists():
archivos_bloque = archivos_existentes.get(bloque_num, [])
md.append(f"- ✅ Carpeta existe")
md.append(f"- Archivos .md encontrados: {len(archivos_bloque)}")
# Contar capítulos esperados en este bloque
esperados_bloque = [c for c in INDICE_ESPERADO.values() if c["bloque"] == bloque_num]
md.append(f"- Capítulos esperados según índice: {len(esperados_bloque)}")
else:
md.append(f"- ❌ Carpeta NO existe")
md.append("\n---\n")
md.append("## 📝 NOTAS\n")
md.append("- Este reporte compara el índice en `INDICE_COMPLETO_MANUAL_TES.md` con los archivos reales en `manual-tes/TES_Manual_Digital/`")
md.append("- Los archivos huérfanos son archivos que existen pero no están listados en el índice")
md.append("- Se recomienda revisar los archivos huérfanos para determinar si deben agregarse al índice o eliminarse")
return "\n".join(md)
if __name__ == "__main__":
print("Verificando estructura del Manual TES Digital...")
reporte = verificar_estructura()
reporte_md = generar_reporte_markdown(reporte)
# Guardar reporte
reporte_path = BASE_DIR / "REPORTE_VERIFICACION_ESTRUCTURA.md"
with open(reporte_path, "w", encoding="utf-8") as f:
f.write(reporte_md)
print(f"\n✅ Reporte generado: {reporte_path}")
print(f"\n📊 Resumen:")
print(f" - Capítulos encontrados: {reporte['estadisticas']['total_encontrado']}/{reporte['estadisticas']['total_esperado']}")
print(f" - Capítulos faltantes: {reporte['estadisticas']['total_faltante']}")
print(f" - Archivos huérfanos: {reporte['estadisticas']['total_huérfanos']}")