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:

Isso abre o modal Registros Observados (Group Observer):

No modal é possível:
- Selecionar a Tabela (DS) que o grupo irá observar;
- Escolher os Registros específicos dessa tabela que o grupo poderá enxergar;
- Clicar em Salvar Observer para confirmar;
- 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.