# Pauta do Dia — Gaps, Dúvidas e Mapa v5 → v6

> **Slug:** `pauta-do-dia` · **Módulo:** `modulos.id = 42` · **Novo na v6**
> Este documento registra o que está quebrado, o que está incompleto, o que
> precisa de decisão do negócio e a comparação com a versão anterior.

---

## 1. Bugs e defeitos observáveis

| # | Severidade | Descrição | Evidência | Efeito |
|---|---|---|---|---|
| B1 | **Alta** | Pauta **não publicada** (`contents.status = false`) aparece no portal: nem `PautaDoDiaController@index`/`@show` nem a view `pauta_do_dia` filtram por `status`. | `v6/app/Http/Controllers/Portal/PautaDoDiaController.php:18-20`; view em `v6/database/migrations/2024_10_13_010549_create_view_pauta_do_dia.php` | Trabalho não publicado vaza ao cidadão. |
| B2 | **Alta** | O formulário do CMS **não tem campo `status`**, mas `ContentController@store` grava `status` a partir do request — o conteúdo nasce "não publicado" e, mesmo assim, é publicado no portal. | `v6/resources/views/prefecture/contents/pauta-do-dia/form.blade.php`; `v6/app/Http/Controllers/Prefecture/ContentController.php:651` | O operador não tem controle de publicação; B1 é a consequência direta. |
| B3 | **Alta** | A ordenação depende de o **número da sessão estar no texto do título** e sem o ano. "19ª Sessão 2026" → `192026`; "Pauta 7 e 8" → `78`. | `regexp_replace(title, '[^0-9]', '', 'g')` em `PautaDoDiaController@index`; `title.replace(/\D/g, '')` em `v6/public/assets/js/custom/contents/pauta-do-dia/datatables.js` | Ordem errada sem que o operador perceba; nenhuma mensagem alerta. |
| B4 | **Média** | A regra de ordenação está **duplicada** em PHP e em JavaScript, sem teste de paridade. | `v6/app/Http/Controllers/Portal/PautaDoDiaController.php:20` e `converterDataPauta()` | Divergência silenciosa entre portal e CMS. |
| B5 | **Média** | A coluna "ID" do CMS mostra o `row_number()` da view, **não** o identificador do conteúdo; o número muda conforme a data de publicação. | `v6/database/migrations/2024_10_13_010549_create_view_pauta_do_dia.php`; coluna "ID" em `v6/resources/views/prefecture/contents/pauta-do-dia/index.blade.php` | Operador não consegue identificar o registro pelo número exibido. |
| B6 | **Média** | A listagem do CMS carrega **todas** as linhas (`DB::table(...)->get()`) antes de paginar em memória. | `v6/app/Http/Controllers/Prefecture/DatatableController.php:465-467` | Consumo de memória e latência crescem com o histórico de pautas. |
| B7 | **Média** | A view SQL usa subquery escalar em `category_contents`; se houver **duas categorias com o slug `pauta-do-dia`** (raiz e subcategoria), o PostgreSQL lança erro e a listagem do CMS para. | `v6/database/migrations/2024_10_13_010549_create_view_pauta_do_dia.php` | Falha total do CMS para o módulo. |
| B8 | **Baixa** | Divergência de validação: o `ContentRequest` impõe `max:120` no título, mas o formulário anuncia "Máximo de 150 caracteres" (`maxlen` 150). | `v6/app/Http/Requests/ContentRequest.php:262-272` e `form.blade.php` | Mensagem enganosa; erro inesperado ao salvar títulos longos. |
| B9 | **Baixa** | Ordenar o DataTable pela coluna **Título** ordena alfabeticamente, ignorando o número da sessão — só a coluna de data usa a chave customizada. | `v6/public/assets/js/custom/contents/pauta-do-dia/datatables.js` | Resultado inesperado para o operador. |
| B10 | **Baixa** | O resumo da listagem usa `str_limit` (helper global do Laravel 5.5, removido nas versões modernas) sobre `strip_tags(stripslashes(...))`. | `v6/resources/views/portal/layouts/modelo1/pauta-do-dia/index.blade.php` | Código a reescrever na v7. |
| B11 | **Baixa** | A verificação de existência do anexo usa `file_exist($archive->path)` com caminho **relativo** ao `public/`. | `v6/resources/views/portal/components/view_pdf/files-list.blade.php` | Quebra se o diretório de trabalho do PHP mudar. |
| B12 | **Baixa** | O botão de compartilhamento usa **AddThis**, serviço descontinuado. | `v6/resources/views/portal/layouts/modelo1/pauta-do-dia/show.blade.php` | Botão sem efeito. |
| B13 | **Baixa** | O texto do portal é renderizado sem escaping (`{!! $pauta->text !!}`). | `v6/resources/views/portal/layouts/modelo1/pauta-do-dia/show.blade.php` | Depende da confiança no operador do CMS (XSS se o CMS for comprometido). |
| B14 | **Informativo** | Grammar: a mensagem de lista vazia diz "Nenhuma registro encontrado." | `v6/resources/views/portal/layouts/modelo1/pauta-do-dia/index.blade.php` | Texto a corrigir. |
| B15 | **Informativo** | A imagem de destaque do detalhe é obtida por lazy loading da relação `archives`, gerando uma query extra por requisição. | `v6/resources/views/portal/layouts/modelo1/pauta-do-dia/show.blade.php` | N+1 potencial se o padrão for replicado em listagens. |

## 2. Funcionalidades incompletas ou mortas

| # | Item | Situação |
|---|---|---|
| I1 | Filtro por status de publicação | Inexistente (B1). |
| I2 | Busca/filtro por data ou número de sessão no portal | Inexistente; só há paginação. |
| I3 | Campo "número da sessão" no formulário | Inexistente; o número vive no título. |
| I4 | Exportação da pauta em PDF para o cidadão | Inexistente no portal (só no CMS, exportando a listagem). |
| I5 | RSS/feed de pautas | Inexistente. |
| I6 | `setStatus` (ativar/inativar conteúdo) | Existe no `ContentController` (linha 1548), mas o módulo não expõe o controle na interface. |
| I7 | Audit trail do portal (visualização pública) | Inexistente; o registro de atividades é interno do CMS. |
| I8 | Ligação entre a pauta e a sessão (`sessoes`) | Inexistente: apenas coincidência de domínio, sem FK. |
| I9 | Coluna "Data e Hora" com ordenação por número de sessão no CMS | Existe, mas apenas via chave artificial em JavaScript (ver B4). |

## 3. Riscos

| # | Risco | Probabilidade | Impacto | Mitigação na v7 |
|---|---|---|---|---|
| R1 | Regressão de ordenação na migração: a v7 ordena por data/número enquanto a v6 ordenava por dígitos do título. | Alta | Alto | Teste de paridade com os casos P2/P3/B5 (ver `07-TESTES.md`). |
| R2 | Migração de dados: extrair `session_number` de títulos existentes gera valores errados (ano no número). | Média | Médio | Relatório de títulos ambíguos para revisão manual antes de ativar. |
| R3 | Quebra de links públicos `/pauta-do-dia/{slug}` já divulgados. | Média | Alto | Preservar a rota e o `slug`; redirecionar se necessário. |
| R4 | Colisão de slug ao criar a tabela com restrição única. | Média | Médio | Reaproveitar os slugs existentes e registrar colisões. |
| R5 | Migração dos anexos de `archives` para a nova entidade. | Média | Médio | Script idempotente, validando `highlight` e `view_pdf`. |
| R6 | Aumento do volume de pautas (sessões diárias acumulados) sem paginação eficiente. | Média | Médio | Índice `(session_date, session_number)` e paginação no servidor. |
| R7 | Dependência do AddThis (serviço externo) no detalhe. | Alta | Baixo | Trocar por compartilhamento nativo. |
| R8 | Exposição de conteúdo não publicado. | Alta | Alto (legal) | `status` obrigatório e filtro em todas as listagens públicas. |
| R9 | Acoplamento ao CRUD genérico de `contents`: mudanças no genérico quebram o módulo sem que o time do módulo perceba. | Média | Médio | Model dedicado na v7 (`06-MIGRACAO-MODERNA.md`). |
| R10 | A view SQL `pauta_do_dia` é um objeto de banco fora do controle do ORM: alterações de schema podem quebrá-la silenciosamente. | Média | Médio | Eliminar a view em favor de query Eloquent. |

## 4. Mapa v5 → v6

### 4.1 O módulo não existe na v5

Verificação executada na raiz do repositório:

```bash
cd /home/one/projects/maxima/v7
grep -riE "pauta" v5/routes/ v5/app/Http/Controllers/
grep -rn "pauta" v5/ --include=*.php -l
```

**Resultado: vazio.** Não existe, na `v5`:

| Artefato | Existe na v5? | Existe na v6? |
|---|---|---|
| Rota pública `/pauta-do-dia` | Não | Sim (`v6/routes/web.php:49-50`) |
| Controller público `PautaDoDiaController` | Não | Sim (`v6/app/Http/Controllers/Portal/PautaDoDiaController.php`) |
| View SQL `pauta_do_dia` | Não | Sim (migration `2024_10_13_010549`) |
| Migration de tabela própria | Não (e não é necessária: usa `contents`) | Não (view + tabelas genéricas) |
| Model `PautaDoDia` | Não | Não (reaproveita `Content` e `CategoryContent`) |
| Categoria `category_contents.slug = 'pauta-do-dia'` | Não | Sim (seed `CategoryContentTableSeeder.php:212`) |
| Views Blade do portal (`pauta-do-dia/index|show`) | Não | Sim (6 temas) |
| Views Blade do CMS (`prefecture/contents/pauta-do-dia/*`) | Não | Sim (5 arquivos) |
| JS do DataTable (`datatables.js` com `converterDataPauta`) | Não | Sim |
| Módulo em `modulos` (id 42) | Não | Sim (migration `2024_11_01_150206`) |
| Item de menu do portal (`menu_items`) | Não | Sim (seed `MenuItemsTableSeeder.php:382`) |
| Telemetria `menu_orders` (id 36) | Não | Sim (seed `MenuOrderSeeder.php:284`) |
| Recurso/funcionalidade (`resources`) | Não | Sim (seed `ResourcesTableSeeder.php:504`) |

### 4.2 Lacuna funcional representa para o município

Na `v5` o portal **não publicava a pauta do dia**. Concretamente, o cidadão
não tinha como saber:

1. **O que seria deliberado** em determinado dia — sem pauta publicada, a
   informação de quais projetos seriam voteados não existia no portal
   (projetos de lei, decretos, requerimentos, moções).
2. **Quando a sessão aconteceria** — a data e a hora da sessão não eram
   divulgadas de forma estruturada, e não havia uma agenda de pautas do dia.
3. **Quais documentos dariam suporte à pauta** — não havia download de
   relatórios, e-mails ou do PDF da pauta.
4. **Quem elaborou a pauta** — autor e fonte não eram exibidos ao público.

Em termos de transparência e legalidade, a v5 deixava a Câmara sem um canal
público de divulgação do conteúdo das sessões: a ata (publicada em outro
módulo) só documentava o que **já** havia sido aprovado, e a pauta — que é
prévia e antecipatória — não existia. Isso é especialmente relevante para
o controle social e para o art. 41 do Regimento Interno, que normalmente
exige a publicação da pauta com antecedência.

### 4.3 O que precisa ser decidido ou replicado na v7

| # | Item | Decisão |
|---|---|---|
| M1 | Modelo de dados | Manter o conteúdo genérico (`contents`) ou criar a entidade `pautas_do_dia`? (Recomendação: entidade própria — ver `06-MIGRACAO-MODERNA.md`.) |
| M2 | Número da sessão | Campo dedicado (`session_number`) obrigatório? Como tratar pautas sem número? |
| M3 | Direção da ordenação numérica | Manter **decrescente** (19 antes de 18), como na v6? Mudar isso altera o que o cidadão vê. |
| M4 | Publicação | Tornar `status` obrigatório e filtrá-lo no portal? |
| M5 | Módulos correlatos | Vincular a pauta à sessão do módulo `sessoes` (FK) e à ata do módulo `atas-e-pontos`? |
| M6 | Itens do menu | Replicar o item "Pauta do Dia" no menu do portal e no menu do CMS, mantendo a ordem e o ícone (`file-o`). |
| M7 | Telemetria | Manter o incremento de `menu_orders.clicks` (ou substituto) para o item de menu. |
| M8 | Habilitação | Reproduzir o comportamento de módulo desligado por padrão (`modulos.status = 0`) na v7? |
| M9 | Auditoria | Manter o registro de atividades (criação/edição/exclusão/anexos) com identificação do operador. |
| M10 | Exportação | Manter Excel/PDF da listagem no CMS? |
| M11 | Compartilhamento | Manter o botão de compartilhamento (substituindo o AddThis)? |
| M12 | Impressão | Oferecer versão imprimível da pauta? |

### 4.4 O que **não** precisa ser migrado da v5

Não há dados, configurações, seeds ou integrações da v5 a portar: o módulo
nasce do zero na v6. O que precisa ser reproduzido é o **comportamento
observável** já em produção na v6 (ordem das listas, formato da data e hora,
formato do resumo, anexos, PDF embutido, URL pública), para não quebrar os
links e as expectativas dos usuários.

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

1. A pauta deve ser **exclusiva de sessões** ou pode haver "pauta de
   reunião" sem número? Se puder, qual campo ordena esses registros?
2. O cidadão deve ver pautas de sessões **futuras** e **passadas** na mesma
   lista, ou deve haver um filtro/separação?
3. Existe limite de quantos dias a pauta permanece publicada no topo?
4. O PDF da pauta é gerado pelo CMS (arquivo enviado) ou extraído
   automaticamente do sistema de deliberações?
5. A pauta deve ser integrável ao portal da Câmara (transmissão) e ao módulo
   de sessões, com link cruzado?
6. Quem aprova a publicação da pauta (fluxo com um ou mais responsáveis)?
7. É necessário manter o histórico de versões de uma pauta corrigida?
8. O resumo de 200 caracteres é suficiente, ou deve haver um campo "resumo"
   escrito pelo operador?

## 6. Encerramento

O módulo "Pauta do Dia" é **inteiramente novo na v6** e entrega uma
funcionalidade que a v5 não possuía: a publicação da pauta da sessão com
data, hora, texto, imagem de destaque e anexos, gerenciada pelo CMS e
consumida pelo cidadão. O código funciona, mas depende de decisões implícitas
— número de sessão dentro do texto do título, ausência de filtro de
publicação, SQL exclusivo do PostgreSQL e a mesma regra de ordenação
implementada duas vezes — que devem ser cristalizadas na v7 com campo
próprio, `status` explícito, ordenação canônica no servidor e testes de
paridade com o comportamento atual.
