# Glossário — Resumo Executivo

> **Versão analisada:** `v6` (módulo idêntico em `v5`)
> **Slug do módulo:** `glossario` (tabela `modulos`, id 24) — categoria de conteúdo `category_contents.slug = 'glossario'` (id 11)
> **Natureza:** CMS (painel administrativo) + Portal (público)
> **Estado:** OK v6 (migrado v5 -> v6 sem alteração funcional relevante)

---

## 1. Objetivo

O Glossário é o dicionário de termos técnicos e expressos do município: o operador cadastra
verbetes no CMS e o cidadão consulta a lista pública indexada alfabeticamente
(`/glossario`). Cada verbete é um registro da tabela `contents` em que `title` é o
**termo** e `text` é a **definição** — não existe tabela própria de verbetes.
A busca global do portal (`/buscar`) inclui a categoria `glossario`, de modo que
um verbete também é encontrado por texto.

## 2. Efeito / Impacto

| Faixa | Efeito |
|---|---|
| Cidadão | Página `/glossario` com índice A–Z; clique na letra recarrega a lista via AJAX. Termos são definições em HTML (aceita formatação). |
| Prefeitura (CMS) | Menu "Glossário" (`/cms/conteudos/glossario`) com listagem em DataTable, cadastro e edição de verbetes (título + texto). |
| Transparência e legalidade | Glossário é conteúdo institucional público; verbetes são indexáveis pela busca global e rastreáveis por log de atividade. |
| Operação técnica | O verbete é um `contents` comum: não há FK própria, nem view dedicada no portal — apenas a view SQL `glossario` usada pelo CMS. |

## 3. Comportamento

- O portal resolve o layout ativo dinamicamente: `GlossaryController@index` monta a view
  `portal.layouts.{template}.transparencia.glossario` (`v6/app/Http/Controllers/Portal/GlossaryController.php:20-25`).
- A listagem **não** é renderizada no servidor: a view só desenha os botões A–Z e o
  JavaScript dispara `GET /glossario-ajax/{letra}` no `$(document).ready`, com `all` como
  primeira chamada.
- O endpoint AJAX devolve JSON no formato
  `{"letterActive": "<letra>", "contentGlossary": [ <modelos Content> ]}`.
- O filtro é `where('title','like', $letra.'%')`: para `all` a letra vira string vazia e
  traz todos os verbetes.
- O glossário **não** é servido pela view SQL `glossario`: o portal consulta Eloquent
  (`contents` com `categoryContents` da slug `glossario`).
- A listagem do CMS usa a view SQL `glossario` (`value`, `titulo`, `id`) via
  `DatatableController@get_glossario`.
- Verbetes não têm status, data de publicação, galeria nem ordem próprios no formulário
  do CMS; o formulário expõe apenas **Título** (máx. 120) e **Texto**.

## 4. Como o Usuário Interage

**Operador (CMS)**

| Tela | Rota | Ação |
|---|---|---|
| Lista | `/cms/conteudos/glossario` | DataTable com colunas ID e Título; botão "Cadastrar Conteúdo"; seleção múltipla com exclusão em lote |
| Cadastro | `/cms/conteudos/cadastrar/glossario` | Formulário com Título e Texto (obrigatórios no markup) |
| Edição | `/cms/conteudos/editar/glossario/{id}` | Mesmo formulário; colunas de ação "editar"/"excluir" por linha |

**Cidadão (portal)**

- `/glossario`: índice de letras A–Z; ao clicar, o conteúdo é trocado sem recarregar a página.
- Busca global `/buscar`: o filtro "Glossário" está disponível; ao clicar num resultado,
  abre `/buscar/{id}` e o controller escolhe a view `glossario.show` do layout ativo.

## 5. Detalhes e Particularidades Técnicas

- Camadas: `Route (web.php)` -> `GlossaryController` -> `App\Prefecture\Content` (Eloquent) -> `contents`; e
  `Route (basepro.php)` -> `ContentController@genericIndex/genericGenerate` -> `ContentRequest` -> `Content` -> `contents`,
  com leitura do CMS pela view SQL `glossario` (`DatatableController`).
- O verbete **é** um `contents`: `title` = termo, `text` = definição
  (`v6/resources/views/prefecture/contents/glossario/form.blade.php:5-24`).
- Dependências: `yajra/laravel-datatables-oracle` (DataTable server-side), jQuery (AJAX no portal),
  `laracasts/presenter` (presenter de `Content`), `cartalyst/sentinel` (permissões `has_access`).

## 6. Estrutura de Dados

| Objeto | Onde | Observação |
|---|---|---|
| `contents` | tabela | Armazena o verbete (`title`, `text`, `category_contents_id = 11`) |
| `category_contents` | linha id 11 | `name = 'Glossário'`, `slug = 'glossario'`, `status_create = 1` |
| view `glossario` | migration `2023_04_10_151502_create_view_to_glossarios.php` | `value` (row_number), `titulo`, `id` |
| `modulos` | id 24 | `name = 'Glossário'`, `slug = 'glossario'`, `status = 1` |
| `resources` | seed | `slug = 'glossario'`, `modulo_id = 24` |

## 7. Como Testar

- CMS: cadastrar verbete, conferir na listagem do DataTable, editar, excluir.
- Portal: abrir `/glossario`, clicar em cada letra, confirmar o filtro por inicial; abrir
  `/glossario-ajax/all` e inspecionar o JSON.
- Busca: pesquisar o termo em `/buscar` e abrir o resultado.

## 8. Migração para Laravel Moderno

Modelo `GlossaryTerm` com `term`/`definition` (ou reaproveitar `Content`), `FormRequest`
com `term` obrigatório e `definition` obrigatória (o legado não exige `text` no servidor),
`Policy` por permissão `glossario.*`, endpoint JSON `GET /api/v1/glossario?letra=A` e
componente Blade único `<x-glossario.indice :termos="$termos" />` em vez das 8 cópias por layout.

## 9. Resumo Geral

O Glossário é um dicionário institucional implementado como conteúdo genérico: cada verbete
é uma linha de `contents` com `title` = termo e `text` = definição, amarrada à categoria
`category_contents.id = 11` (slug `glossario`). O portal `/glossario` renderiza apenas o
índice A–Z e busca os verbetes por AJAX em `/glossario-ajax/{letra}`, filtrando por
`title LIKE 'X%'`. O CMS edita os mesmos registros pelo CRUD genérico de `contents`
(listado pela view SQL `glossario`). A busca global do portal inclui a categoria e abre a
view `glossario.show` do layout ativo. O principal risco de migração é a duplicação das
views por layout e o fato de o índice alfabético ser sensível a maiúsculas e acentos.

---

## Índice do dossiê

| Arquivo | Conteúdo |
|---|---|
| `00-RESUMO.md` | Este documento |
| `01-ARQUITETURA.md` | Camadas, classes e o diagrama de fluxo |
| `02-MODELAGEM.md` | Estrutura de dados detalhada |
| `03-ROTAS-E-CONTROLADORES.md` | Rotas, controllers, requests, resources |
| `04-VIEWS-E-UX.md` | Telas, componentes, JS, assets |
| `05-REGRAS-E-PORTABILIDADE.md` | Particularidades e armadilhas |
| `06-MIGRACAO-MODERNA.md` | Plano de reconstrução em Laravel moderno |
| `07-TESTES.md` | Estratégia e casos de teste |
| `08-GAPS-E-DIVIDAS.md` | Pendências, riscos, comparativo v5 vs v6 |
