# Suporte — Rotas e Controllers

> O módulo tem **uma** rota viva. O sistema de tickets não tem nenhuma.

---

## 1. Rotas

### 1.1 Página de suporte (ativa)

| Método | URI | Nome | Controller@action | Middleware | Linha |
|---|---|---|---|---|---|
| GET | `/cms/suporte` | `informacoes-instituicao` | `Admin\MainController@about` | `web` + `check.logged` | `v6/routes/basepro.php:39` |

> **v5:** a mesma rota existia com o nome **`informacoes-prefeitura`**
> (`v5/routes/basepro.php:39`). A v6 renomeou para
> `informacoes-instituicao` (o produto deixou de ser exclusivo de
> prefeituras). Todos os consumidores do nome foram atualizados — o menu
> do AdminLTE é o único.

### 1.2 Sistema de tickets (sem rotas)

Não existe **nenhuma** rota para `Prefecture\SupportController`. A busca
por `suporte`, `Support` e `SupportController` em `v6/routes/` retorna
apenas a linha 39 acima.

As views do sistema de tickets, porém, referenciam nomes de rota:

| Nome referenciado | Onde | Existe? |
|---|---|---|
| `suporte.index` | `v6/resources/views/prefecture/support/index.blade.php:39` (voltar) e `show.blade.php:38` | **Não** |
| `suporte.create` | `v6/resources/views/prefecture/support/index.blade.php:11` | **Não** |
| `suporte.show` | `v6/resources/views/prefecture/support/index.blade.php:39` | **Não** |
| `email` | `v6/resources/views/prefecture/support/create.blade.php:21` (`Form::open(['url' => route('email')])`) | **Não** |

> Qualquer renderização dessas views lançaria
> `Illuminate\Routing\Router::NamedRouteNotFoundException`.

### 1.3 Rota relacionada no portal

| Método | URI | Nome | Controller@action | Linha |
|---|---|---|---|---|
| GET (ou `any`) | `/apoio-ao-usuario` | `apoio-ao-usuario.index` | `Portal\UserSupportController@index` | `v6/routes/web.php:135` |

> **Não pertence a este módulo.** `Portal\UserSupportController`
> (`v6/app/Http/Controllers/Portal/UserSupportController.php`) renderiza o
> conteúdo estático da categoria "apoio-ao-usuario"
> (`$this->getContentByCategoryWith('apoio-ao-usuario')`). O nome
> "apoio ao usuário" sugere suporte, mas o comportamento é o de uma
> **página institucional**. O controller tem um método `index()`
> **duplicado**: o original está comentado (linhas 14-19) e o novo foi
> escrito por baixo.

---

## 2. Controllers

### 2.1 `Admin\MainController@about` (ativo)

`v6/app/Http/Controllers/Admin/MainController.php:25-28`:

```php
public function about()
{
    return view('admin.layouts.about');
}
```

Sem checagem de permissão, sem auditoria, sem Repository. Toda a lógica
está na view.

> O mesmo controller tem `initApp()`, que **cria usuários e perfis
> programaticamente** (`Sentinel::registerAndActivate` com
> `admin@admin.com` / `123123` e o perfil `administrators`). A rota
> `GET /init` (`v6/routes/basepro.php:9`) é **aberta** (sem
> `check.logged`). Isso é uma vulneração grave **adjacente** ao módulo
> (a rota está no mesmo arquivo e no mesmo controller) — ver
> `08-GAPS-E-DIVIDAS.md`.

### 2.2 `Prefecture\SupportController` (órfão)

`v6/app/Http/Controllers/Prefecture/SupportController.php` (155 linhas).

| Action | Comportamento | Linha |
|---|---|---|
| `index()` | `Support::all()` -> view `prefecture.support.index` | 17-21 |
| `create()` | `SupportCategory::all()` -> view `prefecture.support.create` | 23-26 |
| `show($id)` | `Support::find($id)` -> view `prefecture.support.show` | 29-31 |
| `enviarEmail(Request $request)` | valida, gera protocolo, grava e envia 2 e-mails | 34-128 |
| `_validate()` / `getRules()` / `customAttributes()` | regras inline | 130-155 |

Regras de validação (linhas 142-147):

```php
return [
    'assunto'   => "required|string|max:255",
    'descricao' => 'required|min:5'
];
```

Fluxo de `enviarEmail`:

1. `$user = Sentinel::getUser()`;
2. `$from = Configuration::where('key','email')->first()->value`;
3. `$to = Configuration::where('key','email_suporte')->first()->value`;
4. `$prefecture = Configuration::where('key','titulo_site')->first()->value`;
5. `$categoria = SupportCategory::find($data['supports_categories_id'])`;
6. `$id = Support::max('id')`; se vazio, `$id = 1`; senão `$id += 1`;
7. `$protocolo = strtoupper(substr(str_slug($categoria->name), 0, 2)) . $id . date('Y')`;
8. `$data['users_id'] = Sentinel::getUser()->id`; `$data['protocolo'] = $protocolo`;
9. `DB::transaction( fn () => Support::create($data) )`;
10. `Mail::send('prefecture.emails.support.email_admin', ...)`;
11. `Mail::send('prefecture.emails.support.email_user', ...)`;
12. `activity()->withProperty('Detalhe', ...)->log('Página de suporte')`;
13. flash de sucesso e redirect para `route('suporte.index')`.

Problemas verificados:

- **`catch (Exception $ex)`** (linha 119) resolve para
  `App\Http\Controllers\Prefecture\Exception`, que **não existe** — o
  `use Exception;` está ausente. O bloco de catch **nunca** executa, e as
  exceções escapam sem tratamento.
- **`redirect()->route('suporte.index')`** — nome de rota inexistente:
  mesmo que o controller fosse alcançável, o redirect falharia.
- **`->first()->value`** sem checar null: se a configuração `email_suporte`
  não existir, o código gera erro em `null->value`.
- **`$id = Support::max('id')`** é calculado **antes** do INSERT e
  suffers condição de corrida entre requisições simultâneas.
- **`$prefil`/`$prefecture2`**: a variável `$prefecture2` é lida mas nunca
  usada no segundo `Mail::send` (é passado `$prefecture2` — ok), mas
  `$copyright` e `$copyright2` são atribuídos e **nunca usados**.
- O `use App\Admin\User;` é importado e não usado.

---

## 3. Permissões exigidas

| Recurso | Permissão | Situação |
|---|---|---|
| Página `/cms/suporte` | apenas `check.logged` (sessão) | **sem** checagem de permissão |
| Sistema de tickets | — | inacessível (sem rota) |

Nenhum papel tem permissão específica de suporte: o recurso `suporte`
não existe em `resources`. Qualquer operador autenticado vê a página de
contato do fornecedor.

---

## 4. Form Requests e validações

| Alvo | Validação | Onde |
|---|---|---|
| `SupportController@enviarEmail` | validador **inline** no controller (`_validate`) | `v6/app/Http/Controllers/Prefecture/SupportController.php:130-155` |
| `Admin\MainController@about` | nenhuma | — |

Não há Form Request no módulo.

---

## 5. API Resources / Presenters

Nenhum. A listagem de tickets é um `Support::all()` renderizado
diretamente na view (com N+1: `$content->users->name` e
`$content->category->name` por linha, sem `with()`).

---

## 6. Rotas do portal público

Apenas a rota `apoio-ao-usuario.index`, que **não pertence** a este
módulo (ver 1.3). A página de contato do fornecedor **não** é publicada
no portal — é interna ao CMS.
