# Microsoft Graph Model Change Tracking System

## Overview
Este sistema complementa el tracking de cambios de membresía de usuarios con el tracking de cambios en los propios modelos de Committee y WorkGroup.

## Componentes Implementados

### 1. Base de Datos
- **Tabla**: `msgraph_model_changes`
- **Campos principales**:
  - `model_type`, `model_id` (polimórfico para Committee/WorkGroup)
  - `action` (model_created, model_updated, model_deleted, status_changed, title_changed)
  - `old_status`, `new_status` (para cambios de estado)
  - `old_title`, `new_title`, `language` (para cambios de título)
  - `processed`, `processed_at`, `priority`

### 2. Modelos Eloquent
- **`MsgraphModelChange`**: Modelo principal para cambios de modelo
  - Relación polimórfica con Committee/WorkGroup
  - Scopes para consultas comunes (unprocessed, byPriority, etc.)

### 3. Servicios
- **`MsgraphModelChangeService`**: Maneja la lógica de negocio para cambios de modelo
  - `trackModelCreated()`, `trackModelDeleted()`
  - `trackStatusChanged()`, `trackTitleChanged()`
  - Métodos para consultar y marcar cambios como procesados

- **`ModelChangeTrackingService`**: Servicio de alto nivel para tracking
  - Métodos específicos para Committee y WorkGroup
  - Lógica para determinar qué cambios trackear
  - Exclusión de committees legales

### 4. Event Listeners
- **Committee Model**: 
  - `created`, `deleting`, `updating` (para status)
- **WorkGroup Model**: 
  - `created`, `deleting`, `updating` (para status)
- **CommitteeLanguage Model**: 
  - `updating` (para title)
- **WorkGroupLanguage Model**: 
  - `updating` (para title)
- **WebsiteObject Model**: 
  - `updating` (para status de Committee/WorkGroup)

### 5. Comandos Artisan
- **`msgraph:process-model-changes`**: Procesa cambios pendientes
- **`test:model-change-tracking`**: Test del sistema de tracking

## Flujo de Tracking

### Cambios de Status
1. Cuando se actualiza un `WebsiteObject` con status de Committee/WorkGroup
2. Se dispara el event listener en `WebsiteObject::boot()`
3. Se determina si es Committee o WorkGroup
4. Se llama al `ModelChangeTrackingService` apropiado
5. Se crea registro en `msgraph_model_changes`

### Cambios de Title
1. Cuando se actualiza `CommitteeLanguage` o `WorkGroupLanguage`
2. Se dispara el event listener en el modelo de idioma
3. Se obtiene el Committee/WorkGroup padre
4. Se llama al `ModelChangeTrackingService`
5. Se crea registro con información de idioma

### Creación/Eliminación
1. Eventos `created`/`deleting` en Committee/WorkGroup
2. Event listeners llaman directamente al tracking service
3. Se registra el cambio con metadatos relevantes

## Configuración de Tracking

### Exclusiones
- **Legal Committees**: No se trackean (legalCommittee, legalOpinions)
- **WorkGroups de Legal Committees**: No se trackean

### Prioridades
- **Alta**: Eliminaciones, cambios a/desde status published
- **Normal**: Resto de cambios

## Comandos Disponibles

```bash
# Procesar cambios de modelo pendientes
lando artisan msgraph:process-model-changes --limit=10

# Test del sistema de tracking
lando artisan test:model-change-tracking

# Ver cambios pendientes (usando tinker)
php artisan tinker
>>> App\Models\MsgraphModelChange::unprocessed()->get()
```

## Integración con Microsoft Graph

Los cambios tracked incluyen toda la información necesaria para sincronizar con Microsoft Graph:
- Identificación del modelo (tipo e ID)
- Tipo de acción realizada
- Valores anteriores y nuevos (status/title)
- Metadatos adicionales (idioma, counts, etc.)
- Estado de procesamiento y prioridad

El comando `msgraph:process-model-changes` puede ser extendido para realizar las llamadas reales a la API de Microsoft Graph.
