# Revisões — Views e UX

> Views do CMS em `v6/resources/views/prefecture/configurations/revisoes/`.
> Não há view de portal: o módulo não é exposto publicamente.

---

## 1. Inventário de views

### 1.1 Avaliação (o "formulário")

| Arquivo | Linhas | Função |
|---|---|---|
| `formularios/index.blade.php` | 69 | Listagem "Lista de Revisões" (DataTable `#tabela_formulario`); botões cadastrar, importar, excluir em lote |
| `formularios/create.blade.php` | 36 | Form de criação/edição; escolhe a rota `revisoes.store` ou `revisoes.update` conforme exista `$rating` |
| `formularios/form.blade.php` | 128 | Título, subtítulo, descrição, árvore de perguntas/categorias (sortable), checkbox "Formulario ativo" e includes dos modais |
| `formularios/modal/modal.blade.php` | 20 | Modal de **importação** de revisão (input `file.import-revisao`) |

O editor de perguntas é montado com `sortable` (jQuery UI) e percorre as categorias via
`RevisoesPresenter::pegarQuestoes()`; cada pergunta mostra o tipo e a categoria de opções.

### 1.2 Respostas e envios

| Arquivo | Linhas | Função |
|---|---|---|
| `respostas/index.blade.php` | 56 | "Lista das Respostas" (DataTable `#tabela_respostas`) + modal de envio |
| `respostas/create.blade.php` | 86 | Formulário de aplicação da avaliação (POST em `respostas.store`) com confirmação SweetAlert2 e datetimepicker `d/m/Y H:i` |
| `respostas/form.blade.php` | 88 | Campos: data do envio, revisor e uma linha por pergunta (opções + observação) |
| `respostas/categories.blade.php` | 34 | Bloco de categorias usado no formulário de resposta |
| `respostas/modal.blade.php` | 27 | Modal de **importação de resposta** |
| `envios/index.blade.php` | 42 | "Lista de Envios" (DataTable `#tabela_envios`) + link "Relatorios anuais" |
| `envios/send_estatistica.blade.php` | 37 | Relatório com um `canvas` (Chart.js) por categoria de pergunta |
| `envios/send_anual.blade.php` | 48 | Relatório anual (gráfico de linha com a evolução mensal) |
| `listagem/index.blade.php` | 34 | "Lista de Relatórios" (DataTable `#tabela_listagem_revisoes`) — visão do "cliente" |
| `listagem/send_estatistica.blade.php` | 1 | Apenas `@include('prefecture.configurations.revisoes.envios.send_estatistica')` — delegate da tela de estatísticas |

### 1.3 Modais do editor de questionário

| Arquivo | Linhas | Função |
|---|---|---|
| `modals/question.blade.php` | 105 | Cadastro/edição de pergunta (enunciado, tipo, categoria, categoria de opções, peso) |
| `modals/categoria.blade.php` | 58 | Cadastro de categoria de pergunta (com pai) |
| `modals/edit_categoria.blade.php` | 34 | Edição do título da categoria |
| `modals/edit_categoria_opcoes.blade.php` | 41 | Edição das opções de uma categoria |
| `modals/options.blade.php` | 108 | CRUD de alternativas e de grupos de alternativas |
| `modals/enviar.blade.php` | 45 | Modal de envio do PDF por e-mail (destinatários) |

### 1.4 PDF

| Arquivo | Linhas | Função |
|---|---|---|
| `pdf/index.blade.php` | 244 | Documento do PDF da avaliação (cabeçalho, gráfico geral, doughnuts por categoria, tabela de respostas) |
| `pdf/categories.blade.php` | 63 | Bloco de categoria dentro do PDF |

### 1.5 E-mail

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/emails/revisoes/email_user.blade.php` | Corpo do e-mail com o PDF anexado |
| `v6/resources/views/prefecture/emails/revisoes/email_header.blade.php` | Cabeçalho do e-mail |
| `v6/resources/views/prefecture/emails/revisoes/email_footer.blade.php` | Rodapé do e-mail |

## 2. Layouts

Todas as telas do módulo estendem `admin.layouts.app` (AdminLTE 1.22). Não há layout de portal
(`portal.layouts.modelo1..modelo6`) envolvido — reforçando que o módulo é 100% CMS.

O dashboard legado (`v6/resources/views/admin/layouts/dashboard-legacy.blade.php:153`) inclui
`assets/js/custom/contents/revisoes/revisoes_dashboard.js`, ou seja, o painel do CMS exibe um
widget de revisões.

## 3. JavaScript

Diretório: `v6/public/assets/js/custom/contents/revisoes/`.

| Arquivo | Linhas | Papel |
|---|---|---|
| `index.js` | 29 | Tela de listagem: `setStatus(id)` (POST `/cms/setStatus`) e importação de JSON (`POST /cms/import_revisao` com o conteúdo do arquivo lido por `FileReader`) |
| `formulario/datatable.js` | 34 | DataTable de `formulario`; botões: ativar/desativar, "Iniciar revisão" (`/cms/respostas/create/{id}`), "Copiar Formulário" (`/cms/copiar_revisao/{id}`), download do JSON (`/cms/download_revisao/{id}`), editar, excluir |
| `envios/datatable.js` | 51 | DataTable de `envios`; botões: relatório (`/cms/resposta/enviadas/{id}`), PDF (`/cms/respostas/pdf/{id}`), editar |
| `listagem/datatable.js` | 19 | DataTable de `listagem_revisoes`; botões: gráficos (`/cms/listagem/revisoes/graficos/{id}`) e download do PDF (`/cms/revisoes/relatorios/{id}`) |
| `respostas/datatable.js` | 53 | DataTable de `respostas`; botão "Enviar" dispara `exec_resposta` (abre o modal de e-mail) |
| `revisoesv2.js` | 791 | Editor de questionário: salvar/editar/excluir pergunta, criar categoria, gerenciar opções, reordenar (`/cms/reorder`, `/cms/categories-reorder`) |
| `revisoes_envio.js` | 135 | Tela de respostas pendentes: preenche o modal de envio de e-mail |
| `revisoes_resposta.js` | 29 | Formulário de resposta (importação de resposta) |
| `revisoes_anual.js` | 53 | Relatório anual (gráfico de linha) |
| `revisoes_dashboard.js` | 31 | Widget do dashboard do CMS |
| `envios/chart.js` | 53 | Renderização dos doughnuts por categoria (Chart.js) |

Infraestrutura JS usada (verificada):

- `v6/public/assets/js/custom/utilities/table.js` → `runDatatables(url, columns, ordenavel, type_order, callback, deleteAll)` monta o
  DataTable com `ajax.url = /cms/datatable/${url}` (linha 183) e adiciona exportação Excel/CSV.
- `v6/public/assets/js/custom/utilities/functions.js` → `myFetch(url, type, data)` (JSON +
  `X-CSRF-TOKEN`).

## 4. Endpoints chamados pelo JS

| Endpoint | JS | Momento |
|---|---|---|
| `POST /cms/setStatus` | `index.js`, `formulario/datatable.js` | ativar/desativar avaliação |
| `POST /cms/import_revisao` | `index.js` | importar JSON de questionário |
| `POST /cms/questions/saveQuestion` | `revisoesv2.js` | criar pergunta |
| `POST /cms/questions/editQuestion` | `revisoesv2.js` | editar pergunta |
| `GET /cms/questions/getQuestion/{id}` | `revisoesv2.js` | carregar pergunta no modal |
| `POST /cms/questions/deleteQuestion` | `revisoesv2.js` | excluir pergunta |
| `POST /cms/reorder` | `revisoesv2.js` | reordenar perguntas |
| `POST /cms/categories-reorder` | `revisoesv2.js` | reordenar categorias |
| `POST /cms/options/saveCategories`, `deleteCategories`, `updateCategories` | `revisoesv2.js` | categorias |
| `GET /cms/options/getCategories` | `revisoesv2.js` | árvore de categorias |
| `POST /cms/options/saveOptions`, `deleteOption`, `saveOptionsCategories`, `deleteOptionsCategories`, `updateOptionsCategories`, `deleteOptionOfCategory` | `revisoesv2.js` | alternativas |
| `GET /cms/options/getCategoryOptions`, `getAllOptions`, `getRelation/{id}` | `revisoesv2.js` | grupos e alternativas |
| `POST /cms/ajax/revisoes/delete-por-lote` | `deleteAll.js` (componente `deleteByLoteSubmitButton`) | exclusão em lote |
| `GET /cms/datatable/formulario`, `/envios`, `/respostas`, `/listagem_revisoes` | DataTables | listagens |
| `GET /cms/resposta/getEmails/{id}`, `GET /cms/resposta/getEnvio/{id}`, `POST /cms/resposta/enviar_email` | `revisoes_envio.js` | modal de envio |
| `GET /cms/copiar_revisao/{id}`, `GET /cms/download_revisao/{id}` | `formulario/datatable.js` | copiar / exportar questionário |

## 5. Exportações

| Tipo | Como é gerado |
|---|---|
| **Excel / CSV das listagens** | Botões nativos do DataTable (`runDatatables`, `v6/public/assets/js/custom/utilities/table.js`), com título "Prefeitura de {cidade} - {data}" e exclusão da coluna de ações (`.column-actions`) |
| **PDF da avaliação** | `EnviosRepository::generatePDF()` com Dompdf; gráficos gerados por `AppTrait::createIMGraph()` e embutidos como imagens; arquivo salvo em `storage/app/public/content/revisoes/{id}/pdf/revisoes_{data}.pdf` e referenciado por `send_ratings.path` |
| **JSON do questionário** | `RatingsController@baixar_revisao` grava `public/cache/revisao_{slug}.json` e responde `Response::download()` |
| **Gráficos (tela)** | Chart.js (`v6/public/assets/plugins/chart.js/Chart.min.js`) com dados embutidos no HTML (`#labels`) |

## 6. O que o operador vê (tela a tela)

1. **Menu**: "Revisões" (resource id 43) e "Listagem de Revisões (Cliente)" (id 44), ambos do
   módulo 34. O clique incrementa `menu_orders.clicks` (`menuClicks('revisoes')`).
2. **Lista de Revisões**: título, descrição, status (Ativo/Inativo) e ações. O botão de
   status alterna a avaliação ativa (desativando as demais).
3. **Edição**: árvore de perguntas arrastáveis, com badge do tipo e da categoria de opções;
   modais para pergunta, categoria e opções.
4. **Aplicar avaliação**: tela "Cadastrar Revisão" com data/hora e revisor; cada pergunta
   exibe as alternativas da sua categoria e um campo de observação.
5. **Respostas pendentes**: lista com status "Em espera", revisor, revisão, data, protocolo e
   a marcação "Retificado de {protocolo}".
6. **Enviar**: modal para cadastrar destinatários; o PDF é anexado e o envio passa a "Enviado".
7. **Relatórios**: doughnut por categoria (percentual atingido) e linha de evolução mensal.

## 7. O que o público vê

Nada. Não existe view em `v6/resources/views/portal/` para revisões nem rota em
`v6/routes/web.php`. O público recebe apenas o **e-mail** com o PDF, cujo cabeçalho usa
`Configuration('titulo_site')`, `Configuration('logo')` e o nome do prefeito
(`Configuration('nome_prefeito')`).

## 8. Acessibilidade e usabilidade (observações)

- Os modais de pergunta/categoria/opções abrem e fecham em cascata
  (`revisoesv2.js`), com campos zerados a cada fechamento — a ordem de reabertura é
  controlada por flags (`deletarDados`, `abrirModalPrincipal`).
- A tela de listagem de formulários não exibe o `version` (que é nulo).
- A exclusão em lote usa o componente `prefecture.components.deleteByLoteSubmitButton`, que
  depende de `assets/js/custom/utilities/deleteAll.js`.
