# Diagrama de Flujo - Relaciones entre Entidades

## Relaciones del Sistema

Este diagrama muestra las relaciones entre Clientes, Entornos, Productos y Licencias en el sistema.

```mermaid
flowchart TB
    CLIENTE["👤 CLIENTE<br/><br/>Ej: Empresa ABC"]
    
    subgraph LICENCIAS["🔑 LICENCIAS"]
        direction LR
        LICENCIA1["LICENCIA 1<br/>Token ABC123"]
        LICENCIA2["LICENCIA 2<br/>Token XYZ789"]
        LICENCIA3["LICENCIA N<br/>..."]
    end
    
    subgraph ENTORNOS["🌐 ENTORNOS"]
        direction LR
        ENTORNO1["ENTORNO 1<br/>entorno1.empresa.com"]
        ENTORNO2["ENTORNO 2<br/>entorno2.empresa.com"]
        ENTORNO3["ENTORNO N<br/>..."]
    end
    
    subgraph PRODUCTOS["📦 PRODUCTOS"]
        direction LR
        PRODUCTO1["PRODUCTO 1<br/>Moodle Premium"]
        PRODUCTO2["PRODUCTO 2<br/>WordPress Pro"]
        PRODUCTO3["PRODUCTO N<br/>..."]
    end
    
    CLIENTE -->|"posee múltiples"| LICENCIAS
    CLIENTE -->|"tiene varios"| ENTORNOS
    
    LICENCIA1 -->|"asignada a"| ENTORNO1
    LICENCIA1 -->|"asignada a"| ENTORNO2
    LICENCIA2 -->|"asignada a"| ENTORNO3
    
    LICENCIA1 -->|"incluye"| PRODUCTO1
    LICENCIA1 -->|"incluye"| PRODUCTO2
    LICENCIA2 -->|"incluye"| PRODUCTO1
    LICENCIA2 -->|"incluye"| PRODUCTO3
    
    style CLIENTE fill:#4CAF50,color:#fff,font-size:16px,font-weight:bold
    style LICENCIAS fill:#FF9800,color:#fff,font-size:14px
    style ENTORNOS fill:#2196F3,color:#fff,font-size:14px
    style PRODUCTOS fill:#9C27B0,color:#fff,font-size:14px
    style LICENCIA1 fill:#FF9800,color:#fff,font-size:12px
    style LICENCIA2 fill:#FF9800,color:#fff,font-size:12px
    style LICENCIA3 fill:#FF9800,color:#fff,font-size:12px
    style ENTORNO1 fill:#2196F3,color:#fff,font-size:12px
    style ENTORNO2 fill:#2196F3,color:#fff,font-size:12px
    style ENTORNO3 fill:#2196F3,color:#fff,font-size:12px
    style PRODUCTO1 fill:#9C27B0,color:#fff,font-size:12px
    style PRODUCTO2 fill:#9C27B0,color:#fff,font-size:12px
    style PRODUCTO3 fill:#9C27B0,color:#fff,font-size:12px
```

## Relaciones Simplificadas

### 1. Cliente → Entornos
**Un CLIENTE tiene varios ENTORNOS**

Ejemplo:
- Cliente: "Empresa ABC"
  - Entorno 1: "entorno1.empresa.com"
  - Entorno 2: "entorno2.empresa.com"
  - Entorno 3: "entorno3.empresa.com"

### 2. Cliente → Licencias
**Un CLIENTE posee múltiples LICENCIAS**

Ejemplo:
- Cliente: "Empresa ABC"
  - Licencia 1: "Token ABC123"
  - Licencia 2: "Token XYZ789"

### 3. Licencia → Entornos
**Una LICENCIA está asignada a varios ENTORNOS**

Ejemplo:
- Licencia: "Token ABC123"
  - Entorno: "entorno1.empresa.com"
  - Entorno: "entorno2.empresa.com"

### 4. Licencia ↔ Productos
**Una LICENCIA incluye varios PRODUCTOS** (y un PRODUCTO puede estar en múltiples LICENCIAS)

Ejemplo:
- Licencia: "Token ABC123"
  - Producto: "Moodle Premium"
  - Producto: "WordPress Pro"
  
- Producto: "Moodle Premium" puede estar en:
  - Licencia: "Token ABC123"
  - Licencia: "Token XYZ789"

## Flujo de Datos

```
CLIENTE
  ├── ENTORNOS (directo)
  │   └── LICENCIA (a través de license_token_id)
  │       └── PRODUCTOS (a través de license_token_product)
  │
  └── LICENCIAS (directo)
      ├── PRODUCTOS (a través de license_token_product)
      └── ENTORNOS (a través de license_token_id)
```

## Ejemplo de Uso

### Obtener todos los productos de un cliente:
```php
$client = Client::find(1);
// A través de licencias
$products = $client->tokens()
    ->with('products')
    ->get()
    ->pluck('products')
    ->flatten()
    ->unique('id');
```

### Obtener todos los entornos de un cliente con sus licencias:
```php
$client = Client::find(1);
$environments = $client->environments()
    ->with('licenseToken.products')
    ->get();
```

### Obtener todos los productos de una licencia:
```php
$license = LicenseToken::find(1);
$products = $license->products; // Incluye datos del pivot
```

