Compare commits

...

10 commits

Author SHA1 Message Date
planetazuzu 0201f16cf4 Update lab configuration 2026-03-22
Some checks are pending
Auto Deploy to Server / deploy (push) Waiting to run
2026-03-22 22:50:29 +01:00
Cerebromaniaco e56dd8bfc2 chore: add project config 2026-03-11 22:06:28 +01:00
Cerebromaniaco c9825db32a docs: initialize project - cleanup focus 2026-03-11 22:06:06 +01:00
Cerebromaniaco d26dc0f700 docs: mejora README con badges y autor, actualiza package.json, añade LICENSE 2026-02-28 14:21:58 +01:00
Javier e6e87322df docschore: cleanup, update deps, refactor data schemas 2026-02-27 15:37:22 +01:00
planetazuzu 975892ecd4 chore: actualizar .gitignore para excluir builds y node_modules 2026-01-25 21:11:47 +01:00
planetazuzu 5d7a6500fe refactor: Fase 1 - Clean Architecture, refactorización modular y eliminación de duplicidades
-  Ticket 1.1: Estructura Clean Architecture en backend
-  Ticket 1.2: Schemas Zod compartidos
-  Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares)
-  Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares)
-  Ticket 1.5: Eliminación de duplicidades (~50 líneas)

Cambios principales:
- Creada estructura Clean Architecture en backend/src/
- Schemas Zod compartidos en backend/src/shared/schemas/
- Refactorización modular de drugs y procedures
- Utilidades genéricas en src/utils/ (filter, validation)
- Eliminados scripts obsoletos y documentación antigua
- Corregidos errores: QueryClient, import test-error-handling
- Build verificado y funcionando correctamente
2026-01-25 21:09:47 +01:00
planetazuzu 8cffa970d3 Render ABCDE section 4 visuals 2026-01-20 21:17:27 +01:00
planetazuzu 4e2efa0bed Add missing assets and update RCP references 2026-01-20 20:10:40 +01:00
planetazuzu a58d436505 Update ABCDE section 3 infographic 2026-01-20 11:00:35 +01:00
6932 changed files with 1135100 additions and 102218 deletions

10
.dockerignore Normal file → Executable file
View file

@ -38,10 +38,14 @@ _BACKUP_MD/
MANUAL_TES_DIGITAL/
imagenes-pendientes/
# Scripts (no necesario en producción)
scripts/
# Scripts (no necesario en producción) - EXCEPTO verify-build.js
scripts/*.sh
scripts/*.ts
scripts/deploy/
scripts/consolidated/
!scripts/verify-build.js
*.py
*.sh
!deploy-docker.sh
# Configuraciones de desarrollo

0
.github/workflows/deploy.yml vendored Normal file → Executable file
View file

89
.gitignore vendored Normal file → Executable file
View file

@ -1,56 +1,69 @@
# Logs
logs
# Dependencies
node_modules
admin-panel/node_modules/
backend/node_modules/
# Environment variables
.env
.env.local
.env.*.local
backend/.env
# Build outputs
dist
build
.admin-panel/dist
backend/dist
# Runtime data
*.log
logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
.pnpm-debug.log*
node_modules
dist
dist-ssr
*.local
# Variables de entorno
.env
.env.local
.env.production
.env.development
# Coverage directory
coverage
.nyc_output
# Editor directories and files
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# Archivos temporales y de desarrollo
*.pyc
__pycache__/
*.swp
*.swo
*~
# Archivos de documentación temporal (opcional - descomentar si no quieres subirlos)
# *.md
# !README.md
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Archivos de copia de seguridad
*.bak
*.backup
backup_manual_pre_limpieza/
# Contexto de IA
.ai/
*.ai.md
.ai-assistant.md
# Build outputs (añadido por auditoría de limpieza)
dist/
# Documentación interna
docs/internal/
# Logs (añadido por auditoría de limpieza)
logs/*.log
# Archivos MD internos específicos
docs/BACKLOG_MICRO_TICKETS.md
docs/QUE_FALTA.md
docs/CONTENIDO_FALTANTE.md
SPEC.md
README_TODO.md
auditoria-assets-completa.md
MEDIOS_REALES_NECESARIOS_FILTRADO.md
# Backup files (añadido por auditoría de limpieza)
*.backup
*.bak
# Temporary files
tmp
temp

49
.planning/PROJECT.md Executable file
View file

@ -0,0 +1,49 @@
# EMERGES TES - Limpieza y Arreglos
## What This Is
Copia del proyecto EMERGES TES (Guía Digital de Protocolos de Emergencias para TES) enfocada en limpieza de código, eliminación de código muerto y arreglos técnicos.
## Core Value
Mantener la funcionalidad existente mientras se mejora la calidad del código y se elimina deuda técnica.
## Requirements
### Validated
(None yet - ship to validate)
### Active
- [ ] Limpiar código muerto y archivos sin usar
- [ ] Arreglar errores y warnings en el código
- [ ] Eliminar deuda técnica (código duplicado, patrones inconsistentes)
- [ ] Arreglar bugs conocidos
- [ ] Mejorar consistencia del código
### Out of Scope
- [ ] Nuevas funcionalidades - solo limpieza
- [ ] Cambios de arquitectura mayores
## Context
Proyecto existente con:
- Frontend: React 19 + TypeScript + Vite + Tailwind
- Backend: Express + PostgreSQL + Clean Architecture
- PWA para emergencias médicas
## Constraints
- **[Stack]**: Mantener tecnologías actuales — No cambiar framework
- **[Funcionalidad]**: No romper features existentes — Todos los tests deben pasar
## Key Decisions
| Decision | Rationale | Outcome |
|----------|-----------|---------|
| Modo interactivo | Preferimos aprobar cada paso | — Pending |
---
*Last updated: 2026-03-11 after initialization*

14
.planning/config.json Executable file
View file

@ -0,0 +1,14 @@
{
"mode": "interactive",
"granularity": "standard",
"parallelization": true,
"commit_docs": true,
"model_profile": "balanced",
"workflow": {
"research": true,
"plan_check": true,
"verifier": true,
"nyquist_validation": true,
"auto_advance": false
}
}

0
Dockerfile Normal file → Executable file
View file

View file

@ -1,19 +0,0 @@
# ⚡ COMANDO PARA EJECUTAR
Ejecuta este comando en tu terminal:
```bash
cd /home/planetazuzu/guia-tes/backend
bash crear-usuario-y-bd.sh
```
Este script:
- ✅ Crea el usuario `planetazuzu` con password `Monforte.1977`
- ✅ Crea la base de datos `emerges_tes`
- ✅ Crea el esquema `emerges_content`
- ✅ Da todos los permisos necesarios
**Después de ejecutarlo, avísame y continúo automáticamente con:**
- Verificar conexión
- Crear tablas (migraciones)
- Migrar contenido

View file

@ -1,31 +0,0 @@
# 📊 ESTADO ACTUAL - FASE 1
## ✅ COMPLETADO
1. ✅ **Dependencias instaladas** (`npm install` en backend)
2. ✅ **Archivo `.env` configurado** con tus credenciales:
- Usuario: `planetazuzu`
- Password: `Monforte.1977`
- Base de datos: `emerges_tes`
3. ✅ **Scripts creados**:
- `backend/scripts/verify-setup.js` - Verificar conexión
- `backend/scripts/db-create.js` - Crear tablas
- `backend/scripts/migrate-content.js` - Migrar contenido
- `backend/scripts/create-user.sql` - SQL para crear usuario
- `backend/crear-usuario-y-bd.sh` - Script bash para ejecutar
4. ✅ **Conexión verificada** a PostgreSQL
5. ✅ **Migraciones ejecutadas** (esquema y funciones)
6. ✅ **Contenido migrado** (protocolos y fármacos)
## ✅ ESTADO ACTUAL
La base de datos `emerges_tes` y el esquema `emerges_content` ya están creados,
las migraciones se ejecutaron correctamente y el contenido fue migrado.
## 📁 ARCHIVOS IMPORTANTES
- `backend/.env` - Configuración de base de datos
- `backend/crear-usuario-y-bd.sh` - Script para crear usuario (EJECUTAR ESTE)
- `database/migrations/001_create_schema.sql` - Esquema de tablas
- `database/migrations/002_create_functions.sql` - Funciones y triggers

View file

@ -1,98 +0,0 @@
# 📁 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
└── 📂 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`, `docker.sh`
- Scripts de limpieza: `cleanup.sh`
- Scripts de utilidad: `integrate-assets.py`, `generate-docs.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
tree -L 2
```
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
```

View file

@ -1,93 +0,0 @@
═══════════════════════════════════════════════════════════
ESTRUCTURA DEL PROYECTO: guia-tes
═══════════════════════════════════════════════════════════
📁 CARPETAS PRINCIPALES:
───────────────────────────────────────────────────────────
📂 assets/ (0 archivos, 136K)
📂 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)
📄 components.json (414)
📄 deploy.sh (4,0K)
📄 docker-compose.prod.yml (995)
📄 docker-compose.yml (654)
📄 ecosystem.config.js (852)
📄 eslint.config.js (765)
📄 manifest.json (33K)
📄 package.json (3,3K)
📄 package-lock.json (339K)
📄 postcss.config.js (81)
📄 README.md (1,3K)
📄 reorganizar_proyecto.sh (3,0K)
📄 tailwind.config.ts (3,9K)
📄 tsconfig.app.json (652)
📄 tsconfig.json (369)
📄 tsconfig.node.json (481)
📄 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_Y_DOCUMENTACION
public/manual/BLOQUE_9_MEDICINA_EMERGENCIAS_APLICADA
═══════════════════════════════════════════════════════════
RESUMEN
═══════════════════════════════════════════════════════════
Total archivos: 1233
Total carpetas: 229

21
LICENSE Executable file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Javier Fernández (@planetazuzu)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

0
MANIFESTO_MEDIOS.json Normal file → Executable file
View file

File diff suppressed because it is too large Load diff

View file

@ -1,530 +0,0 @@
# Medios reales necesarios (derivado de referencias en docs/)
Este listado incluye referencias en documentación que no son placeholders evidentes.
## Medios reales necesarios
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 172
- diagrama_abcde_paso_a_paso_completo.svg | public/assets/infografias/bloque-0-fundamentos/diagrama_abcde_paso_a_paso_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 48
- diagrama_abcde_paso_a_paso_completo.svg | diagrama_abcde_paso_a_paso_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 53
- diagrama_abcde_paso_a_paso_completo.svg | /assets/infografias/bloque-0-fundamentos/diagrama_abcde_paso_a_paso_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 59
- rcp_adulto_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 150
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 161
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 172
- rcp_pediatrica_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_pediatrica_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 177
- rcp_lactantes_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_lactantes_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 185
- diagrama_uso_desa.png | public/assets/infografias/bloque-4-rcp/diagrama_uso_desa.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 193
- diagrama_uso_desa.png | diagrama_uso_desa.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 198
- ovace_adulto.png | public/assets/infografias/bloque-4-rcp/ovace_adulto.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 205
- ovace_adulto.png | ovace_adulto.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 210
- ovace_pediatrica.png | public/assets/infografias/bloque-4-rcp/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 217
- ovace_lactantes.png | public/assets/infografias/bloque-4-rcp/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 225
- flujo_rcp_adulto_telefono.svg | flujo_rcp_adulto_telefono.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 250
- rcp_posicion_manos_adulto.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 361
- rcp_posicion_manos_adulto.png | rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 362
- rcp_posicion_manos_adulto.png | /assets/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 363
- rcp_profundidad_compresiones.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_profundidad_compresiones.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 384
- rcp_profundidad_compresiones.png | rcp_profundidad_compresiones.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 385
- rcp_profundidad_compresiones.png | /assets/infografias/rcp/rcp_profundidad_compresiones.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 386
- rcp_adulto_svb.mp4 | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 407
- rcp_adulto_svb_thumb.jpg | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb_thumb.jpg | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 408
- rcp_adulto_svb.mp4 | rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 409
- rcp_adulto_svb.mp4 | /assets/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 410
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 60
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 61
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 415
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 416
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 42
- rcp_page.png | rcp_page.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MODERNIZACION_TECNOLOGICA.md, línea 946
- diagrama_abcde_paso_a_paso_completo.svg | bloque-0-fundamentos/diagrama_abcde_paso_a_paso_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 12
- rcp_adulto_paso_a_paso.png | bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 20
- rcp_pediatrica_paso_a_paso.png | bloque-4-rcp/rcp_pediatrica_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 21
- rcp_lactantes_paso_a_paso.png | bloque-4-rcp/rcp_lactantes_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 22
- diagrama_uso_desa.png | bloque-4-rcp/diagrama_uso_desa.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 23
- ovace_adulto.png | bloque-4-rcp/ovace_adulto.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 24
- ovace_pediatrica.png | bloque-4-rcp/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 25
- ovace_lactantes.png | bloque-4-rcp/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 26
- rcp_posicion_manos_adulto.png | rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/PLAN_TECNICO_SISTEMA_CONTENIDO.md, línea 98
- rcp_posicion_manos_adulto.png | rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/PLAN_TECNICO_SISTEMA_CONTENIDO.md, línea 666
- rcp_adulto_svb.mp4 | rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/PLAN_TECNICO_SISTEMA_CONTENIDO.md, línea 669
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 59
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 89
- priorizacion_vital_enfoque_abcde.png | priorizacion_vital_enfoque_abcde.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 89
- seleccion_talla_collarin_2.png | public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 191
- algoritmo_rcp_comentado.svg | /assets/infografias/bloque-4-rcp/algoritmo_rcp_comentado.svg | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 231
- compresiones_incorrectas.png | /assets/infografias/bloque-4-rcp/compresiones_incorrectas.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 232
- compresiones_correctas.png | /assets/infografias/bloque-4-rcp/compresiones_correctas.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 233
- descompresion_incompleta.png | /assets/infografias/bloque-4-rcp/descompresion_incompleta.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 234
- descompresion_completa.png | /assets/infografias/bloque-4-rcp/descompresion_completa.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 235
- resumen_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/resumen_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 236
- rcp_posicion_manos_adulto.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 225
- rcp_posicion_manos_adulto.png | rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 226
- rcp_posicion_manos_adulto.png | /assets/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 227
- rcp_adulto_svb.mp4 | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 249
- rcp_adulto_svb_thumb.jpg | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb_thumb.jpg | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 250
- rcp_adulto_svb.mp4 | rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 251
- rcp_adulto_svb.mp4 | /assets/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 252
- rcp_posicion_manos_adulto.png | rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/API_ENDPOINTS_ESPECIFICACION.md, línea 504
- rcp_posicion_manos_adulto.png | /media/images/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/API_ENDPOINTS_ESPECIFICACION.md, línea 505
- introduccion_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/introduccion_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_RCP_ADULTO_SVB.md, línea 41
- introduccion_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/introduccion_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_RCP_ADULTO_SVB.md, línea 41
## Medios con ambigüedad (revisión manual)
- imagen_presion_directa.jpg | imagen_presion_directa.jpg | /home/planetazuzu/guia-tes/docs/DISENO_FUNCIONAL_PANEL_ADMINISTRACION.md, línea 247
- tabla_rangos_normales_constantes_vitales.png | public/assets/infografias/bloque-0-fundamentos/tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 23
- tabla_rangos_normales_constantes_vitales.png | tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 28
- tabla_rangos_normales_constantes_vitales.png | /assets/infografias/bloque-0-fundamentos/tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 43
- tabla_escala_glasgow.png | public/assets/infografias/bloque-0-fundamentos/tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 70
- tabla_escala_glasgow.png | tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 75
- diagrama_start_completo.svg | public/assets/infografias/bloque-0-fundamentos/diagrama_start_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 82
- guia_inmovilizacion_manual.png | public/assets/infografias/bloque-2-inmovilizacion/guia_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 94
- guia_inmovilizacion_manual.png | guia_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 99
- diagrama_uso_tablero_espinal.png | public/assets/infografias/bloque-2-inmovilizacion/diagrama_uso_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 106
- infografia_transferencias_seguras.png | public/assets/infografias/bloque-2-inmovilizacion/infografia_transferencias_seguras.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 114
- guia_aspiracion.png | public/assets/infografias/bloque-3-material-sanitario/guia_aspiracion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 126
- guia_aspiracion.png | guia_aspiracion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 131
- organizacion_maletin.png | public/assets/infografias/bloque-3-material-sanitario/organizacion_maletin.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 138
- rcp_adulto_paso_a_paso.png | rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 155
- farmacologia_basica_visual.png | public/assets/infografias/bloque-6-farmacologia/farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 260
- farmacologia_basica_visual.png | farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 267
- tabla_dosis_pediatricas.png | public/assets/infografias/bloque-6-farmacologia/tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 273
- vias_administracion.png | public/assets/infografias/bloque-6-farmacologia/vias_administracion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 282
- tema_descripcion.png | tema_descripcion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 320
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 163
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 171
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 179
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | public/assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 40
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 44
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | public/assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 51
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 97
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.svg | ABCDE_PIRAMIDE_PRIORIDAD_VITAL.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 101
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 106
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.svg | ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 110
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 115
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.svg | ABCDE_FLUJO_DETERIORO_FISIOLOGICO.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 119
- .png | .png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 127
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 163
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 171
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_MEDIOS_VISUALES.md, línea 179
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 133
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 26
- TES.svg | TES.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 27
- diagrama_seleccion_dispositivo_oxigenoterapia.png | diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 28
- fast_transtelefonico.png | fast_transtelefonico.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 29
- flujo_desa_telefono.png | flujo_desa_telefono.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 30
- flujo_rcp_transtelefonica.png | flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 31
- guia_colocacion_dispositivos_oxigenoterapia.png | guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 32
- START.svg | START.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 33
- tabla_rangos_fio2_oxigenoterapia.png | tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 34
- tabla_rangos_fio2_oxigenoterapia1.png | tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 35
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 46
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 49
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 61
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 64
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 79
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 80
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 81
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 84
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 85
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 86
- TES.svg | TES.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 95
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 96
- START.svg | START.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 97
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 121
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 133
- .png | .png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 147
- .png | .png | /home/planetazuzu/guia-tes/docs/VERIFICACION_RUTAS_ASSETS_BLOQUE_0.md, línea 148
- hemorragia_presion_directa.jpg | hemorragia_presion_directa.jpg | /home/planetazuzu/guia-tes/docs/FASE_C_MODELO_DATOS_CANONICO.md, línea 212
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 145
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 50
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 55
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 13
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.jpg | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.jpg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 14
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 15
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL_V2.png | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL_V2.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 25
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | public/assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 35
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 50
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 55
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/INSTRUCCIONES_SUBIR_INFOGRAFIA.md, línea 70
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 508
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 510
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 512
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 497
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 498
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 499
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 508
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 510
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/MEDIOS_VISUALES_SECCION_2_ABCDE.md, línea 512
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 5
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 8
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 9
- favicon.svg | favicon.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 25
- favicon.svg | /home/planetazuzu/guia-tes/public/favicon.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 26
- icon_512.png | icon_512.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 30
- icon_512.png | /home/planetazuzu/guia-tes/public/icon_512.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 31
- icon_512_maskable.png | icon_512_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 35
- icon_512_maskable.png | /home/planetazuzu/guia-tes/public/icon_512_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 36
- icon_192_maskable.png | icon_192_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 40
- icon_192_maskable.png | /home/planetazuzu/guia-tes/public/icon_192_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 41
- icon_192.png | icon_192.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 45
- icon_192.png | /home/planetazuzu/guia-tes/public/icon_192.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 46
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 55
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 56
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 65
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 66
- posicion_tes_inmovilizacion_manual.png | posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 70
- posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 71
- componentes_colchon_vacio.png | componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 75
- componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 76
- errores_frecuentes_collarin_cervical.png | errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 80
- errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 81
- seleccion_talla_collarin_medicion_anatomica.png | seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 85
- seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 86
- seleccion_talla_collarin_tabla_tallas.png | seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 90
- seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 91
- colocacion_collarin_paso_5_verificacion.png | colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 95
- colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 96
- seleccion_talla_collarin_cervical1.png | seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 100
- seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 101
- colocacion_collarin_paso_6_liberacion_controlada.png | colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 105
- colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 106
- colocacion_collarin_paso_4_ajuste_cierres.png | colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 110
- colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 111
- seleccion_talla_collarin_error_demasiado_grande.png | seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 115
- seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 116
- tecnica_sujecion_manual_cervical.png | tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 120
- tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 121
- seleccion_talla_collarin_cervical.png | seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 125
- seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 126
- colocacion_collarin_paso_2_parte_posterior.png | colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 130
- colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 131
- componentes_camilla_cuchara.png | componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 135
- componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 136
- componentes_tablero_espinal.png | componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 140
- componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 141
- colocacion_colchon_vacio_paso_a_paso.png | colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 145
- colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 146
- situaciones_que_requieren_inmovilizacion.png | situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 150
- situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 151
- colocacion_collarin_paso_1_preparacion.png | colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 155
- colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 156
- colocacion_collarin_paso_3_parte_anterior.png | colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 160
- colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 161
- secuencia_transicion_inmovilizacion.png | secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 165
- secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 166
- componentes_sistema_inmovilizacion.png | componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 170
- componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 171
- verificaciones_post_colocacion_collarin.png | verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 175
- verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 176
- coordinacion_equipo_inmovilizacion.png | coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 180
- coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 181
- uso_correcto_pulsioximetro.png | uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 185
- uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 186
- configuracion_maxima_fio2_bolsa_mascarilla.png | configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 190
- configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 191
- canulas_guedel_nasofaringea.png | canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 195
- canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 196
- uso_correcto_ambu.png | uso_correcto_ambu.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 200
- uso_correcto_ambu.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_ambu.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 201
- dispositivos_supragloticos_guia.png | dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 205
- dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 206
- uso_correcto_tensiometro.png | uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 210
- uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 211
- interpretacion_constantes_semaforo.png | interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 215
- interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 216
- ventilacion_medios_fortuna.png | ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 220
- ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 221
- registro_constantes_vitales.png | registro_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 225
- registro_constantes_vitales.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/registro_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 226
- configuracion_gps_antes_de_salir.png | configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 230
- configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-7-conduccion/configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 231
- flujo_rcp_transtelefonica.png | flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 235
- flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 236
- farmacologia_basica_visual.png | farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 240
- farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 241
- flujo_desa_telefono.png | flujo_desa_telefono.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 245
- flujo_desa_telefono.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/flujo_desa_telefono.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 246
- tabla_dosis_pediatricas.png | tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 250
- tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 251
- sistema_abcde_prioridades_emergencias.png | sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 255
- sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 256
- tabla_rangos_fio2_oxigenoterapia1.png | tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 260
- tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 261
- vias_administracion.png | vias_administracion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 265
- vias_administracion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/vias_administracion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 266
- sistema_abcde_prioridades_emergencias.webp | sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 270
- sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 271
- rcp_adulto_paso_a_paso.png | rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 275
- rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 276
- ovace_pediatrica.png | ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 280
- ovace_pediatrica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 281
- guia_colocacion_dispositivos_oxigenoterapia.png | guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 285
- guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 286
- tabla_escala_glasgow.png | tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 290
- tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 291
- el_orden_importa_maeious_que_la_velocidad.png | el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 295
- el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 296
- diagrama_flujo_start_triaje_es.svg | diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 300
- diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 301
- tabla_rangos_normales_constantes_vitales.png | tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 305
- tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 306
- tabla_rangos_fio2_oxigenoterapia.png | tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 310
- tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 311
- priorizaciaeioun_vital_el_enfoque_abcde.png | priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 315
- priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 316
- fast_transtelefonico.png | fast_transtelefonico.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 320
- fast_transtelefonico.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/fast_transtelefonico.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 321
- ovace_lactantes.png | ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 325
- ovace_lactantes.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 326
- abcde_introduccion_estructura_mental.svg | abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 330
- abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 331
- el_orden_importa_maeious_que_la_velocidad.webp | el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 335
- el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 336
- priorizaciaeioun_vital_el_enfoque_abcde.webp | priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 340
- priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 341
- diagrama_seleccion_dispositivo_oxigenoterapia.png | diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 345
- diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 346
- diagrama_decisiones_eticas_urgencias.png | diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 350
- diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-12-marco-legal/diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 351
- diagrama_decisiones_eticas.png | diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 355
- diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-12-marco-legal/diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 356
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 362
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 363
- favicon.svg | favicon.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 380
- favicon.svg | /home/planetazuzu/guia-tes/public/favicon.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 381
- icon_512.png | icon_512.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 385
- icon_512.png | /home/planetazuzu/guia-tes/public/icon_512.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 386
- icon_512_maskable.png | icon_512_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 390
- icon_512_maskable.png | /home/planetazuzu/guia-tes/public/icon_512_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 391
- icon_192_maskable.png | icon_192_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 395
- icon_192_maskable.png | /home/planetazuzu/guia-tes/public/icon_192_maskable.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 396
- icon_192.png | icon_192.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 400
- icon_192.png | /home/planetazuzu/guia-tes/public/icon_192.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 401
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 410
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 411
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 420
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 421
- posicion_tes_inmovilizacion_manual.png | posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 425
- posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 426
- componentes_colchon_vacio.png | componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 430
- componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_colchon_vacio.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 431
- errores_frecuentes_collarin_cervical.png | errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 435
- errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/errores_frecuentes_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 436
- seleccion_talla_collarin_medicion_anatomica.png | seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 440
- seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_medicion_anatomica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 441
- seleccion_talla_collarin_tabla_tallas.png | seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 445
- seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_tabla_tallas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 446
- colocacion_collarin_paso_5_verificacion.png | colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 450
- colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_5_verificacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 451
- seleccion_talla_collarin_cervical1.png | seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 455
- seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 456
- colocacion_collarin_paso_6_liberacion_controlada.png | colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 460
- colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_6_liberacion_controlada.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 461
- colocacion_collarin_paso_4_ajuste_cierres.png | colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 465
- colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_4_ajuste_cierres.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 466
- seleccion_talla_collarin_error_demasiado_grande.png | seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 470
- seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_error_demasiado_grande.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 471
- tecnica_sujecion_manual_cervical.png | tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 475
- tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/tecnica_sujecion_manual_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 476
- seleccion_talla_collarin_cervical.png | seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 480
- seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 481
- colocacion_collarin_paso_2_parte_posterior.png | colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 485
- colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_2_parte_posterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 486
- componentes_camilla_cuchara.png | componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 490
- componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_camilla_cuchara.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 491
- componentes_tablero_espinal.png | componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 495
- componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 496
- colocacion_colchon_vacio_paso_a_paso.png | colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 500
- colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_colchon_vacio_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 501
- situaciones_que_requieren_inmovilizacion.png | situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 505
- situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/situaciones_que_requieren_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 506
- colocacion_collarin_paso_1_preparacion.png | colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 510
- colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 511
- colocacion_collarin_paso_3_parte_anterior.png | colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 515
- colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/colocacion_collarin_paso_3_parte_anterior.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 516
- secuencia_transicion_inmovilizacion.png | secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 520
- secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/secuencia_transicion_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 521
- componentes_sistema_inmovilizacion.png | componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 525
- componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 526
- verificaciones_post_colocacion_collarin.png | verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 530
- verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/verificaciones_post_colocacion_collarin.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 531
- coordinacion_equipo_inmovilizacion.png | coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 535
- coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-2-inmovilizacion/coordinacion_equipo_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 536
- uso_correcto_pulsioximetro.png | uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 540
- uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_pulsioximetro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 541
- configuracion_maxima_fio2_bolsa_mascarilla.png | configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 545
- configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/configuracion_maxima_fio2_bolsa_mascarilla.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 546
- canulas_guedel_nasofaringea.png | canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 550
- canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 551
- uso_correcto_ambu.png | uso_correcto_ambu.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 555
- uso_correcto_ambu.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_ambu.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 556
- dispositivos_supragloticos_guia.png | dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 560
- dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/dispositivos_supragloticos_guia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 561
- uso_correcto_tensiometro.png | uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 565
- uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/uso_correcto_tensiometro.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 566
- interpretacion_constantes_semaforo.png | interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 570
- interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/interpretacion_constantes_semaforo.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 571
- ventilacion_medios_fortuna.png | ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 575
- ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/ventilacion_medios_fortuna.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 576
- registro_constantes_vitales.png | registro_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 580
- registro_constantes_vitales.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-3-material-sanitario/registro_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 581
- configuracion_gps_antes_de_salir.png | configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 585
- configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-7-conduccion/configuracion_gps_antes_de_salir.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 586
- flujo_rcp_transtelefonica.png | flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 590
- flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/flujo_rcp_transtelefonica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 591
- farmacologia_basica_visual.png | farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 595
- farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 596
- flujo_desa_telefono.png | flujo_desa_telefono.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 600
- flujo_desa_telefono.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/flujo_desa_telefono.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 601
- tabla_dosis_pediatricas.png | tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 605
- tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 606
- sistema_abcde_prioridades_emergencias.png | sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 610
- sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 611
- tabla_rangos_fio2_oxigenoterapia1.png | tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 615
- tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 616
- vias_administracion.png | vias_administracion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 620
- vias_administracion.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/vias_administracion.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 621
- sistema_abcde_prioridades_emergencias.webp | sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 625
- sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/sistema_abcde_prioridades_emergencias.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 626
- rcp_adulto_paso_a_paso.png | rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 630
- rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 631
- ovace_pediatrica.png | ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 635
- ovace_pediatrica.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 636
- guia_colocacion_dispositivos_oxigenoterapia.png | guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 640
- guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/guia_colocacion_dispositivos_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 641
- tabla_escala_glasgow.png | tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 645
- tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 646
- el_orden_importa_maeious_que_la_velocidad.png | el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 650
- el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/el_orden_importa_maeious_que_la_velocidad.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 651
- diagrama_flujo_start_triaje_es.svg | diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 655
- diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/diagrama_flujo_start_triaje_es.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 656
- tabla_rangos_normales_constantes_vitales.png | tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 660
- tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 661
- tabla_rangos_fio2_oxigenoterapia.png | tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 665
- tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 666
- priorizaciaeioun_vital_el_enfoque_abcde.png | priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 670
- priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/priorizaciaeioun_vital_el_enfoque_abcde.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 671
- fast_transtelefonico.png | fast_transtelefonico.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 675
- fast_transtelefonico.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/fast_transtelefonico.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 676
- ovace_lactantes.png | ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 680
- ovace_lactantes.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 681
- abcde_introduccion_estructura_mental.svg | abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 685
- abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 686
- el_orden_importa_maeious_que_la_velocidad.webp | el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 690
- el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/el_orden_importa_maeious_que_la_velocidad.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 691
- priorizaciaeioun_vital_el_enfoque_abcde.webp | priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 695
- priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/priorizaciaeioun_vital_el_enfoque_abcde.webp | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 696
- diagrama_seleccion_dispositivo_oxigenoterapia.png | diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 700
- diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-0-fundamentos/diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 701
- diagrama_decisiones_eticas_urgencias.png | diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 705
- diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-12-marco-legal/diagrama_decisiones_eticas_urgencias.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 706
- diagrama_decisiones_eticas.png | diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 710
- diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/public/assets/infografias/bloque-12-marco-legal/diagrama_decisiones_eticas.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 711
- hemorragia_presion_directa.jpg | hemorragia_presion_directa.jpg | /home/planetazuzu/guia-tes/docs/MODELO_DATOS_CANONICO_DEFINITIVO.md, línea 305
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 41
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 43
- TES.svg | TES.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 65
- algoritmo_operativo_del_tes.svg | algoritmo_operativo_del_tes.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 65
- START.svg | START.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 66
- resumen_visual_del_algoritmo_start.svg | resumen_visual_del_algoritmo_start.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 66
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 67
- abcde_introduccion_estructura_mental.svg | abcde_introduccion_estructura_mental.svg | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 67
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | public/assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.png | /home/planetazuzu/guia-tes/docs/PROXIMOS_PASOS_POST_INFOGRAFIA.md, línea 17
- tabla_rangos_normales_constantes_vitales.png | bloque-0-fundamentos/tabla_rangos_normales_constantes_vitales.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 11
- tabla_escala_glasgow.png | bloque-0-fundamentos/tabla_escala_glasgow.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 13
- diagrama_start_completo.svg | bloque-0-fundamentos/diagrama_start_completo.svg | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 14
- guia_inmovilizacion_manual.png | bloque-2-inmovilizacion/guia_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 15
- diagrama_uso_tablero_espinal.png | bloque-2-inmovilizacion/diagrama_uso_tablero_espinal.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 16
- infografia_transferencias_seguras.png | bloque-2-inmovilizacion/infografia_transferencias_seguras.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 17
- guia_aspiracion.png | bloque-3-material-sanitario/guia_aspiracion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 18
- organizacion_maletin.png | bloque-3-material-sanitario/organizacion_maletin.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 19
- farmacologia_basica_visual.png | bloque-6-farmacologia/farmacologia_basica_visual.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 28
- tabla_dosis_pediatricas.png | bloque-6-farmacologia/tabla_dosis_pediatricas.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 29
- vias_administracion.png | bloque-6-farmacologia/vias_administracion.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 30
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | public/assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INFOGRAFIA_ABCDE_INTEGRADA.md, línea 13
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INFOGRAFIA_ABCDE_INTEGRADA.md, línea 33
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | public/assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/INFOGRAFIA_ABCDE_INTEGRADA.md, línea 151
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 40
- tabla_rangos_fio2_oxigenoterapia1.png | tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 42
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 42
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 58
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 60
- img.png | img.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 82
- img.png | img.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 84
- optimized.png | optimized.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 84
- velocidad.png | velocidad.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 88
- el_orden_importa_mas_que_la_velocidad.png | el_orden_importa_mas_que_la_velocidad.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 88
- Emergencias.png | Emergencias.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 90
- sistema_abcde_prioridades_emergencias.png | sistema_abcde_prioridades_emergencias.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 90
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 173
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 174
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 175
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 176
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 181
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 181
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 190
- img.png | img.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 269
- tabla_rangos_fio2_oxigenoterapia.png | tabla_rangos_fio2_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 285
- tabla_rangos_fio2_oxigenoterapia1.png | tabla_rangos_fio2_oxigenoterapia1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 286
- seleccion_talla_collarin_cervical.png | seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 287
- seleccion_talla_collarin_cervical1.png | seleccion_talla_collarin_cervical1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 288
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 289
- componentes_sistema_inmovilizacion.png | componentes_sistema_inmovilizacion.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 290
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 291
- posicion_tes_inmovilizacion_manual.png | posicion_tes_inmovilizacion_manual.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 292
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 293
- 1.png | 1.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 299
- 2.png | 2.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 299
- img.png | img.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 536
- imagen_400w.webp | /assets/infografias/imagen_400w.webp | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 703
- imagen_800w.webp | /assets/infografias/imagen_800w.webp | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 704
- imagen_1200w.webp | /assets/infografias/imagen_1200w.webp | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 705
- TES.svg | TES.svg | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 17
- diagrama_seleccion_dispositivo_oxigenoterapia.png | diagrama_seleccion_dispositivo_oxigenoterapia.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 18
- colocacion_collarin_paso_1_preparacion.png | colocacion_collarin_paso_1_preparacion.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 21
- seleccion_talla_collarin_cervical.png | seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 22
- canulas_guedel_nasofaringea.png | canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 25
- canulas_guedel_nasofaringea.png | /assets/infografias/bloque-3-material-sanitario/canulas_guedel_nasofaringea.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 41
- TES.svg | TES.svg | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 104
- seleccion_talla_collarin_cervical.png | /assets/infografias/bloque-2-inmovilizacion/seleccion_talla_collarin_cervical.png | /home/planetazuzu/guia-tes/docs/consolidado/SISTEMA_MEDIOS_VISUALES.md, línea 350
- ABCDE_ALGORITMO_COMPLETO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ALGORITMO_COMPLETO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_03_ABCDE_OPERATIVO.md, línea 11
- ABCDE_ALGORITMO_COMPLETO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ALGORITMO_COMPLETO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_03_ABCDE_OPERATIVO.md, línea 11
- ABCDE_IMAGEN_01_ESCANEO_INICIAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_01_ESCANEO_INICIAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 107
- ABCDE_IMAGEN_02_PRIORIDAD_VITAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_02_PRIORIDAD_VITAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 124
- ABCDE_IMAGEN_03_TRANSICION_CONTROLADO.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_03_TRANSICION_CONTROLADO.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 141
- ABCDE_IMAGEN_04_REEVALUACION_CICLO.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_04_REEVALUACION_CICLO.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 158
- ABCDE_IMAGEN_05_VISION_GLOBAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_05_VISION_GLOBAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 175
- ABCDE_IMAGEN_01_ESCANEO_INICIAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_01_ESCANEO_INICIAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 107
- ABCDE_IMAGEN_02_PRIORIDAD_VITAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_02_PRIORIDAD_VITAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 124
- ABCDE_IMAGEN_03_TRANSICION_CONTROLADO.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_03_TRANSICION_CONTROLADO.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 141
- ABCDE_IMAGEN_04_REEVALUACION_CICLO.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_04_REEVALUACION_CICLO.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 158
- ABCDE_IMAGEN_05_VISION_GLOBAL.jpg | /assets/infografias/bloque-0-fundamentos/ABCDE_IMAGEN_05_VISION_GLOBAL.jpg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_04_ABCDE_OPERATIVO.md, línea 175
- favicon.svg | favicon.svg | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 16
- icon_192.png | icon_192.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 16
- icon_512.png | icon_512.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 16
- icon_192.png | public/icon_192.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 62
- icon_512.png | public/icon_512.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 62
- icon_192_maskable.png | public/icon_192_maskable.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 62
- icon_512_maskable.png | public/icon_512_maskable.png | /home/planetazuzu/guia-tes/docs/consolidado/CHECKLIST_PWA_COMPLETA.md, línea 62
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_ABCDE_OPERATIVO.md, línea 61
- ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /assets/infografias/bloque-0-fundamentos/ABCDE_INTRODUCCION_ESTRUCTURA_MENTAL.svg | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_ABCDE_OPERATIVO.md, línea 61
- ABCDE_ERROR_01_SALTARSE_LETRAS.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_01_SALTARSE_LETRAS.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 21
- ABCDE_ERROR_02_ATASCARSE_LETRA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_02_ATASCARSE_LETRA.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 85
- ABCDE_ERROR_03_VISIBLE_SOBRE_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_03_VISIBLE_SOBRE_VITAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 149
- ABCDE_ERROR_04_NO_REEVALUAR.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_04_NO_REEVALUAR.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 211
- ABCDE_ERROR_05_PERDER_VISION_GLOBAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_05_PERDER_VISION_GLOBAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 275
- ABCDE_SINTESIS_ESTRUCTURA_PROTECCION.png | /assets/infografias/bloque-0-fundamentos/ABCDE_SINTESIS_ESTRUCTURA_PROTECCION.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 337
- ABCDE_ERROR_01_SALTARSE_LETRAS.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_01_SALTARSE_LETRAS.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 21
- ABCDE_ERROR_02_ATASCARSE_LETRA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_02_ATASCARSE_LETRA.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 85
- ABCDE_ERROR_03_VISIBLE_SOBRE_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_03_VISIBLE_SOBRE_VITAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 149
- ABCDE_ERROR_04_NO_REEVALUAR.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_04_NO_REEVALUAR.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 211
- ABCDE_ERROR_05_PERDER_VISION_GLOBAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_ERROR_05_PERDER_VISION_GLOBAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 275
- ABCDE_SINTESIS_ESTRUCTURA_PROTECCION.png | /assets/infografias/bloque-0-fundamentos/ABCDE_SINTESIS_ESTRUCTURA_PROTECCION.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_05_ABCDE_OPERATIVO.md, línea 337
- favicon.svg | favicon.svg | /home/planetazuzu/guia-tes/docs/consolidado/ANALISIS_TECNOLOGICO_PROYECTO.md, línea 122
- ABCDE_RESUMEN_FLUJO_MENTAL_CONTINUO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_RESUMEN_FLUJO_MENTAL_CONTINUO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_08_ABCDE_OPERATIVO.md, línea 10
- ABCDE_RESUMEN_FLUJO_MENTAL_CONTINUO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_RESUMEN_FLUJO_MENTAL_CONTINUO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_08_ABCDE_OPERATIVO.md, línea 10
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 93
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 112
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 143
- ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /assets/infografias/bloque-0-fundamentos/ABCDE_PIRAMIDE_PRIORIDAD_VITAL.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 93
- ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /assets/infografias/bloque-0-fundamentos/ABCDE_COMPARACION_DESORDEN_VS_ESTRUCTURA.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 112
- ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /assets/infografias/bloque-0-fundamentos/ABCDE_FLUJO_DETERIORO_FISIOLOGICO.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_02_ABCDE_OPERATIVO.md, línea 143

View file

@ -1,47 +0,0 @@
# Medios reales necesarios (filtrado, sin placeholders)
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 172
- rcp_adulto_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 150
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 161
- rcp_adulto_paso_a_paso.png | /assets/infografias/bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 172
- rcp_pediatrica_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_pediatrica_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 177
- rcp_lactantes_paso_a_paso.png | public/assets/infografias/bloque-4-rcp/rcp_lactantes_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 185
- diagrama_uso_desa.png | public/assets/infografias/bloque-4-rcp/diagrama_uso_desa.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 193
- ovace_adulto.png | public/assets/infografias/bloque-4-rcp/ovace_adulto.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 205
- ovace_pediatrica.png | public/assets/infografias/bloque-4-rcp/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 217
- ovace_lactantes.png | public/assets/infografias/bloque-4-rcp/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/MEDIOS_AUDIOVISUALES_FALTANTES.md, línea 225
- rcp_posicion_manos_adulto.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 361
- rcp_posicion_manos_adulto.png | /assets/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 363
- rcp_profundidad_compresiones.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_profundidad_compresiones.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 384
- rcp_profundidad_compresiones.png | /assets/infografias/rcp/rcp_profundidad_compresiones.png | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 386
- rcp_adulto_svb.mp4 | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 407
- rcp_adulto_svb_thumb.jpg | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb_thumb.jpg | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 408
- rcp_adulto_svb.mp4 | /assets/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_PACK_SPEC.md, línea 410
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 60
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 61
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 415
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/AUDITORIA_ASSETS_MULTIMEDIA.json, línea 416
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/SEMANA_2_COMPLETADA.md, línea 42
- rcp_adulto_paso_a_paso.png | bloque-4-rcp/rcp_adulto_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 20
- rcp_pediatrica_paso_a_paso.png | bloque-4-rcp/rcp_pediatrica_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 21
- rcp_lactantes_paso_a_paso.png | bloque-4-rcp/rcp_lactantes_paso_a_paso.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 22
- diagrama_uso_desa.png | bloque-4-rcp/diagrama_uso_desa.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 23
- ovace_adulto.png | bloque-4-rcp/ovace_adulto.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 24
- ovace_pediatrica.png | bloque-4-rcp/ovace_pediatrica.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 25
- ovace_lactantes.png | bloque-4-rcp/ovace_lactantes.png | /home/planetazuzu/guia-tes/docs/MEDIOS_FALTANTES_TABLA_RAPIDA.md, línea 26
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 59
- ABCDE.png | ABCDE.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 89
- algoritmo_rcp_comentado.svg | /assets/infografias/bloque-4-rcp/algoritmo_rcp_comentado.svg | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 231
- compresiones_incorrectas.png | /assets/infografias/bloque-4-rcp/compresiones_incorrectas.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 232
- compresiones_correctas.png | /assets/infografias/bloque-4-rcp/compresiones_correctas.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 233
- descompresion_incompleta.png | /assets/infografias/bloque-4-rcp/descompresion_incompleta.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 234
- descompresion_completa.png | /assets/infografias/bloque-4-rcp/descompresion_completa.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 235
- resumen_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/resumen_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/ANALISIS_MEDIOS_SUPERFLUOS.md, línea 236
- rcp_posicion_manos_adulto.png | .supabase.co/storage/v1/object/public/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 225
- rcp_posicion_manos_adulto.png | /assets/infografias/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 227
- rcp_adulto_svb.mp4 | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 249
- rcp_adulto_svb_thumb.jpg | .supabase.co/storage/v1/object/public/videos/rcp/rcp_adulto_svb_thumb.jpg | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 250
- rcp_adulto_svb.mp4 | /assets/videos/rcp/rcp_adulto_svb.mp4 | /home/planetazuzu/guia-tes/docs/CONTENT_MODEL.md, línea 252
- rcp_posicion_manos_adulto.png | /media/images/rcp/rcp_posicion_manos_adulto.png | /home/planetazuzu/guia-tes/docs/API_ENDPOINTS_ESPECIFICACION.md, línea 505
- introduccion_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/introduccion_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_RCP_ADULTO_SVB.md, línea 41
- introduccion_rcp_adulto_svb.png | /assets/infografias/bloque-4-rcp/introduccion_rcp_adulto_svb.png | /home/planetazuzu/guia-tes/docs/consolidado/SECCION_01_RCP_ADULTO_SVB.md, línea 41

View file

@ -1,36 +0,0 @@
# Sistema de generación de medios audiovisuales Prioridad A
Este documento define prompts y criterios de salida para la generación sistemática de medios críticos.
## Estándar de salida
- Resolución imágenes: 1920x1080 (mínimo)
- Formato imágenes: PNG o JPG según nombre objetivo
- Vídeos: MP4 H.264, 1080p, 30fps, 30-60s
- Sin logos, sin marcas de agua, sin texto excesivo
- Estilo educativo TES, alta legibilidad en móvil
## Prioridad A Medios críticos (12)
### B01_1.1_colocación_manguito_ta_y_pulsioxímetro.jpg
- Tipo: Imagen
- Ruta final esperada: assets/images/bloque_01/B01_1.1_colocación_manguito_ta_y_pulsioxímetro.jpg
- Prompt sugerido:
Fotografía clínica realista, entorno prehospitalario TES, mostrando la colocación correcta del manguito de tensión arterial y el pulsioxímetro en un paciente adulto, con manos del TES colocando ambos dispositivos de forma correcta. Iluminación neutral, alta nitidez, sin logos. Enfoque en el procedimiento, plano medio, fondo limpio.
### B01_1.1_vídeo_toma_ta_manual_y_errores_típicos.mp4
- Tipo: Vídeo
- Ruta final esperada: assets/videos/bloque_01/B01_1.1_vídeo_toma_ta_manual_y_errores_típicos.mp4
- Prompt sugerido:
Vídeo educativo corto (30-60s) mostrando toma manual de tensión arterial con esfigmomanómetro y estetoscopio. Incluir 2-3 errores típicos (manguito mal colocado, brazo sin soporte, estetoscopio mal posicionado) y la corrección inmediata. Estilo demostrativo TES, fondo neutro, sin logos, texto breve en pantalla para señalar errores.
### B01_1.2_diagrama_abcde_operativo.png
- Tipo: Imagen
- Ruta final esperada: assets/images/bloque_01/B01_1.2_diagrama_abcde_operativo.png
- Prompt sugerido:
Infografía clínica en español con diagrama ABCDE operativo. Diseño limpio, fondo claro, títulos grandes: A (Vía aérea), B (Respiración), C (Circulación), D (Neurológico), E (Exposición). Usar iconos simples y flechas de secuencia. Estilo educativo TES, alto contraste, legible en móvil.
### B01_1.4_diagrama_start_flujo_simple.png
- Tipo: Imagen
- Ruta final esperada: assets/images/bloque_01/B01_1.4_diagrama_start_flujo_simple.png
- Prompt sugerido:
Diagrama de flujo START para triaje en español, versión simplificada. Caja inicial con “¿Respira?”, ramas con colores de triaje (rojo, amarillo, verde, negro). Iconos mínimos, tipografía grande, estilo infografía clínica TES, legible en móvil.

File diff suppressed because it is too large Load diff

234
README.md Normal file → Executable file
View file

@ -1,45 +1,220 @@
# EMERGES TES - Protocolo Rápido
# EMERGES TES - Guía Digital de Protocolos de Emergencias 🏥
Aplicación PWA para protocolos médicos de emergencia.
**Aplicación web progresiva (PWA)** diseñada como herramienta de referencia rápida para **Técnicos de Emergencias Sanitarias (TES)** y profesionales de emergencias médicas.
## 🚑 Características
![Estado](https://img.shields.io/badge/Estado-En%20desarrollo-blue)
![PWA](https://img.shields.io/badge/PWA-Ready-green)
![TypeScript](https://img.shields.io/badge/TypeScript-5.8-blue)
![React](https://img.shields.io/badge/React-19-blue)
![License](https://img.shields.io/badge/License-MIT-green)
- **Protocolos de emergencia** (RCP, vía aérea, shock, etc.)
- **Vademécum de fármacos** con dosis, indicaciones y contraindicaciones
- **Calculadoras médicas** (Glasgow, perfusiones)
- **Guías de actuación en escena** (seguridad, ABCDE, triage)
- **Diseño optimizado para móvil** y uso nocturno
- **Funciona offline** (PWA)
## 👤 Autor
**Javier Fernández** · [@planetazuzu](https://github.com/planetazuzu)
TES · Developer · La Rioja 🇪🇸
---
## 🎯 Objetivo Funcional
**EMERGES TES** es un **socio cognitivo** que reduce la carga cognitiva en emergencias médicas proporcionando:
- ✅ Acceso rápido a información crítica (< 2 clics)
- ✅ Protocolos operativos estructurados (RCP, vía aérea, shock, etc.)
- ✅ Vademécum de fármacos con dosis, indicaciones y contraindicaciones
- ✅ Calculadoras médicas (Glasgow, perfusiones, dosis pediátricas)
- ✅ Guías formativas asociadas a protocolos
- ✅ Funcionalidad **offline-first** (funciona sin conexión)
- ✅ Diseño optimizado para uso bajo presión y estrés
**No es:**
- ❌ Un sistema de diagnóstico automático
- ❌ Una herramienta de IA que toma decisiones clínicas
- ❌ Un sustituto de la formación reglada del profesional
- ❌ Un reemplazo del criterio clínico
---
## 📊 Estado Actual del Proyecto
**Estado:** En desarrollo activo
### ✅ Completado
- **Frontend PWA:** React 19 + TypeScript, funcional con Service Worker
- **Backend API:** Express + PostgreSQL con Clean Architecture
- **Protocolos:** 50+ protocolos operativos estructurados
- **Fármacos:** 100+ fármacos con dosis y especificaciones
- **Guías formativas:** Guías de refuerzo asociadas a protocolos
- **Herramientas clínicas:** Checklists, calculadoras, pathways
- **Validación médica:** Workflow completo de revisión y aprobación
- **Glosario:** Backend completo con ~74 términos migrados
- **Medios:** Sistema de gestión de imágenes/vídeos/documentos
- **Tests:** Tests unitarios backend (servicios) y tests integración API
### ⚠️ En Progreso / Pendiente
- **Frontend glosario:** La app aún no consume `GET /api/glossary` (usa datos locales)
- **Cobertura frontend:** Objetivo 80% (en aumento)
- **Contenido:** Categoría "Escena" vacía en protocolos (ver `docs/CONTENIDO_FALTANTE.md`)
**Documentación detallada:** Ver `docs/QUE_FALTA.md` y `docs/CONTENIDO_FALTANTE.md`
---
## ⚠️ ACLARACIÓN FUNDAMENTAL: ¿Qué son los "Tickets"?
### Los tickets NO son funcionalidad de negocio
**IMPORTANTE:** En este proyecto, los **"tickets"** (TICKET-001, TICKET-002, etc.) **NO** son una funcionalidad de negocio.
- ❌ **NO existe** un sistema de tickets de soporte, incidencias o solicitudes de usuarios
- ❌ **NO hay** entidades llamadas "tickets" en el código
- ❌ **NO hay** lógica de negocio asociada a tickets
### Los tickets son tareas técnicas de desarrollo
Los tickets son **únicamente** una forma de dividir, organizar y seguir las **tareas pendientes de desarrollo** de la aplicación.
- ✅ Son equivalentes a **issues** o **tickets técnicos** de JIRA / GitHub
- ✅ Representan **tareas técnicas** o **pasos de desarrollo**
- ✅ Sirven para **planificación y seguimiento** del trabajo
- ✅ Están documentados en `docs/QUE_FALTA.md` y `docs/BACKLOG_MICRO_TICKETS.md`
**Ejemplo:** TICKET-013 significa "Implementar ValidationService para workflow de validación médica" (tarea técnica completada).
### Entidades reales del dominio
Las entidades reales del dominio de la aplicación son:
- **ContentItem:** Protocolos, guías, manuales, checklists
- **Drug:** Fármacos con especificaciones técnicas
- **GlossaryTerm:** Términos médicos del glosario
- **MediaResource:** Imágenes, vídeos, documentos
- **MedicalReview:** Revisiones médicas de contenido
**Ninguna de estas entidades se llama "ticket" ni tiene relación con tickets.**
### Si en el futuro se añade un sistema de tickets de negocio
Si en el futuro se añade un sistema de tickets de soporte/incidencias como **nueva funcionalidad**, deberá tratarse como una **FEATURE independiente**, no implementada actualmente.
---
## 🛠️ Stack Tecnológico
- **React 18** + **TypeScript 5.8**
- **Vite 5.4** - Build tool
### Frontend
- **React 19** + **TypeScript 5.8**
- **Vite 7** - Build tool
- **Tailwind CSS 3.4** + **shadcn/ui** - UI Framework
- **React Router 6.3** - Navegación SPA
- **PWA** - Service Worker + Manifest
- **Vitest** - Testing
## 📦 Instalación
### Backend
- **Node.js** + **TypeScript**
- **Express 4.18** - Framework web
- **PostgreSQL** - Base de datos relacional
- **Redis** - Caché (opcional)
- **Zod** - Validación de esquemas
- **Vitest** + **Supertest** - Testing
### Arquitectura
- **Clean Architecture** en backend (Domain → Application → Infrastructure → Presentation)
- **Arquitectura funcional React** en frontend
- **Type Safety estricto** (sin `any`)
---
## 🚀 Instalación y Ejecución
### Requisitos previos
- Node.js 20+
- PostgreSQL 14+
- Redis (opcional, para caché)
### Instalación
```bash
# Clonar repositorio
git clone [url-del-repositorio]
cd guia-tes
# Instalar dependencias frontend
npm install
npm run dev # Desarrollo (localhost:8096)
npm run build # Producción
# Instalar dependencias backend
cd backend
npm install
cd ..
```
## 🚀 Despliegue Principal
### Ejecución
- **Servidor:** PM2 en puerto 8607
- **Docker:** `docker-compose up --build`
- **CI/CD:** GitHub Actions
#### Solo frontend (desarrollo)
```bash
npm run dev
# Abre en http://localhost:8096
```
#### Frontend + Backend local (con Docker)
```bash
npm run dev:local
# Inicia PostgreSQL + Redis en Docker
# Frontend: http://localhost:8096
# Backend: http://localhost:3000
```
#### Backend solo
```bash
cd backend
npm run dev
# Backend en http://localhost:3000
```
### Build producción
```bash
# Frontend
npm run build
# Backend
cd backend
npm run build
```
**Documentación detallada:** Ver `docs/DESPLIEGUE_LOCAL.md` para configuración completa con Docker.
---
## 📚 Documentación
Ver `docs/consolidado/` para documentación completa:
- Despliegue (Docker, PM2, GitHub Actions)
- PWA y Service Worker
- Estado de funcionalidades
- Análisis técnico
### Documentación principal
- **`SPEC.md`** - Especificación maestra del proyecto (fuente de verdad)
- **`.cursorrules`** - Reglas de desarrollo y arquitectura
- **`docs/QUE_FALTA.md`** - Estado de tickets técnicos y tareas pendientes
- **`docs/CONTENIDO_FALTANTE.md`** - Contenido faltante (protocolos, guías, glosario)
### Documentación para desarrolladores
- **`README_DEV.md`** - Reglas de desarrollo y principios
- **`README_ARCHITECTURE.md`** - Arquitectura del sistema
- **`README_TODO.md`** - Tareas pendientes con prioridades
### Documentación técnica
- **`docs/BACKLOG_MICRO_TICKETS.md`** - Backlog de fases ejecutadas
- **`docs/ANDRAGOGIA_STRESS_READY_112.md`** - Principios de diseño UX
- **`docs/CHECKLIST_ANTES_ACEPTAR_CAMBIOS.md`** - Checklist de calidad
---
## 🔄 Evolución de la Arquitectura
**Nota importante:** La arquitectura puede evolucionar según las necesidades del proyecto.
- Las decisiones arquitectónicas están documentadas en `SPEC.md` y `.cursorrules`
- Cualquier cambio arquitectónico debe documentarse explícitamente
- Se prioriza la mantenibilidad y claridad del código
---
## 📄 Licencia
@ -47,6 +222,15 @@ Ver `docs/consolidado/` para documentación completa:
---
## 👥 Contribución
Este proyecto está en desarrollo activo. Para contribuir:
1. Leer `README_DEV.md` para reglas de desarrollo
2. Revisar `README_ARCHITECTURE.md` para entender la arquitectura
3. Consultar `README_TODO.md` para tareas pendientes
4. Seguir las reglas definidas en `.cursorrules`
---
**Desarrollado para Técnicos de Emergencias Sanitarias**

View file

@ -1,191 +0,0 @@
# 🎛️ RESUMEN: ADMIN PANEL - SISTEMA COMPLETO
## ✅ IMPLEMENTADO
### 1. Modelo de Datos Extendido ✅
**Ubicación**: `admin-panel/shared/types/content.ts`
- ✅ Interfaces TypeScript para Protocol, Guide, Manual, Drug, Checklist
- ✅ Extensión del modelo existente sin romper compatibilidad
- ✅ ContentPack para distribución
- ✅ Tipos de autenticación y autorización
### 2. Backend API Completo ✅
**Ubicación**: `backend/src/`
#### Autenticación
- ✅ `routes/auth.js` - Login, JWT, verificación
- ✅ `middleware/auth.js` - Autenticación y permisos
- ✅ RBAC con 5 roles (super_admin, editor_clinico, editor_formativo, revisor, viewer)
#### Gestión de Contenido
- ✅ `routes/content.js` - CRUD completo
- GET /api/content - Listar con filtros
- GET /api/content/:id - Obtener por ID
- POST /api/content - Crear
- PUT /api/content/:id - Actualizar
- GET /api/content/:id/versions - Historial
- POST /api/content/:id/validate - Validar
- GET /api/content/pack/latest - Content pack público
#### Scripts
- ✅ `scripts/seed-admin.js` - Crear usuario admin
- ✅ `scripts/seed-content.js` - Crear contenido de ejemplo
### 3. Integración en App Principal ✅
**Ubicación**: `src/services/content-pack.ts`
- ✅ Servicio de content pack
- ✅ Sistema de "override" (pack > local)
- ✅ Cache offline
- ✅ Funciones para obtener contenido con override
- ✅ **NO modifica** `procedures.ts` ni `drugs.ts`
### 4. Seed Data ✅
**Contenido de ejemplo creado**:
- ✅ **3 Checklists**:
- Electrodos/Parches DESA
- Preparación Intubación
- RCP Checklist
- ✅ **2 Protocolos Extendidos**:
- RCP Adulto SVB (con checklist, dosis inline, fuentes)
- Shock Hemorrágico (con dosis inline, fuentes)
---
## 🚧 PENDIENTE (Admin Panel UI)
La estructura del Admin Panel está creada, pero los componentes React están pendientes:
- [ ] Dashboard con estadísticas
- [ ] Biblioteca de contenido
- [ ] Editores especializados (Protocolo, Checklist, Guía, Vademécum)
- [ ] Vista de auditoría
- [ ] Gestión de fuentes
**Nota**: El backend está completo y funcional. El Admin Panel UI se puede desarrollar progresivamente.
---
## 🚀 INICIO RÁPIDO
### Backend
```bash
cd backend
# 1. Instalar dependencias
npm install
# 2. Configurar .env (ver backend/ENV_TEMPLATE.md)
# DB_USER=planetazuzu
# DB_PASSWORD=Monforte.1977
# DB_NAME=emerges_tes
# JWT_SECRET=tu-secret-key-aqui
# 3. Crear usuario y BD (requiere sudo)
bash crear-usuario-y-bd.sh
# 4. Crear tablas
npm run db:create
# 5. Crear usuario admin
npm run seed:admin
# 6. Crear contenido de ejemplo
npm run seed:content
# 7. Iniciar servidor
npm run dev
```
**Credenciales por defecto**:
- Email: `admin@emerges-tes.local`
- Password: `Admin123!`
### Admin Panel (cuando esté implementado)
```bash
cd admin-panel
npm install
npm run dev
```
---
## 📁 ARCHIVOS CREADOS
### Modelo de Datos
- `admin-panel/shared/types/content.ts` - Interfaces de contenido
- `admin-panel/shared/types/auth.ts` - Tipos de autenticación
### Backend
- `backend/src/routes/auth.js` - Rutas de autenticación
- `backend/src/routes/content.js` - Rutas de contenido
- `backend/src/middleware/auth.js` - Middleware de auth
- `backend/scripts/seed-admin.js` - Seed de usuario admin
- `backend/scripts/seed-content.js` - Seed de contenido
### Integración
- `src/services/content-pack.ts` - Servicio de content pack
### Documentación
- `docs/ADMIN_PANEL_IMPLEMENTACION.md` - Documentación completa
- `docs/CHECKLIST_VERIFICACION_ADMIN_PANEL.md` - Checklist de verificación
- `admin-panel/README.md` - README del admin panel
---
## ✅ RESTRICCIONES CUMPLIDAS
- ✅ **NO se modifica** `src/data/procedures.ts` ni `searchProcedures()`
- ✅ **NO se modifica** `src/data/drugs.ts` ni `searchDrugs()`
- ✅ **NO rompe PWA offline** - Content pack funciona offline
- ✅ **NO cambia rutas existentes** - Compatibilidad total
- ✅ **Versionado completo** - Todo contenido es versionado
---
## 🔐 ROLES Y PERMISOS
| Rol | Permisos |
|-----|----------|
| **super_admin** | Acceso total |
| **editor_clinico** | Editar protocolos, fármacos, checklists |
| **editor_formativo** | Editar guías y manuales |
| **revisor** | Revisar y validar |
| **viewer** | Solo lectura |
---
## 📝 PRÓXIMOS PASOS
1. **Completar Admin Panel UI** (componentes React)
2. **Integrar content pack** en componentes existentes de la app
3. **Tests automatizados**
4. **Documentación de API**
---
## 🎉 ESTADO
✅ **Backend completo y funcional**
✅ **Modelo de datos diseñado**
✅ **Sistema de content pack implementado**
✅ **Seed data creado**
🚧 **Admin Panel UI pendiente** (estructura lista)
---
## 📚 DOCUMENTACIÓN
- **Implementación completa**: `docs/ADMIN_PANEL_IMPLEMENTACION.md`
- **Checklist de verificación**: `docs/CHECKLIST_VERIFICACION_ADMIN_PANEL.md`
- **README Admin Panel**: `admin-panel/README.md`

0
admin-panel/DIAGNOSTICO.md Normal file → Executable file
View file

0
admin-panel/README.md Normal file → Executable file
View file

0
admin-panel/index.html Normal file → Executable file
View file

0
admin-panel/package-lock.json generated Normal file → Executable file
View file

0
admin-panel/package.json Normal file → Executable file
View file

0
admin-panel/shared/types/auth.ts Normal file → Executable file
View file

4
admin-panel/shared/types/content-canonical.ts Normal file → Executable file
View file

@ -125,7 +125,7 @@ export interface ContentItem {
updated_at: string; // ISO timestamp
// Metadatos adicionales
metadata?: Record<string, any>; // Metadatos flexibles
metadata?: Record<string, unknown>; // Metadatos flexibles
}
/**
@ -438,7 +438,7 @@ export interface AuditLog {
user_role: UserRole; // Rol del usuario
// Metadatos
metadata?: Record<string, any>; // Metadatos adicionales (cambios, valores anteriores, etc.)
metadata?: Record<string, unknown>; // Metadatos adicionales (cambios, valores anteriores, etc.)
// Timestamp
timestamp: string; // ISO timestamp

4
admin-panel/shared/types/content.ts Normal file → Executable file
View file

@ -336,7 +336,7 @@ export interface ContentListResponse {
export interface ContentVersion {
versionId: string;
version: number;
content: any; // Contenido de esta versión
content: unknown; // Contenido de esta versión
status: ContentStatus;
changeSummary?: string;
createdBy: string;
@ -351,7 +351,7 @@ export interface AuditLog {
versionId?: string;
userId: string;
action: 'create' | 'update' | 'delete' | 'validate' | 'approve' | 'publish' | 'revert';
details?: Record<string, any>;
details?: Record<string, unknown>;
timestamp: string;
}

0
admin-panel/src/App.tsx Normal file → Executable file
View file

0
admin-panel/src/components/auth/ProtectedRoute.tsx Normal file → Executable file
View file

View file

View file

@ -11,7 +11,7 @@ interface ValidationHistoryItem {
id: string;
action: string;
timestamp: string;
metadata: any;
metadata: Record<string, unknown>;
username?: string;
role?: string;
}

6
admin-panel/src/components/layout/Layout.tsx Normal file → Executable file
View file

@ -113,9 +113,9 @@ function SidebarContent({
logout,
onClose,
}: {
navigation: any[];
location: any;
user: any;
navigation: Array<{ name: string; href: string; icon: React.ComponentType }>;
location: { pathname: string };
user: { username?: string; role?: string } | null;
logout: () => void;
onClose?: () => void;
}) {

0
admin-panel/src/contexts/AuthContext.tsx Normal file → Executable file
View file

7
admin-panel/src/hooks/useContentStats.ts Normal file → Executable file
View file

@ -57,10 +57,11 @@ export function useContentStats() {
});
console.log('✅ Estadísticas cargadas correctamente');
} catch (error: any) {
} catch (error: unknown) {
console.error('❌ Error cargando estadísticas:', error);
console.error('Detalles del error:', error.response?.data || error.message);
console.error('Status:', error.response?.status);
const err = error as { response?: { data?: unknown; status?: number }; message?: string };
console.error('Detalles del error:', err.response?.data || err.message);
console.error('Status:', err.response?.status);
// Si es error 401, el token puede estar expirado
if (error.response?.status === 401) {

0
admin-panel/src/index.css Normal file → Executable file
View file

0
admin-panel/src/main.tsx Normal file → Executable file
View file

0
admin-panel/src/pages/AuditPage.tsx Normal file → Executable file
View file

7
admin-panel/src/pages/ChecklistEditorPage.tsx Normal file → Executable file
View file

@ -46,7 +46,7 @@ export default function ChecklistEditorPage() {
setIsLoading(true);
contentService
.getById(id)
.then((data: any) => {
.then((data: unknown) => {
setChecklist({
...data,
content: data.content || {
@ -115,9 +115,10 @@ export default function ChecklistEditorPage() {
}
navigate('/content');
} catch (error: any) {
} catch (error: unknown) {
console.error('Error guardando checklist:', error);
setErrors({ general: error.response?.data?.error || 'Error al guardar' });
const err = error as { response?: { data?: { error?: string } } };
setErrors({ general: err.response?.data?.error || 'Error al guardar' });
} finally {
setIsSaving(false);
}

7
admin-panel/src/pages/ContentLibraryPage.tsx Normal file → Executable file
View file

@ -45,12 +45,13 @@ export default function ContentLibraryPage() {
} else {
console.warn('⚠️ No se encontraron items. Verifica filtros y autenticación.');
}
} catch (error: any) {
} catch (error: unknown) {
console.error('❌ Error cargando contenido:', error);
console.error('Detalles:', error.response?.data || error.message);
const err = error as { response?: { data?: unknown; status?: number }; message?: string };
console.error('Detalles:', err.response?.data || err.message);
// Si es error 401, redirigir a login
if (error.response?.status === 401) {
if (err.response?.status === 401) {
console.warn('⚠️ Token expirado o inválido. Redirigiendo a login...');
localStorage.removeItem('admin_token');
localStorage.removeItem('admin_user');

0
admin-panel/src/pages/ContentPackPage.tsx Normal file → Executable file
View file

4
admin-panel/src/pages/DashboardPage.tsx Normal file → Executable file
View file

@ -13,7 +13,7 @@ const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000';
export default function DashboardPage() {
const { stats, isLoading } = useContentStats();
const { hasPermission } = useAuth();
const [validationStats, setValidationStats] = useState<any>(null);
const [validationStats, setValidationStats] = useState<Record<string, unknown> | null>(null);
const [pendingCount, setPendingCount] = useState(0);
useEffect(() => {
@ -160,7 +160,7 @@ function StatCard({
value,
subtitle,
}: {
icon: any;
icon: React.ComponentType;
title: string;
value: number;
subtitle: string;

0
admin-panel/src/pages/DrugEditorPage.tsx Normal file → Executable file
View file

0
admin-panel/src/pages/DrugManagerPage.tsx Normal file → Executable file
View file

0
admin-panel/src/pages/GuideEditorPage.tsx Normal file → Executable file
View file

0
admin-panel/src/pages/LoginPage.tsx Normal file → Executable file
View file

55
admin-panel/src/pages/MediaManagerPage.tsx Normal file → Executable file
View file

@ -36,8 +36,11 @@ export default function MediaManagerPage() {
const [typeFilter, setTypeFilter] = useState<'all' | 'image' | 'video'>('all');
const [searchQuery, setSearchQuery] = useState('');
const [orphanedCount, setOrphanedCount] = useState(0);
const [loadError, setLoadError] = useState<string | null>(null);
const [showUpload, setShowUpload] = useState(false);
const [uploadFile, setUploadFile] = useState<File | null>(null);
const [uploadError, setUploadError] = useState<string | null>(null);
const [uploadValidationDetails, setUploadValidationDetails] = useState<{ path: string; message: string }[] | null>(null);
const [uploadData, setUploadData] = useState({
title: '',
description: '',
@ -48,6 +51,7 @@ export default function MediaManagerPage() {
const loadResources = async () => {
setIsLoading(true);
setLoadError(null);
try {
const token = localStorage.getItem('admin_token');
const params = new URLSearchParams({
@ -63,10 +67,14 @@ export default function MediaManagerPage() {
},
});
const data = await response.json();
if (!response.ok) {
setLoadError(data.error || 'Error al cargar recursos');
return;
}
setResources(data.items || []);
setTotal(data.total || 0);
} catch (error) {
console.error('Error cargando recursos:', error);
setLoadError('Error de conexión al cargar recursos');
} finally {
setIsLoading(false);
}
@ -96,6 +104,8 @@ export default function MediaManagerPage() {
if (!uploadFile) return;
setIsUploading(true);
setUploadError(null);
setUploadValidationDetails(null);
try {
const token = localStorage.getItem('admin_token');
const formData = new FormData();
@ -114,6 +124,8 @@ export default function MediaManagerPage() {
body: formData,
});
const data = await response.json();
if (response.ok) {
setShowUpload(false);
setUploadFile(null);
@ -127,12 +139,16 @@ export default function MediaManagerPage() {
await loadResources();
await loadOrphanedCount();
} else {
const error = await response.json();
alert(`Error: ${error.error || 'Error al subir archivo'}`);
setUploadError(data.error || 'Error al subir archivo');
if (Array.isArray(data.details)) {
setUploadValidationDetails(data.details);
} else {
setUploadValidationDetails(null);
}
}
} catch (error) {
console.error('Error subiendo archivo:', error);
alert('Error al subir archivo');
setUploadError('Error de conexión al subir archivo');
setUploadValidationDetails(null);
} finally {
setIsUploading(false);
}
@ -213,7 +229,20 @@ export default function MediaManagerPage() {
{showUpload && hasPermission('content:write') && (
<div className="bg-card border border-border rounded-xl p-6 space-y-4">
<h2 className="text-xl font-semibold text-foreground">Subir Nuevo Recurso</h2>
{uploadError && (
<div className="bg-red-500/10 border border-red-500/20 rounded-lg p-4 space-y-2" role="alert">
<p className="text-red-500 font-medium">{uploadError}</p>
{uploadValidationDetails && uploadValidationDetails.length > 0 && (
<ul className="text-sm text-red-500/90 list-disc list-inside">
{uploadValidationDetails.map((d, i) => (
<li key={i}>{d.path ? `${d.path}: ` : ''}{d.message}</li>
))}
</ul>
)}
</div>
)}
<div>
<label className="block text-sm font-medium text-muted-foreground mb-1">
Archivo *
@ -308,6 +337,8 @@ export default function MediaManagerPage() {
onClick={() => {
setShowUpload(false);
setUploadFile(null);
setUploadError(null);
setUploadValidationDetails(null);
setUploadData({
title: '',
description: '',
@ -363,7 +394,17 @@ export default function MediaManagerPage() {
{/* Lista de recursos */}
<div className="bg-card border border-border rounded-xl overflow-hidden">
{isLoading ? (
{loadError ? (
<div className="p-8 text-center space-y-4">
<p className="text-red-500">{loadError}</p>
<button
onClick={() => loadResources()}
className="px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors"
>
Reintentar
</button>
</div>
) : isLoading ? (
<div className="p-8 text-center text-muted-foreground">Cargando...</div>
) : resources.length === 0 ? (
<div className="p-8 text-center text-muted-foreground">

0
admin-panel/src/pages/ProtocolEditorPage.tsx Normal file → Executable file
View file

0
admin-panel/src/pages/ValidationPage.tsx Normal file → Executable file
View file

0
admin-panel/src/services/auth.ts Normal file → Executable file
View file

0
admin-panel/src/services/content.ts Normal file → Executable file
View file

0
admin-panel/tailwind.config.js Normal file → Executable file
View file

0
admin-panel/tsconfig.json Normal file → Executable file
View file

0
admin-panel/tsconfig.node.json Normal file → Executable file
View file

0
admin-panel/vite.config.ts Normal file → Executable file
View file

File diff suppressed because it is too large Load diff

0
backend/CONFIGURAR_PASSWORD.md Normal file → Executable file
View file

0
backend/ENV_TEMPLATE.md Normal file → Executable file
View file

13
backend/INSTRUCCIONES_CREAR_USUARIO.md Normal file → Executable file
View file

@ -10,9 +10,10 @@ sudo -u postgres psql -f scripts/create-user.sql
```
Este script:
- ✅ Crea el usuario `planetazuzu` con password `Monforte.1977`
- ✅ Crea el usuario según configuración (ver variables de entorno)
- ✅ Crea la base de datos `emerges_tes`
- ✅ Da todos los permisos necesarios
- ⚠️ **IMPORTANTE:** Configura `DB_USER` y `DB_PASSWORD` antes de ejecutar
## Opción 2: Manual (si prefieres)
@ -20,14 +21,14 @@ Este script:
sudo -u postgres psql
```
Luego ejecutar en psql:
Luego ejecutar en psql (reemplaza 'TU_PASSWORD_SEGURO' con una contraseña segura):
```sql
CREATE USER planetazuzu WITH PASSWORD 'Monforte.1977';
CREATE DATABASE emerges_tes OWNER planetazuzu;
GRANT ALL PRIVILEGES ON DATABASE emerges_tes TO planetazuzu;
CREATE USER tu_usuario WITH PASSWORD 'TU_PASSWORD_SEGURO';
CREATE DATABASE emerges_tes OWNER tu_usuario;
GRANT ALL PRIVILEGES ON DATABASE emerges_tes TO tu_usuario;
\c emerges_tes
CREATE SCHEMA IF NOT EXISTS emerges_content;
GRANT ALL ON SCHEMA emerges_content TO planetazuzu;
GRANT ALL ON SCHEMA emerges_content TO tu_usuario;
\q
```

0
backend/README.md Normal file → Executable file
View file

82
backend/README_ESTRUCTURA.md Executable file
View file

@ -0,0 +1,82 @@
# 🏗️ Estructura Clean Architecture - Backend
## 📁 Estructura de Carpetas
```
backend/src/
├── domain/ # 🎯 DOMAIN LAYER
│ ├── entities/ # Entidades de negocio
│ │ ├── ContentItem.ts
│ │ ├── Drug.ts
│ │ ├── GlossaryTerm.ts
│ │ ├── MediaResource.ts
│ │ ├── MedicalReview.ts
│ │ └── index.ts
│ │
│ ├── value-objects/ # Objetos de valor inmutables
│ │ ├── ContentStatus.ts
│ │ ├── ContentPriority.ts
│ │ └── index.ts
│ │
│ ├── services/ # Servicios de dominio (pendiente)
│ ├── repositories/ # Interfaces de repositorios
│ │ ├── IContentRepository.ts
│ │ ├── IDrugRepository.ts
│ │ ├── IGlossaryRepository.ts
│ │ ├── IMediaRepository.ts
│ │ ├── IReviewRepository.ts
│ │ └── index.ts
│ │
│ └── events/ # Eventos de dominio (pendiente)
├── application/ # 🔧 APPLICATION LAYER
│ ├── services/ # Servicios de aplicación (pendiente)
│ ├── use-cases/ # Casos de uso (pendiente)
│ └── dto/ # Data Transfer Objects (pendiente)
├── infrastructure/ # 🔌 INFRASTRUCTURE LAYER
│ ├── repositories/ # Implementaciones (pendiente)
│ ├── database/ # Acceso a BD (pendiente)
│ ├── storage/ # Almacenamiento (pendiente)
│ ├── cache/ # Caché (pendiente)
│ └── external/ # Servicios externos (pendiente)
├── presentation/ # 🌐 PRESENTATION LAYER
│ ├── routes/ # Rutas Express (existente)
│ ├── middleware/ # Middleware (existente)
│ └── validators/ # Validadores Zod (existente)
└── shared/ # 🔗 CÓDIGO COMPARTIDO
├── types/ # Tipos compartidos
├── errors/ # Errores compartidos
└── utils/ # Utilidades compartidas
```
## ✅ Estado Actual
### Completado (Ticket 1.1)
- ✅ Estructura de carpetas creada
- ✅ Interfaces de repositorios definidas
- ✅ Entidades de dominio creadas (tipos TypeScript)
- ✅ Value Objects creados (ContentStatus, ContentPriority)
- ✅ Tipos compartidos exportados
- ✅ Errores de dominio definidos
- ✅ Utilidades compartidas
### Pendiente
- ⏳ Implementaciones de repositorios (Infrastructure)
- ⏳ Servicios de aplicación (Application)
- ⏳ Casos de uso (Application)
- ⏳ Value Objects adicionales (DoseRange, PatientAge, etc.)
- ⏳ Servicios de dominio (Domain)
## 📝 Próximos Pasos
1. **Ticket 1.2:** Crear schemas Zod compartidos
2. **Ticket 1.3:** Refactorizar `drugs.ts` del frontend
3. **Ticket 1.4:** Refactorizar `procedures.ts` del frontend
4. **Ticket 1.5:** Eliminar duplicidades
---
**Última actualización:** 2025-01-25

View file

@ -1,58 +0,0 @@
/**
* Configuración de conexión a PostgreSQL
*
* FASE 1: Infraestructura Base
*
* IMPORTANTE: Usar variables de entorno para credenciales
*/
import pg from 'pg';
import dotenv from 'dotenv';
dotenv.config();
const { Pool } = pg;
/**
* Pool de conexiones a PostgreSQL
*/
export const pool = new Pool({
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT || '5432', 10),
database: process.env.DB_NAME || 'emerges_tes',
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD || '',
max: 20, // Máximo de conexiones en el pool
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
/**
* Test de conexión
*/
export async function testConnection() {
try {
const result = await pool.query('SELECT NOW()');
console.log('✅ Conexión a PostgreSQL exitosa:', result.rows[0].now);
return true;
} catch (error) {
console.error('❌ Error conectando a PostgreSQL:', error.message);
return false;
}
}
/**
* Función helper para ejecutar queries
* Envuelve pool.query para mantener compatibilidad
*/
export async function query(text, params) {
return await pool.query(text, params);
}
/**
* Cerrar pool de conexiones
*/
export async function closePool() {
await pool.end();
}

0
backend/config/database.ts Normal file → Executable file
View file

View file

@ -10,12 +10,12 @@ cat > /tmp/create-user-emerges.sql << 'SQL'
-- Crear usuario si no existe
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = 'planetazuzu') THEN
CREATE USER planetazuzu WITH PASSWORD 'Monforte.1977';
RAISE NOTICE 'Usuario planetazuzu creado';
IF NOT EXISTS (SELECT FROM pg_user WHERE usename = '${DB_USER:-planetazuzu}') THEN
CREATE USER ${DB_USER:-planetazuzu} WITH PASSWORD '${DB_PASSWORD}';
RAISE NOTICE 'Usuario ${DB_USER:-planetazuzu} creado';
ELSE
RAISE NOTICE 'Usuario planetazuzu ya existe';
ALTER USER planetazuzu WITH PASSWORD 'Monforte.1977';
RAISE NOTICE 'Usuario ${DB_USER:-planetazuzu} ya existe';
ALTER USER ${DB_USER:-planetazuzu} WITH PASSWORD '${DB_PASSWORD}';
END IF;
END
$$;

0
backend/database/migrations/001_create_auth_schema.sql Normal file → Executable file
View file

View file

View file

View file

@ -0,0 +1,60 @@
-- ============================================
-- MIGRACIÓN 004: Esquema de Glosario (tes_content)
-- ============================================
-- TICKET-007: Schema de BD para glosario
-- Crea la tabla glossary_terms en tes_content.
-- Reutiliza tes_content.content_status para estado.
--
-- Schema tes_content ya existe (003); content_status ya existe.
-- ============================================
-- TABLA: glossary_terms
-- Propósito: Términos del glosario médico (farmacológico, anatómico, clínico, procedural)
-- ============================================
CREATE TABLE IF NOT EXISTS tes_content.glossary_terms (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
term VARCHAR(200) NOT NULL,
abbreviation VARCHAR(50),
category VARCHAR(50) NOT NULL,
definition TEXT NOT NULL,
context VARCHAR(500),
examples TEXT[],
related_terms UUID[],
source VARCHAR(200),
status tes_content.content_status NOT NULL DEFAULT 'draft',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
created_by UUID NOT NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_by UUID,
CONSTRAINT chk_glossary_category CHECK (category IN ('pharmaceutical', 'anatomical', 'clinical', 'procedural'))
);
-- Índices
CREATE INDEX IF NOT EXISTS idx_glossary_terms_category ON tes_content.glossary_terms(category);
CREATE INDEX IF NOT EXISTS idx_glossary_terms_status ON tes_content.glossary_terms(status);
CREATE INDEX IF NOT EXISTS idx_glossary_terms_term_lower ON tes_content.glossary_terms(LOWER(term));
CREATE UNIQUE INDEX IF NOT EXISTS idx_glossary_terms_term_category ON tes_content.glossary_terms(LOWER(term), category);
CREATE INDEX IF NOT EXISTS idx_glossary_terms_updated_at ON tes_content.glossary_terms(updated_at);
-- Búsqueda full-text en term y definition
CREATE INDEX IF NOT EXISTS idx_glossary_terms_fts ON tes_content.glossary_terms
USING GIN (to_tsvector('spanish', term || ' ' || COALESCE(definition, '')));
-- Función updated_at en tes_content (idempotente)
CREATE OR REPLACE FUNCTION tes_content.update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_glossary_terms_updated_at
BEFORE UPDATE ON tes_content.glossary_terms
FOR EACH ROW
EXECUTE FUNCTION tes_content.update_updated_at_column();
-- Comentarios
COMMENT ON TABLE tes_content.glossary_terms IS 'Términos del glosario médico (farmacológico, anatómico, clínico, procedural)';

26
backend/dist/config/database.d.ts vendored Executable file
View file

@ -0,0 +1,26 @@
/**
* Configuración de conexión a PostgreSQL
*
* FASE 1: Infraestructura Base
*
* IMPORTANTE: Usar variables de entorno para credenciales
*/
import pg from 'pg';
/**
* Pool de conexiones a PostgreSQL
*/
export declare const pool: pg.Pool;
/**
* Test de conexión
*/
export declare function testConnection(): Promise<boolean>;
/**
* Función helper para ejecutar queries
* Envuelve pool.query para mantener compatibilidad
*/
export declare function query(text: string, params?: any[]): Promise<pg.QueryResult>;
/**
* Cerrar pool de conexiones
*/
export declare function closePool(): Promise<void>;
//# sourceMappingURL=database.d.ts.map

1
backend/dist/config/database.d.ts.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../config/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB;;GAEG;AACH,eAAO,MAAM,IAAI,SASf,CAAC;AAEH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAUvD;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAEjF;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C"}

53
backend/dist/config/database.js vendored Executable file
View file

@ -0,0 +1,53 @@
/**
* Configuración de conexión a PostgreSQL
*
* FASE 1: Infraestructura Base
*
* IMPORTANTE: Usar variables de entorno para credenciales
*/
import pg from 'pg';
import dotenv from 'dotenv';
dotenv.config();
const { Pool } = pg;
/**
* Pool de conexiones a PostgreSQL
*/
export const pool = new Pool({
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT || '5432', 10),
database: process.env.DB_NAME || 'emerges_tes',
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD || '',
max: 20, // Máximo de conexiones en el pool
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
/**
* Test de conexión
*/
export async function testConnection() {
try {
const result = await pool.query('SELECT NOW()');
console.log('✅ Conexión a PostgreSQL exitosa:', result.rows[0].now);
return true;
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
console.error('❌ Error conectando a PostgreSQL:', errorMessage);
return false;
}
}
/**
* Función helper para ejecutar queries
* Envuelve pool.query para mantener compatibilidad
*/
export async function query(text, params) {
return await pool.query(text, params);
}
/**
* Cerrar pool de conexiones
*/
export async function closePool() {
await pool.end();
}
//# sourceMappingURL=database.js.map

1
backend/dist/config/database.js.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../config/database.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAEpB;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;IACxC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC;IACjD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa;IAC9C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;IACvC,GAAG,EAAE,EAAE,EAAE,kCAAkC;IAC3C,iBAAiB,EAAE,KAAK;IACxB,uBAAuB,EAAE,IAAI;CAC9B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,YAAY,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC"}

10
backend/dist/src/config/cors.d.ts vendored Executable file
View file

@ -0,0 +1,10 @@
/**
* Configuración CORS Mejorada
* Limita orígenes incluso en desarrollo por seguridad
*/
import { CorsOptions } from 'cors';
/**
* Obtener configuración CORS basada en entorno
*/
export declare function getCorsConfig(): CorsOptions;
//# sourceMappingURL=cors.d.ts.map

1
backend/dist/src/config/cors.d.ts.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../src/config/cors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEnC;;GAEG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAqD3C"}

57
backend/dist/src/config/cors.js vendored Executable file
View file

@ -0,0 +1,57 @@
/**
* Configuración CORS Mejorada
* Limita orígenes incluso en desarrollo por seguridad
*/
/**
* Obtener configuración CORS basada en entorno
*/
export function getCorsConfig() {
const isDevelopment = process.env.NODE_ENV !== 'production';
// Orígenes por defecto para desarrollo
const defaultDevOrigins = [
'http://localhost:8096',
'http://localhost:5174',
'http://localhost:5173',
];
// Obtener orígenes permitidos de env o usar defaults
const envOrigins = process.env.CORS_ORIGINS
? process.env.CORS_ORIGINS.split(',').map(origin => origin.trim())
: [];
const allowedOrigins = envOrigins.length > 0 ? envOrigins : defaultDevOrigins;
// En producción, CORS_ORIGINS es requerido
if (!isDevelopment && allowedOrigins.length === 0) {
console.error('❌ CRÍTICO: CORS_ORIGINS no configurado en producción');
console.error(' Configurar CORS_ORIGINS en .env con orígenes permitidos separados por coma');
console.error(' Ejemplo: CORS_ORIGINS=https://app.example.com,https://admin.example.com');
process.exit(1);
}
console.log(`✅ CORS configurado para ${isDevelopment ? 'desarrollo' : 'producción'}`);
console.log(` Orígenes permitidos: ${allowedOrigins.join(', ')}`);
return {
origin: (origin, callback) => {
// Permitir requests sin origen solo en desarrollo (mobile apps, Postman, etc.)
if (!origin) {
if (isDevelopment) {
return callback(null, true);
}
else {
return callback(new Error('Origen no proporcionado - requerido en producción'));
}
}
// Verificar si el origen está en la lista permitida
if (allowedOrigins.includes(origin)) {
callback(null, true);
}
else {
console.warn(`⚠️ Intento de acceso desde origen no permitido: ${origin}`);
callback(new Error(`Origen ${origin} no permitido por CORS`));
}
},
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
exposedHeaders: ['X-Total-Count', 'X-Page-Count'],
maxAge: 86400, // 24 horas
};
}
//# sourceMappingURL=cors.js.map

1
backend/dist/src/config/cors.js.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../src/config/cors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAE5D,uCAAuC;IACvC,MAAM,iBAAiB,GAAG;QACxB,uBAAuB;QACvB,uBAAuB;QACvB,uBAAuB;KACxB,CAAC;IAEF,qDAAqD;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY;QACzC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAE9E,2CAA2C;IAC3C,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,2BAA2B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEpE,OAAO;QACL,MAAM,EAAE,CAAC,MAA0B,EAAE,QAAsD,EAAE,EAAE;YAC7F,+EAA+E;YAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YAED,oDAAoD;YACpD,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,oDAAoD,MAAM,EAAE,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,MAAM,wBAAwB,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;QAC7D,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,kBAAkB,CAAC;QACrE,cAAc,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC;QACjD,MAAM,EAAE,KAAK,EAAE,WAAW;KAC3B,CAAC;AACJ,CAAC"}

33
backend/dist/src/config/env.d.ts vendored Executable file
View file

@ -0,0 +1,33 @@
/**
* Validación de Variables de Entorno
* Valida todas las variables requeridas al startup
*/
interface EnvConfig {
db: {
host: string;
port: number;
database: string;
user: string;
password: string;
};
jwt: {
secret: string;
expiresIn: string;
};
cors: {
origins: string[];
};
webhook: {
secret: string;
};
redis: {
url: string;
};
nodeEnv: string;
}
/**
* Validar variables de entorno requeridas
*/
export declare function validateEnv(): EnvConfig;
export {};
//# sourceMappingURL=env.d.ts.map

1
backend/dist/src/config/env.d.ts.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,SAAS;IACjB,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,GAAG,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAmEvC"}

94
backend/dist/src/config/env.js vendored Executable file
View file

@ -0,0 +1,94 @@
/**
* Validación de Variables de Entorno
* Valida todas las variables requeridas al startup
*/
import dotenv from 'dotenv';
dotenv.config();
/**
* Variables de entorno requeridas por categoría
*/
const REQUIRED_ENV_VARS = {
database: [
'DB_HOST',
'DB_NAME',
'DB_USER',
'DB_PASSWORD',
],
security: [
'JWT_SECRET',
],
optional: [
'DB_PORT',
'JWT_EXPIRES_IN',
'CORS_ORIGINS',
'WEBHOOK_SECRET',
'REDIS_URL',
'NODE_ENV',
],
};
/**
* Validar variables de entorno requeridas
*/
export function validateEnv() {
const missing = [];
const warnings = [];
// Validar variables requeridas
Object.entries(REQUIRED_ENV_VARS).forEach(([category, vars]) => {
vars.forEach(key => {
if (!process.env[key]) {
if (category !== 'optional') {
missing.push(`${key} (${category})`);
}
else {
warnings.push(`${key} (${category})`);
}
}
});
});
// Validar formatos específicos
if (process.env.JWT_SECRET && process.env.JWT_SECRET.length < 32) {
missing.push('JWT_SECRET debe tener al menos 32 caracteres');
}
if (process.env.DB_PORT && isNaN(parseInt(process.env.DB_PORT, 10))) {
missing.push('DB_PORT debe ser un número válido');
}
// Mostrar advertencias
if (warnings.length > 0 && process.env.NODE_ENV === 'production') {
console.warn('⚠️ Variables opcionales no configuradas (recomendadas en producción):');
warnings.forEach(key => console.warn(` - ${key}`));
}
// Si faltan variables críticas, salir
if (missing.length > 0) {
console.error('❌ CRÍTICO: Variables de entorno faltantes o inválidas:');
missing.forEach(key => console.error(` - ${key}`));
console.error('\n⚠ Configura estas variables en el archivo .env\n');
process.exit(1);
}
console.log('✅ Variables de entorno validadas correctamente');
return {
db: {
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT || '5432', 10),
database: process.env.DB_NAME || 'emerges_tes',
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD || '',
},
jwt: {
secret: process.env.JWT_SECRET || '',
expiresIn: process.env.JWT_EXPIRES_IN || '24h',
},
cors: {
origins: process.env.CORS_ORIGINS
? process.env.CORS_ORIGINS.split(',').map(o => o.trim())
: [],
},
webhook: {
secret: process.env.WEBHOOK_SECRET || '',
},
redis: {
url: process.env.REDIS_URL || 'redis://localhost:6379',
},
nodeEnv: process.env.NODE_ENV || 'development',
};
}
//# sourceMappingURL=env.js.map

1
backend/dist/src/config/env.js.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,EAAE,CAAC;AA0BhB;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,QAAQ,EAAE;QACR,SAAS;QACT,SAAS;QACT,SAAS;QACT,aAAa;KACd;IACD,QAAQ,EAAE;QACR,YAAY;KACb;IACD,QAAQ,EAAE;QACR,SAAS;QACT,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,WAAW;QACX,UAAU;KACX;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,+BAA+B;IAC/B,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,QAAQ,GAAG,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,QAAQ,GAAG,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACvF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE9D,OAAO;QACL,EAAE,EAAE;YACF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;YACxC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC;YACjD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa;YAC9C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU;YACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;SACxC;QACD,GAAG,EAAE;YACH,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;YACpC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK;SAC/C;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;gBAC/B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,CAAC,CAAC,EAAE;SACP;QACD,OAAO,EAAE;YACP,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;SACzC;QACD,KAAK,EAAE;YACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB;SACvD;QACD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;KAC/C,CAAC;AACJ,CAAC"}

16
backend/dist/src/config/security.d.ts vendored Executable file
View file

@ -0,0 +1,16 @@
/**
* Configuración de Seguridad
* Valida variables de entorno críticas al startup
*/
interface SecurityConfig {
JWT_SECRET: string;
JWT_EXPIRES_IN: string;
WEBHOOK_SECRET: string;
}
/**
* Validar configuración de seguridad
* Si alguna variable crítica falta, la app no arranca
*/
export declare function validateSecurityConfig(): SecurityConfig;
export {};
//# sourceMappingURL=security.d.ts.map

1
backend/dist/src/config/security.d.ts.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/config/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,cAAc,CA2CvD"}

52
backend/dist/src/config/security.js vendored Executable file
View file

@ -0,0 +1,52 @@
/**
* Configuración de Seguridad
* Valida variables de entorno críticas al startup
*/
import dotenv from 'dotenv';
dotenv.config();
/**
* Validar configuración de seguridad
* Si alguna variable crítica falta, la app no arranca
*/
export function validateSecurityConfig() {
const errors = [];
// JWT_SECRET es crítico - debe existir y no ser el valor por defecto
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) {
errors.push('JWT_SECRET no está configurado en .env');
console.error('❌ CRÍTICO: JWT_SECRET no configurado');
console.error(' Generar con: openssl rand -base64 32');
}
else if (JWT_SECRET === 'emerges-tes-secret-key-change-in-production') {
errors.push('JWT_SECRET está usando el valor por defecto inseguro');
console.error('❌ CRÍTICO: JWT_SECRET usa valor por defecto inseguro');
console.error(' Generar un secret seguro con: openssl rand -base64 32');
console.error(' Y actualizarlo en .env');
}
else if (JWT_SECRET.length < 32) {
errors.push('JWT_SECRET debe tener al menos 32 caracteres');
console.error('❌ CRÍTICO: JWT_SECRET demasiado corto (mínimo 32 caracteres)');
}
// WEBHOOK_SECRET es crítico en producción
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET;
if (process.env.NODE_ENV === 'production' && !WEBHOOK_SECRET) {
errors.push('WEBHOOK_SECRET no configurado en producción');
console.error('❌ CRÍTICO: WEBHOOK_SECRET no configurado en producción');
}
// Si hay errores críticos, salir
if (errors.length > 0) {
console.error('\n🚨 ERRORES DE SEGURIDAD ENCONTRADOS:');
errors.forEach((error, index) => {
console.error(` ${index + 1}. ${error}`);
});
console.error('\n⚠ La aplicación no puede iniciarse con estos errores de seguridad.\n');
process.exit(1);
}
console.log('✅ Variables de seguridad validadas correctamente');
return {
JWT_SECRET: JWT_SECRET || '',
JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '24h',
WEBHOOK_SECRET: WEBHOOK_SECRET || '',
};
}
//# sourceMappingURL=security.js.map

1
backend/dist/src/config/security.js.map vendored Executable file
View file

@ -0,0 +1 @@
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/config/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAQhB;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,qEAAqE;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC3D,CAAC;SAAM,IAAI,UAAU,KAAK,6CAA6C,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAChF,CAAC;IAED,0CAA0C;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,iCAAiC;IACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAEhE,OAAO;QACL,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,KAAK;QACnD,cAAc,EAAE,cAAc,IAAI,EAAE;KACrC,CAAC;AACJ,CAAC"}

View file

@ -0,0 +1,35 @@
/**
* ContentItem Entity
* Domain Layer - Entidad inmutable de dominio
*/
import type { ContentStatus } from '../value-objects/ContentStatus.js';
import type { ContentPriority } from '../value-objects/ContentPriority.js';
export type ContentType = 'protocol' | 'guide' | 'manual' | 'checklist';
export type ContentLevel = 'operativo' | 'formativo' | 'referencia';
export type AgeGroup = 'adulto' | 'pediatrico' | 'neonatal' | 'todos';
export interface ContentItem {
readonly id: string;
readonly type: ContentType;
readonly slug: string;
readonly level: ContentLevel;
readonly title: string;
readonly shortTitle?: string;
readonly description?: string;
readonly content: Record<string, unknown>;
readonly contentMarkdown?: string;
readonly category?: string;
readonly subcategory?: string;
readonly priority: ContentPriority;
readonly ageGroup?: AgeGroup;
readonly status: ContentStatus;
readonly version: number;
readonly latestVersion: number;
readonly validatedBy?: string;
readonly validatedAt?: Date;
readonly createdAt: Date;
readonly updatedAt: Date;
readonly createdBy: string;
readonly updatedBy: string;
readonly tags?: readonly string[];
}
//# sourceMappingURL=ContentItem.d.ts.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ContentItem.d.ts","sourceRoot":"","sources":["../../../../src/domain/entities/ContentItem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;AACpE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC"}

View file

@ -0,0 +1,6 @@
/**
* ContentItem Entity
* Domain Layer - Entidad inmutable de dominio
*/
export {};
//# sourceMappingURL=ContentItem.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ContentItem.js","sourceRoot":"","sources":["../../../../src/domain/entities/ContentItem.ts"],"names":[],"mappings":"AAAA;;;GAGG"}

36
backend/dist/src/domain/entities/Drug.d.ts vendored Executable file
View file

@ -0,0 +1,36 @@
/**
* Drug Entity
* Domain Layer - Entidad inmutable de dominio
*/
import type { ContentStatus } from '../value-objects/ContentStatus.js';
export type DrugCategory = 'cardiovascular' | 'respiratorio' | 'neurologico' | 'analgesia' | 'oxigenoterapia' | 'otros';
export type AdministrationRoute = 'IV' | 'IM' | 'SC' | 'IO' | 'Nebulizado' | 'SL' | 'Rectal' | 'Nasal';
export interface Drug {
readonly id: string;
readonly slug: string;
readonly genericName: string;
readonly tradeName?: string;
readonly category: DrugCategory;
readonly line: 'first' | 'second';
readonly frequency: 'high' | 'medium' | 'low';
readonly presentation: string;
readonly adultDose: string;
readonly pediatricDose?: string;
readonly routes: readonly AdministrationRoute[];
readonly dilution?: string;
readonly indications: readonly string[];
readonly contraindications: readonly string[];
readonly sideEffects?: string;
readonly antidote?: string;
readonly notes: readonly string[];
readonly criticalPoints: readonly string[];
readonly source?: string;
readonly status: ContentStatus;
readonly version: string;
readonly latestVersion: string;
readonly createdAt: Date;
readonly updatedAt: Date;
readonly createdBy: string;
readonly updatedBy?: string;
}
//# sourceMappingURL=Drug.d.ts.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Drug.d.ts","sourceRoot":"","sources":["../../../../src/domain/entities/Drug.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,WAAW,GACX,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAC3B,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,YAAY,GACZ,IAAI,GACJ,QAAQ,GACR,OAAO,CAAC;AAEZ,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}

6
backend/dist/src/domain/entities/Drug.js vendored Executable file
View file

@ -0,0 +1,6 @@
/**
* Drug Entity
* Domain Layer - Entidad inmutable de dominio
*/
export {};
//# sourceMappingURL=Drug.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Drug.js","sourceRoot":"","sources":["../../../../src/domain/entities/Drug.ts"],"names":[],"mappings":"AAAA;;;GAGG"}

View file

@ -0,0 +1,23 @@
/**
* GlossaryTerm Entity
* Domain Layer - Entidad inmutable de dominio
*/
import type { ContentStatus } from '../value-objects/ContentStatus.js';
export type GlossaryCategory = 'pharmaceutical' | 'anatomical' | 'clinical' | 'procedural';
export interface GlossaryTerm {
readonly id: string;
readonly term: string;
readonly abbreviation?: string;
readonly category: GlossaryCategory;
readonly definition: string;
readonly context?: string;
readonly examples?: readonly string[];
readonly relatedTerms?: readonly string[];
readonly source?: string;
readonly status: ContentStatus;
readonly createdAt: Date;
readonly updatedAt: Date;
readonly createdBy: string;
readonly updatedBy?: string;
}
//# sourceMappingURL=GlossaryTerm.d.ts.map

View file

@ -0,0 +1 @@
{"version":3,"file":"GlossaryTerm.d.ts","sourceRoot":"","sources":["../../../../src/domain/entities/GlossaryTerm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,YAAY,GACZ,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}

View file

@ -0,0 +1,6 @@
/**
* GlossaryTerm Entity
* Domain Layer - Entidad inmutable de dominio
*/
export {};
//# sourceMappingURL=GlossaryTerm.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"GlossaryTerm.js","sourceRoot":"","sources":["../../../../src/domain/entities/GlossaryTerm.ts"],"names":[],"mappings":"AAAA;;;GAGG"}

View file

@ -0,0 +1,34 @@
/**
* MediaResource Entity
* Domain Layer - Entidad inmutable de dominio
*/
import type { ContentStatus } from '../value-objects/ContentStatus.js';
import type { ContentPriority } from '../value-objects/ContentPriority.js';
export type MediaType = 'image' | 'video' | 'audio' | 'document';
export interface MediaResource {
readonly id: string;
readonly type: MediaType;
readonly path: string;
readonly filename: string;
readonly fileUrl: string;
readonly thumbnailUrl?: string;
readonly title?: string;
readonly description?: string;
readonly altText?: string;
readonly caption?: string;
readonly tags: readonly string[];
readonly block?: string;
readonly chapter?: string;
readonly priority: ContentPriority;
readonly width?: number;
readonly height?: number;
readonly format?: string;
readonly fileSize: number;
readonly durationSeconds?: number;
readonly status: ContentStatus;
readonly createdAt: Date;
readonly updatedAt: Date;
readonly createdBy: string;
readonly updatedBy?: string;
}
//# sourceMappingURL=MediaResource.d.ts.map

View file

@ -0,0 +1 @@
{"version":3,"file":"MediaResource.d.ts","sourceRoot":"","sources":["../../../../src/domain/entities/MediaResource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}

View file

@ -0,0 +1,6 @@
/**
* MediaResource Entity
* Domain Layer - Entidad inmutable de dominio
*/
export {};
//# sourceMappingURL=MediaResource.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"MediaResource.js","sourceRoot":"","sources":["../../../../src/domain/entities/MediaResource.ts"],"names":[],"mappings":"AAAA;;;GAGG"}

View file

@ -0,0 +1,27 @@
/**
* MedicalReview Entity
* Domain Layer - Entidad inmutable de dominio
*/
export type ReviewerRole = 'reviewer' | 'validator';
export type ReviewStatus = 'pending' | 'approved' | 'rejected';
export interface ReviewComment {
readonly id: string;
readonly section: string;
readonly comment: string;
readonly type: 'suggestion' | 'correction' | 'question' | 'approval';
readonly severity: 'low' | 'medium' | 'high' | 'critical';
readonly createdAt: Date;
}
export interface MedicalReview {
readonly id: string;
readonly contentId: string;
readonly reviewerId: string;
readonly reviewerName: string;
readonly reviewerRole: ReviewerRole;
readonly status: ReviewStatus;
readonly comments: readonly ReviewComment[];
readonly clinicalSources: readonly string[];
readonly validatedAt?: Date;
readonly createdAt: Date;
}
//# sourceMappingURL=MedicalReview.d.ts.map

Some files were not shown because too many files have changed in this diff Show more