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:
parent
27cac410ae
commit
a313cfe066
155
COMANDOS_DESPLIEGUE.md
Normal file
155
COMANDOS_DESPLIEGUE.md
Normal 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.
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
99
ESTRUCTURA.md
Normal 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
139
ESTRUCTURA_PROYECTO.txt
Normal 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.
|
|
@ -1 +0,0 @@
|
||||||
Archivo MD,Ruta MD,Línea,Tipo,Ruta Referenciada,Extensión,Existe,Ruta Encontrada,Contexto
|
|
||||||
|
48
abrir-carpeta.sh
Executable file
48
abrir-carpeta.sh
Executable 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"
|
||||||
|
|
||||||
|
|
@ -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']}")
|
|
||||||
|
|
@ -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: 
|
|
||||||
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': 'Sí' 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'] == 'Sí']
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
|
|
@ -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: 
|
|
||||||
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': 'Sí' 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'] == 'Sí']
|
|
||||||
|
|
||||||
# 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()
|
|
||||||
|
|
@ -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()
|
|
||||||
|
|
@ -95,11 +95,11 @@ if command -v pm2 &> /dev/null; then
|
||||||
echo -e "${YELLOW} Reiniciando aplicación existente...${NC}"
|
echo -e "${YELLOW} Reiniciando aplicación existente...${NC}"
|
||||||
pm2 restart "$APP_NAME" || {
|
pm2 restart "$APP_NAME" || {
|
||||||
echo -e "${YELLOW} Error al reiniciar, intentando iniciar...${NC}"
|
echo -e "${YELLOW} Error al reiniciar, intentando iniciar...${NC}"
|
||||||
pm2 start ecosystem.config.js
|
pm2 start ecosystem.config.cjs
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
echo -e "${YELLOW} Iniciando nueva instancia...${NC}"
|
echo -e "${YELLOW} Iniciando nueva instancia...${NC}"
|
||||||
pm2 start ecosystem.config.js
|
pm2 start ecosystem.config.cjs
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Guardar configuración PM2
|
# Guardar configuración PM2
|
||||||
|
|
|
||||||
143
desplegar.sh
Executable file
143
desplegar.sh
Executable 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}"
|
||||||
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
# Resumen de Creación del Manual TES Digital
|
# Resumen de Creación del Manual TES Digital
|
||||||
|
|
||||||
**Fecha:** 2025
|
**Fecha:** 2025
|
||||||
|
**Última actualización:** 2025-12-23
|
||||||
**Archivo Creado:** `docs/MANUAL_TES_DIGITAL.md`
|
**Archivo Creado:** `docs/MANUAL_TES_DIGITAL.md`
|
||||||
**Estado:** ✅ Completado
|
**Estado:** ✅ Completado y Desplegado
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -12,6 +13,7 @@
|
||||||
- Propósito del manual
|
- Propósito del manual
|
||||||
- Aviso legal y responsabilidad médica
|
- Aviso legal y responsabilidad médica
|
||||||
- Versión y validación
|
- Versión y validación
|
||||||
|
- **Archivos:** `BLOQUE_00_0_FUNDAMENTOS_EMERGENCIAS.md`, `BLOQUE_12_0_MARCO_LEGAL_ETICO_PROFESIONAL.md`
|
||||||
- **Etiquetas:** [DOC]
|
- **Etiquetas:** [DOC]
|
||||||
|
|
||||||
### 2. Principios Generales
|
### 2. Principios Generales
|
||||||
|
|
@ -22,26 +24,38 @@
|
||||||
- **Etiquetas:** [APP], [DOC]
|
- **Etiquetas:** [APP], [DOC]
|
||||||
|
|
||||||
### 3. Procedimientos Básicos TES
|
### 3. Procedimientos Básicos TES
|
||||||
- RCP Adulto SVB [APP]
|
- RCP Adulto SVB [APP] - `BLOQUE_04_1_RCP_ADULTOS.md`
|
||||||
- RCP Adulto SVA [APP]
|
- RCP Adulto SVA [APP] - `BLOQUE_04_5_RCP_DOS_INTERVINIENTES.md`
|
||||||
- RCP Pediátrico [APP]
|
- RCP Pediátrico [APP] - `BLOQUE_04_2_RCP_PEDIATRIA.md`, `BLOQUE_04_3_RCP_LACTANTES.md`
|
||||||
- OVACE [APP]
|
- OVACE [APP] - `BLOQUE_04_6_OVACE_ADULTOS.md`, `BLOQUE_04_7_OVACE_PEDIATRIA.md`, `BLOQUE_04_8_OVACE_LACTANTES.md`
|
||||||
- Shock hemorrágico [APP]
|
- Uso DESA [APP] - `BLOQUE_04_4_USO_DESA.md`
|
||||||
- Inmovilización espinal [APP]
|
- Inmovilización espinal [APP] - `BLOQUE_02_5_TABLERO_ESPINAL.md`, `BLOQUE_02_3_COLLARIN_CERVICAL.md`
|
||||||
- Extricación vehicular [APP]
|
- Extricación vehicular [APP] - `BLOQUE_02_7_EXTRICACION_MOVIMIENTOS_BLOQUE.md`
|
||||||
|
- Material e inmovilización [APP] - 14 archivos en BLOQUE_2
|
||||||
- **Etiquetas:** [APP]
|
- **Etiquetas:** [APP]
|
||||||
|
|
||||||
### 4. Protocolos Transtelefónicos
|
### 4. Protocolos Transtelefónicos
|
||||||
- Introducción [DOC]
|
- Introducción [DOC] - `BLOQUE_05_0_INTRODUCCION_PROTOCOLOS_TRANSTELEFONICOS.md`
|
||||||
- PCR (adultos, niños, lactantes) [APP] [IA_FUTURA]
|
- PCR transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_1_PCR_TRANSTELEFONICA.md`
|
||||||
- DESA guiado por teléfono [APP] [IA_FUTURA]
|
- OVACE transtelefónica [APP] [IA_FUTURA] - `BLOQUE_05_2_OVACE_TRANSTELEFONICA.md`
|
||||||
- OVACE transtelefónica (adultos, niños, lactantes) [APP] [IA_FUTURA]
|
- SCA transtelefónico [APP] [IA_FUTURA] - `BLOQUE_05_3_SCA_TRANSTELEFONICO.md`
|
||||||
- SCA (identificación y atención precoz) [APP] [IA_FUTURA]
|
- 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]
|
- **Etiquetas:** [APP], [DOC], [IA_FUTURA]
|
||||||
|
|
||||||
### 5. Vademécum y Abreviaturas
|
### 5. Vademécum y Abreviaturas
|
||||||
- Vademécum de fármacos (5 fármacos) [APP]
|
- Vademécum operativo [APP] - `BLOQUE_06_1_VADEMECUM_OPERATIVO.md`
|
||||||
- Abreviaturas comunes [DOC]
|
- 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]
|
- **Etiquetas:** [APP], [DOC]
|
||||||
|
|
||||||
### 6. Conducción y Seguridad Vial
|
### 6. Conducción y Seguridad Vial
|
||||||
|
|
@ -91,10 +105,11 @@
|
||||||
- ✅ SCA (identificación y atención precoz)
|
- ✅ SCA (identificación y atención precoz)
|
||||||
|
|
||||||
**Vademécum:**
|
**Vademécum:**
|
||||||
- ✅ 5 fármacos de emergencia (Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol)
|
- ✅ 6 fármacos principales de emergencia (Oxígeno, Adrenalina, Amiodarona, Atropina, Midazolam, Salbutamol)
|
||||||
- ✅ Dosis adulto y pediátrica
|
- ✅ Dosis adulto y pediátrica detalladas
|
||||||
- ✅ Indicaciones y contraindicaciones
|
- ✅ Indicaciones y contraindicaciones completas
|
||||||
- ✅ Vías de administración
|
- ✅ Vías de administración y diluciones
|
||||||
|
- ✅ Puntos críticos TES específicos
|
||||||
|
|
||||||
**Calculadoras:**
|
**Calculadoras:**
|
||||||
- ✅ Escala de Coma de Glasgow (GCS)
|
- ✅ Escala de Coma de Glasgow (GCS)
|
||||||
|
|
@ -211,12 +226,14 @@
|
||||||
## 📊 ESTADÍSTICAS DEL MANUAL
|
## 📊 ESTADÍSTICAS DEL MANUAL
|
||||||
|
|
||||||
### Contenido Total
|
### Contenido Total
|
||||||
- **Líneas:** ~1,200 líneas
|
- **Archivos .md:** 94 archivos en `public/manual/`
|
||||||
- **Capítulos:** 9 capítulos principales
|
- **Bloques temáticos:** 17 bloques/carpetas principales (BLOQUE_0 a BLOQUE_15 + otros)
|
||||||
- **Subsecciones:** ~50 subsecciones
|
- **Líneas totales:** ~47,410 líneas de contenido
|
||||||
- **Protocolos:** 15+ protocolos documentados
|
- **Subsecciones:** 94 capítulos/secciones documentados
|
||||||
- **Fármacos:** 5 fármacos en vademécum
|
- **Protocolos:** 20+ protocolos documentados
|
||||||
- **Patologías:** 10 patologías por sistemas
|
- **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
|
### Distribución por Etiquetas
|
||||||
- **[APP]:** ~70% del contenido
|
- **[APP]:** ~70% del contenido
|
||||||
|
|
@ -226,60 +243,84 @@
|
||||||
### Fuentes de Contenido Unificadas
|
### Fuentes de Contenido Unificadas
|
||||||
- ✅ Plan maestro (protocolos transtelefónicos)
|
- ✅ Plan maestro (protocolos transtelefónicos)
|
||||||
- ✅ `src/data/procedures.ts` (protocolos básicos)
|
- ✅ `src/data/procedures.ts` (protocolos básicos)
|
||||||
- ✅ `src/data/drugs.ts` (vademécum)
|
- ✅ `src/data/drugs.ts` (vademécum con 6 fármacos principales)
|
||||||
- ✅ `src/data/calculators.ts` (Glasgow, perfusiones)
|
- ✅ `src/data/calculators.ts` (Glasgow, perfusiones, calculadoras)
|
||||||
- ✅ `src/pages/Patologias.tsx` (patologías)
|
- ✅ `src/pages/Patologias.tsx` (10 patologías por sistemas)
|
||||||
- ✅ `src/pages/Escena.tsx` (seguridad, ABCDE, triage)
|
- ✅ `src/pages/Escena.tsx` (seguridad, ABCDE, triage)
|
||||||
|
- ✅ `public/manual/` (94 archivos .md organizados en 15 bloques)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ ESTADO FINAL
|
## ✅ ESTADO FINAL
|
||||||
|
|
||||||
### Completado
|
### Completado ✅
|
||||||
- ✅ Manual unificado creado
|
- ✅ Manual unificado creado (`docs/MANUAL_TES_DIGITAL.md`)
|
||||||
- ✅ Todo el contenido clínico recopilado
|
- ✅ Manual estructurado completo (94 archivos en `public/manual/`)
|
||||||
- ✅ Estructura por capítulos lógica
|
- ✅ Todo el contenido clínico recopilado y organizado
|
||||||
|
- ✅ Estructura por bloques lógica (17 bloques temáticos)
|
||||||
- ✅ Etiquetado correcto ([APP], [DOC], [IA_FUTURA])
|
- ✅ Etiquetado correcto ([APP], [DOC], [IA_FUTURA])
|
||||||
- ✅ Sin duplicados
|
- ✅ Sin duplicados
|
||||||
- ✅ Contenido ordenado y estructurado
|
- ✅ Contenido ordenado y estructurado
|
||||||
- ✅ Capítulo de evolución incluido
|
- ✅ 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)
|
### Pendiente (No bloqueante)
|
||||||
- ⏳ Validación médica del contenido
|
- ⏳ Validación médica del contenido completo
|
||||||
- ⏳ Implementación en aplicación (Fase 2)
|
- ⏳ Revisión contra guías oficiales (ERC, AHA, SEMES)
|
||||||
- ⏳ Desarrollo de flujos interactivos (Fase 3)
|
- ⏳ Desarrollo de flujos interactivos avanzados (Fase 3)
|
||||||
- ⏳ Integración de IA (Fase 4, futuro)
|
- ⏳ Integración de IA (Fase 4, futuro)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🎯 PRÓXIMOS PASOS RECOMENDADOS
|
## 🎯 PRÓXIMOS PASOS RECOMENDADOS
|
||||||
|
|
||||||
### Inmediato
|
### Inmediato (Prioridad Alta)
|
||||||
1. **Validación Médica**
|
1. **Validación Médica** ⚠️
|
||||||
- Revisión por profesionales médicos especializados
|
- Revisión por profesionales médicos especializados
|
||||||
- Validación contra guías oficiales (ERC, AHA, SEMES)
|
- Validación contra guías oficiales (ERC, AHA, SEMES)
|
||||||
- Corrección de errores o inconsistencias
|
- Corrección de errores o inconsistencias
|
||||||
|
- **Estado:** Pendiente - Requerido antes de uso en producción
|
||||||
|
|
||||||
2. **Implementación [APP]**
|
2. **Mejoras de la Aplicación** ✅ (En progreso)
|
||||||
- Convertir contenido [APP] en aplicación digital
|
- ✅ Aplicación desplegada y funcionando
|
||||||
- Crear UI para protocolos transtelefónicos
|
- ✅ Navegación del manual implementada
|
||||||
- Integrar vademécum y calculadoras
|
- ✅ Vademécum y calculadoras integradas
|
||||||
|
- ⏳ Optimización de rendimiento
|
||||||
|
- ⏳ Mejoras de UX/UI
|
||||||
|
|
||||||
### Medio Plazo
|
### Medio Plazo
|
||||||
3. **Flujos Interactivos**
|
3. **Flujos Interactivos Avanzados**
|
||||||
- Desarrollar árboles de decisión
|
- Desarrollar árboles de decisión interactivos
|
||||||
- Implementar validación de pasos
|
- Implementar validación de pasos en protocolos
|
||||||
- Crear navegación condicional
|
- 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
|
### Largo Plazo
|
||||||
4. **IA de Apoyo (si se valida seguridad)**
|
5. **IA de Apoyo (si se valida seguridad)**
|
||||||
- Análisis de audio para validación de técnica
|
- Análisis de audio para validación de técnica RCP
|
||||||
- Sugerencias contextuales
|
- Sugerencias contextuales durante protocolos
|
||||||
- Aprendizaje continuo
|
- Aprendizaje continuo y mejora de recomendaciones
|
||||||
|
- **Importante:** Solo después de validación médica completa
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Manual creado exitosamente** ✅
|
**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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
@ -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?**
|
|
||||||
|
|
@ -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?**
|
|
||||||
|
|
@ -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
|
|
||||||
```
|
|
||||||
|
|
@ -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)
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
**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.**
|
|
||||||
|
|
@ -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%) ❌
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
- 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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 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 `` 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.
|
|
||||||
|
|
@ -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
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Paso 2: Parte Posterior
|
|
||||||
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
**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.
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
#### Opción 2: Ruta relativa desde `public/`
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
#### Opción 3: Ruta relativa con `../`
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
**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
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### Bloque 2 - Inmovilización
|
|
||||||
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### Bloque 3 - Material Sanitario
|
|
||||||
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 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 -->
|
|
||||||

|
|
||||||
|
|
||||||
<!-- Se convierte automáticamente a -->
|
|
||||||
<img src="/assets/infografias/bloque-2-inmovilizacion/imagen.png" />
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ BUENAS PRÁCTICAS
|
|
||||||
|
|
||||||
### 1. Usar rutas absolutas (recomendado)
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
**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:
|
|
||||||

|
|
||||||
|
|
||||||
❌ Malo:
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Organizar por bloque
|
|
||||||
```markdown
|
|
||||||
<!-- Bloque 2 - Inmovilización -->
|
|
||||||

|
|
||||||
|
|
||||||
<!-- 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
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**Descripción:**
|
|
||||||
- Mantener inmovilización manual
|
|
||||||
- Medir talla aproximada
|
|
||||||
- Preparar collarín
|
|
||||||
|
|
||||||
### Paso 2: Parte Posterior
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**Descripción:**
|
|
||||||
- Colocar parte posterior del collarín
|
|
||||||
- Mantener control manual
|
|
||||||
- Verificar posición
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Última actualización:** 2025-12-23
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
**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: ``
|
|
||||||
- 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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
@ -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 | - |
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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: ``
|
|
||||||
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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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`
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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! 🎉**
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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:** _______________
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
**Proyecto:** EMERGES TES - Protocolo Rápido
|
**Proyecto:** EMERGES TES - Protocolo Rápido
|
||||||
**Fecha de Análisis:** 2025-12-23
|
**Fecha de Análisis:** 2025-12-23
|
||||||
**Ruta del Proyecto:** `/home/planetazuzu/protocolo-r-pido`
|
**Ruta del Proyecto:** `/home/planetazuzu/guia-tes`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,11 @@
|
||||||
- [x] **display** - `standalone` configurado
|
- [x] **display** - `standalone` configurado
|
||||||
- [x] **theme_color** - `#1a1f2e` configurado
|
- [x] **theme_color** - `#1a1f2e` configurado
|
||||||
- [x] **background_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] **scope** - `/` configurado
|
||||||
- [x] **shortcuts** - Configurado (Manual Completo)
|
- [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 ✅
|
### 2. Service Worker ✅
|
||||||
- [x] **Archivo presente** - `public/sw.js`
|
- [x] **Archivo presente** - `public/sw.js`
|
||||||
|
|
@ -53,17 +54,25 @@
|
||||||
|
|
||||||
## ⚠️ MEJORAS OPCIONALES
|
## ⚠️ MEJORAS OPCIONALES
|
||||||
|
|
||||||
### Iconos Específicos
|
### Iconos Específicos ✅
|
||||||
- [ ] Crear iconos PNG 192x192 y 512x512 específicos
|
- [x] Crear iconos PNG 192x192 y 512x512 específicos
|
||||||
- [ ] Añadir iconos maskable para Android
|
- [x] Añadir iconos maskable para Android
|
||||||
- [ ] Optimizar iconos para diferentes dispositivos
|
- [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
|
### Screenshots ⏳
|
||||||
- [ ] Añadir screenshots al manifest para mejor presentación en stores
|
- [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)
|
- [ ] Implementar notificaciones push (requiere backend)
|
||||||
- [ ] Configurar permisos de notificaciones
|
- [ ] 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 |
|
| Requisito | Estado | Notas |
|
||||||
|-----------|--------|-------|
|
|-----------|--------|-------|
|
||||||
| **Manifest** | ✅ Completo | Falta iconos PNG específicos (opcional) |
|
| **Manifest** | ✅ Completo | Iconos PNG y maskable añadidos |
|
||||||
| **Service Worker** | ✅ Completo | Funcionando correctamente |
|
| **Service Worker** | ✅ Completo | Funcionando correctamente |
|
||||||
| **HTTPS** | ✅ Requerido | En producción |
|
| **HTTPS** | ✅ Requerido | En producción |
|
||||||
| **Meta Tags** | ✅ Completo | Todos configurados |
|
| **Meta Tags** | ✅ Completo | Todos configurados |
|
||||||
| **Instalación** | ✅ Completo | Banner implementado |
|
| **Instalación** | ✅ Completo | Banner implementado |
|
||||||
| **Offline** | ✅ Completo | Funciona correctamente |
|
| **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
|
- ✅ Banner de instalación implementado
|
||||||
|
|
||||||
**Mejoras opcionales:**
|
**Mejoras opcionales:**
|
||||||
- Iconos PNG específicos (192x192, 512x512)
|
- ✅ Iconos PNG específicos (192x192, 512x512) - **COMPLETADO**
|
||||||
- Screenshots para manifest
|
- ✅ Iconos maskable para Android - **COMPLETADO**
|
||||||
- Notificaciones push (requiere backend)
|
- ⏳ Screenshots para manifest - **Manifest actualizado, pendiente generar imágenes**
|
||||||
|
- ⏸️ Notificaciones push (requiere backend) - **Pendiente**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
|
|
@ -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()
|
|
||||||
|
|
@ -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: 
|
|
||||||
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!")
|
|
||||||
|
|
@ -12,7 +12,7 @@ import json
|
||||||
|
|
||||||
# Configuración
|
# Configuración
|
||||||
EXCEL_PATH = "/home/planetazuzu/Imágenes/medios de app/Manual_TES_Assets_Tracker.xlsx"
|
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"
|
EXCEL_DEST = REPO_ROOT / "Manual_TES_Assets_Tracker.xlsx"
|
||||||
ASSETS_PLAN = REPO_ROOT / "ASSETS_PLAN.md"
|
ASSETS_PLAN = REPO_ROOT / "ASSETS_PLAN.md"
|
||||||
MANIFEST_PATH = REPO_ROOT / "manifest.json"
|
MANIFEST_PATH = REPO_ROOT / "manifest.json"
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
@ -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
59
mostrar-estructura.sh
Executable 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 ""
|
||||||
|
|
||||||
BIN
public/icon-192-maskable.png
Normal file
BIN
public/icon-192-maskable.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
public/icon-192.png
Normal file
BIN
public/icon-192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 57 KiB |
BIN
public/icon-512-maskable.png
Normal file
BIN
public/icon-512-maskable.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 224 KiB |
BIN
public/icon-512.png
Normal file
BIN
public/icon-512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 335 KiB |
|
|
@ -16,28 +16,62 @@
|
||||||
"src": "/favicon.svg",
|
"src": "/favicon.svg",
|
||||||
"sizes": "any",
|
"sizes": "any",
|
||||||
"type": "image/svg+xml",
|
"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",
|
"src": "/favicon.ico",
|
||||||
"sizes": "256x256",
|
"sizes": "256x256",
|
||||||
"type": "image/x-icon",
|
"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"
|
"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": [
|
"shortcuts": [
|
||||||
{
|
{
|
||||||
"name": "Manual Completo",
|
"name": "Manual Completo",
|
||||||
|
|
|
||||||
20
public/sw.js
20
public/sw.js
|
|
@ -33,9 +33,25 @@ self.addEventListener('install', (event) => {
|
||||||
caches.open(CACHE_NAME)
|
caches.open(CACHE_NAME)
|
||||||
.then((cache) => {
|
.then((cache) => {
|
||||||
console.log('[SW] Caching static assets');
|
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
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
# Script de reorganización del Manual TES Digital
|
# Script de reorganización del Manual TES Digital
|
||||||
# FASE 5: Reorganización del Proyecto MD
|
# 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
|
cd "$BASE_DIR" || exit 1
|
||||||
|
|
||||||
echo "======================================================================"
|
echo "======================================================================"
|
||||||
|
|
|
||||||
348
scripts/diagnostico_errores.md
Normal file
348
scripts/diagnostico_errores.md
Normal 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
114
scripts/generar_iconos_pwa.py
Executable 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()
|
||||||
|
|
||||||
101
scripts/generar_screenshots.md
Normal file
101
scripts/generar_screenshots.md
Normal 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
81
scripts/generar_screenshots.sh
Executable 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
|
||||||
|
|
||||||
81
scripts/limpiar_errores_desarrollo.sh
Executable file
81
scripts/limpiar_errores_desarrollo.sh
Executable 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 ""
|
||||||
|
|
||||||
|
|
@ -2,5 +2,5 @@
|
||||||
echo "🚀 Iniciando servidor de desarrollo..."
|
echo "🚀 Iniciando servidor de desarrollo..."
|
||||||
echo "📍 URL: http://localhost:8096"
|
echo "📍 URL: http://localhost:8096"
|
||||||
echo ""
|
echo ""
|
||||||
cd /home/planetazuzu/protocolo-r-pido
|
cd /home/planetazuzu/guia-tes
|
||||||
npm run dev
|
npm run dev
|
||||||
|
|
|
||||||
24
src/App.tsx
24
src/App.tsx
|
|
@ -52,13 +52,13 @@ const App = () => {
|
||||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary>
|
<QueryClientProvider client={queryClient}>
|
||||||
<QueryClientProvider client={queryClient}>
|
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
|
||||||
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
|
<TooltipProvider>
|
||||||
<TooltipProvider>
|
<Toaster />
|
||||||
<Toaster />
|
<Sonner />
|
||||||
<Sonner />
|
<BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
|
||||||
<BrowserRouter>
|
<ErrorBoundary>
|
||||||
<div className="min-h-screen bg-background flex flex-col">
|
<div className="min-h-screen bg-background flex flex-col">
|
||||||
<Header
|
<Header
|
||||||
onSearchClick={() => setIsSearchOpen(true)}
|
onSearchClick={() => setIsSearchOpen(true)}
|
||||||
|
|
@ -118,11 +118,11 @@ const App = () => {
|
||||||
onClose={() => setIsMenuOpen(false)}
|
onClose={() => setIsMenuOpen(false)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</BrowserRouter>
|
</ErrorBoundary>
|
||||||
</TooltipProvider>
|
</BrowserRouter>
|
||||||
</ThemeProvider>
|
</TooltipProvider>
|
||||||
</QueryClientProvider>
|
</ThemeProvider>
|
||||||
</ErrorBoundary>
|
</QueryClientProvider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import React, { Component, ErrorInfo, ReactNode } from 'react';
|
import React, { Component, ErrorInfo, ReactNode } from 'react';
|
||||||
import { AlertTriangle, Home, RefreshCw } from 'lucide-react';
|
import { AlertTriangle, Home, RefreshCw } from 'lucide-react';
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
|
|
|
||||||
|
|
@ -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']}")
|
|
||||||
Loading…
Reference in a new issue