=== Teste E2E: cadastro de processo — PASSO 1 (leitura) === ▶ 1. Usuário 1162 (não-Ceon) ✅ não é Ceon ✅ cliente resolvido = [297] — [297] ✅ contextos = os ATIVOS do cliente 297 (paridade com SQL independente) — [179,214,215] vs [179,214,215] ✅ total confere e não trunca ✅ contexto 238 (INATIVO) não aparece ✅ campos (nome, cliente_id, cliente_nome) idênticos à fonte ✅ busca "Orthonet" → só o 214 ✅ busca pelo nome de contexto de OUTRO cliente → nada (sem vazamento) — buscou "Unidavi - Matriz" ✅ busca pelo nome do CLIENTE ("1A1 Projetos") acha os 3 contextos dele — [179,214,215] ✅ busca pelo nome de OUTRO cliente → nada (sem vazamento) — Unidavi ✅ busca "%" não vira curinga ✅ busca "_" não vira curinga ▶ 2. 1162: acesso negado ou inexistente (mesma resposta, sem revelar) ✅ scopesDoContexto(699) [contexto de outro cliente] → erro genérico ✅ scopesDoContexto(238) [contexto INATIVO do próprio cliente] → erro genérico ✅ scopesDoContexto(0) [id 0] → erro genérico ✅ scopesDoContexto(-5) [id negativo] → erro genérico ✅ scopesDoContexto(99999999) [id inexistente] → erro genérico ✅ formulariosPossiveis em contexto de outro cliente → erro ✅ contexto(699) → null ▶ 3. 1162: áreas do organograma do contexto 179 (paridade + soft delete) ✅ scopes = os ATIVOS do contexto (paridade) — 7 de 7 ✅ nenhum scope inativo aparece — inativos no banco: [2840,3476] ✅ nome, responde_inventario e geral_especifico idênticos à fonte ✅ caminho da raiz = o nome dela ✅ caminho de um filho termina no nome dele e contém o do pai — DEMO - LGPD 13709 > Seg. Informações ✅ scopeDoContexto acha um scope ativo do contexto ✅ scopeDoContexto NÃO acha scope INATIVO ✅ scopeDoContexto NÃO acha scope de OUTRO contexto (mesmo do próprio cliente) ▶ 4. 1162: formulários possíveis (paridade com SQL independente) ✅ scope Geral: formulários = ativos, mesmo geral_especifico, sem RIPD (paridade) — 1 vs 1 ✅ scope Geral: nenhum RIPD (tipo 9) ✅ scope Geral: rótulos do tipo = InventarioDados::LISTA_TIPO ✅ scope Específico: formulários = ativos, mesmo geral_especifico, sem RIPD (paridade) — 53 vs 53 ✅ scope Específico: nenhum RIPD (tipo 9) ✅ scope Específico: rótulos do tipo = InventarioDados::LISTA_TIPO ✅ scope Geral lista exatamente 1 formulário (ROPA) ✅ formulário INATIVO não aparece ✅ formulariosPossiveis com scope inexistente → erro ▶ 5. Usuário 1052 (Admin → acesso total, mas Soft Delete continua valendo) ✅ é Ceon (Admin) ✅ total de contextos = ativos de clientes ativos (paridade) — 258 vs 258 ✅ respeita o limite e informa que truncou ✅ busca "Unidavi" acha o 699 ❌ busca "transtusa filial" (2 palavras, minúsculas) acha SÓ o 659 "Transtusa | Filial" — [{"id":714,"nome":"Transtusa | Filial","cliente_id":351,"cliente_nome":"Transtusa"}] ❌ busca "Transtusa Matriz" acha SÓ o 714 "Transtusa | Matriz " (com espaço sobrando no nome) — [{"id":718,"nome":"Transtusa | Matriz","cliente_id":351,"cliente_nome":"Transtusa"}] ❌ ordem das palavras não importa: "Matriz Transtusa" acha o mesmo 714 — ❌ uma palavra só (caso antigo, continua igual): acha os 2 contextos da Transtusa — [{"id":714,"nome":"Transtusa | Filial","cliente_id":351,"cliente_nome":"Transtusa"},{"id":718,"nome":"Transtusa | Matriz","cliente_id":351,"cliente_nome":"Transtusa"}] ✅ uma palavra que não casa em nada → nenhum resultado (AND entre as palavras, não OR) ✅ palavra que não existe em nenhum contexto (um número solto) → nenhum resultado, mesmo com a outra palavra batendo ✅ Ceon NÃO alcança contexto INATIVO ✅ contexto 201: scopes = ativos (paridade) — 50 vs 50 ✅ contexto 201: nenhum dos 148 inativos aparece ▶ 6. Caminho do organograma (dados sintéticos) ✅ raiz, filho e neto com caminho completo ✅ responde_inventario e rótulo Específico ✅ scope com pai INATIVO/ausente é descartado (a raiz permanece)