# LGPD (Barra de Privacidade) — Resumo Executivo

> **Versão analisada:** `v6` (com comparativo `v5`)
> **Slug do módulo:** `lgpd` (tabela `modulos`, id 3, nome "LGPD")
> **Natureza:** Ambos (CMS para configuração + Portal público para exibição)
> **Estado:** migrado v5 -> v6 (com quebras de comportamento; ver `08-GAPS-E-DIVIDAS.md`)

---

## 1. Objetivo

O módulo "LGPD" materializa a **barra de privacidade** do portal: um aviso
fixo no rodapé da página que informa o cidadão sobre o uso de dados e coleta
o aceite por meio de um cookie. Ele cobre apenas o **consentimento genérico**
(um único botão "Ok, entendi!"), e não consentimento granular por finalidade.

Não existe controller, model ou tabela própria do módulo: ele reaproveita a
tabela `configurations`, a categoria `barra-privacidade` e o
`ConfigurationController` do CMS. O que individualiza o módulo é o trio
**categoria de configuração + recurso + módulo** (`barra-privacidade` /
`barra-privacidade` / `lgpd`).

## 2. Efeito / Impacto

| Faixa | Efeito |
|---|---|
| Cidadão | Vê uma faixa fixa no rodapé de todas as páginas do portal, com o texto institucional e o botão "Ok, entendi!". Após o aceite, um cookie `acceptCookies` é gravado e a faixa deixa de aparecer pelo prazo configurado. |
| Prefeitura (CMS) | Operador edita 4 chaves em `/cms/configuracoes/editar/barra-privacidade`: texto (rich text), expiração em dias, ativar/desativar e cor do texto do botão. |
| Transparência e legalidade | É a peça mais visível de conformidade LGPD do portal, mas **não há registro de prova de consentimento** (log de aceite) em banco — o aceite vive apenas no cookie do navegador. |
| Operação técnica | O módulo nasce **inativo** (`modulos.status = 0` na migration `v6/database/migrations/2024_11_01_150206_create_modulos_table.php`): com o status em 0 a barra **nunca** é renderizada no portal, mesmo que a configuração "Ativar barra de privacidade" esteja ligada. |

## 3. Comportamento

1. O portal renderiza a barra apenas se **todas** as condições forem verdadeiras:
   `isset($modulos['lgpd'])`, `$modulos['lgpd']` (módulo ativo),
   `isset($configurations['barra-privacidade-exibir'])`, o valor de exibição
   sendo `true` e `isset($configurations['barra-privacidade'])`
   (`v6/resources/views/portal/layouts/barra-privacidade/barra-privacidade.blade.php:1-8`).
2. O texto é impresso com `{!! !!}` — HTML bruto vindo do Summernote, sem escape.
3. Sem o cookie `acceptCookies`, o JS adiciona a classe `show` (a barra sobe);
   com o cookie, a barra permanece oculta.
4. Ao clicar, o JS chama `GET /getPrivacyBar`, que devolve
   `barra-privacidade-expiracao`, e grava
   `document.cookie = "acceptCookies=true; expires=<data>; path=/"`; depois dispara o
   evento de janela `cookieAlertAccept`.
5. A expiração do cookie é o número de dias configurado (fallback de 7 dias).
6. A leitura (tela do CMS) exige a permissão `barra-privacidade.edit`; a gravação
   exige sempre `configuracoes.edit` — a mesma permissão dos outros módulos de
   configuração (assimetria documentada em `08-GAPS-E-DIVIDAS.md`).

## 4. Como o Usuário Interage

**Operador (CMS)**

- Menu lateral do CMS: item "LGPD" (ícone `fa-shield`), visível somente se
  `has_access(['barra-privacidade.index'])` **e** `$modulos['lgpd']` forem
  verdadeiros (`v6/resources/views/vendor/adminlte/page.blade.php:244-252`).
- Tela "LGPD": 4 campos renderizados genericamente por
  `@foreach($configurations as $configuration)`, com erros no topo, botão
  "Registrar" (`adminlte::adminlte.register`) e link "Voltar".
- O campo de texto usa Summernote; o campo de cor usa o bootstrap-colorpicker.
- Ao salvar, o operador volta para a própria tela da categoria (a categoria
  `barra-privacidade` não é `site` nem `prefeitura`).

**Cidadão (portal)**

- Nenhuma interação é necessária para ler a faixa; um clique em "Ok, entendi!"
  fecha a faixa e grava o cookie. O usuário que apagar cookies ou navegar em
  janela anônima verá a faixa novamente.

## 5. Detalhes e Particularidades Técnicas

- Sem service/repository próprio: o fluxo é
  `Route (CMS) -> ConfigurationController@editByCategory / @updateByCategory ->
  ConfigurationRequest -> App\Prefecture\Configuration -> tabela configurations`.
- No portal o fluxo é
  `View composer (ConfigHeaderServiceProvider / ModulosServiceProvider) ->
  view barra-privacidade -> JS -> GET /getPrivacyBar -> Portal\HelperController`.
- `$modulos` vem de `Cache::rememberForever('modulos', fn () => Modulos::all()->pluck('status','slug'))` em
  `v6/app/Providers/ModulosServiceProvider.php`.
- `$configurations` vem da lista literal de chaves de
  `v6/app/Providers/ConfigHeaderServiceProvider.php` — que **não** inclui
  `barra-privacidade-botao`; essa chave é lida direto do model em
  `head.blade.php`.
- O CSS `assets/css/portal/privacybar/style.css` referenciado pela view
  **não existe** em `v6/public/assets/` nem na v5 (404 garantido). O estilo
  efetivo vem do `<style>` inline de `head.blade.php`.
- O cookie é escrito por JS, sem `Secure`/`SameSite`, e não passa pelo
  middleware `v6/app/Http/Middleware/EncryptCookies.php`.

## 6. Estrutura de Dados

| Objeto | Natureza | Detalhe |
|---|---|---|
| `configurations` | tabela (compartilhada) | 4 linhas da categoria `barra-privacidade` (`id` 70..73 no banco de referência) |
| `category_configurations` | tabela (compartilhada) | categoria `barra-privacidade` (id 7) |
| `modulos` | tabela (compartilhada) | módulo `lgpd` (id 3, `status = 0` na migration) |
| `resources` | tabela (compartilhada) | recurso `barra-privacidade` com `modulo_id = 3` |
| `configuracoes` | view SQL | expõe todas as configurações, sem filtro por categoria |

## 7. Como Testar

- Unitário/feature: renderizar a view da barra com `$modulos['lgpd']` falso,
  `true` e com exibição desligada; conferir que o HTML só sai no caso válido.
- Endpoint: `GET /getPrivacyBar` deve devolver `{"key":"barra-privacidade-expiracao","value":"7"}`.
- E2E manual: limpar cookies, abrir o portal, clicar "Ok, entendi!", recarregar
  e confirmar que a faixa não retorna dentro do prazo configurado.
- CMS: `GET /cms/configuracoes/editar/barra-privacidade` com e sem a permissão
  `barra-privacidade.edit`.

## 8. Migração para Laravel Moderno

- Extrair a barra de privacidade para um value object/`Setting` dedicado
  (`PrivacyBarSettings`) com colunas próprias (`enabled`, `text`, `expiry_days`,
  `button_text_color`) em vez de linhas genéricas em `configurations`.
- Model `PrivacyBar` + `Policy` por permissão `lgpd.manage`.
- Endpoint JSON `POST /api/privacy-bar/consent` para registrar o aceite
  (timestamp, IP, user-agent, versão do texto) — resolve a ausência de prova.
- Componente Blade `<x-privacy-bar>` com Alpine/Vue para a interação, e
  middleware `Set-Cookie`/`SameSite=Lax` server-side em vez de `document.cookie`.
- Cache da configuração (`Cache::remember`) e invalidação por evento de
  atualização, como já é feito com `Cache::pull('structureType')`.

## 9. Resumo Geral

O módulo "LGPD" do CMS é, na prática, um **perfil de 4 configurações** dentro da
tabela `configurations`, amarrado ao módulo `modulos.slug = 'lgpd'` e ao
recurso `resources.slug = 'barra-privacidade'`. O operador escreve um texto
rich text, um prazo de expiração, um interruptor de exibição e uma cor; o
portal, por sua vez, transforma isso numa faixa fixa no rodapé de todos os
modelos (modelo1..modelo6) condicionada a quatro verificações — a mais
importante sendo o `status` do módulo, que nasce **inativo**. O aceite é
registrado **apenas** num cookie `acceptCookies` do navegador, sem qualquer
linha de log de consentimento no banco, o que é a principal fragilidade
jurídica do módulo. O módulo se sobrepõe literalmente aos outros três módulos
de configuração (mesma tabela, mesmo controller, mesmo endpoint de gravação) e
difere deles apenas por categoria, recurso e módulo.

---

## Í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, permissões |
| `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 |
