# Vereadores e Mandatos — Views e UX

> Módulo `vereadores` (id 43). Portal: Bootstrap 4; CMS: AdminLTE 1.22.

---

## 1. Mapa de arquivos de view

### 1.1 Portal — lista e perfil de vereadores

| Arquivo | Função |
|---|---|
| `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/vereadores/index.blade.php` | Lista de vereadores ativos em cartões. |
| `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/vereadores/show.blade.php` | Perfil do vereador. |
| `v6/resources/views/portal/layouts/modelo2/informacoes-instituicao/vereadores/index.blade.php` | Idem para o tema `modelo2`. |
| `v6/resources/views/portal/layouts/modelo2/informacoes-instituicao/vereadores/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo3/informacoes-instituicao/vereadores/index.blade.php` | Idem para o tema `modelo3`. |
| `v6/resources/views/portal/layouts/modelo3/informacoes-instituicao/vereadores/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo4/informacoes-instituicao/vereadores/index.blade.php` | Idem para o tema `modelo4`. |
| `v6/resources/views/portal/layouts/modelo4/informacoes-instituicao/vereadores/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo5/informacoes-instituicao/vereadores/index.blade.php` | Idem para o tema `modelo5`. |
| `v6/resources/views/portal/layouts/modelo5/informacoes-instituicao/vereadores/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo6/informacoes-instituicao/vereadores/index.blade.php` | Idem para o tema `modelo6`. |
| `v6/resources/views/portal/layouts/modelo6/informacoes-instituicao/vereadores/show.blade.php` | Idem. |

São **6 cópias** de cada tela (uma por tema). O tema é escolhido em runtime por
`getTemplateActived()`.

### 1.2 Portal — mandatos

| Arquivo | Função |
|---|---|
| `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/mandates/index.blade.php` | Menu lateral com as categorias de mandato. |
| `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/mandates/show.blade.php` | Acordeão com os mandatos e seus vereadores. |
| `v6/resources/views/portal/layouts/modelo2/informacoes-instituicao/mandates/index.blade.php` | Idem tema `modelo2`. |
| `v6/resources/views/portal/layouts/modelo2/informacoes-instituicao/mandates/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo3/informacoes-instituicao/mandates/index.blade.php` | Idem tema `modelo3`. |
| `v6/resources/views/portal/layouts/modelo3/informacoes-instituicao/mandates/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo4/informacoes-instituicao/mandates/index.blade.php` | Idem tema `modelo4`. |
| `v6/resources/views/portal/layouts/modelo4/informacoes-instituicao/mandates/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo5/informacoes-instituicao/mandates/index.blade.php` | Idem tema `modelo5`. |
| `v6/resources/views/portal/layouts/modelo5/informacoes-instituicao/mandates/show.blade.php` | Idem. |
| `v6/resources/views/portal/layouts/modelo6/informacoes-instituicao/mandates/index.blade.php` | Idem tema `modelo6`. |
| `v6/resources/views/portal/layouts/modelo6/informacoes-instituicao/mandates/show.blade.php` | Idem. |

### 1.3 Portal — carrossel da home

| Arquivo | Função |
|---|---|
| `v6/resources/views/portal/layouts/modelo5/home/vereadores/vereadores-carousel.blade.php` | Carrossel *lightSlider* de vereadores na home do tema `modelo5`. |

### 1.4 CMS (AdminLTE)

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/councilmen/index.blade.php` | DataTable de vereadores (nome, nº de mandatos, situação, ações). |
| `v6/resources/views/prefecture/councilmen/create.blade.php` | Formulário de cadastro (inclui `prefecture.councilmen.form`) + preview da imagem. |
| `v6/resources/views/prefecture/councilmen/edit.blade.php` | Formulário de edição + script `deleteHighlightArchive()`. |
| `v6/resources/views/prefecture/councilmen/form.blade.php` | Campos comuns (status, nome, partido, imagem, texto). |
| `v6/resources/views/prefecture/councilmen/show.blade.php` | Detalhe do vereador + tabela de mandatos + formulário "Atribuir Mandato". |
| `v6/resources/views/prefecture/mandates/index.blade.php` | DataTable de mandatos (título, categoria, situação, ações). |
| `v6/resources/views/prefecture/mandates/create.blade.php` | Formulário de cadastro (inclui `prefecture.mandates.form`). |
| `v6/resources/views/prefecture/mandates/edit.blade.php` | Formulário de edição. |
| `v6/resources/views/prefecture/mandates/form.blade.php` | Campos (status, categoria, nome, ano inicial, ano final). |
| `v6/resources/views/prefecture/mandates/edit-council-members.blade.php` | Tela de ordenação por *drag-and-drop*. |
| `v6/resources/views/prefecture/mandate-categories/index.blade.php` | DataTable de categorias. |
| `v6/resources/views/prefecture/mandate-categories/create.blade.php` | Formulário de criação. |
| `v6/resources/views/prefecture/mandate-categories/edit.blade.php` | Formulário de edição. |
| `v6/resources/views/prefecture/mandate-categories/form.blade.php` | Campo `name`. |

## 2. Tela pública — lista de vereadores

`v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/vereadores/index.blade.php`

Destaques:

- Define uma **função PHP dentro do Blade** que abrevia o nome:

```php
function trata_nome($nome){
    $partes = explode(" ", $nome);
    $nomeOK = $partes[0];
    if(sizeof($partes)-1 >= 3){ $maximo = 3; } else { $maximo = sizeof($partes)-1; }
    for($i = 1; $i < $maximo; $i++){
        if(strlen($partes[$i]) > 2){
            $nomeOK .= " ".strtoupper(substr($partes[$i], 0,1))."." ;
        }
    }
    if(sizeof($partes) > 1){ $nomeOK .= " ".$partes[sizeof($partes)-1]; }
    return $nomeOK;
}
```

  Ex.: "João Carlos Ferreira de Souza" → "João C. F. Souza".
- Foto: `{{ url("/storage/content/vereadores/{$content->id}/{$content->archives->name}") }}`,
  com fallback `{{ url("/assets/images/perfil.jpg") }}`.
- Cartão com link `route('vereador', $content->id)`, nome abreviado e partido.
- Mensagem de vazio: "Nenhuma registro encontrado." (gramática do legado).

## 3. Tela pública — perfil do vereador

`v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/vereadores/show.blade.php`

- Foto, nome completo e partido.
- Biografia renderizada com `{!! $content->text !!}` — **HTML sem sanitização** (campo
  controlado pelo CMS, mas sem `purify`).
- Bloco "Mandatos" (só aparece se `count($content->mandates) > 0`), listando
  `nome | (ano) - (ano)` e `Cargo: {{$mandate->pivot->role}}`.
- Botão de compartilhamento (`addthis_inline_share_toolbox`).
- Coluna lateral com `@include('portal.layouts.modelo1.layout.sidebar.layout')`.

## 4. Tela pública — mandatos

**`.../mandates/index.blade.php`**: coluna esquerda com a lista de categorias
(`route('portal.mandato', $cat->slug)`), marcando a categoria ativa; coluna direita
mostra "Selecione uma categoria ao lado".

**`.../mandates/show.blade.php`**: accordion Bootstrap (`#accordion`), um card por
mandato e, dentro dele, os vereadores do mandato. O Blade injeta o model diretamente:

```blade
@inject('CouncilmenMandates','App\Http\Model\Prefecture\CouncilmenMandates' )
...
$Councilmen = $CouncilmenMandates->with('councilmen')
    ->where('mandates_id', $content->id)
    ->orderBy('order', 'asc')
    ->get();
```

Cada cartão mostra a foto (fallback `/assets/images/perfil.jpg`), o nome abreviado, o
partido e o cargo (`{{$vereador->role}}`).

Observação: a função `trata_nome()` é **redeclarada** neste arquivo e no
`vereadores/index.blade.php` — como são views diferentes, não há colisão, mas a
lógica está duplicada em 12 arquivos (6 temas × 2 telas).

## 5. Carrossel da home (tema `modelo5`)

`v6/resources/views/portal/layouts/modelo5/home/vereadores/vereadores-carousel.blade.php`

| Aspecto | Detalhe |
|---|---|
| Consulta | `CityCouncilor::with('archives')->where('status', 1)->orderBy('name')->get()` |
| Plugin | **lightSlider** sobre `<ul id="councilors-slider">` |
| Itens | 5 (desktop) / 4 (<1200px) / 3 (<992px) / 2 (<768px) / 1 (<480px) |
| Controles | Botões `.btn-prev` e `.btn-next` (escondidos se couberem todos os itens) |
| Endereço da foto | `archives.path`, com *fallback* de `storage/vereadores` → `storage/content/vereadores` |
| Imagem padrão | `url('img/sem-imagem.png')` + `onerror` que troca para a mesma imagem |
| Seção | `#councilmen-carousel`, com link "Ver Todos" para `route('vereadores')` |
| Estilo | Borda do cartão e botões usam `$configHeader['cor_1']` |

Trecho do *fallback* de caminho (importante porque o `archives.path` gravado pelo CMS
é `storage/vereadores/...`, mas o arquivo é gravado em `content/vereadores/...`):

```php
if (strpos($path, 'storage/vereadores') !== false && strpos($path, 'storage/content/vereadores') === false) {
    $path = str_replace('storage/vereadores', 'storage/content/vereadores', $path);
}
```

O bloco é inserido na home pelo seed `AddVereadoresCarouselToLayout`
(`v6/database/seeds/AddVereadoresCarouselToLayout.php`), que cria as chaves
`layouts` `vereadores` (section) e `vereadores-carousel` (element, `status = 0` por
padrão — o operador precisa ligá-lo no editor de layout).

## 6. Telas do CMS

### 6.1 Lista de vereadores

`v6/resources/views/prefecture/councilmen/index.blade.php`

- DataTable **client-side** (`$('#dataTableListContentsConf').DataTable({...})`), sem
  endpoint server-side — todos os registros são renderizados no HTML.
- Colunas: Nome, Nº de Mandatos (`count($content->mandates)`), Situação (Ativo /
  Desativado) e Ações.
- Botão "Cadastrar Vereador" controlado por `has_access(['vereadores.create'])`.
- Botões de ação: "Mandatos" (ícone de tag, sempre visível), "Editar"
  (`has_access(['vereadores.edit'])`) e "Excluir" (**`has_access(['agenda.delete'])`** —
  bug de slug).
- Exclusão via `Form::open(['route' => ['vereadores.destroy', $content->id'], 'method' => 'DELETE'])`
  com confirmação `$.confirmation`.

### 6.2 Formulário do vereador

`v6/resources/views/prefecture/councilmen/form.blade.php`

| Campo | Tipo | Observação |
|---|---|---|
| `status` | checkbox "Ativar" | Default marcado na criação; `maxlength` não se aplica. |
| `name` | texto, `maxlength=120` | Usuário redigido — a regra do Request permite 190. |
| `party` | texto, `maxlength=120` | Idem. |
| `archives_id` | file `accept="image/*"` | Input oculto; preview com `FileReader`. |
| `text` | textarea com classe `summernote` | Biografia (HTML). |

**Não há campo de mandatos no formulário** — apesar de `create()`/`edit()` passarem
`$mandates` para a view. A atribuição de mandato é feita apenas na tela de detalhe.

### 6.3 Detalhe do vereador e atribuição de mandato

`v6/resources/views/prefecture/councilmen/show.blade.php`

- Foto, nome e partido.
- Tabela de mandatos com botão "Excluir" por linha, que envia `id` (id do pivot) e
  `councilmen_id` para `route('drop.mandato')`.
- Formulário "Atribuir Mandato": `select name="mandates_id"` (lista de
  `Mandate::where('status', true)`) + `input name="role"`, enviados para
  `route('atribuir.mandato')`.

### 6.4 Lista de mandatos

`v6/resources/views/prefecture/mandates/index.blade.php`

- DataTable client-side com ordenação `[[0,'desc']]`.
- Colunas: Título, Categoria (`$content->categories->name`), Situação e Ações.
- Botões: "Cadastrar Mandato", "Categorias de Mandato" (rota `categorias-mandatos.index`),
  "Vereadores do mandato" (`vereadores-do-mandato.edit`), "Editar" e "Excluir".

### 6.5 Formulário de mandato

`v6/resources/views/prefecture/mandates/form.blade.php`

- `status` (checkbox), `mandate_categories_id` (select), `name` (texto),
  `start_year` e `end_year` (selects de ano, de 1900 até +20 anos, com seleção
  padrão no ano atual e no ano atual + 4).
- A ordem dos campos no formulário é: status, categoria, nome, início, término.

### 6.6 Tela de ordenação dos vereadores do mandato

`v6/resources/views/prefecture/mandates/edit-council-members.blade.php`

- Tabela `grabbable` com colunas: alça de arrasto, Nome, Cargo.
- jQuery UI `sortable` em `table tbody`; ao soltar, coleta os `id` das linhas
  (`sortable_data`) e faz `POST` para `route('ajust.vereadores-mantado')` com
  `_token`.
- Mostra "Atualizando..." e depois "Posições atualizadas!" (some em 2 s).
- DataTable com `ordering: false` (a ordenação é manual) e `pageLength: 25`.

### 6.7 Categorias de mandato

`v6/resources/views/prefecture/mandate-categories/index.blade.php` — DataTable
simples (Título + Ações), com botão "Cadastrar Categoria" e link "Voltar" para
`mandatos.index`.

## 7. Endpoints Ajax/JS acionados

| Endpoint | Origem | Payload |
|---|---|---|
| `POST /cms/ajax/ajust-vereadores-mandato` | `edit-council-members.blade.php` | `_token`, `sortable_data[]` (ids do pivot) |
| `POST /cms/ajax/ajax-delete-files-vereadores` | `councilmen/edit.blade.php` (`deleteHighlightArchive`) | `_token`, `content` (id do vereador), `archive_id` |
| `POST /cms/vereadores/atribuir-mandato` | `councilmen/show.blade.php` | `_token`, `id`, `mandates_id`, `role` |
| `POST /cms/vereadores/excluir-mandato` | `councilmen/show.blade.php` | `_token`, `id` (id do pivot), `councilmen_id` |

Não há polling, exportação (Excel/PDF/CSV) nem relatórios neste módulo.

## 8. O que o cidadão vê vs. o que o operador vê

| Aspecto | Cidadão (portal) | Operador (CMS) |
|---|---|---|
| Vereadores | Apenas os **ativos**; vê foto, nome abreviado, partido, biografia, mandatos e cargo | Todos (ativos e inativos); edita nome, partido, foto, biografia, status |
| Mandatos | Lista por categoria, com acordeão e a lista de vereadores ordenada | Cadastra mandato, categoria, anos, status; ordena os vereadores |
| Cargo (`role`) | Visível no perfil e no acordeão | Digitado livremente no formulário de atribuição |
| Exclusão | Não existe | Bloqueada se o vereador tiver mandatos |
| Foto | Placeholder quando não há imagem | Upload, preview e remoção |
| Auditoria | Invisível | Registrada via `activity()` e visível em `/cms/log` |
