# Novidades — Resumo Executivo

> **Versão analisada:** `v6` (módulo **novo** na v6; não existe na v5)
> **Slug do módulo:** `novidades` (tabela `modulos`, id 10, `status = true`)
> **Natureza:** CMS (painel administrativo)
> **Estado:** novo na v6

---

## 1. Objetivo

Manter o **changelog do produto**: a lista cronológica das
funcionalidades entregues em cada versão, com título, número da versão,
data de publicação, ícone e uma descrição em HTML rico (com capturas de
tela). Serve para comunicar as novidades ao cliente e guiar a migração
de sistemas antigos.

A descrição original do próprio módulo (registrada no seed) diz:
*"O Changelog (Novidades) foi criado com o intuito de auxiliar os clientes
na hora da migração de sistemas, pelo mesmo será possível observar as
novas atualizações assim como melhorias feitas, dessa forma guiando o
cliente sobre novas ferramentas e atualizações de itens já existentes."*

## 2. Efeito / Impacto

| Faixa | Efeito |
|---|---|
| Cidadão | Nenhum efeito direto. |
| Prefeitura (CMS) | Dá ao gestor visibility do que mudou em cada versão do sistema. |
| Transparência e legalidade | Indireto: a versão do sistema aparece no rodapé do CMS, com link para esta tela. |
| Operação técnica | Serve de changelog do produto e de insumo para a documentação da v7. |

## 3. Comportamento

- Cada registro tem: `title` (obrigatório, 3-120 caracteres),
  `numero_versao` (obrigatório, string de até 20 caracteres),
  `data_versao` (obrigatório), `descricao` (obrigatório, HTML do
  Summernote) e `icon` (obrigatório, classe CSS de ícone).
- A data é gravada em formato `Y-m-d H:i:s`; o controller tenta
  `d/m/Y H:i:s` e, em falha, `d/m/Y`.
- A listagem é uma **timeline vertical** (inspirada no Insignia), do mais
  novo para o mais antigo (`ChangeLog::orderBy('id','DESC')`).
- A descrição completa é aberta em um **modal**, sem sair da listagem
  (implementado em JavaScript puro, lendo um `input hidden`).
- Botões: "Cadastrar Novidades", editar (ícone) e excluir (lixeira), com
  as permissões `changelog.create`, `changelog.edit` e `changelog.delete`.
- O **rodapé do CMS** exibe a versão do sistema (`update_logs`) com link
  para esta tela.

## 4. Como o Usuário Interage

- Menu de engrenagem do AdminLTE -> item **"Novidades"**
  (`v6/resources/views/vendor/adminlte/page.blade.php:310-317`), sem
  guarda de módulo nem de permissão.
- `/cms/novidades`: timeline com um bloco por versão (ícone, título,
  resumo de 250 caracteres, versão e data).
- Botão "Saber mais" / olho -> abre o modal com a descrição completa.
- Ícone de lápis -> `/cms/novidades/editar/{id}`.
- Lixeira -> `DELETE /cms/novidades/delete/{id}`.
- "Cadastrar Novidades" -> `/cms/novidades/create`.

## 5. Detalhes e Particularidades Técnicas

- Camadas: `Route` -> `check.logged` -> `Admin\ChangeLogController` ->
  `ChangeLogRequest` -> `App\Admin\ChangeLog` -> `change_logs`.
  **Não há Repository** nem Service.
- O controller está no namespace `Admin`, mas as views vivem em
  `prefecture/configurations/changelog/` — inconsistência de organização.
- A data é convertida com `Carbon::createFromFormat`; o segundo `catch`
  é vazio (silencia o erro).
- O model **não** usa `SoftDeletes`, apesar de a tabela ter a coluna
  `deleted_at` — a exclusão é **definitiva**.
- A rota `changelog.show` existe (`GET /cms/novidades/{id}`) mas o
  controller **não implementa** `show()` — erro 500.
- O módulo **não tem recurso** em `resources`; a permissão `changelog.*`
  não pode ser concedida a nenhum perfil (só `super-admin` passa).
- A tela usa Summernote para a descrição e o
  `fontawesome-iconpicker` para escolher o ícone.

## 6. Estrutura de Dados

| Tabela | Papel |
|---|---|
| `change_logs` | Uma linha por versão publicada |
| `update_logs` | **Outro** conceito: a versão corrente do sistema (rodapé) |
| `modulos` | Registro de módulos (id 10 = `novidades`) |

Views SQL: nenhuma.

Seeds: `v6/database/seeds/ChangeLogTableSeeder.php` popula a tabela com
~28 versões (de 5.0 a 6.0), com descrições HTML e caminhos de imagem
`/storage/img/changelog/*.png`.

## 7. Como Testar

- Autenticado em `/cms/novidades` deve ver a timeline.
- Criar uma novidade com título, versão, data, descrição e ícone deve
  redirecionar para a listagem e gravar a linha.
- Sem `data_versao` válida, o `Carbon::createFromFormat` lança exceção
  (o segundo `catch` a engole e a data fica como enviada).
- O botão "Saber mais" deve abrir o modal com a descrição completa.
- `GET /cms/novidades/{id}` deve retornar erro (rota sem método).

## 8. Migração para Laravel Moderno

- Model `ChangeLog` com `casts` (`data_versao => datetime`,
  `descricao` como string), `SoftDeletes` (ou remoção da coluna).
- `StoreChangeLogRequest` / `UpdateChangeLogRequest` com as mesmas
  regras, mais `Rule::unique` opcional para `numero_versao`.
- `ChangeLogPolicy` no lugar das `has_access` hardcoded.
- `ChangeLogResource` para a API.
- Componente Blade `<x-changelog-timeline>` com Alpine.js, substituindo o
  JS imperativo do modal.
- Campo `icon` com validação contra uma lista fechada de classes
  FontAwesome (evitar HTML/CSS arbitrário).
- Tabela `update_logs` mantida separada, ou unificada com `change_logs`
  via `numero_versao`.

## 9. Resumo Geral

"Novidades" é o changelog do produto: cada versão entregue é registrada
com título, número de versão, data, ícone e descrição em HTML rico com
capturas de tela. A leitura acontece em `/cms/novidades`, numa timeline
vertical com modal de detalhe em JavaScript puro; a escrita usa um
FormRequest simples e o model `App\Admin\ChangeLog` (tabela
`change_logs`). O módulo é **novo na v6** e traz o seed
`ChangeLogTableSeeder` com o histórico de 28 versões do produto. Os
problemas: a rota `changelog.show` aponta para um método inexistente; o
model não usa `SoftDeletes` apesar da coluna; o `update` grava a data
sem validação quando o `Carbon` falha; o módulo não tem recurso em
`resources`, o que torna `changelog.index`/`edit`/`delete` inacessíveis
a qualquer perfil que não seja `super-admin`; e há uma confusão
conceitual entre `change_logs` (changelog do produto) e `update_logs`
(versão do sistema), ambas exibidas no rodapé do CMS.

---

## Í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 |
