Saltar al contenido principal
Versión: 1.0

Módulo: Onboarding

Scope

Tipo de organizaciónAcceso
Empresa
Agencia
Reclutador independiente

¿Qué es?

El módulo de Onboarding guía a los nuevos usuarios registrados a través del proceso de creación de su organización (tenant) en Contratta. Se muestra una sola vez después del primer login cuando el usuario no tiene organización asignada.

¿Qué puede hacer el usuario?

  • Seleccionar su tipo de organización (Empresa o Reclutador)
  • Si es reclutador: elegir entre independiente o agencia
  • Ingresar el nombre comercial de su organización
  • Opcionalmente proporcionar razón social y RFC/ID fiscal
  • Confirmar y crear su tenant

Flujo del usuario

Empresa

1. Login exitoso sin organización → se muestra TenantSelectionPage
2. Selecciona "Empresa"
3. Se muestra TenantFormPage con título "Nombre de tu Empresa"
4. Ingresa nombre comercial (obligatorio), razón social y RFC (opcionales)
5. Presiona "Continuar" → confirma en modal
6. Se crea el tenant → se recarga user context
7. Se muestra OnboardingStepsModal (tour de 3 slides)
8. Navega al Home

Reclutador independiente

1. Login exitoso sin organización → TenantSelectionPage
2. Selecciona "Reclutador"
3. Se muestra RecruiterTypeSelectionPage
4. Selecciona "Reclutador Independiente"
5. Se muestra TenantFormPage con título "Tu Nombre Completo"
6. Ingresa nombre → confirma → crea tenant
7. OnboardingStepsModal → Home

Agencia

1. Login exitoso sin organización → TenantSelectionPage
2. Selecciona "Reclutador"
3. Se muestra RecruiterTypeSelectionPage
4. Selecciona "Pertenezco a una Agencia"
5. Se muestra TenantFormPage con título "Nombre de tu Agencia"
6. Ingresa nombre → confirma → crea tenant
7. OnboardingStepsModal → Home

Arquitectura

lib/features/onboarding/
├── application/
│ ├── onboarding_cubit.dart # Maneja estado de creación de tenant
│ └── onboarding_state.dart # OnboardingStatus enum + Equatable state
├── data/
│ ├── datasources/
│ │ └── onboarding_remote_datasource.dart # Abstract + Impl (POST /onboarding/tenant)
│ ├── models/
│ │ └── tenant_onboarding_model.dart # TenantOnboardingModel (toJson)
│ └── repositories/
│ └── onboarding_repository_impl.dart
├── domain/
│ ├── entities/
│ │ └── tenant_onboarding.dart # TenantOnboarding entity + TenantType enum
│ └── repositories/
│ └── onboarding_repository.dart
└── presentation/
├── pages/
│ ├── tenant_selection_page.dart # Selección Empresa vs Reclutador
│ ├── recruiter_type_selection_page.dart # Independiente vs Agencia
│ └── tenant_form_page.dart # Formulario de nombre + datos opcionales
└── widgets/
├── onboarding_layout.dart # Layout reutilizable con shapes decorativas
├── onboarding_steps_modal.dart # Tour de 3 slides post-creación
└── welcome_modal.dart # Modal de bienvenida personalizado

Endpoints API

MétodoEndpointDescripción
POST/onboarding/tenantCrea tenant inicial (empresa, agencia o reclutador independiente)

Body de POST /onboarding/tenant

{
"type": "COMPANY" | "AGENCY" | "RECRUITER",
"name": "Nombre comercial",
"legalName": "Razón social (opcional)",
"taxId": "RFC (opcional)"
}

Registro DI

  • Datasource: LazySingleton
  • Repository: LazySingleton
  • Cubit: Factory (nueva instancia por uso)
getIt<OnboardingCubit>()

Localización

✅ Completada — todos los strings de la capa de presentación usan context.l10n.onboardingXxx.

Claves con prefijo onboarding en lib/l10n/app_es.arb y lib/l10n/app_en.arb.