# Pauta do Dia — Resumo Executivo

> **Versão analisada:** `v6` (Laravel 5.5.50 / PHP 7.2.34 / PostgreSQL 10 + PostGIS)
> **Slug do módulo:** `pauta-do-dia` — `modulos.id = 42` (verificado no banco)
> **Natureza:** Portal (público) + CMS (painel administrativo)
> **Estado:** **novo na v6** — não existe na `v5`
> **Rotas públicas:** `/pauta-do-dia` e `/pauta-do-dia/{slug}`
> **Item de menu:** `menu_orders.id = 36`, `modulo_id = 42`

---

## 1. Objetivo

Publicar, no portal, a **pauta da sessão da Câmara Municipal** — a relação de
itens que serão discutidos e votados em um determinado dia — e oferecer ao
operador do CMS o cadastro e a edição dessa pauta com anexo de documentos e
imagem de destaque. O módulo serve ao cidadão que quer saber o que será
votado antes de ir à sessão, e serve à Secretaria da Câmara que precisa
divulgar a pauta com rapidez e transparência.

Na `v6` o módulo **não tem tabela própria**: é um conteúdo genérico da tabela
`contents`, filtrado pela categoria `category_contents.slug = 'pauta-do-dia'`.
A listagem do CMS lê uma **view SQL** (`pauta_do_dia`), enquanto a listagem
pública lê a tabela `contents` diretamente.

## 2. Efeito / Impacto

| Faixa | Efeito |
|---|---|
| Cidadão | Passa a consultar a pauta do dia em URL estável (`/pauta-do-dia/{slug}`), com resumo na listagem, texto completo, data/hora de publicação, autor/fonte, imagem de destaque, documento em PDF embutido e demais anexos para download. |
| Prefeitura (CMS) | Tela `/cms/conteudos/pauta-do-dia` com DataTable server-side, botão "Cadastrar Pauta do Dia", edição inline, exclusão individual e em lote, e telemetria de cliques no menu. |
| Transparência e legalidade | Publica com data e hora o que será deliberado, atendendo ao principio da publicidade dos atos legislativos e permitindo confirmação posterior pela ata e pelos pontos de frequência. |
| Operação técnica | O módulo nasce **desligado** (`modulos.status = 0` no seed) e o operador precisa habilitá-lo em `/cms/modulos`; o conteúdo é gravado na tabela genérica `contents`, compartilhada com Notícias, Requerimentos, Transmissões, Sessões e Atas. |

## 3. Comportamento

- **Listagem pública** (`GET /pauta-do-dia`): exibe as pautas da categoria
  `pauta-do-dia` ordenadas por **data (dia) decrescente** e, dentro do mesmo
  dia, pelo **número extraído do título** (ex.: "19ª Sessão" → `19`) em ordem
  decrescente; desempate final pelo `id` decrescente. Paginação padrão do
  Laravel (15 itens por página) via `$pautas->links()`.
- **Detalhe público** (`GET /pauta-do-dia/{slug}`): exibe título, autor, fonte,
  data e hora, imagem de destaque (arquivo com `highlight = true`), o texto HTML
  sem escaping (`{!! $pauta->text !!}`), botão de compartilhamento AddThis e a
  lista de anexos. Slug inexistente devolve **404** (`firstOrFail`).
- **Anexos**: são gravados em `archives` com `contents_id`; um arquivo pode ser
  marcado como `view_pdf` (embutido em `iframe` no desktop) e outro como
  `highlight` (imagem de destaque). O restante vira "Arquivos para Download".
- **Cadastro no CMS** (`/cms/conteudos/cadastrar/pauta-do-dia`): exige
  `título` (máx. 120 caracteres no `ContentRequest`, máx. 150 no formulário),
  `texto` e `data de publicação` (com hora). A imagem de destaque aceita
  apenas imagem até 5 MB; anexos são limitados às extensões de documento.
- **Publicação**: o estado `status` do conteúdo é gravado, mas **não é usado
  como filtro** nem na listagem pública nem na view SQL — pautas inativas
  continuam visíveis ao cidadão (ver `08-GAPS-E-DIVIDAS.md`).
- **Ordenação duplicada**: a mesma regra de ordenação existe em dois lugares
  independentes — o `orderByRaw` do controller do portal e a função
  `converterDataPauta()` do JavaScript do CMS — que devem produzir o mesmo
  resultado.

## 4. Como o Usuário Interage

**Cidadão (portal)**

1. Acessa `/pauta-do-dia` (link no menu do portal, cadastrado em
   `menu_items` com `category_contents_id` da categoria "Pautas do Dia").
2. Navega pela listagem paginada: data, título e resumo de 200 caracteres.
3. Clica em um item e chega à página de detalhe, com breadcrumb, imagem de
   destaque, texto, PDF embutido e anexos para download.
4. Compartilha por AddThis ou, no CMS, pelo botão de Facebook.

**Operador (CMS)**

1. Menu "Pauta do Dia" (`/cms/conteudos/pauta-do-dia`), exibido pelo
   `MenuServiceProvider` a partir do slug do módulo.
2. DataTable com colunas: seleção em lote, "ID" (numeração da view), Título,
   Data e Hora (ordenável pela chave customizada) e Ações.
3. Ação "Compartilhar no Facebook" (abre `/pauta-do-dia/{slug}`), "Editar" e
   "Excluir" — os botões só aparecem conforme `has_access()`.
4. Formulário: título, data/hora de publicação, texto rico (Summernote),
   imagem de destaque e anexos; o "Link Permanente" (`slug`) é derivado do
   título no cadastro e editável na edição.
5. Exportação da listagem para Excel e PDF (botões padrão do DataTable).

## 5. Detalhes e Particularidades Técnicas

- **Camadas**: `Route (web.php)` → `Portal\PautaDoDiaController` → Eloquent
  (`Content`, `CategoryContent`, `Archive`) → Blade `portal.layouts.{tema}.pauta-do-dia.*`.
  No CMS: `Route (basepro.php)` → `Prefecture\ContentController` (CRUD genérico)
  → `ContentRequest` → `Content`/`Archive` → `Prefecture\DatatableController@get_pauta_do_dia`
  → view SQL `pauta_do_dia` → DataTables (Yajra) + JS customizado.
- **View SQL** `pauta_do_dia` criada por
  `v6/database/migrations/2024_10_13_010549_create_view_pauta_do_dia.php`:
  expõe `value` (`row_number()`), `titulo`, `data_e_hora` (texto em
  `DD/MM/YYYY às HH24:MI`), `id` e `slug`.
- **Sem tabela própria**: o módulo reaproveita `contents`, `category_contents`
  e `archives`; o slug da categoria é o único vínculo.
- **PostgreSQL específico**: o `orderByRaw` do portal usa `::date`,
  `regexp_replace` e `::numeric` — SQL que não existe em MySQL/SQLite.
- **Telemetria**: `menuClicks('pauta-do-dia')` incrementa
  `menu_orders.clicks` a cada abertura da tela do CMS.
- **Auditoria**: o `ContentController` registra criação, edição, exclusão e
  anexos na tabela de atividades (`activity()`), com o usuário do Sentinel.
- **Dependências**: `laravel/framework 5.5.*`, `yajra/laravel-datatables ^1.5`,
  `cartalyst/sentinel 2.0.*`.

## 6. Estrutura de Dados

| Objeto | Tipo | Papel |
|---|---|---|
| `contents` | tabela | Armazena a pauta (título, texto, data de publicação, slug, autor, fonte, status). |
| `category_contents` | tabela | Categorias; a linha com `slug = 'pauta-do-dia'` classifica as pautas. |
| `archives` | tabela | Anexos e imagem de destaque, ligados por `contents_id`. |
| `pauta_do_dia` | view SQL | Projeção usada pela listagem do CMS (`value`, `titulo`, `data_e_hora`, `id`, `slug`). |
| `modulos` | tabela | Registro do módulo (id 42, `status = 0` no seed). |
| `menu_orders` | tabela | Telemetria de cliques do item de menu (id 36, `modulo_id = 42`). |

## 7. Como Testar

- Portal: abrir `/pauta-do-dia` com duas pautas no mesmo dia e conferir a
  ordem (número de sessão maior primeiro); abrir `/pauta-do-dia/{slug}` e
  validar destaque, PDF e anexos; abrir `/pauta-do-dia/inexistente` e
  esperar 404.
- CMS: `/cms/conteudos/pauta-do-dia` — validar ordenação da coluna
  "Data e Hora", ordenação alfabética por Título, botões de ação conforme
  permissão, exclusão individual e em lote, e exportação para Excel/PDF.
- Banco: comparar `select * from pauta_do_dia` com o que a tela mostra.
  Detalhado em `07-TESTES.md`.

## 8. Migração para Laravel Moderno

Criar um model dedicado `PautaDoDia` (em vez de conteúdo genérico), com
`session_number` explícito (número da sessão, hoje extraído por `regexp_replace`
do título), `session_date`, `published_at`, `status` e `slug`; Form Request com
`session_number` numérico; Policy para as permissões
`pauta-do-dia.create|edit|delete`; API Resource JSON; rotas REST
`/api/v1/pautas-do-dia`; e testes automatizados. **A semântica de ordenação
observável (data e, dentro do dia, número da sessão em ordem decrescente) não
pode mudar.** Detalhes em `06-MIGRACAO-MODERNA.md`.

## 9. Resumo Geral

O módulo "Pauta do Dia" é novo na `v6` e dá ao portal a capacidade de
divulgar, com data e hora, o que será deliberado na sessão da Câmara. Não
possui tabela própria: as pautas são conteúdos genéricos da tabela `contents`
classificados pela categoria `pauta-do-dia`, com anexos em `archives`. O
operador cadastra a pauta no CMS (que grava em `/cms/conteudos/pauta-do-dia`,
com telemetria e auditoria) e o cidadão a consulta em `/pauta-do-dia`, com
ordenação por data e por número de sessão — regra implementada duas vezes, em
`orderByRaw` (portal) e em `converterDataPauta()` (CMS). A listagem do CMS
consome a view SQL `pauta_do_dia`, criada por migration e mantida por
`CREATE OR REPLACE VIEW`. Os principais riscos a tratar na reconstrução são:
dependência de SQL exclusivo do PostgreSQL, extração frágil do número da
sessão a partir do texto digitado pelo operador, ausência de filtro de
publicação (`status`) na listagem pública e duplicação da lógica de ordenação
entre PHP e JavaScript.

---

## Í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, permissões |
| `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 |
