# RAG — "Contexto" / LGPD v2 (`performance/contexto/view`)

> Material de apoio para o **prompt do Agente** responder perguntas sobre a tela de **Contexto** (LGPD v2 — `lgpdv2.php`).

> Este documento segue o `docs/CONTRATO-ORIGEM.md` (origem verificável, nada inventado, estado VERIFICADO/NÃO VERIFICADO).
>
> **Data de consulta (código):** 16/09/2026. Toda afirmação carrega o endereço de origem (`arquivo:linha` / tabela / configuração). Parecer em código lido e conferido; pendências de paridade com banco real marcadas.

---

## 1. Identificação e finalidade

A tela **`performance/contexto/view`** (view **`lgpdv2.php`**) é o **dashboard LGPD do Contexto** — a unidade organizacional auditável (departamento, local, processo). Apresenta, em uma única página:

- Cards de resumo no topo: **Valor Global** (gauge), **Evolução** (linha), **Indicadores Avaliados**, **Análises Realizadas**, **Tarefas**;
- **Perfil de Desempenho** (gráfico de linhas), **Áreas de Preocupação** (colunas com drilldown), **Grupo de Indicadores** (barras), **Evolução**;
- Calendário de coletas (TUI Calendar);
- **Análise Técnica** (6 abas: Informações, Pareceres, Recomendações, Documentos, Fotos, Timeline);
- **Inventários** (sub-abas ROPA / Fornecedores / SITI), **Análise de Risco** (Avaliação / Cenários / Quadrantes), **Criticidade ROPA**;

**Origem (código):** `modules/performance/views/contexto/lgpdv2.php` e módulos auxiliares (55+ views lidas). Estado: **VERIFICADO** (código lido).

---

## 2. Entidade principal — `contexto`

**Origem (código):** `modules/performance/models/Contexto.php` (3974 linhas, estende `kartik\tree\models\Tree`).

- Tabela `contexto` é uma árvore **nested-set** (colunas `lft/rgt/lvl/root`). Cada nó folha é uma unidade auditável.
- **Colunas:** `id`, `root`, `lft`, `rgt`, `lvl`, `name`, `icon`, `icon_type`, `active`, `selected`, `disabled`, `readonly`, `visible`, `collapsed`, `movable_*`, `removable*`, `child_allowed`, `cliente_id` (REQUIRED), `created_at`, `updated_at`, `endereco`, `cep`, `cpf_cnpj`, `latitude`, `longitude`, `taxa_substituicao`, `cadastrado_por`, `natureza`, `pontuacao` (double), `foto`, `contato_principal`, `nome_alternativo`, `pontuacao_fracao`, `contato_principal_telefone`, `contato_principal_email`, `cota_disco`, `plano_acao_observacao`.
- Relações: `getCliente` (hasOne), `getContextoTemContatos`, `getContextoTemParametros`, `getContextoTemServicos`, `getColetas` (hasMany), `getOrsegupsContextoPostos`, `getMembros`/`getLocal`.
- Fáscia de score: `contexto.pontuacao` validada via `Contexto::getSituacao()` (`Contexto.php:2254`).

Estado: **VERIFICADO** (docblock + rules do modelo lidos).

---

## 3. Cadeia de dados (contexto → cliente)

| Entidade | Tabela | Chaves | Colunas principais |
|---|---|---|---|
| **Contexto** | `contexto` | `id`, `cliente_id` | `name`, `natureza`, `pontuacao`, `active` |
| **Coleta** | `coleta` | `contexto_id`, `projeto_id`, `vertical_id` | `nome`, `data_coleta`, `status` |
| **Projeto** | `projeto` | `cliente_id`, `vertical_id` | `nome`, `status`, `taxa_substituicao`, `coleta_necessita_homologacao` |
| **Aplicação ↔ Projeto** | `aplicacao_tem_projeto` | `aplicacao_id`, `projeto_id` | — |
| **Aplicação** | `aplicacao` | `unidade_negocio_id` | `nome`, `rota`, `tipo`, `importancia`, `icone` |
| **Unidade de Negócio** | `unidade_negocio` | `cliente_id` | `nome`, `status` |
| **Cliente** | `cliente` | `id` | `nome`, `razao_social`, `cpf_cnpj`, `status` |

Relação canônica: `contexto (1) — (N) coleta — (1) projeto — (N) aplicacao_tem_projeto — (1) aplicacao — (1) unidade_negocio — (1) cliente`.

Resolução da "Aplicação": `db_select aplicacao` via cadeia `contexto → coleta → projeto → aplicacao_tem_projeto → aplicacao`.

Estado: **VERIFICADO** (models com FOREIGN KEY lidos em `modules/performance/models/`).

---

## 4. Pontuação do Contexto (`Contexto::geraPontuacao`)

**Origem:** `modules/performance/models/Contexto.php:636-813`.

- **Se existe coleta ativa:** `pontuacao = coleta.valorGlobal` (coleta mais recente).
- **Se sem coleta mas com risco:** `pontuacao = pontuacaoColeta + pontuacaoRisco`
  - `pontuacaoColeta = Σ(coleta.valorGlobal × taxa_substituicao_projeto / 100)` por projeto;
  - `pontuacaoRisco = (100 - riscoCenario.pontuacao) × (taxaProjetoSemColeta / 100)`.
- **Se sem coleta e sem risco:** `pontuacao = Σ(coleta.valorGlobal × taxa / 100)`.
- Root SES (`id=15835`): resultado **não** arredondado; demais: `round()`.
- Override hardcoded: contexto `id=19629` sempre `pontuacao = 71`.

Estado: **VERIFICADO** (método lido).

---

## 5. Valor global da coleta (`Coleta::getValorGlobal`)

**Origem:** `modules/performance/models/Coleta.php:280-290`.

- Retorna `ColetaEstrutura.pontuacao` onde `tipo_estrutura='V'` (vértice da árvore MCDA-C).
- Agregação **bottom-up** `Coleta::geraPontuacao()` (`Coleta.php:1072`): em cada nível `pontuacao_no = round(Σ(taxa_substituicao × pontuacao_filho) / 100)`.
- Fluxo: alternativas selecionadas (`selecionado=1`) → indicador (`pontuacao = nivel_referencia`) → estruturas folha → estruturas pai → **vértice (`tipo_estrutura='V'`)** = `coleta.valorGlobal`.

Estado: **VERIFICADO** (métodos lidos).

---

## 6. Faixas de classificação (cor / label)

**Origem:** `models/Base.php:115-138`; `modules/agent/components/tools/FaixasTool.php`; `Contexto.php:2254`.

- **Prioridade de resolução:** (1) `projeto_tem_faixa` → (2) `cliente_tem_faixa` → (3) default.
- `Base::faixasPadrao()` (`Base.php:115`): `-100..0` → `#DF5353` Comprometedor; `1..100` → `#e8dd11` Mercado; `101..200` → `#089f50` Excelência.
- **FaixasTool default** (`FaixasTool.php:70`): `0..20` → `#df5353` Comprometedor; `20..80` → `#e8dd11` Mercado; `80..100` → `#089f50` Excelência.
  - ⚠️ Os dois defaults **divergem** (faixas e limites) — o Agente deve **ler o arquivo atual** (contrato §4) antes de classificar.
- Overrides hardcoded por cliente: cliente 31 = 40/80; SEA = 15/65; default = 20/80.
- Constantes: `PONTUACAO_CRITICA=20`, `PONTUACAO_NORMALIDADE=80` (`Contexto.php:46-47`); outras (SUPERVISAO/OPERADORAS/FEELING) em `Contexto.php:48-62`.

Estado: **VERIFICADO**.


## 7. Tela lgpdv2 — cards e seções

**Origem:** `modules/performance/views/contexto/lgpdv2.php` + partials `_cards_topo3`, `_grafico_*`, `_indicadores3`, `_estrutura3`, `_analise_tecnica3`, `_plano_aplicacao`.

- **"Nível de proteção de dados"** (sinônimos: "valor global", "Nível de conformidade") = 1º CARD, gauge (Highcharts solidgauge), mostra `contexto.pontuacao` — nível ATUAL, atualizado a cada coleta. Pergunta ⇒ leia `contexto.pontuacao` e informe **valor + faixa + cor**.
- **"Perfil de Desempenho"** = linhas dos indicadores da coleta referência (usa `perfil_desempenho`; nunca barras). Para tabular: `sql_query em vw_perfil_desempenho`.
- **"Áreas de preocupação"** = colunas com drilldown `Valor Global → PVF → PVE → Indicador`, células coloridas por faixa (AJAX `dados-area-preocupacao`).
- **"Grupo de indicadores"** = barras (AmCharts XYChart) com CONTAGEM por classificação (`Comprometedor`=#DF5353, `Mercado`=#E8DD11, `Excelência`=#089F50).
- **"Evolução"** = linha do valor global ao longo das coletas (ordem `data_coleta ASC`).
- **"Risco"/"Análise de Risco"** = card real (abas Avaliação, Cenários, Quadrantes).
- **"Análise Técnica"** = aba de Análise Técnica com 6 sub-abas.
- **"Análise da Criticidade dos Processos"** = 3 LISTAS SEPARADAS (sub-abas próprias, `lgpdv2.php:610-960`), NUNCA misturadas: **"ROPA"** (`InventarioScopeSearch::searchRopa()`, `tipo=InventarioDados::TIPO_ROPA`, exclui `TIPO_RIPD`, risco em `inventario_scope.risco`), **"Operadores de dados"** (`searchModelFornecedor()`, `tipo=TIPO_FORNECEDOR`, risco em `risco_fornecedor`) e **"Segurança da Informação"/SI&TI** (`searchModelSiti()`, `tipo=TIPO_SEGURANCA`, risco em `risco_seguranca`, aba separada "Análise da Criticidade dos Controles"). ⚠️ CORRIGIDO 2026-09-18: "ROPA" **NÃO** é sinônimo de "todos os processos do inventário" — essa definição estava errada aqui e no prompt do agente, e fazia a IA misturar ROPA+Fornecedores+SI&TI+RIPD+Governança de Dados numa única resposta. Colunas: Organograma (`scope.name`) | Processo (`inventario_scope.nome`) | Criticidade. ⚠️ Nomes de processo podem conter `|` — exibir inteiros (escape `\|`).
- **"Aplicação"** = aplicação-alvo no Privia.
- Cards topo: "Indicadores Avaliados", "Análises Realizadas", "Tarefas" (contagens). Calendário TUI Calendar (AJAX `getColetas`).

Estado: **VERIFICADO** (views lidas).

---

## 9. Análise Técnica (6 abas)

**Origem:** `modules/performance/views/contexto/_analise_tecnica3.php`.

| Aba | Conteúdo | CRUD via |
|---|---|---|
| **Informações** | nome, natureza, contatos, parâmetros, serviços, Google Maps | — |
| **Pareceres** | opiniões técnicas | `ParecerTecnicoColetaController` |
| **Recomendações** | cards coloridos (Importante=#DF5353, Recomendável=#E8DD11, Desejável=#089F50) com cenários de risco | `RecomendacaoSegurancaController` |
| **Documentos** | anexos (galeria Fancybox) | `AnexoController` |
| **Fotos** | galeria de fotos | `FotoController` |
| **Timeline** | linha do tempo de eventos | `AtendimentoController` |

Aba "Informações" fica oculta para `Cliente::ID_FEELING`.

Estado: **VERIFICADO**.

---

## 10. Estrutura da coleta

**Origem:** `modules/performance/views/contexto/_estrutura3.php`.

- Árvore jsTree com hierarquia da coleta; AJAX: `recupera-coleta-pvf?coleta=` e `recupera-coleta-filho?tipo=`.
- Hierarquia: **Vértice (V) → Estrutura (T) → Indicador (L) → Alternativa**; `taxa_substituicao` em cada nível; fórmula bottom-up em `Coleta::geraPontuacao()`.

Estado: **VERIFICADO**.

---

## 11. Indicadores

**Origem:** `modules/performance/views/contexto/_indicadores3.php`; `ColetaIndicador.php:211`.

- 3 abas por cor: Comprometedor (bg-danger), Mercado (bg-warning), Excelência (bg-success).
- Colunas: nome, ícone plano de ação, sparkline, mín/atual/máx, link "detalhes" (modal `#dados-modal`).
- Classificação: `indicador.pontuacao ≤ minimoMercado` → Comprometedor; `≥ minimoExcelencia` → Excelência; senão → Mercado.
- **Peso no modelo** (`percentualDoModelo`): percorre a cadeia de taxas (`valor = ∏(taxa/100) × 100`) → % de contribuição do indicador ao total.

Estado: **VERIFICADO**.

---

## 12. Modal de detalhes do indicador

**Origem:** `lgpdv2.php` (modal `#dados-modal`) + AJAX (`pesquisa-estrutura`, `pesquisa-parametro`, `pesquisa-gpp`, `pesquisa-plano-acao`, `pesquisa-alternativa`, `pesquisa-dados-absoluto`).

Abas: **Informações** (caminho da estrutura, descrição, descritor, interpolação), **Gestão** (parâmetros, GPP/análise de causa raiz), **Plano de Ação** (CRUD), **Análise de Movimentação** (pie chart — indicadores específicos), **Evolução Mensal** (linha — indicadores específicos).

Estado: **VERIFICADO**.

---

## 13. Inventários (ROPA / Fornecedores / SITI)

**Origem:** `modules/performance/views/contexto/lgpdv2.php` (sub-abas); `models/InventarioDados.php:41-54`; `models/InventarioScope.php:89-101`.

- **`inventario_dados`** (tipos): `ROPA=1`, `FORNECEDOR=2`, `SEGURANCA=3`, `GOVERNANCA_DADOS=4`, `GENERICO=5`, `AUDITORIA=6`, `INDICADOR=8`, `RIPD=9`, `OPERADOR_DADOS_INTERNACIONAL=10`, `NORMAS_CORPORATIVAS_GLOBAIS=11`, `TIA=12`. Colunas: `id, nome, cliente_id, contexto_id (nullable), padrao, status, geral_especifico, tipo, vertical_estrutura_id`.
- **`inventario_scope`** (processos respondidos): `id, scope_id, inventario_dados_id, nome, status, pontuacao_original, agravamento, pontuacao, risco (virtual), nome_responsavel, email_responsavel, percentual_respondido, justificativa_ponderacao`.
- **`scope`** (organograma): `id, type, name, parent_id, root, status, cliente_id, contexto_id, respondido_por, geral_especifico, responde_inventario, percentual_respondido`.
- **Risco do inventario_scope:** `Leve` (0-4), `Moderado` (5-9), `Grave` (10-16), `Crítico` (17+). Constantes: `RISCO_TOLERAVEL=0`, `RISCO_SIGNIFICATIVO=5`, `RISCO_SERIO=10`, `RISCO_INTOLERAVEL=17`.
- **INVENTÁRIO DE DADOS** = o questionário APLICADO ao `scope` (`inventario_scope`); `inventario_dados` é só o modelo. CRUD via `InventarioDadosController` / `InventarioScopeController`.
- **⚠️ "ROPA" na tela NÃO é sinônimo de "todo o inventário"** (erro corrigido em 2026-09-18, ver `models/InventarioScopeSearch.php:92-172`): a aba "Análise da Criticidade dos Processos" tem 2 sub-abas com queries SEPARADAS — `searchRopa()` filtra `tipo=ROPA` e exclui `RIPD`; `searchModelFornecedor()` filtra `tipo=FORNECEDOR`. Há ainda uma aba INDEPENDENTE "Análise da Criticidade dos Controles" (`searchModelSiti()`, `tipo=SEGURANCA`). Cada uma lê uma coluna de risco diferente: ROPA→`risco`, Fornecedor→`risco_fornecedor`, Segurança→`risco_seguranca`. RIPD e Governança de Dados (`tipo=9`/`4`) NÃO aparecem em nenhuma dessas 3 telas de criticidade. Paridade VERIFICADA contra contexto real (id=659, Transtusa\|Filial, 2026-09-18): ROPA=128 processos, Fornecedor=67, confirmados por query direta no banco batendo com o filtro do código.

Estado: **VERIFICADO** (models + queries de busca lidos, paridade com banco real confirmada 2026-09-18).

---

## 14. Análise de Risco

**Origem:** `lgpdv2.php` (seção `contexto-analise-risco`); `Contexto.php:3094-3136`; `RiscoCenario.php:36-38`.

- 3 sub-abas: **Avaliação** (Risco, Consequência, Probabilidade, TS, Pontuação), **Cenários** (gráfico temporal `#divgraficotempo`), **Quadrantes** (matrizes cor × probabilidade, 4×10).
- **Risco LGPD** (`getLgpdRisco`): `≤20=Baixo` (verde), `≤50=Moderado` (azul), `≤80=Alto` (amarelo), `>80=Crítico` (vermelho). Fonte: `RiscoCenario::VIALGPD_LIMITE_BAIXO/MODERADO/ALTO`.

Estado: **VERIFICADO**.

---

## 15. Plano de Ação

**Origem:** `lgpdv2.php` (tab Plano de Ação); `modules/performance/models/PlanoAcao.php`.

- Tabela `pa_plano_acao`: `id, contexto_id, vertical_id, vertical_indicador_id, nome, status, created_at, created_by, objetivo, responsavel, observacao`. Sub-entidades: `AcaoProposta` (`pa_acao_proposta`) → `Tarefa` (`pa_tarefa`). `status` do plano = andamento (1 Cadastrado, 2 Em andamento, 3 Concluído, 4 Homologado, 5 Recusado, 0 Inativo); em ações/tarefas `status` = ativo (0 = inativo) e `situacao` = andamento (1 Não iniciada, 2 Em andamento, 3 Interrompida, 4 Pendente, 5 Encerrada). Tarefa ATRASADA = `termino_previsto < hoje` e `situacao != 5`. Responsáveis via `user_has_resource` (roles "Plano de Ação - Nível 1/2/3 - Responsável Plano/Ação Proposta/Tarefa", `resource_id` = id da entidade); os campos `responsavel` das tabelas `pa_*` são NULL nos dados reais.
- **Aba "Planos de Ação"** (`lgpdv2.php:2217-2264`, CORRIGIDO 2026-09-18 — antes constava "ChartJS pie", errado): 2 gráficos **AmCharts 4** (CDN `cdn.amcharts.com/lib/4`) — pizza "Quantidade de Planos de Ação por Status" (`graficoplanoacaostatus`, `:2987`; 5 status sempre presentes, cores `PlanoAcao::STATUS_*_COR`) e barras horizontais "Quantidade de Ação Proposta por Plano de Ação" (`graficoplanoacaoacaoproposta`, `:3060`) — mais a lista de planos (nome, indicador, responsável, tag de status). Dados: `ContextoController.php:3900-3945` (planos com `status != 0`; ações com `status != 0`). Agente: ferramenta `planos_acao` (`PlanosAcaoTool`).
- Seções do offcanvas: tabela Plano Completo, tabela Plano Básico. Observação: CKEditor (`observacao_plano_acao.php`).

Estado: **VERIFICADO** (aba, gráficos e dados lidos no código e conferidos contra o banco local — contexto 659: 2 planos, 4 ações — 2026-09-18).

---

## 16. Ferramentas do Agente (relacionadas)

| Ferramenta | Classe | Finalidade |
|---|---|---|
| `context_get` | `ContextTool` | escopo do usuário, clientes validados |
| `coleta_cadeia_nota` | `CadeiaNotaTool` | cadeia completa alternativa→indicador→estrutura→vértice |
| `coleta_faixas` | `FaixasTool` | faixas de classificação (projeto→cliente→padrão) |
| `perfil_desempenho` | `PerfilDesempenhoTool` | N coletas recentes, indicadores alinhados, faixas |
| `knowledge_search` | `KnowledgeSearchTool` | busca conceitual em `agent_knowledge` |
| `sql_query` | `SqlQueryTool` | SQL bruto com isolamento de tenant nas `vw_*` |
| `schema_info` | `SchemaTool` | metadados de tabelas/views do `agent_catalogo` |

Estado: **VERIFICADO** (toolbox `Agent.php:78-94`).

---

## 17. Views SQL (catálogo do Agente)

**Origem:** `modules/agent/scripts/ddl_views_catalogo.php:208-239`.

| View | DEFINIÇÃO |
|---|---|
| `vw_contexto` | `contexto JOIN cliente (WHERE active=1)` — `id, nome, cliente_id, cliente_nome, natureza, pontuacao, active` |
| `vw_coleta` | `coleta JOIN contexto (WHERE status!=0)` — `id, nome, contexto_id, contexto_nome, projeto_id, vertical_id, data_coleta, status` |
| `vw_coleta_cadeia_nota` | alternativa×indicador×estrutura — `estrutura_pontuacao, indicador_pontuacao, taxa_substituicao, nivel_referencia, peso, selecionado` |
| `vw_perfil_desempenho` | 1 registro por indicador×coleta — `indicador_pontuacao` + `valor_global_coleta` (subquery do vértice) |

Estado: **VERIFICADO** (DDL lido).

---

## 18. Resumo de estados

- Seções 1–17: **VERIFICADO** (origens em `arquivo:linha` lidas: models, views, views SQL, toolbox do Agente).
- Paridade de dados (exemplo de processo/risco real): **NÃO VERIFICADO** — depende de auditoria contra o banco real (contrato §1b.4).
- Restrições: análises feitas a partir de **código + banco** (sem automação de tela nesta entrega).

---

## 19. Teste de verificação (repetível)

Ferramenta: `coleta_faixas` (FaixasTool) para uma coleta específica deve retornar `fonte_das_faixas ∈ {projeto_tem_faixa, cliente_tem_faixa, padrao}` e faixas iguais às do arquivo ativo (`Base.php`/`FaixasTool.php`) — paridade a conferir contra o banco real (depende de ambiente com dados).

Estado: **NÃO VERIFICADO** (aguardando auditoria contra o banco real).