# Multi-Tenancy (Estratégia Atual) - Mapeamento por Evidência

Este documento mapeia a estratégia de multi-tenancy **somente** com base no que foi encontrado no código.

## 1. Como o tenant é identificado?

Pelo middleware `App\Http\Middleware\Tenant`.

Regra observada:
- Se `token_whatsapp` existe no request e não está vazio (`$request->token_whatsapp != ''`), busca um registro em `App\Models\Cliente` onde:
  - `cliente_id = $request->token_whatsapp`
- Caso contrário, tenta buscar em `App\Models\Cliente` onde:
  - `cliente_id = Auth()->user()->cliente_id`

Evidência:

`app/Http/Middleware/Tenant.php`
- busca por `cliente_id` usando `token_whatsapp` ou `Auth()->user()->cliente_id`

## 2. Onde é resolvido?

A resolução do tenant acontece no próprio middleware `Tenant` chamando `connect()` no model `App\Models\Cliente`.

Evidência (chamada):
`app/Http/Middleware/Tenant.php`
```php
if (!is_null($user)) {
    $user->connect();
}
return $next($request);
```

Evidência (connect ajustando conexão `tenant`):
`app/Models/Cliente/Cliente.php`
```php
DB::purge('tenant');
Config::set('database.connections.tenant.host', $this->db_host);
Config::set('database.connections.tenant.database', $this->db_name);
Config::set('database.connections.tenant.username', $this->db_user);
Config::set('database.connections.tenant.password', $this->db_pass);
DB::reconnect('tenant');
Schema::connection('tenant')->getConnection()->reconnect();
```

## 3. Existe middleware específico?

Sim:
- `App\Http\Middleware\Tenant` é usado nas rotas que exigem tenant (ex.: webhooks e rotas de integração).

Evidência (rotas):
`routes/web.php`
- múltiplas rotas com `->middleware(\App\Http\Middleware\Tenant::class)`

Também existe:
- MFA middleware: `App\Http\Middleware\VerifiedMFA` (não é multi-tenant, mas afeta o fluxo de auth).

## 4. Existe Global Scope?

Não identificado no código.

O que foi identificado no nível de Model:
- `TenantModel` fixa `protected $connection = 'tenant'`.

Evidência:
`app/Models/TenantModel.php`
```php
protected $connection = 'tenant';
```

## 5. Há tabelas sem `tenant_id` que deveriam ter?

Com base nas migrations do diretório `database/migrations/tenant`, o padrão não parece ser “todas as tabelas têm `tenant_id`”.

Exemplos encontrados:
- `database/migrations/tenant/2024_07_18_182244_create_atendimento.php`
  - cria tabela `atendimento` **sem** coluna `tenant_id`/`client_id` (por inspeção do schema da migration).
- `database/migrations/tenant/2024_07_18_182336_create_fila_canal.php`
  - cria tabela `fila_canal` **sem** `tenant_id`/`client_id`.

Já existe pelo menos uma migration onde `tenant_id`/`client_id` aparecem:
- `database/migrations/tenant/2024_07_18_182302_create_configuracao_email.php`
  - tabela `configuracao_email` tem:
    - `tenant_id`
    - `client_id`
    - `client_secret`

Conclusão (apenas pelo que está no código):
- **Não dá para afirmar** que tabelas sem `tenant_id` “deveriam ter”, porque o mecanismo real de tenant no código parece ser a troca da conexão `tenant` (por `connect()`), não um filtro universal por coluna `tenant_id`.

## 6. Há queries sem filtro de tenant?

Há queries sem filtro explícito por `tenant_id`/`client_id` nos controllers, mas isso não implica ausência de tenant isolamento, porque:
- os Models consultados podem estar na conexão `tenant` (via `TenantModel`), e a conexão `tenant` já é resolvida pelo middleware `Tenant`.

Exemplo 1: `WebhookController@store`
- monta/atualiza configuração do webhook usando `where('tipo', 1)` e `whereNotNull('url')`, sem filtro explícito por `client_id`/`tenant_id`.

Evidência:
`app/Http/Controllers/Webhook/WebhookController.php`
- `webhookConfig::select('url')->where('tipo', 1)->count()`
- atualiza/insere em `webhook_config`

Exemplo 2: `RelatorioWhatsController@relatorio_whats` (trecho mostrado)
- usa `$this->Atendimento` (que é `TenantModel`) e faz filtros por `canais`, `status`, range de datas etc.
- não adiciona um `where('tenant_id', ...)` explicitamente no bloco principal mostrado.

Evidência:
`app/Http/Controllers/Relatorio/RelatorioWhatsController.php`
- construção da query com `->whereIn('solicitacao_chat_whatsapp.canal_id', ...)`
- filtros adicionais por `data_init`, `data_fim`, etc.

Observação:
- Não identificado no código: checagens de “tenant_id” em todas as queries de todos os controllers.

