Saltar al contenido principal
Versión: 1.2

Módulo: Registro de Cuenta

Scope

Tipo de organizaciónAcceso
Empresa
Agencia
Reclutador independiente
Usuario sin organización

Permisos por rol

AcciónDisponiblePermiso
Crear cuenta nuevaPúblico (no requiere autenticación)
Reenviar correo de verificaciónPúblico
Ver términos y condicionesPúblico
Ver política de privacidadPúblico

¿Qué es?

Flujo de registro de nuevos usuarios en Contratta. Permite crear una cuenta con nombre, email y contraseña. Tras el registro, se envía un correo de verificación que el usuario debe confirmar antes de iniciar sesión.

¿Qué puede hacer el usuario?

  • Crear cuenta con nombre completo, email y contraseña
  • Ver y aceptar términos y condiciones
  • Ver política de privacidad
  • Recibir correo de verificación automático post-registro
  • Reenviar correo de verificación (con cooldown de 60s)
  • Navegar al login si ya tiene cuenta

Flujo del usuario

1. Presiona "Regístrate ahora" desde la pantalla de login
2. Llena formulario:
- Nombre completo
- Email
- Contraseña (mínimo 8 caracteres)
- Confirmar contraseña
3. Lee y acepta términos y condiciones (obligatorio)
4. Presiona "Crear cuenta"
5. API registra usuario → envía correo de verificación
6. Navega a pantalla de éxito:
- Ícono de correo enviado
- Mensaje de éxito
- Chip con el email registrado
- Botón reenviar (cooldown 60s)
7. Presiona "Ir a iniciar sesión" → vuelve a login
8. Verifica email vía link del correo (fuera de Flutter)
9. Puede iniciar sesión normalmente

Reglas de negocio

  • Nombre es obligatorio (no vacío)
  • Email debe ser válido (validación regex)
  • Contraseña mínima: 8 caracteres
  • Confirmación de contraseña debe coincidir exactamente
  • Aceptar términos y condiciones es obligatorio para enviar el formulario
  • El botón de "Crear cuenta" se deshabilita si no se aceptan los términos
  • Cooldown de 60 segundos entre reenvíos de correo de verificación
  • El backend permite registro con email duplicado (devuelve error específico)
  • Post-registro no se inicia sesión automáticamente — el usuario debe verificar email primero

Requisitos para registro

CampoTipoRequeridoValidación
nameStringNo vacío
emailStringRegex email válido
passwordStringMínimo 8 caracteres
confirmPasswordStringDebe coincidir con password (local)
acceptTermsboolDebe ser true

Requisitos para reenvío de verificación

CampoTipoRequeridoNotas
emailStringEl email con el que se registró

Arquitectura

lib/features/auth/
├── application/
│ ├── register_cubit.dart # Lógica de registro
│ ├── register_state.dart # RegisterStatus enum
│ ├── verification_cubit.dart # Lógica de reenvío de verificación
│ └── verification_state.dart # VerificationStatus enum
├── domain/
│ └── usecases/
│ ├── register_usecase.dart
│ └── send_verification_email_usecase.dart
└── presentation/
└── pages/
├── register_page.dart # Formulario de registro
├── register_success_page.dart # Pantalla éxito + reenvío
├── terms_and_conditions_page.dart # Consume API legal-documents
└── privacy_policy_page.dart # Consume API legal-documents

lib/features/legal_documents/
├── application/
│ ├── legal_document_cubit.dart # Carga terms/privacy desde API
│ └── legal_document_state.dart
├── data/
│ ├── datasources/
│ │ └── legal_documents_remote_datasource.dart
│ ├── models/
│ │ └── legal_document_model.dart
│ └── repositories/
│ └── legal_documents_repository_impl.dart
└── domain/
├── entities/
│ └── legal_document.dart
├── repositories/
│ └── legal_documents_repository.dart
└── usecases/
├── get_terms_and_conditions_usecase.dart
└── get_privacy_policy_usecase.dart

Endpoints API

MétodoEndpointAutenticaciónDescripción
POST/api/auth/sign-up/emailPúblicoCrear cuenta
POST/api/auth/send-verification-emailPúblicoReenviar verificación

Request body — Registro

{
"name": "Ana López",
"email": "ana@ejemplo.com",
"password": "miPassword123",
"rememberMe": true
}

Request body — Reenvío verificación

{
"email": "ana@ejemplo.com"
}

Registro DI

  • UseCases: LazySingleton
    • RegisterUseCase
    • SendVerificationEmailUseCase
  • Cubits: Factory (nueva instancia por pantalla)
    • RegisterCubit
    • VerificationCubit
getIt.registerFactory<RegisterCubit>(
() => RegisterCubit(registerUseCase: getIt<RegisterUseCase>()),
);

getIt.registerFactory<VerificationCubit>(
() => VerificationCubit(
sendVerificationEmailUseCase: getIt<SendVerificationEmailUseCase>(),
),
);

Localización

✅ Completa — todos los strings usan context.l10n:

ClaveEspañolInglés
registerTitleCrear cuentaCreate account
registerSubtitleCompleta los siguientes datos para registrarteFill in the details below to sign up
registerNameHintEj: Ana LópezE.g. Ana López
registerNameRequiredEl nombre es requeridoName is required
registerPasswordHintMínimo 8 caracteresMinimum 8 characters
registerPasswordMinMínimo 8 caracteresMinimum 8 characters
registerConfirmPasswordHintRepite tu contraseñaRepeat your password
registerConfirmPasswordRequiredConfirma tu contraseñaPlease confirm your password
registerPasswordMismatchLas contraseñas no coincidenPasswords do not match
registerAcceptTermsAcepto losI accept the
registerTermstérminos y condicionesterms and conditions
registerAndy laand the
registerPrivacypolítica de privacidadprivacy policy
registerButtonCrear cuentaCreate account
registerHaveAccount¿Ya tienes cuenta?Already have an account?
registerLoginIniciar sesiónSign in
registerAcceptTermsErrorDebes aceptar los términos...You must accept the terms...
registerSuccessTitle¡Registro exitoso!Registration successful!
registerSuccessSubtitleHemos enviado un correo de verificación...We've sent a verification email...
registerGoToLoginIr a iniciar sesiónGo to login
registerVerificationSentSe ha reenviado el correo de verificaciónVerification email has been resent
registerVerificationDidntReceive¿No lo recibiste?Didn't receive it?
registerVerificationResendReenviar correoResend email
registerVerificationResendInReenviar en {seconds}sResend in {seconds}s

Tests

ArchivoTests
register_cubit_test.dart5 — initial state, success, ServerFailure, NetworkFailure, params verification
register_usecase_test.dart3 — success, ServerFailure, NetworkFailure
verification_cubit_test.dart5 — initial state, success, ServerFailure, NetworkFailure, email verification

Estados de la UI

RegisterPage

EstadoComportamiento
InitialFormulario visible, botón habilitado solo si terms aceptados
LoadingBotón muestra spinner, deshabilitado
SuccessNavega a RegisterSuccessPage
ErrorMuestra notificación con el mensaje del failure

RegisterSuccessPage

EstadoComportamiento
InitialPantalla de éxito con cooldown activo
Loading (reenvío)Botón de reenvío muestra spinner
Success (reenvío)Muestra notificación de éxito, reinicia cooldown
Error (reenvío)Muestra notificación de error
Cooldown activoMuestra timer "Reenviar en Xs"

Pendientes

TemaEstadoNotas
Términos y Condiciones localizadoConsume GET /legal-documents/terms-and-conditions con locale
Política de Privacidad localizadoConsume GET /legal-documents/privacy-policy con locale
Checkbox requiere lecturaEl checkbox se habilita solo después de leer ambos documentos