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-001: Registrarse en la app

Caso de uso detallado para el registro de un nuevo usuario en IslaBox.


Metadatos

Campo Valor
ID CU-001
Nombre Registrarse en la app
Actor primario Usuario Final
Actores secundarios Sistema de Notificaciones (SMS OTP)
Módulo Autenticación y registro
Prioridad Alta (MVP)
Frecuencia esperada Alta (registros nuevos)
Trazabilidad SRS RF-001, RF-002, RF-003, RF-007

Descripción

Un nuevo usuario descarga la app, ve la pantalla de bienvenida y decide crear una cuenta. El sistema lo guía por un proceso mínimo (nombre, correo, teléfono, contraseña), verifica el teléfono vía OTP, verifica el correo vía enlace y le asigna su identificador único de casillero CP-NNNNNN-D.


Precondiciones

  • El usuario tiene la app instalada y conexión a internet.
  • El usuario tiene un correo electrónico válido.
  • El usuario tiene un teléfono celular con capacidad de recibir SMS (+1, EE.UU.).
  • El usuario está físicamente en EE.UU. (o tiene acceso a un número +1).

Postcondiciones

Éxito: - Se crea un User en la base de datos con email_verified = false y phone_verified = false. - Se crea un LockerCode con status = ACTIVE y se asigna al usuario. - Se envía un SMS con código OTP al teléfono registrado. - Se envía un correo con enlace de verificación. - Se muestra al usuario la pantalla "Verifica tu teléfono".

Fallo: - No se crea ningún registro. - Se muestra un mensaje de error específico al usuario.


Flujo principal

  1. El usuario abre la app y ve la pantalla Welcome.
  2. El usuario toca Crear Cuenta.
  3. El sistema muestra la pantalla Register con los campos: nombre, apellidos, correo, teléfono (con código de país fijo +1), contraseña, repetir contraseña.
  4. El usuario completa todos los campos.
  5. El sistema valida en tiempo real:
  6. Email con formato válido
  7. Teléfono: prefijo +1 y exactamente 10 dígitos
  8. Contraseña: mínimo 8 caracteres, al menos una mayúscula, al menos un número
  9. Contraseña == Repetir contraseña
  10. El usuario marca el checkbox Acepto los términos y condiciones y la política de privacidad (obligatorio).
  11. El usuario toca Registrarse.
  12. El sistema valida que el email no esté registrado → si está, error EMAIL_ALREADY_EXISTS.
  13. El sistema valida que el teléfono no esté registrado → si está, error PHONE_ALREADY_EXISTS.
  14. El sistema crea el User con email_verified = false, phone_verified = false, role = 'user', level = 1.
  15. El sistema toma un lock distribuido en Redis sobre el prefijo CP.
  16. El sistema genera el siguiente sequential disponible (6 dígitos, autoincremental).
  17. El sistema calcula el check_digit con el algoritmo Mod-10 sobre el secuencial.
  18. El sistema crea el LockerCode con status = ACTIVE y lo asocia al usuario.
  19. El sistema libera el lock.
  20. El sistema genera un código OTP de 6 dígitos y lo guarda en Redis con TTL 5 minutos, clave otp:user:{user_id}.
  21. El sistema envía el OTP al +1 vía SMS.
  22. El sistema envía un correo con un enlace de verificación https://app.islabox.com/verify-email?token={token} (válido 24 h).
  23. El sistema navega a la pantalla VerificationCode (phone).
  24. El usuario recibe el SMS e ingresa los 6 dígitos.
  25. El sistema valida el OTP contra Redis.
  26. Si el OTP es correcto, el sistema marca phone_verified = true y elimina el código de Redis.
  27. El sistema navega a la pantalla Success con mensaje "¡Cuenta creada con éxito!".
  28. El usuario toca Ir al inicio.
  29. El sistema navega al Dashboard, donde se muestra el identificador CP-NNNNNN-D con badge "Activo".

Nota: el correo puede verificarse más tarde; no bloquea el ingreso al dashboard. Un banner persistente recordará al usuario verificarlo.


Flujos alternativos

FA-1: Email ya registrado

  • En el paso 8, si el email ya existe:
  • El sistema muestra error inline: "Este correo ya está registrado. ¿Quieres iniciar sesión?"
  • Ofrece link a Login.

FA-2: Teléfono ya registrado

  • En el paso 9, si el teléfono ya existe:
  • El sistema muestra error inline: "Este teléfono ya está registrado. ¿Quieres iniciar sesión?"

FA-3: Teléfono no es +1 (no debería ocurrir por UI pero defensivo)

  • En el paso 5, si el backend recibe un teléfono que no cumple el formato E.164 +1XXXXXXXXXX:
  • El sistema devuelve PHONE_COUNTRY_NOT_SUPPORTED.
  • Se muestra mensaje: "IslaBox está disponible solo para personas en Estados Unidos que envían a Cuba."

FA-4: SMS no llega

  • Después del paso 17, si el usuario no recibe el SMS en 60 segundos:
  • Se habilita un botón Reenviar código con countdown de 60s.
  • Al reenviar, se genera un nuevo OTP y se invalida el anterior.

FA-5: OTP incorrecto

  • En el paso 21, si el OTP no coincide:
  • El sistema decrementa el contador de intentos (almacenado en Redis).
  • Si quedan intentos, muestra error "Código incorrecto. Te quedan N intentos."
  • Si se acabaron los intentos, el OTP se invalida y el usuario debe reenviar.

FA-6: OTP expirado

  • Si pasaron más de 5 minutos desde el envío:
  • El sistema muestra "El código expiró" y habilita el botón Reenviar código.

FA-7: Usuario cierra la app antes de verificar

  • Si el usuario cierra la app y vuelve más tarde:
  • Al volver a abrir, la app detecta que tiene una cuenta pero phone_verified = false.
  • Lo envía directamente a la pantalla VerificationCode (phone).

FA-8: Fallo al generar identificador (lock no adquirido)

  • En el paso 11, si no se puede adquirir el lock en Redis tras 3 reintentos:
  • El sistema devuelve LOCKER_CODE_GENERATION_FAILED.
  • Se muestra: "No pudimos crear tu identificador. Intenta de nuevo."
  • Se loguea el error para investigación.

Excepciones

Excepción Causa Manejo
EMAIL_ALREADY_EXISTS Email duplicado Mensaje inline + link a Login
PHONE_ALREADY_EXISTS Teléfono duplicado Mensaje inline + link a Login
INVALID_PHONE_FORMAT Teléfono no es E.164 +1XX Mensaje: "Ingresa un número de EE.UU. válido"
INVALID_PASSWORD_FORMAT No cumple requisitos Mensaje con requisitos
OTP_INVALID Código incorrecto Mensaje con intentos restantes
OTP_EXPIRED Pasaron 5 min Habilitar reenvío
OTP_MAX_ATTEMPTS 3 intentos fallidos Invalidar OTP, habilitar reenvío
LOCKER_CODE_GENERATION_FAILED Lock no adquirido Reintentar 3 veces, luego error genérico
SMS_DELIVERY_FAILED Error del proveedor SMS Mostrar "Reintentar envío"
EMAIL_DELIVERY_FAILED Error del proveedor email Mostrar "Reintentar envío"

Reglas de negocio aplicables

  • RN-1 (Origen del usuario): solo se registran personas en EE.UU. con +1. Ver reglas-negocio.md.
  • RN-2 (Identificador): el identificador se calcula con Mod-10 sobre el secuencial. Ver identificador.md.
  • RN-3 (Verificaciones): el OTP tiene vigencia 5 minutos y máximo 3 intentos. Ver requisitos.md.

Criterios de aceptación

  • Un usuario nuevo puede completar el registro en menos de 2 minutos.
  • El identificador generado pasa la validación Mod-10.
  • Un email o teléfono duplicado es detectado y reportado claramente.
  • El OTP expirado es rechazado con mensaje claro.
  • El sistema soporta al menos 100 registros concurrentes sin colisión de identificadores.
  • El SMS se envía en menos de 30 segundos en el 95% de los casos.
  • La contraseña se almacena hasheada (bcrypt/argon2), nunca en texto plano.

Mockups / wireframes de referencia


Diagrama de actividad

flowchart TD
    A["Pantalla Welcome"] --> B["Toca 'Crear Cuenta'"]
    B --> C["Pantalla Register"]
    C --> D{"¿Campos válidos?"}
    D -- No --> E["Muestra errores inline"]
    E --> C
    D -- Sí --> F{"¿Email único?"}
    F -- No --> G["Error: email duplicado"]
    G --> C
    F -- Sí --> H{"¿Teléfono único?"}
    H -- No --> I["Error: teléfono duplicado"]
    I --> C
    H -- Sí --> J["Crea User"]
    J --> K["Lock Redis"]
    K --> L["Genera identificador CP-NNNNNN-D"]
    L --> M["Crea LockerCode"]
    M --> N["Libera lock"]
    N --> O["Genera OTP y guarda en Redis (TTL 5min)"]
    O --> P["Envía SMS"]
    P --> Q["Envía email de verificación"]
    Q --> R["Pantalla VerificationCode (phone)"]
    R --> S{"¿OTP correcto?"}
    S -- No --> T{"¿Intentos < 3?"}
    T -- Sí --> U["Muestra error, decrementa intentos"]
    U --> R
    T -- No --> V["Invalida OTP, habilita reenvío"]
    S -- Sí --> W["Marca phone_verified = true"]
    W --> X["Pantalla Success"]
    X --> Y["Dashboard"]

Pruebas asociadas

Ver plan-pruebas.md sección "Pruebas funcionales - Autenticación".

Casos de prueba clave: - PT-001: Registro exitoso completo - PT-002: Email duplicado - PT-003: Teléfono duplicado - PT-004: Validación de contraseña débil - PT-005: OTP expirado - PT-006: OTP con 3 intentos fallidos - PT-007: Generación de 100 identificadores concurrentes sin colisión - PT-008: Validación Mod-10 sobre el identificador generado