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¶
- El usuario abre la app y ve la pantalla Welcome.
- El usuario toca Crear Cuenta.
- 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.
- El usuario completa todos los campos.
- El sistema valida en tiempo real:
- Email con formato válido
- Teléfono: prefijo +1 y exactamente 10 dígitos
- Contraseña: mínimo 8 caracteres, al menos una mayúscula, al menos un número
- Contraseña == Repetir contraseña
- El usuario marca el checkbox Acepto los términos y condiciones y la política de privacidad (obligatorio).
- El usuario toca Registrarse.
- El sistema valida que el email no esté registrado → si está, error
EMAIL_ALREADY_EXISTS. - El sistema valida que el teléfono no esté registrado → si está, error
PHONE_ALREADY_EXISTS. - El sistema crea el
Userconemail_verified = false,phone_verified = false,role = 'user',level = 1. - El sistema toma un lock distribuido en Redis sobre el prefijo
CP. - El sistema genera el siguiente
sequentialdisponible (6 dígitos, autoincremental). - El sistema calcula el
check_digitcon el algoritmo Mod-10 sobre el secuencial. - El sistema crea el
LockerCodeconstatus = ACTIVEy lo asocia al usuario. - El sistema libera el lock.
- 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}. - El sistema envía el OTP al +1 vía SMS.
- El sistema envía un correo con un enlace de verificación
https://app.islabox.com/verify-email?token={token}(válido 24 h). - El sistema navega a la pantalla VerificationCode (phone).
- El usuario recibe el SMS e ingresa los 6 dígitos.
- El sistema valida el OTP contra Redis.
- Si el OTP es correcto, el sistema marca
phone_verified = truey elimina el código de Redis. - El sistema navega a la pantalla Success con mensaje "¡Cuenta creada con éxito!".
- El usuario toca Ir al inicio.
- El sistema navega al Dashboard, donde se muestra el identificador
CP-NNNNNN-Dcon 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¶
- Pantalla Welcome: pantallas-implementadas.md
- Pantalla Register: pantallas-implementadas.md
- Pantalla VerificationCode: pantallas-implementadas.md
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