Apariencia
Registro y aprobación
Cualquier empresa puede registrarse desde la web pública. El flujo crea simultáneamente la cuenta del usuario responsable y el registro de la empresa, ambos en estado pendiente, hasta que un administrador HUMAE los apruebe.
Recorrido global
1. Usuario llena form → Backend crea:
· User (status=pending_approval, role=company_user)
· Company (status=pending, is_verified=false)
· CompanyMember (role=owner, accepted_at=now)
+ Notificación a TODOS los admins
+ Correo de verify-email al usuario
↓
2. Usuario verifica el correo
↓
3. Admin revisa la solicitud → Aprobar / Rechazar
↓
4a. Aprobar → User pasa a active → Login OK
4b. Rechazar → User pasa a inactive → Login bloqueadoLa empresa queda igualmente en pending
Aprobar al usuario lo deja en active para que pueda iniciar sesión, pero no marca a la Company como verificada. Esa verificación (status active + is_verified=true) la hace el admin desde la pantalla de empresas si necesita validar documentación adicional. En la práctica, una vez que el usuario puede entrar, ya puede operar su empresa con su pivote owner.
Paso 1 · Formulario público
URL: /register → tarjeta "Represento una empresa" → /register/empresa
El form tiene dos secciones visuales:
A) Tu cuenta (responsable de la empresa)
| Campo | Validación |
|---|---|
name | Requerido, 2–120 caracteres |
email | Requerido, formato email, único en users |
phone | Opcional, máx. 30 caracteres |
password | 8+ caracteres, al menos 1 letra y 1 número |
password_confirmation | Debe coincidir |
accept_terms | Checkbox obligatorio |
B) Datos de la empresa
| Campo | Validación |
|---|---|
company.legal_name | Requerido, 2–200 caracteres |
company.trade_name | Opcional, máx. 200 |
company.rfc | Opcional, máx. 30 |
company.website | Opcional, URL válida |
company.contact_phone | Opcional, máx. 30 |
company.industry_id | Opcional, debe existir en industries |
company.company_size_id | Opcional, debe existir en company_sizes |
company.motivo | Opcional, máx. 500 caracteres — texto libre para el admin |
Endpoint: POST /api/v1/auth/register/companyRate limit: 5 por minuto por IP.
Los campos opcionales aceleran la aprobación
Mientras más datos provea la empresa (RFC, sitio web, motivo), más rápido el admin valida que es legítima. Recomendamos llenar al menos trade_name y website.
Paso 2 · Lo que crea el backend
AuthService::registerCompanyUser() corre dentro de una transacción que persiste tres registros:
User(status=pending_approval, password hasheada,email_verified_at=NULL).Company(status='pending',is_verified=false, slug derivado delegal_namecon sufijo numérico si colisiona).CompanyMember(pivote):role='owner',is_primary_contact=true,accepted_at=now()(el dueño no necesita aceptar invitación porque él mismo se registró).
Después de la transacción:
- Dispatch del evento
Registered→ envíaVerifyEmailal usuario. PendingUserRegistrationNotificationa todos los admins (incluye ellegal_namede la empresa para que el admin sepa de quién es la solicitud).
La respuesta 201 no incluye token; el frontend muestra la pantalla "¡Recibimos el registro de tu empresa!".
Paso 3 · Verificación de email
Idéntica al resto de roles: signed URL con expiración de 60 min, marca email_verified_at. No cambia status ni el flag de la empresa.
Paso 4 · Aprobación o rechazo
Ver Gestión de usuarios y aprobaciones (admin) para el detalle operativo. Una vez aprobado:
- El usuario inicia sesión normal y aterriza en
/me/empresa/vacantes. - Su pivote
CompanyMemberconrole='owner'le da permisos para crear vacantes, editar datos de la empresa y solicitar entrevistas. - Si el admin necesita marcar la empresa como verificada (badge ✔ en cards de candidatos), lo hace desde el panel de empresas — pero esto es separado del login.
Paso 5 · Login antes y después
| Estado | Resultado |
|---|---|
| Pre-aprobación, email no verificado | 403 errors.code = email_unverified |
| Pre-aprobación, email verificado | 403 errors.code = pending_approval con texto "Tu cuenta está en revisión" |
| Aprobado y verificado | 200 {user, token} → redirect a /me/empresa/vacantes |
| Rechazado por el admin | 403 errors.code = account_inactive |
Notificaciones relacionadas
| Evento | Destinatario | Plantilla |
|---|---|---|
| Solicitud creada | Usuario solicitante | VerifyEmail |
| Solicitud creada | Cada admin | PendingUserRegistrationNotification (incluye companyName) |
| Aprobación | Usuario | AccountApprovedNotification |
| Rechazo | Usuario | AccountRejectedNotification(reason?) |
Errores comunes
| Síntoma | Causa | Solución |
|---|---|---|
422 errors.email | Email ya existe | Usar Recuperar contraseña |
422 errors.company.legal_name | Razón social vacía | Llenar el campo (es requerido) |
422 errors.company.website | URL malformada | Incluir esquema https://... o dejarlo vacío |
422 errors.company.industry_id / company.company_size_id | ID no existe en catálogo | Elegir del select; el campo es opcional |
Siguiente
Tras la aprobación: Publicar una vacante →.

