# Telefones Úteis — Gaps, Dívidas e Comparativo v5 -> v6

## 1. Bugs e erros conhecidos

| # | Achado | Evidência | Severidade |
|---|---|---|---|
| B1 | Layout `default` não possui `informacoes-instituicao/telefones-uteis`; a rota pública quebra quando o layout ativo é `default` | `v6/resources/views/portal/layouts/default/pages/contents/telefones-uteis/index.blade.php` é o único arquivo do layout default | Alta |
| B2 | A view `default` referencia `$category`, variável não enviada pelo controller | `Breadcrumbs::render('category-content', $category)` em `v6/resources/views/portal/layouts/default/pages/contents/telefones-uteis/index.blade.php:4` | Média |
| B3 | A busca do portal é case-sensitive apenas no layout `default` | comparação `indexOf` sem `toUpperCase` no `default`, com `toUpperCase` nos demais | Baixa |
| B4 | A listagem pública não filtra `status`, expondo telefones desativados | `getContentByCategory` não aplica `byStatus` | Média |
| B5 | `ContentController@store` contém branch morto para o campo `phone` | `v6/app/Http/Controllers/Prefecture/ContentController.php:662-663` | Baixa |
| B6 | `ContentRequest` mantém a mensagem `phone.required` sem regra `phone` | `v6/app/Http/Requests/ContentRequest.php:337` | Baixa |
| B7 | `PhoneType::phones()` não retorna valor (falta `return`) | `v6/app/Http/Model/Admin/PhoneType.php:25` | Baixa (fora do escopo do módulo, mas no mesmo domínio) |
| B8 | `area_code` consta no `$fillable` de `Phone`, mas a coluna não existe | `v6/app/Http/Model/Admin/Phone.php:15-20` vs migration `2018_03_16_194527` | Baixa (fluxo LAI) |
| B9 | A rota pública usa `Route::any`, aceitando POST sem efeito | `v6/routes/web.php:97` | Baixa |
| B10 | O portal não pagina: a query retorna todos os registros da categoria | `getContentByCategory` sem `limit`/`paginate` | Média em volume alto |

## 2. Funcionalidades incompletas ou mortas

| Item | Situação |
|---|---|
| Tabela `phones` / `phones_type` | Não tem relação com o módulo Telefones Úteis; é usada apenas pelo fluxo LAI (`v6/app/Http/Controllers/Portal/InformationController.php`). Não há tela de CMS para ela. |
| `area_code` | Comentado na migration e sem uso no formulário |
| `Person` (`v6/app/Http/Model/Admin/Person.php`) | Vinculado a `phones.persons_id`; fora do escopo deste módulo |
| Pasta `pages/contents/telefones-uteis` do layout `default` | View órfã: o controller aponta para `informacoes-instituicao` |
| Busca do portal | Não tem índice, paginação nem busca por número (só por título e número via texto combinado) |

## 3. Riscos de dados

| Risco | Detalhe |
|---|---|
| Telefone em texto livre | Sem tipo, sem DDD estruturado, sem validação; migração para coluna dedicada exige limpeza manual |
| Slugs colliding | `store`/`update` aplicam sufixos automáticos (`slug-<maxid+1>`, `pub<id>-slug`); migração para `slug` único exige resolver duplicatas |
| Soft delete sem restauração no portal | A view e o portal ignoram `deleted_at`; registros em lixeira somem de todos os lugares |
| Sem vínculo com secretarias/órgãos | O telefone não referencia `secretaria` nem `orgaos_id`, embora `contents` tenha essas colunas; a relação é apenas textual |
| Sem trilha de alterações por item | O log registra a operação, mas não guarda o valor anterior do telefone |

## 4. Estado atual do banco (leitura em `prefeituras_v5`)

| Consulta | Resultado |
|---|---|
| `select count(*) from telefones_uteis` | 0 |
| `select count(*) from phones` | 0 |
| `select count(*) from phones_type` | 2 (Residencial, Comercial) |
| `modulos` id 27 (`telefones-uteis`) | `status = true` |

Ou seja: **o módulo está habilitado, mas sem dados** no ambiente de desenvolvimento. Nenhuma
funcionalidade de telefones pode ser observada sem antes cadastrar registros.

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

1. O telefone deve ser vinculado a uma secretaria/órgão cadastrado (em vez de texto livre)?
2. Deve existir um telefone com DDD, número e tipo (fixo, celular, atendimento)?
3. Telefones desativados devem sumir do portal?
4. Deve haver mais de um telefone por registro (tabela pivô)?
5. A lista pública deve ser paginada ou por ordem alfabética?
6. O módulo deve continuar no CMS genérico de conteúdos ou ganhar telas próprias?
7. Qual layout é o oficial? Se for `default`, B1/B2 precisam ser corrigidos antes.

## 5.1 Checklist de migração de dados (v6 -> v7)

| Passo | Ação | Verificação |
|---|---|---|
| 1 | Exportar `contents` da categoria `telefones-uteis` com `title`, `text`, `slug`, `status`, `deleted_at` | contagem igual à da view `telefones_uteis` mais os apagados |
| 2 | Identificar registros com `text` vazio ou não numérico | relatório para decisão do negócio |
| 3 | Gerar slugs únicos para a nova tabela | sem colisão em `useful_phones.slug` |
| 4 | Importar para `useful_phones` | contagem e amostragem conferidas |
| 5 | Recriar as permissões `telefones-uteis.*` | `php artisan tinker` verificando `can()` |
| 6 | Recriar o item de menu e o breadcrumb | acesso pelo CMS e pela rota pública |

## 6. Mapa v5 -> v6

| Aspecto | v5 | v6 | Impacto |
|---|---|---|---|
| Controller do portal | `v5/app/Http/Controllers/Portal/UsefulPhonesController.php` | `v6/app/Http/Controllers/Portal/UsefulPhonesController.php` | Idêntico, exceto o nome da pasta de views |
| Caminho da view do portal | `portal.layouts.<layout>.informacoes-prefeitura.telefones-uteis.index` | `portal.layouts.<layout>.informacoes-instituicao.telefones-uteis.index` | **Mudança breaking**: exige renomear as pastas de view |
| Views do portal | `v5/resources/views/portal/layouts/modelo5/informacoes-prefeitura/telefones-uteis/index.blade.php` | `v6/resources/views/portal/layouts/modelo5/informacoes-instituicao/telefones-uteis/index.blade.php` | Renomeação de pasta (reorganização “Prefeitura” -> “Instituição”) |
| Layout `default` | `v5/resources/views/portal/layouts/default/pages/contents/telefones-uteis/index.blade.php` | idem caminho | Mesma inconsistência B1 nas duas versões |
| Migration da view SQL | `v5/database/migrations/2023_03_16_093713_create_view_to_telefones_uteis.php` | `v6/database/migrations/2023_03_16_093714_create_view_to_telefones_uteis.php` | Mesmo SQL; nome com 1 segundo de diferença (as views são recriadas) |
| Rota pública | `v5/routes/web.php:88` | `v6/routes/web.php:97` | Mesma URI e nome (`telefones-uteis.index`) |
| Breadcrumb | `v5/routes/breadcrumbs.php:314` | `v6/routes/breadcrumbs.php:235` | Mesma estrutura (`Home > Telefones Úteis`) |
| DataTable do CMS | `v5/app/Http/Controllers/Prefecture/DatatableController.php` (`get_telefones_uteis`) | idem | Sem mudança de comportamento |
| Formulário do CMS | `v5/resources/views/prefecture/contents/telefones-uteis/` | `v6/resources/views/prefecture/contents/telefones-uteis/` | Sem mudança; o mask `advanced-phone` já existia |
| Tabelas `phones`/`phones_type` | migrations `2018_03_16_194526` e `2018_03_16_194527` | idem | Sem mudança; continuam restritas ao fluxo LAI |
| Registro no menu do CMS | menu estático em controller | `v6/app/Providers/MenuServiceProvider.php` com evento `BuildingMenu` | Mudança de arquitetura: o menu virou dado (`modulos`, `menu_orders`) |
| Permissões | seeds de `resources`/`roles` | idem, com `modulos` e `resources.modulo_id` | Idêntico |
| Colunas novas em `contents` | sem `linha_fina` | `linha_fina` adicionada em `v6/database/migrations/2026_06_25_000001_add_linha_fina_to_contents_table.php` | Sem impacto no módulo |

### Itens da v5 que não existem na v6

Nada relevante foi removido: o módulo existe nas duas versões com o mesmo conjunto de rotas, views e
regras. As diferenças são de **organização** (renomeação de pastas de view e registro do menu por
`modulos`/`menu_orders`), não de funcionalidade.

### Itens novos na v6

- `contents.linha_fina` (coluna genérica, não usada por telefones).
- Registro do módulo na tabela `modulos` (`2024_11_01_150206_create_modulos_table.php`) e o
  `MenuServiceProvider` baseado no evento `BuildingMenu`.
- Exportação Excel/PDF já existente no `runDatatables` (`v6/public/assets/js/custom/utilities/table.js`) — presente também na v5 (`v5/public/assets/js/custom/utilities/table.js`).
