Portal Básico para Médicos¶
Identificador: MTS-PTL-001 Versión: 1.0.0 Fecha: 2025-12-01 Autor: SpecQueen
- 1. Propósito
- 2. Actores
- 3. Funcionalidades
- 3.1. Generación de Código de Acceso (MTS-PTL-001-F01)
- 3.2. Acceso del Médico (MTS-PTL-001-F02)
- 3.3. Acceso Permanente para Médicos (MTS-PTL-001-F03)
- 3.4. Notificaciones al Paciente (MTS-PTL-001-F04)
- 4. Reglas de Negocio
- 5. Modelo de Datos
- 5.1. Entidad CodigoAccesoMedico
- 5.2. Entidad VisualizacionPerfil
- 5.3. Entidad CuentaMedico
- 5.4. Verificación CPDP México (Iteración 13)
- 5.5. Entidad AccesoPermanenteMedico
- 6. Seguridad
- 6.1. Protección del Código
- 6.2. Auditoría
- 7. Criterios de Aceptación
- 8. Referencias
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¶
- Paciente accede a "Compartir con Médico"
- Sistema muestra opciones de contenido a incluir:
- Datos básicos (nombre, edad, tipo de sangre)
- Alergias
- Condiciones crónicas
- Medicamentos activos (con dosis y frecuencia)
- Adherencia (últimos 30 días)
- Paciente selecciona información a compartir
- Sistema genera:
- Código de 6 dígitos (numérico)
- Enlace único (URL corta)
- Sistema muestra código + enlace + código QR
- Paciente puede compartir por:
- Mostrar código QR
- Copiar enlace
- Dictar código de 6 dígitos
- 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 | Sí |
| Alergias | Lista completa de alergias | Sí |
| Condiciones | Condiciones crónicas | Sí |
| Medicamentos | Lista con dosis y frecuencia | Sí |
| Adherencia | Estadísticas últimos 30 días | Sí |
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¶
- Médico accede a la página de acceso (portal.medtime.app o similar)
- Sistema solicita código de 6 dígitos
- Médico ingresa el código
- Sistema valida:
- Código existe
- No ha expirado (< 24h)
- No ha excedido visualizaciones (< 5)
- Si válido: Sistema muestra perfil del paciente
- Sistema registra visualización (contador +1)
- Sistema registra en audit log del paciente
3.2.3. Flujo: Acceso con Enlace¶
- Médico accede directamente al enlace único
- Sistema valida vigencia y visualizaciones
- Si válido: Sistema muestra perfil del paciente
- 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¶
- Médico visualiza perfil con código temporal
- Médico selecciona "¿Desea acceso permanente?"
- Sistema muestra opciones:
- Continuar sin cuenta (acceso temporal)
- Crear cuenta de médico
- 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)
- Sistema notifica al paciente de la solicitud
- 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 | Sí |
| Recibir actualizaciones | Cambios en medicamentos | Sí |
| 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.