# A Cidade — Mapa v5 → v6, Perguntas em Aberto e Verificações

> Complemento de `08-GAPS-E-DIVIDAS.md`. Comparação entre a versão do módulo
> na v5 e na v6, com o que foi alterado, perdido ou introduzido.

---

## 1. Mapa v5 → v6

### 1.1 Correção de premissa

Três afirmações comuns sobre este módulo **não se confirmam** na v6. Registradas
aqui porque a premissa errada leva a decisões erradas na migração:

| Premissa | Resultado |
|---|---|
| "A v6 renomeou o prefixo público `a-prefeitura` para `a-cidade`" (`v5/routes/web.php:76-78` vs `v6/routes/web.php:85-87`) | ❌ **Falso.** O prefixo `a-cidade` **já existia na v5**, com a mesma rota, o mesmo nome e o mesmo controller. O que foi renomeado na v6 foi `a-prefeitura` → **`a-instituicao`**, que pertence a outro módulo. |
| "As 4 rotas da v5 (`{slug}`, `secretarias/{slug}`, `secretarias/paginas/...`, `orgaos/{slug}`) foram reduzidas a 1 na v6" (`v5/routes/web.php:69-74` vs `v6/routes/web.php:77-83`) | ❌ **Falso.** As 4 rotas foram **movidas** para o prefixo `a-instituicao` **com as 4 preservadas**. A redução a 1 rota nunca existiu para A Cidade: ela tem **1** rota desde a v5. |
| "A categoria `a-prefeitura` (id 6) permanece semeada e órfã" (`v6/database/seeds/CategoryContentTableSeeder.php:41-53` + consulta na base) | ❌ **Falso.** O seed **renomeia** a linha: `slug` passa de `a-prefeitura` para `a-instituicao`. Na base v6 atual, `category_contents.id = 6` é `A Instituição` / `a-instituicao`. O que **sobra** órfão é o **diretório de views** `default/pages/contents/a-prefeitura/` e o diretório `components-a-prefeitura/`. |

### 1.2 Tabela de correspondências — A Cidade

| Elemento | v5 | v6 | Tipo de mudança |
|---|---|---|---|
| Categoria âncora e conteúdos | `category_contents.id = 4`, `slug = 'a-cidade'`, `name = 'A cidade'`; conteúdos `historia`, `mapa`, `hino-oficial`, `fotos-da-cidade` | idem | **Sem mudança** |
| Rota do portal | `ANY /a-cidade/{slug}` — nome `a-cidade.index` | idem | **Sem mudança** |
| Controller do portal e trait | `Portal\AboutController@getIndex` + `GetInformationsPrefectureTrait` | idem (o arquivo do controller é byte a byte idêntico, exceto o nome do diretório de views) | **Sem mudança** |
| View SQL | `a_cidade` (`value`, `titulo`, `id`) | `a_cidade` (`value`, `titulo`, `id`, **`slug`**) | **Coluna nova** |
| Migration da view | `v5/database/migrations/2023_04_10_144637_create_view_to_a_cidade.php` **e** `v5/database/migrations/2026_03_09_000000_update_views_to_include_slug.php` | `v6/database/migrations/2023_04_10_144637_create_view_to_a_cidade.php` **e** `v6/database/migrations/2024_11_29_094836_update_view_a_cidade.php` | Recriada com `slug` — **adiantada na v6** (2024-11-29 contra 2026-03-09 na v5) |
| Diretório de views e componente do portal | `portal/layouts/modeloN/informacoes-prefeitura/acidade/` e `.../components/components-acidade/` | `portal/layouts/modeloN/informacoes-instituicao/acidade/` e `.../components/components-acidade/` | Diretório pai renomeado; **nome do componente mantido** |
| View do layout `default` | `portal/layouts/default/pages/contents/a-cidade/show.blade.php` | **idêntica, byte a byte** | **Sem mudança (continua órfã)** |
| Grade do CMS e JS | `DatatableController@get_a_cidade` → `DB::table('a_cidade')`; `public/assets/js/custom/contents/acidade/datatable.js` **com** guarda `if (data.slug)` | idem no controller; **sem** a guarda no JS | **Regressão no JS** |
| Controller do CMS e Form Request | `ContentController@genericIndex` (`case 'a-cidade'`); `case 'a-cidade'` (compartilhado com `orgaos`) | idem | **Sem mudança** |
| Permissões | `a-cidade.index/.create/.edit/.delete/.inactive/.inactivate/.restore/.show` (`v5/database/seeds/RolesTableSeeder.php:48`) | idem (`roles.permissions` JSON do papel `administrador`) | **Sem mudança** |
| `resources` e `menu_orders` | `resources.slug = 'a-cidade'` (`v5/database/seeds/ResourcesTableSeeder.php:54`); `menu_orders.slug = 'a-cidade'`, `id = 7` | `resources.slug = 'a-cidade'`, `modulo_id = 13`; `menu_orders.slug = 'a-cidade'`, `id = 10`, `modulo_id = 13` | **Id do `menu_orders` mudou** |
| Tabela `modulos` | **não existe** | `id = 13`, `slug = 'a-cidade'`, **`status = 0`** | **Nova — e desativa o menu** |
| Ferramenta de compartilhamento | `addthis_inline_share_toolbox` | `addtoany` (5 botões) | **Troca de biblioteca** |
| CSS da coluna lateral | `ml-auto pl-0` | `ml-auto pr-0 pl-0` | Ajuste visual |
| Breadcrumb | `Breads::view(..., $contentNew->categoryContents->slug, $contentNew->title)` (v5) | `Breads::view(..., $contentNew->categoryContents->slug, $contentNew)` (v6) | **Assinatura do breadcrumb mudou** (agora recebe o model) |

### 1.3 Tabela de correspondências — o módulo **A Instituição** (contexto)

| Elemento | v5 | v6 |
|---|---|---|
| Categoria | `id = 6`, `slug = 'a-prefeitura'` | `id = 6`, `slug = 'a-instituicao'` (renomeada por seed) |
| Rotas do portal | 4 rotas sob `a-prefeitura` | **4 rotas sob `a-instituicao`** (mesmos controllers) |
| Nomes de rota | `a-prefeitura.index`, `a-prefeitura-secretarias.index`, `secretarias-pages.index`, `a-prefeitura-orgaos.index` | `a-instituicao.index`, **`a-instituicao.index` (duplicado)**, `secretarias-pages.index`, `a-instituicao-orgaos.index` |
| Diretório de views e de componente | `informacoes-prefeitura/a-prefeitura/` e `components-a-prefeitura/` | `informacoes-instituicao/a-instituicao/` e `components-a-prefeitura/` (nome **antigo** mantido) |

> O bug do nome de rota duplicado (`a-instituicao.index` atribuído a duas URIs)
> está detalhado em `../a-instituicao/08-GAPS-E-DIVIDAS.md`.

### 1.4 Itens que existem na v5 e foram **removidos** na v6 (afetando A Cidade)

| Item | Evidência | Consequência |
|---|---|---|
| Guarda `if (data.slug)` no botão "Acessar" da grade | `v5/public/assets/js/custom/contents/acidade/datatable.js:13-24` vs `v6/public/assets/js/custom/contents/acidade/datatable.js:14` | Com `slug` NULL, o botão vira `/a-cidade/undefined` e abre uma página de erro. |
| `addthis` (widget de compartilhamento) | `v5/resources/views/portal/layouts/modelo1/informacoes-prefeitura/components/components-acidade/index.blade.php:16` | Substituído por `addtoany` — dependência externa nova (imagens servidas por `static.addtoany.com`). |

### 1.5 Itens que existem na v6 e **não** existiam na v5

| Item | Impacto em A Cidade |
|---|---|
| Tabela `modulos` (56 módulos) com `status` | **A Cidade saiu do menu lateral do CMS** (`modulos.id = 13`, `status = false`). A entrada só reaparece se `has_access('a-cidade.index')` **e** `modulos.status` forem verdadeiros. |
| Coluna `slug` na view `a_cidade` e middleware `check.route.permission` com `hasAccessSegment()` | A coluna é necessária para o botão "Acessar" da grade; o middleware faz a permissão depender da **posição do segmento na URL**. |

---

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

| # | Pergunta | Impacto |
|---|---|---|
| P-1 | A Cidade deve voltar a aparecer no menu do CMS? (`modulos.status = false`) | Define se o módulo é operável ou apenas herdado. |
| P-2 | "A Cidade" é uma **categoria de conteúdo** ou deve ser um **tipo de conteúdo** com campos próprios (ex.: "símbolos", "geografia", "história")? | Define a estratégia de migração (opção A ou B em `06-MIGRACAO-MODERNA.md`). |
| P-3 | Os 4 conteúdos semeados ("História", "Mapa", "Hino Oficial", "Fotos da Cidade", todos com texto "Em breve...") devem ser mantidos, renomeados ou removidos? | O conteúdo atual é placeholder. |
| P-4 | O cliques deve contar por requisição ou por sessão/visitante? | Muda o número exibido no painel. |
| P-5 | A página de conteúdo inexistente deve devolver 404 real? Um rascunho deve continuar acessível por URL direta (pré-visualização)? | Muda o comportamento observável (SEO, métricas). Se o rascunho continuar acessível, o filtro de status precisa de um bypass autenticado. |
| P-6 | A galeria deve aceitar documentos (PDF) além de imagens? | Hoje o PDF renderiza quebrado; a resposta define o escopo do `archiveGallery`. |
| P-7 | O módulo deve ser exposto em dados abertos (`/api/v1/a-cidade`)? | Aplica-se ao catalogo de informacoes do municipio. |
| P-8 | Os layouts `default` e `newsbit` devem ser suportados? | Define se é preciso criar `home/index.blade.php` neles ou removê-los do produto. |
| P-9 | A imagem de destaque deve aparecer? Hoje nunca aparece (BUG-7). | Se a resposta for "não", remover o slot e a coluna. |

## 6. Verificações realizadas e não realizadas

### 6.1 Verificado

| Item | Como |
|---|---|
| Rotas da v6 e da v5 (`web.php`, `basepro.php`, `api.php`, `breadcrumbs.php`) e `FilterSearchAllSite.php:29` | Leitura direta dos arquivos + `grep` |
| `Portal\AboutController` (v5 e v6) e `GetInformationsPrefectureTrait` (busca, layout, cliques) | Leitura dos arquivos (o controller é idêntico exceto pelo nome da view) |
| `embedVideo()` e `normalizeVideoLink()` | `v6/app/Helpers/functions.php:607` e `:672` |
| Existência das views `informacoes-instituicao/acidade/show.blade.php` e de `home/index.blade.php` | `find` no filesystem: `modelo1..modelo6` **sim** nos dois casos; `default` e `newsbit` **não** em nenhum dos dois (v5 e v6) |
| View `default/pages/contents/a-cidade/show.blade.php` | Existe; `diff` entre v5 e v6 = **vazio** |
| Colunas da view SQL `a_cidade` e de `contents`, `category_contents`, `archives`, `links` | `\d` na base v6 (e v5 para a view) |
| Conteúdos da categoria 4 | `SELECT` — 4 linhas, `status` NULL, `clicks = 1` |
| `category_contents.id = 6` | `SELECT` — `a-instituicao` na v6; `a-prefeitura` na v5 |
| Renomeação da categoria 6 | `v6/database/seeds/CategoryContentTableSeeder.php:41-53` |
| `modulos` (id 13) | `SELECT` — `status = false`; a tabela **não existe** na v5 (`relation does not exist`) |
| Permissões `a-cidade.*` e `resources` (id 12) | `SELECT` — `roles.permissions` do papel `administrador`; `resources.slug = 'a-cidade'`, `modulo_id = 13` |
| Regressão do JS da grade e diferenças entre as 6 views do portal | `diff` entre `v5/public/assets/js/custom/contents/acidade/datatable.js` e o da v6; `diff` entre `modelo1` e `modelo2..6` |
| PHP / PHPUnit | `docker exec v6_6f22e1bd-app-1` — PHP 7.2.34, PHPUnit 6.5.14 |
| Suíte de testes existente | 31 arquivos, todos do Dashboard; nenhum de A Cidade |
| Rotas de apoio (`ajax.delete.files`, `ajax.generic.content.deleteAll`, `galeria.*`) | `grep` em `v6/routes/basepro.php` |

### 6.2 Não verificado

| Item | Motivo |
|---|---|
| Comportamento em runtime da aplicação (execução real das rotas, do `embedVideo`, do `file_exist()` com caminho relativo) e se `file_exist()` realmente falha em produção | PHP não está instalado no host; a suíte de testes do módulo **não foi escrita** (é trabalho de implementação, não de documentação). O `file_exist()` depende do `cwd` do PHP-FPM no deploy — não verificável no repositório. O `archives.path` relativo está confirmado. |
| Ganhos de SEO / indexação real das páginas e volume real de tráfego da categoria 4 | Requer acesso ao Search Console. A base de desenvolvimento tem apenas 4 conteúdos placeholder. |
| A remocao de `default`/`newsbit` como layouts de produto | Decisão de negócio, não verificável no código. |
| `role_permissions` / vínculo Sentinel entre papéis e permissões | Nesta base as permissões são **JSON na coluna `roles.permissions`**; o schema do Sentinel (`role_permissions`) não existe na base de desenvolvimento. O mecanismo foi confirmado pelo `roles.permissions` do papel `administrador`. |
