# Suporte — Gaps, Dívidas e Divergências v5 → v6

> Módulo com **duas metades**: uma viva e mínima, outra completa e morta.

---

## 1. Decisão pendente (bloqueante para a v7)

O módulo "Suporte" precisa de uma decisão de negócio:

| Opção | Descrição | Consequência |
|---|---|---|
| **A** | Manter apenas a **página de contato do fornecedor** e fundir com o módulo `fornecedores` | simplest; remove código morto; o slug `suporte` sai do registro de módulos |
| **B** | **Reativar o sistema de chamados** (tickets) e remover a página do fornecedor | exige papel de atendente, fila, SLA, notificações |
| **C** | Manter as duas coisas | confuso: "suporte" significa duas coisas diferentes |

A implementação atual é **A** (a página do fornecedor) com a
infraestrutura de **B** pronta e desligada. A recomendação técnica é
**A**: o código de B nunca funcionou, não tem autorização, e a página do
fornecedor é a que o menu realmente usa.

---

## 2. Bugs e erros conhecidos

| Sev. | Item | Arquivo / linha |
|---|---|---|
| **CRÍTICO** | `GET /init` cria o usuário `admin@admin.com` (senha `123123`) com o perfil `administrators` — rota **pública** | `v6/routes/basepro.php:9` + `v6/app/Http/Controllers/Admin/MainController.php:45` |
| **CRÍTICO** | Sistema de tickets inalcançável (nenhuma rota) e com redirects para `route('suporte.index')` inexistente | `v6/app/Http/Controllers/Prefecture/SupportController.php:93,110,118,126` |
| **ALTO** | `catch (Exception $ex)` sem `use Exception;` — resolve para uma classe inexistente e **não captura nada** | `v6/app/Http/Controllers/Prefecture/SupportController.php:119` |
| **ALTO** | As views órfãs chamam `route('suporte.index')`, `route('suporte.create')`, `route('suporte.show')` e `route('email')` — todas inexistentes | `v6/resources/views/prefecture/support/**` |
| **ALTO** | `Configuration::where('key','email_suporte')->first()->value` sem checar null | `v6/app/Http/Controllers/Prefecture/SupportController.php:42-44` |
| **MÉDIO** | O ticket é gravado **antes** do envio do e-mail; se o e-mail falhar, há registro sem notificação | `v6/app/Http/Controllers/Prefecture/SupportController.php:73-112` |
| **MÉDIO** | Protocolo gerado por `Support::max('id') + 1` — condição de corrida, sem índice único | `v6/app/Http/Controllers/Prefecture/SupportController.php:63-69` |
| **MÉDIO** | Página em branco quando não há fornecedor ativo (sem ramo `@else`) | `v6/resources/views/admin/layouts/about.blade.php` |
| **MÉDIO** | N+1 na listagem de tickets (`users` e `category` lazy por linha) | `v6/resources/views/prefecture/support/index.blade.php:31-32` |
| **MÉDIO** | Inconsistência de slug: `has_access(['support.create'])` (com "c") x módulo `suporte` | `v6/resources/views/prefecture/support/index.blade.php:10` |
| **MÉDIO** | `SupportController` estende o `Controller` do **Admin**, que não registra middleware — se as rotas forem reativadas, ficam sem `check.logged` | `v6/app/Http/Controllers/Prefecture/SupportController.php:8` |
| **BAIXO** | `SupportCategory` não usa `SoftDeletes` apesar da coluna existir | `v6/app/Http/Model/Prefecture/SupportCategory.php` |
| **BAIXO** | `Support::users()` / `Support::category()` são `hasOne` (semântica de `belongsTo`) | `v6/app/Http/Model/Prefecture/Support.php:33-43` |
| **BAIXO** | Variáveis mortas `$copyright`, `$copyright2`; import `App\Admin\User` não usado | `v6/app/Http/Controllers/Prefecture/SupportController.php` |
| **BAIXO** | `Supplier::$fillable` inclui `telefone` e `endereco`, colunas que não existem em `suppliers` | `v6/app/Http/Model/Prefecture/Supplier.php:18-32` |
| **BAIXO** | `Portal\UserSupportController` tem um `index()` **comentado** e outro escrito por baixo | `v6/app/Http/Controllers/Portal/UserSupportController.php:14-19,35-39` |
| **BAIXO** | O item de menu "Suporte" não tem guarda `$modulos['suporte']` | `v6/resources/views/vendor/adminlte/page.blade.php:302-309` |

---

## 3. Funcionalidades incompletas ou mortas

| Item | Situação |
|---|---|
| `Prefecture\SupportController` (155 linhas) | **Morto** — nenhuma rota |
| `App\Http\Model\Prefecture\Support` / `SupportCategory` | **Mortos** — só usados pelo controller órfão |
| Tabelas `supports` / `supports_categories` | **Mortas** — nenhum dado é gravado |
| `SupportCategorySeeder` | **Morto** — popula categorias que ninguém usa |
| Views `prefecture/support/{index,create,form,show}.blade.php` | **Mortas** — referenciam rotas inexistentes |
| Views `prefecture/support/{support,tutorial}.blade.php` | Conceptualmente de outro módulo (páginas estáticas do portal) — **misplaced** |
| Templates `prefecture/emails/support/{email_admin,email_user}.blade.php` | **Mortos** |
| Recurso `suporte` em `resources` | **Ausente** — não há permissão concedível |
| Item em `menu_orders` | **Ausente** — o item vem do menu do AdminLTE, não do menu por módulo |
| Fila / SLA / atendente | **Inexistentes** |
| Respostas ao ticket | **Inexistentes** (o model não tem `answers`) |

---

## 4. Mapa v5 → v6

| Aspecto | v5 | v6 |
|---|---|---|
| Rota | `GET /cms/suporte` — **`informacoes-prefeitura`** | `GET /cms/suporte` — **`informacoes-instituicao`** |
| `Admin\MainController` | idêntico | **idêntico** |
| `Prefecture\SupportController` | idêntico | **idêntico** |
| Models `Support` / `SupportCategory` | idênticos | **idênticos** |
| Views `prefecture/support/**` | 6 arquivos | **idênticos** |
| Migrations `supports*` | idênticas | **idênticas** |
| `SupportCategorySeeder` | idêntico | **idêntico** |
| Tabelas `supports` / `supports_categories` | idênticas | **idênticas** |
| Sistema de tickets alcançável | **Não** | **Não** |
| Registro de módulos | inexistente | `modulos` (id 9, `status = true`) — **sem** recurso vinculado |

**Única mudança no escopo do módulo**: o **nome** da rota. Tudo o mais
é byte-a-byte idêntico entre v5 e v6.

A razão do renomeamento é a unificação de produtos (Prefeitura, Câmara,
IPM) introduzida na v6, conforme o changelog "Public V6".

---

## 5. Riscos de dados

| Risco | Detalhe | Mitigação |
|---|---|---|
| Decidir remover `supports` | perda do histórico de chamados (hoje vazio) | exportar antes; confirmar com o negócio |
| `supports.protocolo` sem `unique` | protocolos duplicados | adicionar índice único após limpar duplicatas |
| `supports_categories` sem `SoftDeletes` no model | registros "apagados" visíveis | uniformizar |
| Página vazia sem fornecedor ativo | diagnóstico ruim | mensagem explícita + link para `/cms/fornecedores` |
| Dois fornecedores ativos | resultado não determinístico | impor unicidade (índice parcial único em `fornecedor_ativo`) |
| E-mail enviado em_request síncrono | delay da resposta | mover para fila (caminho B) |
| Credenciais padrão criadas por `/init` | acesso administrativo aberto | remover a rota |

---

## 6. Perguntas em aberto para o negócio

1. **O que o módulo "Suporte" deve ser na v7?** (ver seção 1)
2. **O sistema de tickets já foi usado em alguma instalação?** A base
   analisada está vazia, mas há telas de listagem de tickets prontas — houve
   uma fase de uso?
3. **A página do fornecedor deveria ser pública?** Hoje é interna.
4. **Deve haver mais de um fornecedor ativo (ex.: por município do
   estado)?** Hoje o modelo é "um ativo, globalmente único".
5. **O que fazer com as tabelas `supports`/`supports_categories` se a
   opção A for escolhida?**
6. **A rota `/init` pode ser removida sem quebrar alguma instalação?**
   Ela parece ser um utilitário de instalação esquecido.
7. **As páginas estáticas `support.blade.php` e `tutorial.blade.php`
   devem ir para o diretório correto?** Elas usam o layout do portal
   dentro de `prefecture/support/`.

---

## 7. Checklist de correção (priorizado)

| Prioridade | Item | Arquivo |
|---|---|---|
| P0 | Remover a rota `GET /init` | `v6/routes/basepro.php:9` |
| P0 | Decidir o futuro do módulo (A, B ou C) | — (decisão de negócio) |
| P1 | Mensagem de estado vazio na página do fornecedor | `v6/resources/views/admin/layouts/about.blade.php` |
| P1 | Corrigir `catch (Exception $ex)` -> `catch (\Exception $ex)` | `v6/app/Http/Controllers/Prefecture/SupportController.php:119` |
| P1 | Se as rotas forem reativadas: adicionar `check.logged` + permissão | `v6/app/Http/Controllers/Prefecture/SupportController.php` |
| P1 | Se as rotas forem reativadas: corrigir os redirects para `route('suporte.*')` | mesmo arquivo, linhas 93, 110, 118, 126 |
| P2 | Adicionar guarda `$modulos['suporte']` no menu | `v6/resources/views/vendor/adminlte/page.blade.php:302` |
| P2 | Se as rotas forem reativadas: `with(['users','category'])` na listagem | `v6/app/Http/Controllers/Prefecture/SupportController.php:19` |
| P2 | Se as rotas forem reativadas: índice único em `supports.protocolo` | nova migration |
| P2 | Se as rotas forem reativadas: checar null em `email_suporte` | `v6/app/Http/Controllers/Prefecture/SupportController.php:42` |
| P3 | Remover `telefone`/`endereco` do `$fillable` de `Supplier` | `v6/app/Http/Model/Prefecture/Supplier.php:18-32` |
| P3 | Adicionar `SoftDeletes` ao `SupportCategory` (ou remover a coluna) | `v6/app/Http/Model/Prefecture/SupportCategory.php` |
| P3 | Mover `support.blade.php` e `tutorial.blade.php` para o diretório do portal | `v6/resources/views/prefecture/support/` |
| P3 | Limpar variáveis mortas e imports | `v6/app/Http/Controllers/Prefecture/SupportController.php` |
