# Sistema de Activación de Usuarios

## Descripción
Los usuarios se crean sin contraseña. El sistema **envía automáticamente** un correo electrónico de activación con un enlace único. El usuario establece su propia contraseña al activar su cuenta.

## ⚡ Características

- ✅ **Envío automático de correos** con template profesional HTML
- ✅ **Tokens de seguridad** únicos de 64 caracteres
- ✅ **Expiración de tokens** después de 48 horas
- ✅ **Función de reenvío** si el usuario no recibe el correo
- ✅ **Diseño responsive** para dispositivos móviles
- ✅ **Validaciones de seguridad** múltiples

## Flujo de Creación de Usuario

### 1. Administrador crea el usuario
- Accede a: `Usuarios > Nuevo Usuario`
- Completa el formulario con:
  - Nombre Completo *
  - Correo Electrónico *
  - Rol *
  - Teléfono (opcional)
  - Cargo/Posición (opcional)
- **NO se solicita contraseña**

### 2. Sistema genera token y envía correo automáticamente
- Al guardar, el sistema:
  - Genera un token único de activación (64 caracteres)
  - Crea una contraseña temporal aleatoria
  - Marca el usuario como inactivo (`is_active = false`)
  - Registra la fecha de envío del token
  - **Envía automáticamente un correo electrónico** al usuario

### 3. Correo de activación profesional
El usuario recibe un correo con:
- ✉️ **Asunto:** "Bienvenido a Ticketera - Activa tu cuenta"
- 🎨 **Diseño profesional:** Template HTML con gradiente morado
- 👤 **Información del usuario:** Nombre, email y rol
- 🔘 **Botón CTA prominente:** "Activar mi cuenta"
- 📋 **Instrucciones paso a paso**
- 🔒 **Consejos de seguridad** para contraseñas
- ⏰ **Validez del enlace:** 48 horas
- 🔗 **Enlace alternativo** en texto plano

Si falla el envío del correo, el sistema muestra el enlace manualmente para que el admin lo copie.

### 4. Usuario activa su cuenta
- El usuario hace clic en el enlace recibido
- Ve una pantalla de bienvenida con:
  - Su nombre y correo
  - Formulario para establecer contraseña
  - Campo de confirmación de contraseña
  - Consejos de seguridad

### 5. Usuario establece su contraseña
- Debe tener al menos 8 caracteres
- Debe confirmar la contraseña
- Al enviar, el sistema:
  - Valida que el token sea válido y no haya expirado
  - Hashea y guarda la nueva contraseña
  - Activa la cuenta (`is_active = true`)
  - Elimina el token de activación
  - Redirige al login con mensaje de éxito

### 6. Usuario puede iniciar sesión
- Con su correo y la contraseña que estableció

## Reenvío de Activación

Si el usuario no recibe el correo o el token expira, el administrador puede reenviar la activación:

1. Ir a la lista de usuarios
2. Hacer clic en el usuario inactivo
3. Clic en botón **"Reenviar Activación"** (aparece solo si el usuario está inactivo)
4. El sistema:
   - Genera un nuevo token
   - Actualiza la fecha de envío
   - Envía nuevamente el correo al usuario
   - Muestra mensaje de confirmación

## Archivos Modificados

### Migración
- `database/migrations/2024_01_10_000000_add_activation_token_to_users.php`
  - Agrega campos: `activation_token`, `activation_token_sent_at`

### Modelo
- `app/Models/User.php`
  - Agrega campos a `$fillable`: `activation_token`, `activation_token_sent_at`
  - Agrega campo a `$casts`: `activation_token_sent_at`

### Controlador
- `app/Http/Controllers/UserController.php`
  - `store()`: Ya no requiere contraseña, genera token y **envía correo automáticamente**
  - `showActivationForm($token)`: Muestra formulario de activación, **valida expiración de 48 horas**
  - `activate(Request $request, $token)`: Procesa activación
  - `resendActivation(User $user)`: **NUEVO** - Reenvía correo de activación

### Correos
- `app/Mail/UserActivationMail.php` (NUEVA)
  - Clase Mailable para correo de activación
  - Define asunto y template

- `resources/views/emails/user-activation.blade.php` (NUEVA)
  - Template HTML profesional del correo
  - Diseño responsive con gradiente morado
  - Información del usuario, botón CTA, instrucciones

### Vistas
- `resources/views/users/create.blade.php`
  - Eliminados campos de contraseña
  - Agregada alerta informativa sobre activación
  - Removido checkbox "Usuario Activo" (se activa automáticamente al establecer contraseña)

- `resources/views/users/activate.blade.php` (NUEVA)
  - Formulario de bienvenida y establecimiento de contraseña
  - Diseño con layout guest

- `resources/views/users/show.blade.php`
  - Mejora en mensaje de éxito
  - Botón para copiar enlace de activación
  - **Botón "Reenviar Activación"** para usuarios inactivos

- `resources/views/layouts/guest.blade.php` (NUEVA)
  - Layout para páginas públicas (login, activación)
  - Fondo gradiente, sin sidebar

### Rutas
- `routes/web.php`
  - GET `/activate/{token}` → Muestra formulario de activación
  - POST `/activate/{token}` → Procesa activación
  - POST `/users/{user}/resend-activation` → **NUEVO** - Reenvía correo

### Configuración
- `.env`
  - Variables SMTP configuradas para envío de correos
  - `MAIL_MAILER`, `MAIL_HOST`, `MAIL_PORT`, etc.

## 📧 Configuración de Correos

Para que el envío automático funcione, debes configurar un servidor SMTP. Ver documentación completa en: **[CONFIGURACION_CORREOS.md](CONFIGURACION_CORREOS.md)**

### Opción Rápida: Gmail

1. Habilita verificación en 2 pasos en Gmail
2. Genera una "App Password" en https://myaccount.google.com/apppasswords
3. Actualiza `.env`:

```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tu-correo@gmail.com
MAIL_PASSWORD=tu-app-password-de-16-caracteres
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@ticketera.com"
MAIL_FROM_NAME="Ticketera"
```

4. Reinicia el servidor: `php artisan serve`

### Para Testing: Mailtrap

Captura correos sin enviarlos realmente (perfecto para pruebas):

1. Crear cuenta en https://mailtrap.io
2. Copiar credenciales SMTP
3. Configurar en `.env`

Ver opciones adicionales (Outlook, SendGrid, servidor propio) en [CONFIGURACION_CORREOS.md](CONFIGURACION_CORREOS.md)

## Seguridad

### Validaciones
- Token único de 64 caracteres (prácticamente imposible de adivinar)
- **Expiración de 48 horas** desde el envío
- Validación de existencia del token
- Verificación de que la cuenta no esté ya activada
- Contraseña mínimo 8 caracteres con confirmación
- Usuario inactivo hasta que establezca contraseña

### Protecciones
- Tokens de un solo uso (se eliminan después de usarse)
- Usuarios inactivos no pueden iniciar sesión
- Validación de correo único
- Hash de contraseñas con bcrypt
- Manejo de errores en envío de correos (fallback a enlace manual)

## Próximos Pasos Implementados ✅

### ~~1. Envío automático de correos~~ ✅ COMPLETADO
```php
// En UserController::store()
Mail::to($user->email)->send(new UserActivationMail($user, $activationLink));
```

### ~~2. Expiración de tokens~~ ✅ COMPLETADO
```php
// En showActivationForm()
if ($user->activation_token_sent_at->addHours(48)->isPast()) {
    return redirect()->route('login')->with('error', 'Token expirado');
}
```

### ~~3. Reenvío de activación~~ ✅ COMPLETADO

```php
// En UserController - IMPLEMENTADO
public function resendActivation(User $user)
{
    $newToken = Str::random(64);
    $user->update([
        'activation_token' => $newToken,
        'activation_token_sent_at' => now(),
    ]);
    
    $activationLink = route('users.activate.show', ['token' => $newToken]);
    Mail::to($user->email)->send(new UserActivationMail($user, $activationLink));
}
```

## Mejoras Futuras Sugeridas

### 1. Cola de correos (Queue)
Enviar correos en segundo plano para no bloquear la respuesta

### 2. Notificaciones adicionales
- Correo de bienvenida después de activar
- Notificación de ticket asignado
- Resumen diario de tickets

### 3. Tracking de correos
- Registrar si el correo fue abierto
- Dashboard de estadísticas de activación

## Testing

### Crear usuario de prueba
1. Login como admin: `admin@ticketera.com` / `password123`
2. Ir a `Usuarios > Nuevo Usuario`
3. Llenar formulario:
   - Nombre: Juan Pérez
   - Email: juan@example.com
   - Rol: Técnico
   - Teléfono: 123456789
   - Cargo: Soporte Técnico
4. Clic en "Crear Usuario"
5. Copiar enlace de activación

### Activar cuenta
1. Abrir enlace en navegador de incógnito (o cerrar sesión)
2. Verificar que aparece nombre y correo del usuario
3. Establecer contraseña: `password123`
4. Confirmar contraseña: `password123`
5. Clic en "Activar Cuenta"
6. Verificar redirección a login con mensaje de éxito

### Iniciar sesión
1. Email: `juan@example.com`
2. Contraseña: `password123`
3. Verificar acceso al sistema

## Notas Importantes

- Los usuarios existentes en la base de datos mantienen sus contraseñas actuales
- Solo los nuevos usuarios creados después de este cambio usarán el flujo de activación
- El administrador puede ver en la lista de usuarios cuáles están activos/inactivos
- Los usuarios inactivos (sin activar) no pueden iniciar sesión
- El token de activación es de un solo uso y se elimina después de la activación
