# Transparência Fiscal — Views e UX

>_views do portal em `v6/resources/views/portal/`, do CMS em `v6/resources/views/prefecture/`._

---

## 1. Mapa de templates do portal

O template ativo vem de `configurations.key = 'layout'` (no banco inspecionado:
`modelo1`). `getTemplateActived()` resolve `portal.layouts.{layout}.*`.

### 1.1 Views do módulo por template

| View relativa | modelo1 | modelo2 | modelo3 | modelo4 | modelo5 | modelo6 | newsbit | default |
|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| `transparencia-fiscal/index.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — |
| `transparencia-fiscal/show.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/subcategorias.blade.php` | — | — | — | — | **✔** | — | — | — |
| `transparencia-fiscal/relatorio-estatistico/index.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/relatorio-estatistico/js.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/estrutura-organizacional.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/informacao-solicitada.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/ouvidoria-solicitada.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/convenio.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |
| `transparencia-fiscal/relatorio-estatistico-ouvidoria/{index,js}.blade.php` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | — | — |

**Lacunas de cobertura (verificadas por `find`):**

- `subcategorias.blade.php` existe **apenas** no `modelo5`. A rota
  `/transparencia/categoria/{slug}` (`transparencia.subcategoria`) **quebra** em todos os
  outros templates (`View not found`).
- O template `newsbit` tem **apenas** `transparencia-fiscal/index.blade.php` — as demais
  rotas do módulo (`show`, `subcategoria`, `relatorio-estatistico`) falham.
- O template `default` **não tem** diretório `transparencia-fiscal/`; além disso não possui
  `home/index.blade.php`, o que faz `getTemplateActived()` abortar com 404
  (`view_inexistente`) e colocar `pagina_em_manutencao = 1`.

### 1.2 Views legadas órfãs (template `default`)

| Arquivo | Papel | Status |
|---|---|---|
| `v6/resources/views/portal/layouts/default/pages/contents/transparencia-fiscal/index.blade.php` | Listagem antiga da transparência | **Órfã**: nenhum controller atual renderiza `portal.layouts.default.contents.transparencia-fiscal.index` |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/solicitacao-form.blade.php` | Formulário de solicitação de informação (e-SIC) | Legado do template `default` |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/solicitar-informacao.blade.php` | Idem | Legado |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/informacao-solicitada.blade.php` | Idem | Legado |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/acompanhe-sua-solicitacao.blade.php` | Acompanhamento de protocolo | Legado |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/relatorio-estatistico.blade.php` | Relatório estatístico antigo | Legado |
| `v6/resources/views/portal/layouts/default/pages/statics/transparencia-fiscal/full-report-information.blade.php` | Relatório completo | Legado |

---

## 2. Componentes reutilizados (portal)

Todos em `v6/resources/views/portal/components/transparencia-fiscal/`:

| Arquivo | Função |
|---|---|
| `item-box.blade.php` | Caixa de um item da grade: ícone `{{ $content->icon }} fa-3x`, título, badge de referência e link |
| `item-box-grid-styles.blade.php` | CSS do grid de itens |
| `referencia-badge.blade.php` | Badge com a `referencia` (ex.: "2.1 a 2.5") |
| `referencia-badge-styles.blade.php` | CSS do badge |

`item-box.blade.php` decide o destino:

```blade
@php
    $isExternal = isset($content->linksUnique['link']) && $content->linksUnique['isBlank'] == 1;
    $url = isset($content->linksUnique['link'])
        ? ($isExternal ? $content->linksUnique['link'] : route('transparencia.show', $content->slug))
        : route('transparencia.show', $content->slug);
@endphp
```

> Consequência: um item **sem** `links` (URL vazia) aponta para a rota interna
> `transparencia.show`, cujo `show` faz `Content::where('slug',$slug)->first()` — se o
> conteúdo também não existir, ocorre erro por acesso a propriedade de `null`.

---

## 3. Tela do portal — índice (`transparencia-fiscal/index.blade.php`)

Estrutura (tomando `modelo1` como referência, idêntica nos demais modelos):

1. Breadcrumb `Breadcrumbs::view('portal.layouts.modelo1.layout.breadcrumb', 'acesso-rapido', 'Transparência Fiscal')`.
2. Título "Transparência Fiscal" com classe `txt-color-2 font-or`.
3. Seção **"Geral"**: `$contents->where('category_contents_id', $idTransparencia)` — itens na raiz.
4. Uma seção por categoria de `$categoriesData`, com o título `$category->name` e a
   descrição `$category->description` (quando preenchida).
5. Em cada seção, `@include('portal.components.transparencia-fiscal.item-box', ['content' => $content])`.

> O `$contents` chega ao Blade já unificado: `index` concatena as "pastas"
> (`$categoryItems`, com `id = 'cat_' . $cat->id`, `icon = 'fa fa-folder-open'`,
> `is_category = true`) e os itens de conteúdo. A view do `modelo1` **ignora** as pastas e
> usa apenas `$categoriesData` + `$contents`, reconstruindo as seções — a fusão com
> `$categoryItems` é redundante no Blade.

---

## 4. Tela do portal — item (`transparencia-fiscal/show.blade.php`)

```blade
<iframe src="{{ $transparencia->linksUnique['link'] }}" frameborder="0" width="100%" height="100%" style="min-height: 800px; height: calc(100vh - 200px);"></iframe>
```

- Título exibido: `{{ $transparencia->title ?? 'Transparência Fiscal' }}`.
- O `iframe` **não** tem `sandbox`, o que permite ao site externo executar scripts
  dentro do portal (o conteúdo vem de outra origem, mas a navegação fica livre e sem
  qualquer restrição de janela).

---

## 5. Relatório Estatístico — `relatorio-estatistico/index.blade.php`

| Bloco | Comportamento |
|---|---|
| Título | "LAI - Relatório Estatístico" |
| Texto introdutório | `strip_tags($content->text)` da `static_pages` `relatorio-estatistico` |
| Filtro de ano | `<select name="ano">` com as opções vindas de `$datas` (anos distintos de `informations_requests.created_at`); botão "Filtrar" (submit do form `#form-filter`) e "Limpar filtro" (link para `route('relatorio-estatistico')`) |
| Gráfico | `<div id="chart_div">` preenchido por Google Charts (pie) |
| Exportação | 4 botões: `exportarRelatorio('xls'\|'pdf'\|'csv'\|'txt')` |
| Listagem completa | Tabela `#solicitations` (DataTables), recolhida por `#btn-list`; **oculta** se `full_list_requests_disabled == 1` |
| Colunas | Status (com cor do `ContentPresenter::textColor`), Protocolo (mascarado), Solicitante (mascarado), Data do pedido, botão "Solicitação" (abre modal) |
| Anexos | `@include('portal.components.view_pdf.files-list')` quando há `archives` ou `view_pdf` |
| Modal | `#modal` com `#soliModal` (solicitação) e `#answers` (respostas) |

### 5.1 JavaScript (`relatorio-estatistico/js.blade.php`)

| Recurso | Uso |
|---|---|
| `https://www.gstatic.com/charts/loader.js` | Google Charts (`corechart`) — **CDN externa** |
| `assets/components/DataTables/datatables.min.js` | Tabela de solicitações (sem `searching`, sem `ordering`, sem `lengthChange`) |
| `$.ajax` POST `route('get.answers')` | Carrega `{_token, id}` e monta o HTML do modal |

Trecho da serialização do filtro de exportação:

```js
function exportarRelatorio(type) {
    var valores = $('#form-filter').serialize();
    window.location.href = "{{ route('relatorio-estatistico') }}?" + valores + '&type=' + type;
}
```

> `route('relatorio-estatistico')` resolve para `/relatorio-estatistico` (nome único).
> O `?type=` chega ao controller que decide entre HTML e download.

### 5.2 Cores por status (JS)

```js
function textColor(status) {
    switch (status) {
        case 1: return 'text-warning';   // Em Tramitação
        case 2: return 'text-success';   // Atendido
        case 3: return 'text-danger';    // Indeferido
        case 4: return 'text-primary';   // Prorrogado
    }
}
```

---

## 6. Exportações

| Formato | Mecanismo | Nome do arquivo |
|---|---|---|
| `xls` | `Excel::download(new InformationsRequestsExport($informationRequests), 'relatorio-estatistico.xlsx')` | `relatorio-estatistico.xlsx` |
| `csv` | `Excel::download(new InformationsRequestsExport($informationRequests), 'relatorio-estatistico.csv')` | `relatorio-estatistico.csv` |
| `pdf` | `PDF::loadView('exports.informations-requests', [...])->download('relatorio-estatistico.pdf')` (dompdf) | `relatorio-estatistico.pdf` |
| `txt` | `exportTxt()` — monta o texto com `sprintf`/`implode` e responde com `Content-Type: plain/txt` | `relatorio-estatistico.txt` |

A view de export (`v6/resources/views/exports/informations-requests.blade.php`) é usada
tanto pelo Excel (`FromView`) quanto pelo PDF. O TXT é montado à mão em PHP, duplicando a
formatação da view.

> Na v5 o nome dos arquivos era `lai-relatorio-estatistico.*` e o PDF usava a view
> `exports.information-requests` (singular) — ver `08-GAPS-E-DIVIDAS.md`.

---

## 7. CMS — telas do operador

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/contents/transparencia-fiscal/index.blade.php` | Listagem: título "Transparência Fiscal", botões "Cadastrar Link", "Categorias de transparência fiscal", exclusão em lote; tabela `#tabela_transparencia_fiscal`; sortable jQuery |
| `v6/resources/views/prefecture/contents/transparencia-fiscal/create.blade.php` | Wrapper do formulário de criação |
| `v6/resources/views/prefecture/contents/transparencia-fiscal/edit.blade.php` | Wrapper do formulário de edição |
| `v6/resources/views/prefecture/contents/transparencia-fiscal/form.blade.php` | Formulário: status, categoria, título, ícone (iconpicker), posição, URL, referência, "abrir em nova janela" |
| `v6/resources/views/prefecture/category-contents/transparencia-fiscal/create.blade.php` | CRUD de categorias (com `has_access(['transparencia-fiscal.*'])` para exibir a coluna de ações) |
| `v6/resources/views/prefecture/category-contents/transparencia-fiscal/edit.blade.php` | Edição de categoria |
| `v6/resources/views/prefecture/category-contents/transparencia-fiscal/form.blade.php` | Formulário de categoria (nome, slug, descrição, ícone) |

### 7.1 Campos do formulário de item

| Campo | Tipo | Validação |
|---|---|---|
| `status` | checkbox "Ativar/Desativar" | `boolean` |
| `category_contents_id` | select com as subcategorias + botão "Nova Categoria" | `numeric` (0 ⇒ raiz) |
| `title` | texto (max 120) | `required|max:120` |
| `icon` | texto + iconpicker (Font Awesome 5.15.4) | `required` |
| `order` | número (min 1, max = `count($transparencia) + 1`) | `required` |
| `link` | texto (max 2999) | `required|max:2999` |
| `referencia` | texto (max 50) — "Informe o código do critério, ex: 2.1 a 2.5" | `nullable|string|max:50` |
| `isBlank` | checkbox "Abrir em nova janela" | `boolean` |

### 7.2 JavaScript do CMS

| Arquivo | Função |
|---|---|
| `v6/public/assets/js/custom/contents/transparencia-fiscal/datatable.js` | Colunas do DataTable: `titulo`, `category_name`, `status_name` e coluna de ações (arrastar, ativar/inativar, editar, excluir) |
| `v6/public/assets/js/custom/utilities/deleteAll.js` | Exclusão em lote |
| `v6/public/assets/plugins/fontawesome-iconpicker/dist/js/fontawesome-iconpicker.js` | Seletor de ícones |

`datatable.js` consome `runDatatables('transparencia_fiscal', collums, true, 'ASC', null, true)`
— o primeiro argumento é o nome do DataTable, que casa com a rota
`/cms/datatable/transparencia_fiscal` (nome `datatable.transparencia_fiscal`).

> O JS depende das colunas `edit`, `active`, `inactivate` e `delete` adicionadas por
> `struct_views()` — acoplamento direto entre o payload do controller e o JavaScript.

---

## 8. Resumo do que o usuário vê

| Persona | Tela | Elementos |
|---|---|---|
| Cidadão | `/transparencia-fiscal` | Grade de ícones por seção, com badge de referência legal e destaque visual (hover) |
| Cidadão | `/transparencia-fiscal/{slug}` | Página com título e `iframe` do sistema externo |
| Cidadão | `/relatorio-estatistico` | Gráfico de pizza, filtro de ano, tabela de solicitações, downloads |
| Operador | `/cms/conteudos/transparencia-fiscal` | DataTable com ordenação por `order`, drag-and-drop,ativação rápida, exclusão em lote |
| Operador | `/cms/conteudos/cadastrar/transparencia-fiscal` | Formulário de link com preview de ícone |
| Operador | `/cms/categorias/transparencia-fiscal` | Gestão de pastas da transparência |
