Saltar a contenido

Portal Básico para Médicos

Identificador: MTS-PTL-001 Versión: 1.0.0 Fecha: 2025-12-01 Autor: SpecQueen


1. Propósito

Este módulo permite a los pacientes compartir un perfil médico temporal con profesionales de salud mediante un código de 6 dígitos y un enlace único, sin requerir que el médico tenga una cuenta en MedTime.

2. Actores

Actor Descripción
Paciente Genera el código de acceso y controla qué información compartir
Médico/Profesional de Salud Accede al perfil compartido usando el código
Sistema Genera códigos, valida accesos, registra visualizaciones

3. Funcionalidades

3.1. Generación de Código de Acceso (MTS-PTL-001-F01)

3.1.1. Descripción

El paciente genera un código de 6 dígitos + enlace único para compartir su perfil médico con un profesional de salud.

3.1.2. Flujo: Generar Código de Acceso

  1. Paciente accede a "Compartir con Médico"
  2. Sistema muestra opciones de contenido a incluir:
  3. Datos básicos (nombre, edad, tipo de sangre)
  4. Alergias
  5. Condiciones crónicas
  6. Medicamentos activos (con dosis y frecuencia)
  7. Adherencia (últimos 30 días)
  8. Paciente selecciona información a compartir
  9. Sistema genera:
  10. Código de 6 dígitos (numérico)
  11. Enlace único (URL corta)
  12. Sistema muestra código + enlace + código QR
  13. Paciente puede compartir por:
  14. Mostrar código QR
  15. Copiar enlace
  16. Dictar código de 6 dígitos
  17. Sistema registra generación en audit log

3.1.3. Especificaciones del Código

Aspecto Especificación
Formato 6 dígitos numéricos (000000 - 999999)
Vigencia 24 horas desde generación
Máximo de visualizaciones 5 visualizaciones
Expiración Lo que ocurra primero (24h o 5 visualizaciones)
Regeneración Paciente puede generar nuevo código en cualquier momento

3.1.4. Contenido del Perfil Compartible

Sección Datos Incluidos Seleccionable
Identificación Nombre, edad, género No (siempre incluido)
Datos vitales Tipo de sangre, peso, altura
Alergias Lista completa de alergias
Condiciones Condiciones crónicas
Medicamentos Lista con dosis y frecuencia
Adherencia Estadísticas últimos 30 días

3.2. Acceso del Médico (MTS-PTL-001-F02)

3.2.1. Descripción

El profesional de salud accede al perfil compartido usando el código o enlace proporcionado.

3.2.2. Flujo: Acceso con Código

  1. Médico accede a la página de acceso (portal.medtime.app o similar)
  2. Sistema solicita código de 6 dígitos
  3. Médico ingresa el código
  4. Sistema valida:
  5. Código existe
  6. No ha expirado (< 24h)
  7. No ha excedido visualizaciones (< 5)
  8. Si válido: Sistema muestra perfil del paciente
  9. Sistema registra visualización (contador +1)
  10. Sistema registra en audit log del paciente

3.2.3. Flujo: Acceso con Enlace

  1. Médico accede directamente al enlace único
  2. Sistema valida vigencia y visualizaciones
  3. Si válido: Sistema muestra perfil del paciente
  4. Sistema registra visualización

3.2.4. Interfaz de Visualización del Perfil

┌────────────────────────────────────────────────────────────┐
│  PERFIL MÉDICO COMPARTIDO                                   │
│  Compartido por: Juan García                                │
│  Válido hasta: 01/12/2025 15:30                            │
├────────────────────────────────────────────────────────────┤
│                                                             │
│  DATOS BÁSICOS                                              │
│  ─────────────                                              │
│  Nombre: Juan García López                                  │
│  Edad: 45 años                                              │
│  Tipo de sangre: O+                                         │
│                                                             │
│  ALERGIAS                                                   │
│  ────────                                                   │
│  • Penicilina (severa)                                      │
│  • Sulfas (moderada)                                        │
│                                                             │
│  MEDICAMENTOS ACTIVOS                                       │
│  ────────────────────                                       │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ Metformina 850mg                                      │  │
│  │ 1 tableta cada 12 horas - Con alimentos               │  │
│  │ Desde: 15/06/2024                                     │  │
│  └──────────────────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ Lisinopril 10mg                                       │  │
│  │ 1 tableta cada 24 horas - En ayunas                   │  │
│  │ Desde: 01/03/2024                                     │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
│  ADHERENCIA (Últimos 30 días)                              │
│  ──────────────────────────────                            │
│  Cumplimiento general: 94%                                  │
│  Metformina: 96% | Lisinopril: 92%                         │
│                                                             │
│  ────────────────────────────────────────────────────────  │
│  Este perfil fue compartido voluntariamente por el          │
│  paciente. Los datos mostrados son de solo lectura.        │
│                                                             │
│  [Descargar PDF]  [¿Desea acceso permanente?]              │
└────────────────────────────────────────────────────────────┘

3.3. Acceso Permanente para Médicos (MTS-PTL-001-F03)

3.3.1. Descripción

Opcionalmente, el médico puede crear una cuenta para tener acceso permanente a pacientes que lo autoricen.

3.3.2. Flujo: Solicitar Acceso Permanente

  1. Médico visualiza perfil con código temporal
  2. Médico selecciona "¿Desea acceso permanente?"
  3. Sistema muestra opciones:
  4. Continuar sin cuenta (acceso temporal)
  5. Crear cuenta de médico
  6. Si elige crear cuenta:

a. Médico ingresa email y cédula profesional (CPDP) b. Sistema verifica formato de cédula según país c. México: Sistema consulta API CPDP para validar cédula d. Sistema envía email de verificación e. Médico confirma email f. Sistema crea cuenta de médico (con badge de verificación si CPDP válido)

  1. Sistema notifica al paciente de la solicitud
  2. Paciente puede aprobar/rechazar acceso permanente

3.3.3. Permisos del Médico con Cuenta

Permiso Descripción Requiere Aprobación
Ver perfil compartido Datos que el paciente decidió compartir
Recibir actualizaciones Cambios en medicamentos
Descargar reportes PDF del perfil No
Ver historial Medicamentos pasados Sí (adicional)

Nota: El médico NO puede ver más información de la que el paciente decidió compartir. El paciente mantiene control total.


3.4. Notificaciones al Paciente (MTS-PTL-001-F04)

3.4.1. Descripción

El paciente recibe notificaciones sobre el acceso a su perfil compartido.

3.4.2. Eventos Notificados

Evento Notificación
Perfil visualizado "Un profesional de salud vio tu perfil compartido"
Código próximo a vencer "Tu código de acceso vence en 2 horas"
Visualizaciones agotadas "Tu código ha alcanzado el máximo de visualizaciones"
Solicitud de acceso permanente "Dr. [Nombre] solicita acceso permanente a tu perfil"
Acceso permanente otorgado "Has otorgado acceso permanente a Dr. [Nombre]"

4. Reglas de Negocio

ID Regla
RN-PTL-001 Código de acceso es de 6 dígitos numéricos
RN-PTL-002 Código expira a las 24 horas o 5 visualizaciones, lo que ocurra primero
RN-PTL-003 Paciente puede revocar código activo en cualquier momento
RN-PTL-004 Acceso del médico se registra en audit log del paciente
RN-PTL-005 Médico solo ve información que el paciente decidió compartir
RN-PTL-006 Cuenta de médico es opcional para acceso temporal
RN-PTL-007 Acceso permanente requiere aprobación explícita del paciente
RN-PTL-008 Paciente puede revocar acceso permanente en cualquier momento
RN-PTL-009 Máximo 10 códigos activos simultáneos por paciente
RN-PTL-010 Enlace único no contiene información del paciente en la URL

5. Modelo de Datos

5.1. Entidad CodigoAccesoMedico

CodigoAccesoMedico {
  id: UUID (PK)
  usuario_id: UUID (FK)
  codigo: string (6 dígitos, hashed)
  token_enlace: string (UUID, hashed)
  contenido_compartido: array
  fecha_creacion: timestamp
  fecha_expiracion: timestamp
  visualizaciones_max: integer (default: 5)
  visualizaciones_actuales: integer
  estado: enum [ACTIVO, EXPIRADO, REVOCADO, AGOTADO]
  created_at: timestamp
}

5.2. Entidad VisualizacionPerfil

VisualizacionPerfil {
  id: UUID (PK)
  codigo_acceso_id: UUID (FK)
  ip_address: string
  user_agent: string
  ubicacion_aproximada: string
  medico_cuenta_id: UUID (FK, nullable)
  timestamp: timestamp
}

5.3. Entidad CuentaMedico

CuentaMedico {
  id: UUID (PK)
  email: string (unique)
  cedula_profesional: string
  pais_cedula: string (ISO 3166-1 alpha-2)
  nombre: string
  especialidad: string
  verificado: boolean
  verificacion_cpdp: boolean  // Iteración 13: Verificación via API CPDP (México)
  badge_tipo: enum [NINGUNO, VERIFICADO, CPDP_VERIFICADO]  // Iteración 13
  fecha_verificacion: timestamp
  datos_cpdp: jsonb (nullable)  // Iteración 13: Respuesta de API CPDP
  created_at: timestamp
  updated_at: timestamp
}

5.4. Verificación CPDP México (Iteración 13)

Nota: La verificación CPDP aplica solo para médicos mexicanos.

5.4.1. Proceso de Verificación

flowchart TD
    A[Médico ingresa cédula] --> B{País = México?}
    B -->|No| C[Verificación manual]
    B -->|Sí| D[Consultar API CPDP]
    D --> E{Respuesta válida?}
    E -->|Sí| F[Extraer datos profesionales]
    F --> G[Asignar badge CPDP_VERIFICADO]
    E -->|No| H{Cédula formato válido?}
    H -->|Sí| I[Asignar badge VERIFICADO]
    H -->|No| J[Rechazar registro]

5.4.2. API CPDP (Cédula Profesional de Médico)

Aspecto Especificación
Endpoint API pública de verificación SEP/DGP
Datos consultados Nombre, institución, fecha expedición
Cache 24 horas (evitar llamadas repetidas)
Fallback Verificación manual si API no disponible
5.4.2.1. Especificación Técnica - Flujo Hybrid API SEP

Decisión del Director (ACL12-014): Implementar flujo híbrido con fallback manual automático.

sequenceDiagram
    participant App
    participant Backend
    participant API_SEP as API SEP/DGP
    participant Manual as Revisión Manual

    App->>Backend: POST /verificar-cedula {cedula, nombre}
    Backend->>API_SEP: GET /consulta?cedula=XXX
    alt API disponible y cédula válida
        API_SEP-->>Backend: 200 {verificado: true, datos}
        Backend-->>App: Verificación instantánea ✓
    else API no disponible o timeout
        Backend->>Manual: Crear ticket verificación
        Backend-->>App: Verificación pendiente (24-48h)
        Manual-->>Backend: Aprobar/Rechazar
        Backend-->>App: Push notification resultado
    end

Configuración API SEP:

Parámetro Valor
Endpoint <https://cpdp.sep.gob.mx/api/v1/consulta>
Timeout 5 segundos
Reintentos 2 (con backoff exponencial)
Cache 24 horas para cédulas verificadas
Fallback Revisión manual si API falla

Manejo de Errores:

Código Significado Acción
200 Cédula válida Verificación inmediata
404 Cédula no encontrada Fallback manual
429 Rate limit Retry con backoff
5xx Error servidor Fallback manual
Timeout Sin respuesta en 5s Fallback manual

Reglas de Negocio:

ID Regla
RN-PTL-SEP-001 Timeout de API SEP dispara fallback manual automático
RN-PTL-SEP-002 Cédula cacheada válida por 24 horas
RN-PTL-SEP-003 Máximo 2 reintentos con backoff exponencial (1s, 2s)
RN-PTL-SEP-004 Ticket manual se crea con prioridad ALTA
RN-PTL-SEP-005 SLA de revisión manual: 24-48 horas hábiles

5.4.3. Tipos de Badge

Badge Requisito Icono Sugerido
NINGUNO Email no verificado -
VERIFICADO Email verificado + cédula formato válido
CPDP_VERIFICADO Cédula validada via API CPDP ✓✓ (doble check azul)

5.5. Entidad AccesoPermanenteMedico

AccesoPermanenteMedico {
  id: UUID (PK)
  paciente_id: UUID (FK)
  medico_id: UUID (FK)
  permisos: array
  fecha_solicitud: timestamp
  fecha_aprobacion: timestamp
  estado: enum [PENDIENTE, APROBADO, RECHAZADO, REVOCADO]
  created_at: timestamp
  updated_at: timestamp
}

6. Seguridad

6.1. Protección del Código

Medida Descripción
Rate limiting Máximo 5 intentos por IP en 15 minutos
Bloqueo temporal IP bloqueada 30 minutos tras 5 intentos fallidos
Código hasheado Código no almacenado en texto plano
Sin información en URL Enlace no revela datos del paciente

6.2. Auditoría

Evento Datos Registrados
Generación de código Usuario, timestamp, contenido seleccionado
Visualización IP, user agent, ubicación aproximada, timestamp
Revocación Usuario, timestamp, motivo
Solicitud acceso permanente Médico, paciente, timestamp

7. Criterios de Aceptación

ID Criterio
AC-001 Paciente puede generar código de 6 dígitos + enlace único
AC-002 Código expira a las 24 horas o 5 visualizaciones
AC-003 Médico puede acceder al perfil con código válido
AC-004 Médico puede acceder al perfil con enlace válido
AC-005 Paciente recibe notificación cuando su perfil es visualizado
AC-006 Paciente puede revocar código activo
AC-007 Médico puede crear cuenta opcional para acceso permanente
AC-008 Acceso permanente requiere aprobación del paciente
AC-009 Paciente puede revocar acceso permanente
AC-010 Todas las visualizaciones se registran en audit log

8. Referencias


Documento generado por SpecQueen - La especificación funcional ES el sistema.