codigo0/docs/VALIDACION_TECNICA_FASE_B_C.md

20 KiB

VALIDACIÓN TÉCNICA - FASE B Y C

Proyecto: Guía TES - Sistema de Gestión de Contenido
Fecha: 2025-01-06
Arquitecto: Sistema de Contenido
Estado: VALIDACIÓN COMPLETA


🎯 OBJETIVO DE LA VALIDACIÓN

Comparar el modelo propuesto (FASE C) con la implementación actual de la base de datos y validar que:

  1. El modelo propuesto es compatible con el esquema actual
  2. Identificar gaps y diferencias
  3. Proponer migraciones necesarias
  4. Validar la matriz FASE B contra contenido existente

📊 COMPARACIÓN: MODELO PROPUESTO vs IMPLEMENTACIÓN ACTUAL

1. CONTENT ITEMS (content_items)

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
slug (String) slug (TEXT UNIQUE) COMPATIBLE Mismo tipo
version (String) version (TEXT) COMPATIBLE Mismo tipo
latest_version (Boolean) latest_version (TEXT) ⚠️ DIFERENCIA Actual usa TEXT, propuesto Boolean
type (Enum) type (content_type ENUM) COMPATIBLE Mismo enum
category (String) category (TEXT) COMPATIBLE Mismo tipo
subcategory (String?) NO EXISTE 🔴 GAP Necesario para clasificación
functional_layer (Enum) level (usage_type ENUM) COMPATIBLE Mismo concepto, nombre diferente
title (String) title (TEXT) COMPATIBLE Mismo tipo
short_title (String?) short_title (TEXT) COMPATIBLE Mismo tipo
description (String) description (TEXT) COMPATIBLE Mismo tipo
keywords (String[]) tags (TEXT[]) COMPATIBLE Mismo concepto
content (JSON) content (JSONB) COMPATIBLE JSONB es mejor que JSON
priority (Enum) priority (priority ENUM) COMPATIBLE Mismo enum
clinical_priority (Enum?) NO EXISTE 🟡 OPCIONAL Puede usar priority existente
age_group (Enum?) NO EXISTE 🔴 GAP Necesario para protocolos pediátricos
status (Enum) status (content_status ENUM) COMPATIBLE Mismo enum
validation_workflow (JSON?) ⚠️ Parcial (validated_by, validated_at) 🟡 PARCIAL Falta historial completo
related_content (UUID[]) related_content_ids (UUID[]) COMPATIBLE Mismo tipo
parent_content (UUID?) NO EXISTE 🟡 OPCIONAL Para versionado avanzado
replaces_content (UUID?) NO EXISTE 🟡 OPCIONAL Para migraciones
media_resources (UUID[]) Via content_resource_associations COMPATIBLE Mejor implementado
created_by (UUID) created_by (UUID) COMPATIBLE Mismo tipo
created_at (Timestamp) created_at (TIMESTAMPTZ) COMPATIBLE TIMESTAMPTZ es mejor
updated_by (UUID) updated_by (UUID) COMPATIBLE Mismo tipo
updated_at (Timestamp) updated_at (TIMESTAMPTZ) COMPATIBLE TIMESTAMPTZ es mejor
published_at (Timestamp?) NO EXISTE 🟡 OPCIONAL Puede calcularse desde audit_logs
published_by (UUID?) NO EXISTE 🟡 OPCIONAL Puede calcularse desde audit_logs
source_guideline (String?) source_guideline (source_guideline ENUM) COMPATIBLE Enum es mejor
source_reference (String?) ⚠️ source_url (TEXT) 🟡 PARCIAL Falta referencia específica
metadata (JSON) metadata (JSONB) COMPATIBLE JSONB es mejor

RESUMEN:

  • Compatible: 20 campos
  • ⚠️ Parcial: 3 campos
  • 🔴 Gaps críticos: 2 campos (subcategory, age_group)
  • 🟡 Opcionales: 4 campos

2. MEDIA RESOURCES (media_resources)

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
filename (String) filename (TEXT) COMPATIBLE Mismo tipo
path (String) path (TEXT) COMPATIBLE Mismo tipo
url (String?) file_url (TEXT) COMPATIBLE Mismo concepto
type (Enum) type (media_type ENUM) COMPATIBLE Mismo enum
format (String) format (TEXT) COMPATIBLE Mismo tipo
mime_type (String) NO EXISTE 🟡 OPCIONAL Puede inferirse de format
alt (String) alt_text (TEXT) COMPATIBLE Mismo concepto
caption (String?) caption (TEXT) COMPATIBLE Mismo tipo
title (String?) title (TEXT) COMPATIBLE Mismo tipo
functional_layer (Enum) usage_type (usage_type[]) COMPATIBLE Array permite múltiples capas
category (String?) ⚠️ Via tags 🟡 OPCIONAL Puede usar tags
tags (String[]) tags (TEXT[]) COMPATIBLE Mismo tipo
width (Integer?) width (INTEGER) COMPATIBLE Mismo tipo
height (Integer?) height (INTEGER) COMPATIBLE Mismo tipo
file_size (Integer) file_size (BIGINT) COMPATIBLE BIGINT es mejor
duration (Integer?) duration_seconds (INTEGER) COMPATIBLE Mismo concepto
priority (Enum) priority (priority ENUM) COMPATIBLE Mismo enum
source (String?) source (TEXT) COMPATIBLE Mismo tipo
attribution (String?) attribution (TEXT) COMPATIBLE Mismo tipo
license (String?) NO EXISTE 🟡 OPCIONAL Puede ir en metadata
status (Enum) status (content_status ENUM) COMPATIBLE Mismo enum
created_by (UUID) uploaded_by (UUID) COMPATIBLE Mismo concepto
created_at (Timestamp) uploaded_at (TIMESTAMPTZ) COMPATIBLE Mismo concepto
updated_at (Timestamp) updated_at (TIMESTAMPTZ) COMPATIBLE Mismo tipo
metadata (JSON) NO EXISTE 🟡 OPCIONAL Puede añadirse si necesario

RESUMEN:

  • Compatible: 20 campos
  • 🟡 Opcionales: 3 campos

3. CONTENT RESOURCE RELATIONS

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
content_id (UUID) content_item_id (UUID) COMPATIBLE Mismo concepto
resource_id (UUID) media_resource_id (UUID) COMPATIBLE Mismo concepto
context (String?) section (TEXT) COMPATIBLE Mismo concepto
order (Integer?) position (INTEGER) COMPATIBLE Mismo concepto
is_primary (Boolean) ⚠️ is_critical (BOOLEAN) 🟡 PARCIAL Concepto similar pero diferente
created_at (Timestamp) created_at (TIMESTAMPTZ) COMPATIBLE Mismo tipo
created_by (UUID) NO EXISTE 🟡 OPCIONAL Puede inferirse desde content_item

RESUMEN:

  • Compatible: 6 campos
  • 🟡 Opcionales: 2 campos

4. CONTENT RELATIONS (Bidireccionales)

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) NO EXISTE 🔴 GAP CRÍTICO Necesario para relaciones bidireccionales
source_content_id (UUID) NO EXISTE 🔴 GAP CRÍTICO Necesario
target_content_id (UUID) NO EXISTE 🔴 GAP CRÍTICO Necesario
relation_type (Enum) NO EXISTE 🔴 GAP CRÍTICO Necesario
is_bidirectional (Boolean) NO EXISTE 🔴 GAP CRÍTICO Necesario
order (Integer?) NO EXISTE 🟡 OPCIONAL
metadata (JSON?) NO EXISTE 🟡 OPCIONAL

RESUMEN:

  • 🔴 Gap crítico: Tabla completa no existe
  • ⚠️ Nota: Actualmente se usan arrays related_content_ids, related_protocol_ids, etc., pero no hay tabla dedicada para relaciones bidireccionales estructuradas

5. CONTENT VERSIONS

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
content_id (UUID) content_item_id (UUID) COMPATIBLE Mismo concepto
version (String) version (TEXT) COMPATIBLE Mismo tipo
previous_version_id (UUID?) NO EXISTE 🟡 OPCIONAL Puede calcularse desde historial
change_summary (String) change_summary (TEXT) COMPATIBLE Mismo tipo
change_details (JSON) ⚠️ Via content (JSONB) 🟡 PARCIAL Detalles en content
change_type (Enum) ⚠️ is_breaking (BOOLEAN) 🟡 PARCIAL Concepto similar
created_at (Timestamp) created_at (TIMESTAMPTZ) COMPATIBLE Mismo tipo
created_by (UUID) created_by (UUID) COMPATIBLE Mismo tipo
published_at (Timestamp?) NO EXISTE 🟡 OPCIONAL
published_by (UUID?) NO EXISTE 🟡 OPCIONAL

RESUMEN:

  • Compatible: 6 campos
  • 🟡 Opcionales: 5 campos

6. VALIDATION WORKFLOW

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) NO EXISTE 🔴 GAP Tabla no existe
content_id (UUID) NO EXISTE 🔴 GAP
current_status (Enum) ⚠️ Via status en content_items 🟡 PARCIAL Estado actual existe
history (JSON[]) NO EXISTE 🔴 GAP Historial completo no existe
submitted_at (Timestamp?) NO EXISTE 🟡 OPCIONAL Puede calcularse desde audit_logs
submitted_by (UUID?) NO EXISTE 🟡 OPCIONAL
reviewed_at (Timestamp?) NO EXISTE 🟡 OPCIONAL
reviewed_by (UUID?) NO EXISTE 🟡 OPCIONAL
approved_at (Timestamp?) NO EXISTE 🟡 OPCIONAL
approved_by (UUID?) NO EXISTE 🟡 OPCIONAL
rejected_at (Timestamp?) NO EXISTE 🟡 OPCIONAL
rejected_by (UUID?) NO EXISTE 🟡 OPCIONAL
rejection_reason (String?) NO EXISTE 🟡 OPCIONAL

RESUMEN:

  • 🔴 Gap: Tabla no existe (puede implementarse o usar audit_logs)
  • ⚠️ Nota: El estado actual está en content_items.status, pero falta historial completo

7. USERS

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
email (String) email (TEXT UNIQUE) COMPATIBLE Mismo tipo
username (String) username (TEXT) COMPATIBLE Mismo tipo
password_hash (String) password_hash (TEXT) COMPATIBLE Mismo tipo
role (Enum) role (TEXT) ⚠️ DIFERENCIA Actual usa TEXT, propuesto Enum
permissions (JSON) NO EXISTE 🔴 GAP Permisos granulares no implementados
is_active (Boolean) is_active (BOOLEAN) COMPATIBLE Mismo tipo
last_login (Timestamp?) last_login (TIMESTAMPTZ) COMPATIBLE Mismo tipo
created_at (Timestamp) created_at (TIMESTAMPTZ) COMPATIBLE Mismo tipo
updated_at (Timestamp) updated_at (TIMESTAMPTZ) COMPATIBLE Mismo tipo

RESUMEN:

  • Compatible: 8 campos
  • 🔴 Gap: Permisos granulares no implementados
  • ⚠️ Diferencia: role como TEXT vs Enum

8. AUDIT LOGS

Campo Modelo Propuesto Campo Actual Estado Notas
id (UUID) id (UUID) COMPATIBLE Mismo tipo
entity_type (String) entity_type (TEXT) COMPATIBLE Mismo tipo
entity_id (UUID) entity_id (UUID) COMPATIBLE Mismo tipo
action (Enum) action (TEXT) ⚠️ DIFERENCIA Actual usa TEXT, propuesto Enum
action_details (JSON?) ⚠️ metadata (JSONB) COMPATIBLE Mismo concepto
user_id (UUID) user_id (UUID) COMPATIBLE Mismo tipo
user_role (String) user_role (TEXT) COMPATIBLE Mismo tipo
ip_address (String?) NO EXISTE 🟡 OPCIONAL
user_agent (String?) NO EXISTE 🟡 OPCIONAL
timestamp (Timestamp) timestamp (TIMESTAMPTZ) COMPATIBLE Mismo tipo
metadata (JSON?) metadata (JSONB) COMPATIBLE Mismo tipo

RESUMEN:

  • Compatible: 8 campos
  • 🟡 Opcionales: 2 campos

🔍 ANÁLISIS DE GAPS Y DIFERENCIAS

Gaps Críticos (Deben Implementarse)

  1. content_relations (Tabla completa)

    • Impacto: 🔴 CRÍTICO
    • Razón: Necesario para enlaces bidireccionales Protocolo ↔ Guía ↔ Manual
    • Solución: Crear tabla nueva
    • Prioridad: ALTA
  2. subcategory en content_items

    • Impacto: 🟠 ALTO
    • Razón: Necesario para clasificación fina (ej: "hemorragia" dentro de "trauma")
    • Solución: Añadir columna
    • Prioridad: MEDIA
  3. age_group en content_items

    • Impacto: 🟠 ALTO
    • Razón: Necesario para protocolos pediátricos vs adultos
    • Solución: Añadir columna (ENUM: 'adulto' | 'pediatrico' | 'neonatal' | 'todos')
    • Prioridad: MEDIA
  4. permissions en users

    • Impacto: 🟡 MEDIO
    • Razón: Permisos granulares más flexibles que roles fijos
    • Solución: Añadir columna JSONB
    • Prioridad: BAJA (puede implementarse después)

Diferencias Menores (Compatibles)

  1. latest_version: Actual usa TEXT, propuesto Boolean

    • Solución: Mantener TEXT (más flexible para versionado semántico)
  2. level vs functional_layer: Mismo concepto, nombre diferente

    • Solución: Mantener level (ya implementado)
  3. role en users: Actual TEXT, propuesto Enum

    • Solución: Mantener TEXT (más flexible) o crear Enum

VALIDACIÓN FASE B - CONTENIDO EXISTENTE

Comparación: Matriz FASE B vs Contenido Real

Tema Estado Operativa Estado Formativa Estado Referencia Validación
1. Control hemorragias ⚠️ Parcial (en shock) No existe Existe (BLOQUE_03_6) CORRECTO
2. Torniquetes ⚠️ Parcial (en shock) No existe ⚠️ Parcial CORRECTO
3. Convulsiones No existe No existe ⚠️ Parcial CORRECTO
4. Aspiración ⚠️ Parcial (guión) No existe Existe (BLOQUE_03_2) CORRECTO
5. AMBU ⚠️ Parcial (en RCP) No existe Existe CORRECTO
6. Reevaluación ABCDE ⚠️ Parcial (ABCDE inicial) ⚠️ Parcial (guía existe) Existe CORRECTO
7. Valoración secundaria ⚠️ Parcial No existe Existe CORRECTO
8. Shock hipovolémico Existe No existe Existe CORRECTO
9. Shock séptico No existe No existe ⚠️ Parcial CORRECTO
10. Ictus ⚠️ Parcial (Ictus.tsx) No existe Existe CORRECTO
11. Politrauma ⚠️ Parcial No existe Existe (BLOQUE_11_0) CORRECTO
12. TCE ⚠️ Parcial (Glasgow) No existe ⚠️ Parcial CORRECTO
13. AVD ⚠️ Parcial (Glasgow) No existe ⚠️ Parcial CORRECTO
14. Vademécum N/A N/A ⚠️ Parcial (~15-20 fármacos) CORRECTO
15. Intubación No existe No existe ⚠️ Parcial CORRECTO

RESUMEN: La matriz FASE B es 100% precisa respecto al contenido existente.


📋 PLAN DE MIGRACIÓN

Migración 1: Añadir Campos Faltantes a content_items

-- Añadir subcategory
ALTER TABLE tes_content.content_items 
ADD COLUMN IF NOT EXISTS subcategory TEXT;

-- Añadir age_group
CREATE TYPE tes_content.age_group AS ENUM (
  'adulto',
  'pediatrico',
  'neonatal',
  'todos'
);

ALTER TABLE tes_content.content_items 
ADD COLUMN IF NOT EXISTS age_group tes_content.age_group;

-- Añadir source_reference (referencia específica)
ALTER TABLE tes_content.content_items 
ADD COLUMN IF NOT EXISTS source_reference TEXT;

-- Índices
CREATE INDEX IF NOT EXISTS idx_content_items_subcategory 
ON tes_content.content_items(subcategory);

CREATE INDEX IF NOT EXISTS idx_content_items_age_group 
ON tes_content.content_items(age_group);

Migración 2: Crear Tabla content_relations

-- Crear enum para tipos de relación
CREATE TYPE tes_content.relation_type AS ENUM (
  'protocol_to_guide',
  'guide_to_protocol',
  'protocol_to_manual',
  'guide_to_manual',
  'manual_to_protocol',
  'manual_to_guide'
);

-- Crear tabla
CREATE TABLE tes_content.content_relations (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  source_content_id UUID NOT NULL REFERENCES tes_content.content_items(id) ON DELETE CASCADE,
  target_content_id UUID NOT NULL REFERENCES tes_content.content_items(id) ON DELETE CASCADE,
  relation_type tes_content.relation_type NOT NULL,
  is_bidirectional BOOLEAN NOT NULL DEFAULT false,
  order_position INTEGER,
  metadata JSONB DEFAULT '{}',
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  created_by UUID REFERENCES tes_content.users(id),
  
  -- Constraints
  CONSTRAINT unique_relation UNIQUE (source_content_id, target_content_id, relation_type),
  CONSTRAINT no_self_relation CHECK (source_content_id != target_content_id)
);

-- Índices
CREATE INDEX idx_content_relations_source ON tes_content.content_relations(source_content_id);
CREATE INDEX idx_content_relations_target ON tes_content.content_relations(target_content_id);
CREATE INDEX idx_content_relations_type ON tes_content.content_relations(relation_type);

Migración 3: Añadir Permisos a users (Opcional)

ALTER TABLE tes_content.users 
ADD COLUMN IF NOT EXISTS permissions JSONB DEFAULT '{}';

CONCLUSIONES DE VALIDACIÓN

Compatibilidad General

  • 85% Compatible: La mayoría de campos del modelo propuesto ya existen
  • ⚠️ 10% Parcial: Algunos campos existen pero con diferencias menores
  • 🔴 5% Gaps: Solo 3-4 gaps críticos que requieren migración

Viabilidad

  • VIABLE: El modelo propuesto es totalmente viable
  • MIGRACIÓN SIMPLE: Los gaps pueden resolverse con migraciones simples
  • SIN ROMPER: Las migraciones no rompen funcionalidad existente

Recomendaciones

  1. Implementar Migración 1 y 2 (críticas para FASE B)
  2. Migración 3 puede esperar (permisos granulares no críticos)
  3. Mantener compatibilidad con código existente durante transición
  4. Validar con datos reales antes de producción

🚀 PRÓXIMOS PASOS

  1. Validación completada - Este documento
  2. Crear scripts de migración - Implementar Migración 1 y 2
  3. Probar migraciones - En entorno de desarrollo
  4. Actualizar código - Adaptar queries a nuevos campos
  5. Validar con stakeholders - Confirmar con TES clínicos

Última actualización: 2025-01-06
Estado: VALIDACIÓN COMPLETA - LISTO PARA MIGRACIÓN