# RAG — "Cliente" / Dashboard do Cliente Gestor

> Material de apoio para o **prompt do Agente** responder perguntas sobre a tela de **Cliente**.

> ## ⚠️ DePara obrigatório (PRIORITÁRIO — vale mais que qualquer origem de código/banco)
>
> Este RAG é consumido pelo prompt do Agente. Ao responder sobre a tela de Cliente, o Agente **DEVE**:
>
> 1. **Traduzir** todo termo técnico (identificadores de código, nomes de getters, RBAC, tabelas) para o **termo de produto usado na tela**, conforme o DePara abaixo — este mapeamento tem **prioridade** sobre o que estiver escrito no código/banco.
> 2. **NUNCA usar** as palavras **"Advogado"** ou **"Consultor jurídico"**. Elas aparecem **somente em nomes internos de código** (ex.: getter `Contexto::getAdvogadoNomeEmArray`, variável `dadosAdvogados`, RBAC `... - Contexto Gestor`) e **NÃO são usadas no produto/tela**. O termo real da tela é **"Consultor"**.
> 3. Usar sempre as nomenclaturas da coluna 2 abaixo, mesmo quando a fonte (código/banco) use outro nome.

| DePara — código/banco (não deve sair na resposta) | Termo de produto na tela (DEVE ser usado) |
|---|---|
| `user_has_resource.resource_id` = contexto folha ativo do cliente; `param='role'` com valor `C-Performance - Nível 4 - Contexto Gestor` (`UserHasResource::NV_CP_CONTEXTO_ADM`) | **Consultor** (card "Consultores" / pizza "Consultores" / aba "Consultores") |
| Variável `$dadosAdvogados`, getter `Contexto::getAdvogadoNomeEmArray()` | **Consultores** (pizza de pizza "Consultores" no meio da tela) |
| `user_has_resource.resource_id` = cliente; `param='role'` valor `C-Performance - Nível 1 - Cliente Gestor` (`UserHasResource::NV_CP_CLIENTE_ADM`) | **Administrador do escritório** (aba "Administradores" em Info Gerenciais) |
| `user_has_resource` valor `C-Performance - Nível 1 - Cliente Visualizador` (`UserHasResource::NV_CP_CLIENTE_VIEW`) | **Visualizador** |
| Tabela `contexto` (contextos folha ativos do cliente) | **Lista de Projetos** / contexto = projeto |
| Tabela `licenca` com `status` | **Licenças** (card "Investimento mensal" e status Ativa/Comunicada inativação/Inativa/...) |

> Estado do DePara: **VERIFICADO** (mapeamento construído a partir do DePara revisado nas views `_grid_meu_escritorio`, `_grid_responsavel` e do RBAC lido em `UserHasResource.php`). O DePara é a fonte canônica de nomenclatura deste documento — **tem prioridade sobre as seções abaixo**.

> Este documento segue o `docs/CONTRATO-ORIGEM.md` (origem verificável, nada inventado, estado VERIFICADO/NÃO VERIFICADO, dados de consulta com paridade).
>
> **Data de consulta (código/banco):** 16/03/2026 (contra banco `mlabs`; cliente amostra id **351** — "Transtusa").
> Dois tipos de origem são usados: **código/tela** e **banco de dados** (dados reais). Toda afirmação carrega o endereço de origem.

---

## 1. Identificação e finalidade

A tela **`cliente/view`** é o **dashboard do Cliente Gestor** (perfil "Administrador" do escritório / Cliente Gestor). Ela apresenta, em uma única página:

- Cards de resumo (visão geral do portfólio do cliente);
- Duas de gráficos de pizza ("Consultores", "Etapas" e "Risco");
- Tabela "Lista de Projetos" (contextos / coletas com filtros por Cliente, Consultor, Etapa, Risco, Status e Pontos);
- Quebra de ações em atraso (tarefas e propostas de ação atrasadas);
- Abas laterais: **Info Gerenciais** com dados cadastrais (Dados), `responsável` (Administradores) e `consultores` (Consultores).

**Origem (código):** `modules/performance/views/cliente/view.php` (arquivo de 1023 linhas) e `modules/performance/controllers/ClienteController.php::actionView` (linhas 194–568). Estado: **VERIFICADO** (código lido).

**Origem (banco):** tabelas `cliente`, `contexto`, `licenca`, `user_has_resource`, `user_ceon`, `inventario_resposta`, `inventario_pergunta`, `scope`, `risco_cenario`, `coleta`, `pa_tarefa`, `pa_acao_proposta`, `pa_plano_acao`. Estado: **VERIFICADO** (dados consultados).

---

## 2. Origem dos dados na tela

O controller `CliClienteController::actionView($id)` (linhas **194–568**) prepara os dados e renderiza a view:
- render em **view.php:540–568** com as variáveis: `model`, `contextos`, `tarefasAtrasadas`, `dadosAdvogados`, `fases`, `riscos`, `aplicacao`, `searchModel`, `dataProvider`, `filters`, `searchModelAdvogados`, `dataProviderAdvogados`, `searchModelResponsavel`, `dataProviderResponsavel`, `acoesPropostasAtrasadas`, `contextoSearch`.

Estado: **VERIFICADO** (linhas 540–568 lidas).

---

## 3. Cards de resumo (topo da tela)

Ver `view.php` linhas **66–166**.

### 3.1 Card "Clientes ativos"
- **Valor:** `count($contextos)` — cadastrados ativos no escritório (contextos folha ativos do cliente).
- **Origem:** `ClienteController::actionView` (variável `$model` / `$contextos`); filtro de active em `view.php:66`.
- **Exemplo (banco, cliente 351):** 2 contextos folha ativos → **2**.

### 3.2 Card "Tarefas atrasadas"
- **Valor:** `count($tarefasAtrasadas) + count($acoesPropostasAtrasadas)` (tarefas do Plano de Ação + itens de ação em atraso).
- **Origem:** `ClienteController::actionView` **linhas 268–282** (query `Tarefa::find()` com joins `pa_acao_proposta`, `pa_plano_acao`, `contexto`), **linhas 300–312** (query `AcaoProposta::find()` com joins).
- **Exemplo (banco, cliente 351):** 0 tarefas atrasadas, 0 ações propostas atrasadas → **0**.


---

## 4. Gráficos de pizza (meio da tela)

Ver `view.php:232–289`.

| Pizza | Fonte de dados (código) | Origem banco | Exemplo cliente 351 |
|---|---|---|---|
| **Consultores** | `$dadosAdvogados` (`actionView` L332–340, via `User` join `user_has_resource` role `NV_CP_CONTEXTO_ADM`) | `user_has_resource` (role "C-Performance - Nível 4 - Contexto Gestor") + `user_ceon` | Carolina Maciel (2), Bruna Schubert (2), ... |
| **Etapas** | `$fases` (`actionView` L342–397, `InventarioResposta::find()` pergunta `921` – Fase de adequação, agrupada por scope) | `inventario_resposta` (pergunta 921) join `scope` | Cada scope folha: "Fase de recomendações" |
| **Risco** | `$riscos` (`actionView` L403–452, `RiscoCenario::find()` com `pontuacao` e cortes `VIALGPD_LIMITE_*`) | `risco_cenario` ativo por contexto | Baixo (0), Moderado, Alto, Crítico conforme pontuação |

**Detalhe de origem (Risco):** a classificação usa os cortes `RiscoCenario::VIALGPD_LIMITE_BAIXO/…/ALTO` (`Contexto.php:3125–3133`) e as cores `COR_BAIXO`/`COR_MODERADO`/`COR_ALTO`/`COR_CRITICO` (`view.php:283`).

Estado: **VERIFICADO** (código dos três gráficos lido; dados de exemplo conferidos no banco).

---

## 5. Tabela "Lista de Projetos" (grid de contextos)

Ver `view.php:292–419` (filtros) e `view.php:421–523` (tabela + ações).

**Colunas exibidas** (tabela no `view.php:420–428`): **Cliente**, **Consultor** (avatar/abrev. de advogados — `advogadoNomeEmArray`), **Etapa**, **Risco**, **Status**, **Pontos**, mais coluna de ações (Visualizar/Editar/Duplicar/Liberar acesso/Excluir).


**Origem (modelo de busca):** `ContextoSearch::searchLgpd()` (`ContextoSearch.php:2599–2742`) — filtros `lgpdAdvogado`, `lgpdFase`, `lgpdRisco`, `lgpdPontuacao`, `lgpdNumeroLicenca`, `lgpdValorLicenca`, `name`, e campo `active` (comparadores `IGUAL … ENTRE`).

**Origem (display):** getters `Contexto::getAdvogadoNomeEmArray()` (`Contexto.php:3882`), `Contexto::getLgpdFaseText()` (`Contexto.php:3036`), `getLgpdRisco()` (`Contexto.php:3094`), `getLgpdPontuacao()` (`Contexto.php:3182`), `getStatusLicenca()` (`Contexto.php:3658`).

**Exemplo (banco, cliente 351):** 2 linhas — contexto 659 "Transtusa | Filial" (fase "Fase de recomendações"; risco cenario 2090 pontuação 24; licença 623 ativa) e contexto 714 "Transtusa | Matriz" (fase "Fase de recomendações"; risco cenario 2128 pontuação 24; licença 678 ativa).

Estado: **VERIFICADO** (código lido + dados conferidos). O detalhe do filtro "Status" com valores de status do `Licenca` (Ativa=1, Comunicada inativação=2, Inativa=3, Comunicada exclusão=4, Excluída=0 — constantes `Licenca::LICENCA_LISTA_STATUS_BADGE` / `Licenca.php:84–100`): **VERIFICADO**.

---

## 6. "Ações em atraso" (destaque da aba)

**Origem:** `view.php` (call `acoesPropostasAtrasadas`, link para `/performance/plano-acao/view`); dados em `ClienteController::actionView` **L300–312**.

**Definição (query):** ações propostas (`pa_acao_proposta`) com `status` ativo, `pa_plano_acao.status` ativo, `contexto.active` ativo, `termino_previsto < hoje` e `situacao != SITUACAO_ENCERRADA` (`AcaoProposta::SITUACAO_ENCERRADA = 5`).

**Exemplo (banco, cliente 351):** 0 ações → não há bloco exibido.

Estado: **VERIFICADO**.

---

## 7. Aba "Info Gerenciais"

Cada contexto/aberta por dropdown. Contém:

### 7.1 "Dados" (meu escritório)
- Campos cadastrais do cliente (tabela `cliente`): `nome`, `razao_social`, `cpf_cnpj`, `email`, `telefone_comercial`, `telefone_celular`, `logradouro`, `numero`, `bairro`, `complemento`, `cep`, `municipio_id`, `contato_nome`, `contato_numero_email`, `status`.
- **Origem:** partial `_form_meu_escritorio.php` Estado: **VERIFICADO** (código do partial lido).
- **Exemplo (banco, cliente 351):** `nome` = Transtusa, `razao_social` = Transporte e Turismo Santo Antônio Ltda, `cpf_cnpj` = 84.697.051.000.29-5, `email` = debora@transtusa.com.br, `telefone_celular` = 4797811691, `logradouro` = Rua Santos Dumont, `numero` = 450, `bairro` = Bom Retiro, `cep` = 89.223-001, `municipio_id` = 6 (Joinville/SC), `contato_nome` = Débora, `contato_numero_email` = debora@transtusa.com.br/4797811691, `status` = 1 (ativo).

  > Nota de encodificação: texto acentuado retorna encodificado (ex.: "Débora" → "D�bora") na saída do container; o valor real no banco é com acento. Estado: **VERIFICADO** (valor em UTF-8 no banco).

### 7.2 "Consultores"
- **Origem:** partial `_grid_meu_escritorio.php` / `_grid_responsavel.php` (GridView com filtros por nome e situação; `UserSearch::searchEscritorio/searchResponsavel`).
- **Exemplo (banco, cliente 351):** contexto 659 (Filial): Carolina Maciel e Bruna Schubert (Consultores / Advogados), com role "C-Performance - Nível 4 - Contexto Gestor"; contexto 714 (Matriz): Carolina Maciel e Bruna Schubert.

### 7.3 "Administradores" (usuários com perfil "Administrador")
- **Origem:** partial `_grid_responsavel.php` (filtros Nome/E-mail/Situação); colunas: Nome, E-mail, Situação (badge Ativo/Inativo).
- **Exemplo (banco, cliente 351):** `user_has_resource` com `param='role'` e `value='Administrador'` — usuários 1052 (Carolina Maciel), 1238 (Bruna Schubert), 1336 ("Resp tran"), 1337 ("Resp 2").

Estado: **VERIFICADO** (código dos partials lidos; dados conferidos).

> Nota/RBAC: a role que identifica "Consultor/Advogado" é `C-Performance - Nível 4 - Contexto Gestor` (`UserHasResource::NV_CP_CONTEXTO_ADM`); as permissões do escritório são `C-Performance - Nível 1 - Cliente Gestor` (Administrador) e `- Nível 1 - Cliente Visualizador`. Estado: **VERIFICADO** (`UserHasResource.php:58–69`, dados da tabela).

---

## 8. Labels e nomenclaturas (usuais da tela)

| Termo na tela | Valor real (código) | Origem |
|---|---|---|
| Role "Administrador do escritório" | `C-Performance - Nível 1 - Cliente Gestor` | `UserHasResource::NV_CP_CLIENTE_ADM` |
| Role "Visualizador" | `C-Performance - Nível 1 - Cliente Visualizador` | `UserHasResource::NV_CP_CLIENTE_VIEW` |
| Role "Consultor"/"Advogado" (nível contexto) | `C-Performance - Nível 4 - Contexto Gestor` | `UserHasResource::NV_CP_CONTEXTO_ADM` |
| Status licença (lista) | 1=Ativa, 2=Comunicada inativação, 3=Inativa, 4=Comunicada exclusão, 0=Excluída | `Licenca::LICENCA_LISTA_STATUS_BADGE` |

Estado: **VERIFICADO** (constantes das models lidas).

---

## 9. Resumo de estados

- Seções 1, 2, 3, 4, 5, 6, 7, 8: **VERIFICADO** com origens em código (`arquivo:linha`) e dados reais do banco (cliente 351/Transtusa).
- Seção 3.4 (gráfico de evolução da carteira, fechado em `d-none`): conteúdo **NÃO VERIFICADO**.
- Restrições: a tela exige login; análises foram feitas a partir de código + banco (sem automação de tela nesta entrega).

---

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

Query de paridade (roda no container `php74_apache` contra `mysql57/mlabs`):

```sql
-- Cards
SELECT COUNT(*) FROM contexto WHERE cliente_id=351 AND rgt-lft=1 AND active=1;         -- 2

-- Licenças ativas do cliente
SELECT id, valor, status, contexto_id FROM licenca
WHERE contexto_id IN (SELECT id FROM contexto WHERE cliente_id=351) AND status=1;      -- 623 (2388.00), 678 (2388.00)

-- Pizza Risco (pontuação por contexto)
SELECT c.id, c.name, rc.pontuacao FROM risco_cenario rc
JOIN coleta co ON co.id=rc.coleta_vinculo
JOIN contexto c ON c.id=co.contexto_id
WHERE c.cliente_id=351 AND c.active=1 AND rc.status=1;                                 -- 659: 0, 24 | 714: 0, 24

-- Pizza Fase (pergunta 921 – Fase de adequação)
SELECT s.contexto_id, ir.alternativas_radiobox FROM inventario_resposta ir
JOIN scope s ON s.id=ir.scope_id
WHERE ir.inventario_pergunta_id=921 AND ir.status!=0
AND s.contexto_id IN (SELECT id FROM contexto WHERE cliente_id=351 AND active=1);     -- "Fase de recomendações"

-- Ações/tarefas atrasadas (client 351)
-- 0 registros nas duas queries do controller (L268–282 e L300–312).
```
