Saltar al contenido principal
Versión: 1.0

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 nueva✅Público (no requiere autenticación)
Reenviar correo de verificación✅Público
Ver términos y condiciones✅Público
Ver política de privacidad✅Pú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
nameString✅No vacío
emailString✅Regex email válido
passwordString✅Mínimo 8 caracteres
confirmPasswordString✅Debe coincidir con password (local)
acceptTermsbool✅Debe ser true

Requisitos para reenvío de verificación​

CampoTipoRequeridoNotas
emailString✅El 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 localizado✅Consume GET /legal-documents/terms-and-conditions con locale
Política de Privacidad localizado✅Consume GET /legal-documents/privacy-policy con locale
Checkbox requiere lectura✅El checkbox se habilita solo después de leer ambos documentos