# Sistema de Asignación de Proyectos

## Funcionalidad Implementada

El sistema ahora incluye un **control de acceso por proyectos** que permite a los administradores asignar específicamente qué empresas y proyectos puede ver cada técnico, ingeniero o supervisor.

## Características Principales

### 1. Asignación de Proyectos
- **Botón "Asignar"** en la lista de usuarios (visible solo para técnicos, ingenieros y supervisores)
- **Interfaz intuitiva** con checkboxes agrupados por empresa
- **Selección múltiple** de proyectos de diferentes empresas
- **Selección masiva** por empresa usando el checkbox del encabezado

### 2. Control de Acceso
Los usuarios solo ven tickets de sus proyectos asignados:
- ✅ **Técnicos N1**: Solo ven tickets de proyectos asignados
- ✅ **Ingenieros N2**: Solo ven tickets de proyectos asignados
- ✅ **Supervisores N3**: Solo ven tickets de proyectos asignados
- ✅ **Administradores**: Ven todos los tickets (sin restricciones)
- ✅ **Clientes**: Solo ven sus propios tickets

### 3. Filtrado Automático
- Los tickets se filtran automáticamente en el listado principal
- Al crear tickets, solo se muestran proyectos asignados al usuario
- Los usuarios pueden ver tickets que les están asignados directamente, incluso si no tienen el proyecto

## Cómo Usar el Sistema

### Para Administradores

1. **Asignar Proyectos a un Usuario**
   - Ir a "Usuarios" en el menú
   - Hacer clic en el botón verde "Asignar" del usuario deseado
   - Seleccionar las empresas y/o proyectos específicos
   - Guardar cambios

2. **Seleccionar Toda una Empresa**
   - Marcar el checkbox del nombre de la empresa
   - Todos los proyectos de esa empresa se seleccionarán automáticamente

3. **Seleccionar Proyectos Específicos**
   - Dejar sin marcar el checkbox de la empresa
   - Seleccionar solo los proyectos deseados

### Para Técnicos/Ingenieros/Supervisores

- Al entrar al sistema, solo verás tickets de tus proyectos asignados
- No necesitas configurar nada, el filtrado es automático
- Si necesitas acceso a más proyectos, contacta al administrador

## Estructura de la Base de Datos

### Tabla `user_project` (Pivote)
```
- id
- user_id (FK a users)
- project_id (FK a projects)
- created_at
- updated_at
- UNIQUE(user_id, project_id) - Evita duplicados
```

## Rutas Agregadas

```php
// Ver formulario de asignación
GET /users/{user}/assign-projects

// Guardar asignaciones
PUT /users/{user}/update-projects
```

## Métodos en User Model

```php
// Relación many-to-many con proyectos
$user->projects()

// Verificar si tiene un proyecto
$user->hasProject($projectId)

// Obtener IDs de proyectos asignados
$user->getAssignedProjectIds()
```

## Métodos en Project Model

```php
// Usuarios asignados a un proyecto
$project->assignedUsers()
```

## Datos de Prueba (Seeder)

### Asignaciones Creadas
- **Supervisor**: Acceso a TODOS los proyectos (3)
- **Carlos (Ingeniero N2)**: Solo Empresa ABC (1 proyecto)
- **Ana (Ingeniero N2)**: Solo Comercial XYZ (1 proyecto)
- **Juan (Técnico N1)**: Empresa ABC + Restaurantes Unidos (2 proyectos)
- **María (Técnico N1)**: Todos los proyectos (3 proyectos)

### Verificar Funcionamiento
1. Entrar como `carlos@ticketera.com` → Solo verá tickets de Empresa ABC
2. Entrar como `ana@ticketera.com` → Solo verá tickets de Comercial XYZ
3. Entrar como `juan@ticketera.com` → Verá tickets de ABC y Restaurantes
4. Entrar como `maria@ticketera.com` → Verá todos los tickets
5. Entrar como `admin@ticketera.com` → Verá absolutamente todo

## Mejoras Adicionales

### UI Mejorada
- ✅ Columna "Contacto" eliminada (no aportaba valor)
- ✅ Botón "Asignar" con icono distintivo (engranaje + edificio)
- ✅ Badges de rol con colores apropiados
- ✅ Estado indeterminado en checkboxes de empresa

### Validaciones
- Solo permite asignar proyectos a técnicos, ingenieros y supervisores
- Valida que los IDs de proyectos existan
- Evita duplicados con constraint UNIQUE en base de datos

## Notas Técnicas

1. **Método `sync()`**: Reemplaza todas las asignaciones existentes con las nuevas (más eficiente que detach + attach)
2. **Filtrado Inteligente**: Los usuarios siempre pueden ver tickets asignados a ellos, incluso sin el proyecto
3. **Performance**: Las relaciones usan `whereIn()` para consultas optimizadas
4. **Extensibilidad**: Fácil agregar asignación de empresas si se necesita en el futuro

## Soporte

Para modificar asignaciones o reportar problemas, contactar al administrador del sistema.
