Saltar a contenido

Documento histórico

Este documento se conserva solo para trazabilidad. Consulte el índice maestro para la fuente vigente.

Documento histórico — no usar como fuente de decisiones actuales

Reemplazado por la versión canónica del 2026-07-11. Conservar solo como trazabilidad histórica.


CU-010: Completar KYC (verificación de identidad)

Caso de uso detallado para que el usuario complete el proceso de verificación de identidad y para que el operador lo revise.


Metadatos

Campo Valor
ID CU-010
Nombre Completar KYC (verificación de identidad)
Actor primario Usuario Final (carga) + Operador (revisa)
Módulo KYC
Prioridad Alta (MVP)
Frecuencia esperada Baja (1 vez cada 10 años por usuario)
Trazabilidad SRS RF-030, RF-031, RF-032

Descripción

El usuario, al intentar despachar por primera vez (o desde el perfil), inicia el proceso KYC: selecciona tipo de documento, sube fotos, completa dirección de residencia en EE.UU. y envía a revisión. El operador revisa y aprueba, rechaza (con motivo) o requiere más información.


Precondiciones

  • El usuario tiene cuenta activa con phone_verified = true.
  • El usuario aún no tiene KYC aprobado (o quiere renovarlo porque venció).

Postcondiciones

Aprobado: - Se crea/actualiza un KycRecord con status = aprobado, approved_at = now, expires_at = now + 10 años. - El usuario puede despachar, consolidar para envío, pagar y usar crédito. - Se registra reviewed_by (operador) y reviewed_at.

Rechazado: - status = rechazado con rejection_reason. - El usuario ve el motivo y puede corregir + reenviar.

Requiere más información: - status = requiere_mas_informacion con el campo faltante. - El usuario completa lo solicitado.


Flujo principal

Parte A: Usuario carga KYC

  1. El usuario toca Iniciar verificación desde el banner del dashboard o el perfil.
  2. El sistema muestra la pantalla KYC - Paso 1: Bienvenida, con explicación del proceso.
  3. El usuario toca Comenzar.
  4. Paso 2: Tipo de documento.
  5. El usuario selecciona entre: Pasaporte, Carné de identidad, Licencia de conducir.
  6. Paso 3: Foto del documento.
  7. Frente (obligatorio).
  8. Reverso (obligatorio si el documento lo tiene).
  9. Paso 4: Selfie con documento.
  10. El usuario toma una foto sosteniendo el documento abierto, con su rostro visible.
  11. Paso 5: Datos de residencia en EE.UU..
  12. Dirección completa.
  13. Estado (dropdown con los 50 estados + territorios).
  14. Código postal.
  15. Paso 6: Confirmación.
  16. El usuario revisa todo y toca Enviar a revisión.
  17. El sistema:
  18. Crea un KycRecord con status = enviado.
  19. Sube las fotos a MinIO (bucket kyc-documents, privado, con URLs firmadas).
  20. Registra submitted_at = now.
  21. Notifica al equipo de revisión.
  22. Muestra pantalla de éxito: "Estamos verificando tu identidad. Te notificaremos en 24 h."

Parte B: Operador revisa

  1. El operador accede a la cola KYC pendiente de revisión en el backoffice.
  2. Selecciona un KYC enviado.
  3. Ve los datos del usuario y del documento.
  4. Compara selfie con foto del documento.
  5. Valida la dirección de residencia.
  6. Decide:
    • Aprobar:
    • Estado → aprobado
    • Registra reviewed_by (su user_id), reviewed_at = now
    • Calcula expires_at = now + 10 años
    • Push al usuario: "Tu verificación fue aprobada. Ya puedes despachar."
    • Rechazar:
    • Estado → rechazado
    • Ingresa rejection_reason (motivo obligatorio, ej. "Documento ilegible", "Selfie no coincide con documento", "Dirección no válida")
    • Push al usuario: "Tu verificación fue rechazada. Motivo: {x}. Corrige y reenvía."
    • Requiere más información:
    • Estado → requiere_mas_informacion
    • Ingresa el campo o documento faltante
    • Push al usuario: "Necesitamos información adicional: {detalle}."

Parte C: Usuario corrige (si fue rechazado o requiere más info)

  1. El usuario accede al banner del dashboard o perfil.
  2. Toca Corregir y reenviar.
  3. El sistema muestra los pasos nuevamente, con los datos cargados (excepto los que se pidió corregir).
  4. El usuario corrige lo necesario y reenvía.
  5. Vuelve al paso 10 con status = enviado (nueva revisión).

Flujos alternativos

FA-1: KYC vencido (renovación)

  • Si el KYC aprobado tiene expires_at < now:
  • El estado pasa automáticamente a vencido (job diario).
  • El usuario ve un banner: "Tu verificación venció. Renuévala para seguir operando."
  • El proceso es idéntico a KYC nuevo, pero con un KycRecord actualizado en lugar de creado.

FA-2: KYC bloqueado manual

  • Si el operador bloquea manualmente al usuario (User.is_active = false):
  • El KYC se marca como bloqueado_manual.
  • El usuario no puede hacer nada en el sistema.
  • Solo un admin puede desbloquear.

FA-3: Foto del documento ilegible

  • Si la foto del documento está borrosa, cortada o sin reflejos no legibles:
  • El operador marca requiere_mas_informacion con motivo: "La foto del documento no es legible. Sube una nueva foto clara."

FA-4: Selfie no coincide

  • Si la selfie no muestra claramente el rostro o no coincide con el documento:
  • El operador marca requiere_mas_informacion: "La selfie no es clara o no coincide con el documento. Tómala de nuevo con ambos elementos visibles."

FA-5: Dirección no válida

  • Si la dirección no es verificable (no existe en USPS, formato incorrecto):
  • El operador marca requiere_mas_informacion: "La dirección no es válida. Verifica el formato y vuelve a ingresar."

FA-6: Usuario sube fotos de más de 10 MB

  • El cliente valida en el front (Fase 2 con cámara nativa) y rechaza.
  • Si pasa al backend, el servidor valida y devuelve FILE_TOO_LARGE.

FA-7: KYC revocado por admin

  • Un admin puede revocar un KYC aprobado (por fraude detectado, etc.).
  • Esto marca el KYC como bloqueado_manual y desactiva al usuario.

Excepciones

Excepción Causa Manejo
INVALID_DOCUMENT_TYPE Tipo no soportado Mostrar opciones válidas
MISSING_REQUIRED_PHOTO Faltan fotos obligatorias Bloquear envío
FILE_TOO_LARGE > 10 MB Mensaje con límite
INVALID_FILE_FORMAT No es JPG/PNG/PDF Mensaje con formatos aceptados
KYC_ALREADY_APPROVED Intentar iniciar KYC nuevo con uno aprobado Mensaje "Ya tienes KYC aprobado"
REVIEWER_NOT_AUTHORIZED Operador sin permisos Bloquear acción

Reglas de negocio aplicables

  • RN-29 (KYC no bloquea prealerta): el usuario puede reportar compras y ver paquetes sin KYC aprobado. Ver kyc.md.
  • RN-30 (KYC bloquea despacho): no se puede despachar, consolidar para envío, pagar ni usar crédito. Ver kyc.md.
  • RN-31 (Vigencia 10 años): expires_at = approved_at + 10 años. Ver kyc.md.
  • RN-32 (Archivos privados): KYC en bucket privado con URLs firmadas TTL 5 min. Ver almacenamiento-archivos.md.
  • RN-33 (Log de acceso): cada lectura de archivo KYC se registra. Ver almacenamiento-archivos.md.

Criterios de aceptación

  • El usuario puede completar el KYC en menos de 5 minutos.
  • Las fotos se validan en formato y tamaño antes de aceptar.
  • El bucket KYC es privado y solo accesible con URL firmada.
  • El operador puede aprobar, rechazar (con motivo) o requerir más info.
  • El motivo de rechazo es obligatorio.
  • El usuario recibe push en cada cambio de estado.
  • Un KYC aprobado tiene vigencia de 10 años.
  • Un KYC vencido bloquea el despacho pero permite la prealerta.
  • Los intentos de KYC duplicado se rechazan.

Diagrama de actividad

Parte A — Usuario

flowchart TD
    A["Toca 'Iniciar KYC'"] --> B["Pantalla bienvenida"]
    B --> C["Paso 2: Tipo documento"]
    C --> D["Paso 3: Fotos"]
    D --> E["Paso 4: Selfie"]
    E --> F["Paso 5: Dirección EE.UU."]
    F --> G["Paso 6: Confirmar"]
    G --> H["Crea KycRecord status=enviado"]
    H --> I["Sube fotos a MinIO privado"]
    I --> J["Notifica al equipo de revisión"]
    J --> K["Pantalla 'En revisión'"]

Parte B — Operador

flowchart TD
    A["Cola KYC pendiente"] --> B["Selecciona un KYC"]
    B --> C["Ve datos y fotos"]
    C --> D{"¿Aprobado?"}
    D -- Sí --> E["Status=aprobado, expires=+10años"]
    D -- No --> F["Ingresa motivo"]
    F --> G{"¿Rechazado o requiere más?"}
    G -- "Rechazado" --> H["Status=rechazado"]
    G -- "Más info" --> I["Status=requiere_mas_informacion"]
    E --> J["Push al usuario"]
    H --> J
    I --> J

Diagrama de estados (KYC)

stateDiagram-v2
    [*] --> sin_iniciar
    sin_iniciar --> borrador: usuario carga datos parciales
    borrador --> enviado: usuario envía
    sin_iniciar --> enviado: usuario envía completo
    enviado --> en_revision: operador toma
    en_revision --> aprobado: operador aprueba
    en_revision --> rechazado: operador rechaza
    en_revision --> requiere_mas_informacion: operador requiere
    rechazado --> enviado: usuario corrige y reenvía
    requiere_mas_informacion --> enviado: usuario completa
    aprobado --> vencido: pasan 10 años
    aprobado --> bloqueado_manual: admin bloquea
    vencido --> enviado: usuario renueva
    bloqueado_manual --> [*]
    aprobado --> [*]
    rechazado --> [*]

Pruebas asociadas

  • PT-140: Iniciar KYC nuevo
  • PT-141: Cargar documento (pasaporte / CI / licencia)
  • PT-142: Foto borrosa → operador requiere nueva foto
  • PT-143: Selfie no coincide → operador requiere nueva selfie
  • PT-144: Dirección inválida → operador requiere corrección
  • PT-145: Aprobación correcta con vigencia 10 años
  • PT-146: Rechazo con motivo → push al usuario
  • PT-147: Requerir más info → push al usuario
  • PT-148: Corrección tras rechazo → reenvío
  • PT-149: Renovación de KYC vencido
  • PT-150: Bloqueo manual por admin
  • PT-151: Intento de despacho con KYC vencido (debe fallar)
  • PT-152: Intento de prealerta con KYC vencido (debe pasar)
  • PT-153: Archivos KYC solo accesibles con URL firmada
  • PT-154: Log de acceso a archivos KYC
  • PT-155: Validación de tamaño y formato de archivos