Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Permissão por Vínculo de Grupo (Group Observer)

O que é

O Group Observer permite restringir quais registros os usuários de um grupo podem visualizar, com base no vínculo desses registros com entradas específicas de outra tabela.

Exemplo prático: o grupo "Almoxarifado Norte" observa os Fornecedores com SEQ_DB 3 e 7. A partir daí, qualquer cadastro que possua um campo apontando para a tabela FORNECEDOR (ex.: Pedidos de Compra, Notas de Entrada) exibirá automaticamente apenas os registros vinculados aos fornecedores 3 e 7, sem nenhuma alteração nos DS ou queries.

O filtro é aplicado de forma transparente nas camadas Dao, TabelaBO e NFSQueryBuilder.


Como configurar

A configuração é feita em Controle de Acesso → Grupos → [editar grupo].

Na tela de edição do grupo, clique no ícone de olho no canto superior direito:

Tela de edição de grupo com botão Observer

Isso abre o modal Registros Observados (Group Observer):

Modal de configuração do Group Observer

No modal é possível:

  1. Selecionar a Tabela (DS) que o grupo irá observar;
  2. Escolher os Registros específicos dessa tabela que o grupo poderá enxergar;
  3. Clicar em Salvar Observer para confirmar;
  4. Remover observers existentes pela coluna Ações na tabela de observers configurados.

A pesquisa de registros no modal ignora os próprios filtros de observer, para que o administrador sempre consiga enxergar todos os registros disponíveis.


Como o filtro é aplicado

O sistema percorre três estratégias em ordem, parando na primeira que produz resultado:

1. Filtro direto

A própria tabela consultada está sob observer.

-- Observer: FORNECEDOR → [3, 7]
-- Consultando a tabela FORNECEDOR:
alias.SEQ_DB IN (3, 7)

2. Filtro via FK

A tabela consultada possui um campo do tipo FK apontando para uma tabela observada.

-- Observer: FORNECEDOR → [3, 7]
-- Tabela PEDIDO tem campo FORNECEDOR_SEQ_DB (FK → FORNECEDOR):
alias.FORNECEDOR_SEQ_DB IN (3, 7)

3. Filtro via LOVN

A tabela consultada possui um campo do tipo LOVN que se relaciona com uma tabela observada através de uma tabela de junção.

-- Observer: FORNECEDOR → [3, 7]
-- Campo LOVN aponta para FORNECEDOR via tabela de junção (ex.: app_nota_fornecedor):
alias.SEQ_DB IN (
    SELECT NOTA_SEQ_DB FROM app_nota_fornecedor
    WHERE FORNECEDOR_SEQ_DB IN (3, 7) AND ATIVO = 1
)

Se nenhuma das três estratégias encontrar correspondência, nenhum filtro é aplicado e o usuário vê todos os registros normalmente.


Ignorar o filtro

Em situações onde o filtro não deve ser aplicado (ex.: endpoints de configuração, migrations, relatórios administrativos):

NFSQueryBuilder:

$qb = NFSQueryBuilder::table('APP_FORNECEDOR');
$qb->bypassGroupObserver();

Para toda a request atual:

AclGroupObserverService::bypassForCurrentRequest();

Considerações

  • O filtro é aplicado apenas em consultas. Inserções, atualizações e exclusões não são afetadas.
  • Se um usuário pertence a múltiplos grupos, os observers de todos os grupos são somados (união dos SEQ_DBs).
  • Se um usuário possui o tipo ACCESS_TOKEN_USER, o filtro usa os observers do usuário criador do token (ACCESS_TOKEN_CREATOR).
  • Tabelas sem DS configurado no sistema não aparecerão na listagem de tabelas disponíveis para observer.
  • Os observers são carregados uma vez por sessão ($_SESSION['groupObservers']) e invalidados automaticamente ao salvar ou remover um observer.