# 🧪 Cómo Probar el Sistema Multi-Tenant

## 🚀 Inicio Rápido

### 1. Preparar el Entorno

```bash
# Limpiar caches
php artisan config:clear
php artisan route:clear
php artisan cache:clear

# Verificar que las migraciones estén ejecutadas
php artisan migrate:status

# Verificar roles
php artisan tinker --execute="use Spatie\Permission\Models\Role; echo Role::pluck('name')->implode(', ');"
```

### 2. Crear Demo de Super Admin

```bash
php artisan tinker --execute="
use App\Models\User;
use Spatie\Permission\Models\Role;
use Illuminate\Support\Facades\Hash;

\$superAdmin = User::firstOrCreate(
    ['email' => 'superadmin@campaignhub.com'],
    [
        'name' => 'Super Admin',
        'password' => Hash::make('admin123'),
        'is_active' => true,
        'consent_data' => true,
        'consent_data_at' => now(),
        'consent_contact' => true,
        'consent_contact_at' => now()
    ]
);

\$superAdmin->assignRole('super_admin');
echo 'Super Admin creado: superadmin@campaignhub.com / admin123';
"
```

---

## 📋 Escenario 1: Usuario Compra Suscripción

### Paso 1: Registrarse como Campaign Admin

**URL:** http://localhost:8001/register

**Datos:**
- Nombre: `María Rodríguez`
- Email: `maria@alcaldia.com`
- Contraseña: `password`
- Rol: `candidate` (o `campaign_admin`)
- ✅ Acepto tratamiento de datos
- ✅ Acepto contacto

### Paso 2: Crear Campaña (Comprar)

**URL:** http://localhost:8001/campaigns/create

**O vía API:**
```bash
curl -X POST http://localhost:8001/api/campaigns \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {TOKEN}" \
  -d '{
    "name": "Alcaldía Medellín 2024",
    "candidate_name": "María Rodríguez",
    "email": "contacto@maria2024.com",
    "level": "municipal",
    "jurisdiction": "Medellín",
    "plan": "pro",
    "election_date": "2024-10-27"
  }'
```

**Respuesta esperada:**
```json
{
  "message": "¡Campaña creada exitosamente! Tienes 14 días de prueba gratis.",
  "campaign": {
    "id": 1,
    "name": "Alcaldía Medellín 2024",
    "plan": "pro",
    "max_users": 50,
    "max_whatsapp_monthly": 10000,
    "trial_ends_at": "2024-11-13"
  }
}
```

---

## 📋 Escenario 2: Configurar Ambiente

### Paso 1: Ir a Configuración

**URL:** http://localhost:8001/campaigns/1/settings

### Paso 2: Configurar APIs (Tab "APIs & Servicios")

**WhatsApp Business:**
- API Key: `EAABsbCS1iHgBO...`
- Phone ID: `123456789012345`
- Business ID: `987654321098765`

**Email SMTP:**
- Host: `smtp.gmail.com`
- Puerto: `587`
- Usuario: `contacto@maria2024.com`
- Contraseña: `app-password`
- Email Remitente: `contacto@maria2024.com`
- Nombre: `Campaña María 2024`

**Redes Sociales:**
- Facebook API: `tu-facebook-api-key`
- Twitter API: `tu-twitter-api-key`
- Instagram API: `tu-instagram-api-key`

### Paso 3: Configurar Branding (Tab "Marca")

- Color Primario: `#E91E63` (rosa)
- Color Secundario: `#9C27B0` (morado)
- Logo URL: `https://ejemplo.com/logo.png`

---

## 📋 Escenario 3: Invitar Equipo

### Paso 1: Invitar Coordinador

**Desde la UI:**
http://localhost:8001/campaigns/1/settings → Tab "Equipo" → Invitar

**O vía API:**
```bash
curl -X POST http://localhost:8001/api/campaigns/1/invite \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {TOKEN}" \
  -d '{
    "email": "carlos@coordinador.com",
    "role": "coordinator"
  }'
```

**Respuesta:**
```json
{
  "message": "Invitación enviada exitosamente",
  "invitation": {
    "email": "carlos@coordinador.com",
    "role": "coordinator",
    "token": "abc123xyz..."
  },
  "invitation_link": "http://localhost:8001/invitations/abc123xyz.../accept"
}
```

### Paso 2: Invitar Voluntarios

```bash
curl -X POST http://localhost:8001/api/campaigns/1/invite \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {TOKEN}" \
  -d '{
    "email": "laura@voluntaria.com",
    "role": "volunteer"
  }'
```

---

## 📋 Escenario 4: Usuario Acepta Invitación

### Paso 1: Acceder al Link de Invitación

```
http://localhost:8001/invitations/{token}/accept
```

### Paso 2: Registro (si no existe)

Si el usuario no existe, debe registrarse primero con el mismo email de la invitación.

### Paso 3: Aceptación Automática

Al iniciar sesión con ese email, la invitación se acepta automáticamente y el usuario se une a la campaña.

---

## 📋 Escenario 5: Trabajar en la Campaña

### Ver Campaña Actual

```bash
curl http://localhost:8001/api/campaigns \
  -H "Authorization: Bearer {TOKEN}"
```

**Respuesta:**
```json
{
  "my_campaigns": [
    {
      "id": 1,
      "name": "Alcaldía Medellín 2024",
      "pivot": {
        "role": "campaign_admin"
      }
    }
  ],
  "current_campaign": {
    "id": 1,
    "name": "Alcaldía Medellín 2024"
  }
}
```

### Ver Equipo

```bash
curl http://localhost:8001/api/campaigns/1/users \
  -H "Authorization: Bearer {TOKEN}"
```

### Ver Configuración

```bash
curl http://localhost:8001/api/campaigns/1 \
  -H "Authorization: Bearer {TOKEN}"
```

---

## 📋 Escenario 6: Crear Segunda Campaña (Otro Cliente)

### Paso 1: Nuevo Usuario

```bash
curl -X POST http://localhost:8001/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Pedro Gómez",
    "email": "pedro@alcalde.com",
    "password": "password",
    "password_confirmation": "password",
    "role": "campaign_admin",
    "consent_data": true,
    "consent_contact": true
  }'
```

### Paso 2: Crear Segunda Campaña

```bash
curl -X POST http://localhost:8001/api/campaigns \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {PEDRO_TOKEN}" \
  -d '{
    "name": "Gobernación Antioquia 2024",
    "candidate_name": "Pedro Gómez",
    "email": "contacto@pedro2024.com",
    "level": "regional",
    "jurisdiction": "Antioquia",
    "plan": "enterprise"
  }'
```

### Paso 3: Verificar Aislamiento

**Pedro solo ve su campaña:**
```bash
curl http://localhost:8001/api/campaigns \
  -H "Authorization: Bearer {PEDRO_TOKEN}"
```

**Respuesta:**
```json
{
  "my_campaigns": [
    {
      "id": 2,
      "name": "Gobernación Antioquia 2024"
    }
  ]
}
```

**María solo ve su campaña:**
```bash
curl http://localhost:8001/api/campaigns \
  -H "Authorization: Bearer {MARIA_TOKEN}"
```

**Respuesta:**
```json
{
  "my_campaigns": [
    {
      "id": 1,
      "name": "Alcaldía Medellín 2024"
    }
  ]
}
```

---

## 📋 Escenario 7: Cambiar Entre Campañas

Si un usuario pertenece a múltiples campañas:

```bash
curl -X POST http://localhost:8001/api/campaigns/2/switch \
  -H "Authorization: Bearer {TOKEN}"
```

**Respuesta:**
```json
{
  "message": "Campaña cambiada exitosamente",
  "current_campaign": {
    "id": 2,
    "name": "Gobernación Antioquia 2024"
  }
}
```

---

## 📋 Escenario 8: Verificar Límites por Plan

### Plan Starter (10 usuarios)

```bash
# Intentar invitar usuario #11
curl -X POST http://localhost:8001/api/campaigns/1/invite \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {TOKEN}" \
  -d '{
    "email": "usuario11@email.com",
    "role": "volunteer"
  }'
```

**Respuesta esperada:**
```json
{
  "error": "Has alcanzado el límite de usuarios para tu plan"
}
```

### Plan Pro (50 usuarios) ✅

### Plan Enterprise (Ilimitado) ✅

---

## 🔐 Escenario 9: Probar Permisos

### Como Campaign Admin

```bash
# ✅ Puede configurar APIs
curl -X PUT http://localhost:8001/api/campaigns/1 \
  -H "Authorization: Bearer {ADMIN_TOKEN}" \
  -d '{"whatsapp_api_key": "nuevo-key"}'
```

### Como Coordinator

```bash
# ❌ No puede configurar APIs
curl -X PUT http://localhost:8001/api/campaigns/1 \
  -H "Authorization: Bearer {COORDINATOR_TOKEN}" \
  -d '{"whatsapp_api_key": "nuevo-key"}'
```

**Respuesta:**
```json
{
  "error": "No tienes permisos para editar esta campaña"
}
```

### Como Volunteer

```bash
# ❌ No puede invitar usuarios
curl -X POST http://localhost:8001/api/campaigns/1/invite \
  -H "Authorization: Bearer {VOLUNTEER_TOKEN}"
```

**Respuesta:**
```json
{
  "error": "Solo los administradores pueden invitar usuarios"
}
```

---

## 🎯 Checklist de Pruebas

### ✅ Funcionalidades Core

- [ ] Registrar usuario
- [ ] Crear campaña con plan
- [ ] Configurar APIs (WhatsApp, Email, Redes)
- [ ] Configurar branding
- [ ] Invitar usuarios
- [ ] Aceptar invitaciones
- [ ] Ver solo datos de mi campaña
- [ ] Cambiar entre campañas
- [ ] Verificar límites por plan

### ✅ Aislamiento Multi-Tenant

- [ ] Usuario A no ve datos de Campaña B
- [ ] Usuario B no ve datos de Campaña A
- [ ] Configuraciones son por campaña
- [ ] Equipos son independientes

### ✅ Permisos

- [ ] Super Admin ve todo
- [ ] Campaign Admin gestiona su campaña
- [ ] Coordinator no configura APIs
- [ ] Volunteer solo ve dashboard

### ✅ Seguridad

- [ ] No se puede acceder a campaña sin permiso
- [ ] No se puede remover al owner
- [ ] Invitaciones expiran en 7 días
- [ ] API Keys están ocultas

---

## 📊 Datos de Prueba Completos

### Usuarios Demo

| Email | Password | Rol | Campaña |
|-------|----------|-----|---------|
| `superadmin@campaignhub.com` | `admin123` | super_admin | Todas |
| `maria@alcaldia.com` | `password` | campaign_admin | Medellín |
| `pedro@alcalde.com` | `password` | campaign_admin | Antioquia |
| `carlos@coordinador.com` | `password` | coordinator | Medellín |
| `laura@voluntaria.com` | `password` | volunteer | Medellín |

### Campañas Demo

| ID | Nombre | Plan | Owner | Max Users |
|----|--------|------|-------|-----------|
| 1 | Alcaldía Medellín 2024 | pro | María | 50 |
| 2 | Gobernación Antioquia 2024 | enterprise | Pedro | Ilimitado |

---

## 🐛 Troubleshooting

### Error: "No tienes acceso a esta campaña"
**Solución:** Verificar que el usuario esté en `campaign_user` para esa campaña.

### Error: "Database connection [tenant] not configured"
**Solución:** Este es del sistema legacy de tenancy. Usar el nuevo sistema de `campaign_id`.

### Error: "Auth guard [sanctum] is not defined"
**Solución:** Ya está instalado Sanctum. Verificar que el token sea válido.

### Las APIs no funcionan
**Solución:** Verificar que la campaña tenga configuradas las API keys en `campaigns.whatsapp_api_key`, etc.

---

## 🎉 Resultado Esperado

Al finalizar las pruebas deberías tener:

1. ✅ 2+ campañas independientes
2. ✅ Cada una con su equipo
3. ✅ Cada una con sus configuraciones
4. ✅ Aislamiento total de datos
5. ✅ Permisos funcionando correctamente
6. ✅ Límites por plan aplicándose

**¡Sistema Multi-Tenant 100% Funcional!** 🚀







