# US-ADM-001: Invitar y Registrar Usuarios **ID:** US-ADM-001 **MΓ³dulo:** MAI-013 **Relacionado con:** RF-ADM-001, ET-ADM-001 **Prioridad:** Alta **Story Points:** 8 --- ## πŸ“– Historia de Usuario **Como** Director General o RH de una constructora **Quiero** invitar nuevos usuarios por email y que puedan registrarse con un rol especΓ­fico **Para** incorporar al equipo sin permitir registros pΓΊblicos y mantener control sobre quiΓ©n accede al sistema --- ## βœ… Criterios de AceptaciΓ³n ### 1. Enviar InvitaciΓ³n ```gherkin Given que soy Director General o RH con permisos de gestiΓ³n de usuarios When accedo a la secciΓ³n "Usuarios" y hago clic en "Invitar Usuario" And completo el formulario con: - Email del invitado - Rol a asignar (director, engineer, resident, etc.) - Mensaje personalizado (opcional) And hago clic en "Enviar InvitaciΓ³n" Then el sistema debe: - Generar un token ΓΊnico con expiraciΓ³n de 7 dΓ­as - Enviar email con el link de registro - Mostrar el usuario como "Invitado (Pendiente)" en la lista - Registrar la acciΓ³n en el audit log ``` ### 2. Registro desde InvitaciΓ³n ```gherkin Given que recibΓ­ un email de invitaciΓ³n vΓ‘lido When hago clic en el link de registro Then debo ser redirigido a un formulario pre-llenado con: - Email (no editable) - Nombre completo - Password (con validaciΓ³n de polΓ­tica) - Confirmar password - Aceptar tΓ©rminos y condiciones When completo el formulario y hago clic en "Crear Cuenta" Then el sistema debe: - Validar que el token no haya expirado - Validar que el password cumpla la polΓ­tica - Crear la cuenta con status "active" - Invalidar el token de invitaciΓ³n - Enviar email de bienvenida - Permitir login inmediato ``` ### 3. Token Expirado ```gherkin Given que recibΓ­ una invitaciΓ³n hace mΓ‘s de 7 dΓ­as When intento acceder al link de registro Then debo ver un mensaje: "Esta invitaciΓ³n ha expirado" And un botΓ³n "Solicitar Nueva InvitaciΓ³n" When hago clic en "Solicitar Nueva InvitaciΓ³n" Then se debe enviar un email al administrador notificando la solicitud ``` ### 4. Validaciones de Email ```gherkin Given que estoy enviando una invitaciΓ³n When ingreso un email que ya estΓ‘ registrado Then debo ver un error: "Este email ya tiene una cuenta activa" And no se debe enviar la invitaciΓ³n Given que un email ya tiene una invitaciΓ³n pendiente When intento invitar al mismo email nuevamente Then debo ver un mensaje: "Este usuario ya tiene una invitaciΓ³n pendiente" And opciones para: - "Reenviar invitaciΓ³n" - "Cancelar invitaciΓ³n anterior y crear nueva" ``` ### 5. Lista de Invitaciones ```gherkin Given que soy administrador When accedo a "Usuarios > Invitaciones Pendientes" Then debo ver una tabla con: - Email invitado - Rol asignado - Enviado por - Fecha de envΓ­o - Expira en (countdown) - Estado (Pendiente, Expirado, Aceptado) - Acciones: Reenviar, Cancelar ``` --- ## 🎨 Mockup / Wireframe ### Formulario de InvitaciΓ³n ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Invitar Nuevo Usuario [X]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Email * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ usuario@ejemplo.com β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Rol * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ [v] Ingeniero β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β–Ό Director General β”‚ β”‚ Ingeniero β”‚ β”‚ Residente de Obra β”‚ β”‚ Compras β”‚ β”‚ Finanzas β”‚ β”‚ RH β”‚ β”‚ Post-venta β”‚ β”‚ β”‚ β”‚ Mensaje Personalizado (opcional) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Te invitamos a unirte a nuestro equipo β”‚ β”‚ β”‚ β”‚ en el sistema... β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ [Cancelar] [Enviar InvitaciΓ³n] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### PΓ‘gina de Registro (desde invitaciΓ³n) ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 🏒 Logo Constructora β”‚ β”‚ β”‚ β”‚ Bienvenido a [Nombre Constructora] β”‚ β”‚ Has sido invitado como: Ingeniero β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Email β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ usuario@ejemplo.com [bloqueado]β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Nombre Completo * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Juan PΓ©rez β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Crear Password * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ [πŸ‘οΈ] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Fuerza: β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘ Buena β”‚ β”‚ β”‚ β”‚ βœ“ Al menos 12 caracteres β”‚ β”‚ β”‚ β”‚ βœ“ Contiene mayΓΊscula β”‚ β”‚ β”‚ β”‚ βœ“ Contiene minΓΊscula β”‚ β”‚ β”‚ β”‚ βœ“ Contiene nΓΊmero β”‚ β”‚ β”‚ β”‚ βœ— Contiene carΓ‘cter especial β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Confirmar Password * β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’ [πŸ‘οΈ] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β˜‘οΈ Acepto los tΓ©rminos y condiciones β”‚ β”‚ β˜‘οΈ Acepto el aviso de privacidad β”‚ β”‚ β”‚ β”‚ [Crear Mi Cuenta] β”‚ β”‚ β”‚ β”‚ La invitaciΓ³n expira en: 5 dΓ­as 3 horas β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Lista de Invitaciones Pendientes ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Invitaciones Pendientes [+ Invitar Usuario]β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Email Rol Enviado por Expira en β”‚ β”‚ ─────────────────────────────────────────────────────────│ β”‚ juan@mail.com Ingeniero MarΓ­a LΓ³pez 2 dΓ­as β”‚ β”‚ [Reenviar][X]β”‚ β”‚ β”‚ β”‚ ana@mail.com Residente MarΓ­a LΓ³pez 5 dΓ­as β”‚ β”‚ [Reenviar][X]β”‚ β”‚ β”‚ β”‚ pedro@mail.com Compras MarΓ­a LΓ³pez Expirado β”‚ β”‚ [Nueva InvitaciΓ³n]β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ§ͺ Casos de Prueba ### CP-001: InvitaciΓ³n Exitosa **Precondiciones:** - Usuario autenticado con rol "director" o "hr" - Email no existe en el sistema **Pasos:** 1. Navegar a "Usuarios > Invitar Usuario" 2. Ingresar email: "nuevo@test.com" 3. Seleccionar rol: "engineer" 4. Ingresar mensaje: "Bienvenido al equipo" 5. Clic en "Enviar InvitaciΓ³n" **Resultado Esperado:** - βœ… Mensaje: "InvitaciΓ³n enviada exitosamente" - βœ… Email recibido en "nuevo@test.com" con link vΓ‘lido - βœ… Usuario aparece en lista de invitaciones pendientes - βœ… Audit log registra: "invitation_sent" ### CP-002: Registro con InvitaciΓ³n VΓ‘lida **Precondiciones:** - InvitaciΓ³n enviada y no expirada - Token vΓ‘lido en URL **Pasos:** 1. Abrir link de invitaciΓ³n desde email 2. Ingresar nombre: "Juan PΓ©rez" 3. Ingresar password: "SecurePass123!@#" 4. Confirmar password: "SecurePass123!@#" 5. Aceptar tΓ©rminos 6. Clic en "Crear Mi Cuenta" **Resultado Esperado:** - βœ… Cuenta creada con status "active" - βœ… InvitaciΓ³n marcada como "aceptada" - βœ… Email de bienvenida enviado - βœ… Redirige a login o dashboard - βœ… Puede iniciar sesiΓ³n inmediatamente ### CP-003: Token Expirado **Precondiciones:** - InvitaciΓ³n enviada hace mΓ‘s de 7 dΓ­as **Pasos:** 1. Abrir link de invitaciΓ³n expirada **Resultado Esperado:** - βœ… Muestra mensaje: "Esta invitaciΓ³n ha expirado" - βœ… BotΓ³n para solicitar nueva invitaciΓ³n visible - βœ… No permite completar registro ### CP-004: Email Duplicado **Precondiciones:** - Usuario con email "existente@test.com" ya registrado **Pasos:** 1. Intentar invitar a "existente@test.com" **Resultado Esperado:** - βœ… Error: "Este email ya tiene una cuenta activa" - βœ… No se envΓ­a email - βœ… No se crea invitaciΓ³n ### CP-005: Password DΓ©bil **Precondiciones:** - En pΓ‘gina de registro desde invitaciΓ³n **Pasos:** 1. Ingresar password: "12345" 2. Intentar crear cuenta **Resultado Esperado:** - βœ… Errores de validaciΓ³n mostrados: - "Password debe tener al menos 12 caracteres" - "Debe contener mayΓΊscula, minΓΊscula, nΓΊmero y carΓ‘cter especial" - βœ… BotΓ³n "Crear Cuenta" deshabilitado - βœ… No se crea la cuenta --- ## πŸ”— Dependencias **Requisitos Previos:** - ET-ADM-001: Modelo de base de datos implementado - ET-ADM-005: PolΓ­ticas de password configuradas - Servicio de email configurado (SendGrid/SES) **APIs Necesarias:** - `POST /api/admin/users/invite` - `POST /api/auth/register-from-invitation` - `GET /api/admin/invitations` - `POST /api/admin/invitations/:id/resend` - `DELETE /api/admin/invitations/:id` **Componentes Frontend:** - InviteUserModal - RegisterFromInvitation - InvitationsList - PasswordStrengthMeter --- ## πŸ“Š MΓ©tricas de Γ‰xito - **Tasa de conversiΓ³n:** >80% de invitaciones aceptadas dentro de 7 dΓ­as - **Tiempo promedio de registro:** <3 minutos desde apertura del link - **Tasa de error en registro:** <5% - **Passwords que cumplen polΓ­tica:** 100% --- **Generado:** 2025-11-20 **Estado:** βœ… Listo para desarrollo