Administração do sistema

Restrições de acesso a registros

RT.FAQ-53634
As regras de acesso definidas através das funções de usuário definem as ações que um usuário pode executar no sistema, mas não estabelecem relação com os registros que o usuário pode visualizar. Para estes casos, existem algumas regras de negócio que são nativas do próprio sistema e aplicadas a TODOS os cenários em que o sistema é utilizado.
Estas regras variam de interface para interface e podem ou não ser customizadas de acordo com cada caso. Algumas destas regras, por exemplo, estão relacionadas a participação dos usuários em diferentes estabelecimentos.

Quando um determinado cenário tiver uma necessidade que não é atendida diretamente pelas regras genéricas do sistema, pode-se utilizar duas soluções distintas:

Ambos podem ser configurados pela interface Configurações das interfaces do sistema.

Acessos concedidos para usuários e grupos

Apropriado quando não existe como definir quem tem acesso ao registro apenas consultando seus dados. Neste tipo de cenário, quem criou terá acesso, assim como os membros de seu grupo primário. Posteriormente, o usuário poderá dar acesso para o registro a outros usuários e/ou grupos.

Para maiores detalhes, ver:

Acessos definidos por expressões

Apropriado quando os dados do registro definem direta ou indiretamente quem terá acesso ao mesmo.

Neste caso, será necessário configurar a expressão que dá acesso ao registro. A expressão utiliza a sintaxe do comando WHERE do SQL e tem acesso a qualquer informação (coluna) existente no bloco, permitindo, inclusive acessar dados de outras tabelas através do operador EXISTS.
Além das colunas do bloco, qualquer variável da sessão pode ser incluída na expressão:

A expressão é baseada nas colunas resultante do bloco (por fora), ou seja, quaisquer referências às colunas deverão ser feitas com base ao nome do ITEM e não ALIAS.COLUNA. Digamos, por exemplo, que existe um item CLIENTE cujo binding aponta para CLIE.PESSOA. Neste caso, a expressão deverá usar simplesmente a coluna CLIENTE. Por outro lado, caso seja necessário executar uma sub-query, então pode-se diferenciar entre as colunas do bloco usando o alias "QUERY".

Neste modo, também é possível definir uma chave de acesso que libera o usuário a acessar todos os registros de forma independente à expressão. Isso é utilizado como exceção criada para gerentes e outras pessoas que poderão acessar todos os registros.

Ver os campos da Configurações das interfaces do sistema:

Exemplos

Restringir acesso aos pedidos apenas para os vendedores e/ou representantes informados no pedido e/ou no cadastro do cliente:
exists (select p.id
   from pedidos p
   join clientes c on c.id = p.cliente_id
   where [PERSON_ID] in (p.vendedor_id, p.representante_id, c.vendedor_id, c.representante_id)
   and query.id = p.id
)

Idem acima para as consultas de itens:
exists (select p.id
   from itens_pedidos i
   join pedidos p on p.id = i.pedido_id
   join clientes c on c.id = p.cliente_id
   where [PERSON_ID] in (p.vendedor_id, p.representante_id, c.vendedor_id, c.representante_id)
   and query.id = i.id
)

Restringir acesso de contatos de CRM apenas para os usuários que participaram do contato ou que sejam vendedor ou representante de uma das pessoas contatadas:
exists (
   select 1 
   from pessoas_contatos pc
   where pc.contato_id = query.id
   and pc.pessoa_id = [PERSON_ID]
   
   union
   
   select 1 
   from pessoas_contatos pc
   join clientes c on c.id = pc.pessoa_id
   where pc.contato_id = query.id
   and [PERSON_ID] in (c.vendedor_id, c.representante_id)
)


Restringir o acesso ao cadastro de Pessoas para que sejam apresentadas somente:
(exists (select p.id
 from pessoas p
 where [USER_ID] = p.usuario_inclusao_id and query.id = p.id
)
or
exists (select 1 
 from clientes c 
 where [PERSON_ID] in (c.vendedor_id, c.representante_id)
 and c.id = query.id
)
or 
exists (select 1
  from usuarios u
  where [USER_ID] = u.id
  and u.super_usuario = 'S'
  )
)

Restringir acesso apenas a pedidos emitidos pelo próprio usuário nos ultimos 30 dias. Usuários na função "X" poderão ver de outros usuários mas também apenas emitidos nos ultimos 30 dias:
exists (select p.id
  from pedidos p
  where p.data_inclusao > current_date - 30
  and query.id = p.idA
  and (p.usuario_inclusao_id = [USER_ID]
       or exists (select 1
                  from funcoes_usuaQrios f
                  where f.funcao_id = 41932943  /* ID da função "X" */
                  and f.usuario_id = [USER_ID]))
)


Ver também: