Módulo: Onboarding
Scope
| Tipo de organización | Acceso |
|---|---|
| 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étodo | Endpoint | Descripción |
|---|---|---|
| POST | /onboarding/tenant | Crea 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.