Listar apenas Pessoas de cada Empresa

Bom dia pessoal! Estou trabalhando em um ERP e agora me surgiu uma dúvida.

Tenho uma tabela Pessoa Funcionario, Empresa, Usuario e Cliente herdam dela…
Tenho um XHTML que faz a inserção dessas novas pessoas e que exibe também a lista delas. Igual a imagem abaixo…

Só que, cada usuário tem sua lista de pessoas, clientes e funcionarios únicos. Então eu queria saber como faço para exibir nessa lista apenas pessoas que foram cadastradas pela empresa em questão. Exemplo.
Empresa 1: pessoas: Arthur, Pedro e Miguel
Empresa 2: pessoas: Ana, Gustavo e Luiz

Ontem quebrei a cabeça tentando utilizar uma query pra poder executar essa função, mas parece que não deu muito certo.

Esse é o diagrama. (Empresa está ligado a Pessoa para cadastrar o proprietário da mesma.)

Olá @Rafael_Victor.

Como foram as querys que você tentou. Pensando muito rapidamente aqui parece que algo do tipo abaixo funcionaría.

Select Empresa.nome, Pessoa.nome From Empresa

INNER Join Cliente

On Empresa.codigo = Cliente.empresa_codigo

Inner join Pessoa

On Cliente.pessoa_cpf = Pessoa.cpf

Então amigo, o que acontece. Esse ERP ele é de distribuição a empresa que me contratou já trabalha com um em Delphi7 Local e aluga para os comércios.
Então basicamente existe 3 tipos de usuarios no sistema. (Administrador, Gerente, Balconista)
Adm faz cadastros de novos clientes, empresas e funcionários da empresa ERP.
Gerente é pessoa que aluga o sistema deles, faz cad de produtos, funcionarios, cliente, vendas.
Balconista é funcionário do gerente e tem limitações no sistema, faz cad de clientes e vendas.

Então pensei em uma solução não sei se será a correta. Criar tabelas diferentes para o usuário ADM e Gerente. Assim as informações da Empresa que vende o ERP ficará separada das informações da empresa que Aluga o sistema. Sera que ta certo minha logica?

1 curtida

@Rafael_Victor Olhando com as informações que você passa me parece que esta relação já existiria pela ligação Empresa >> Funcionario >> Pessoa >> Usuario.

Caso decida criar novas tabelas cuide para garantir a integridade dos dados para evitar redundância nas informações e informações divergentes.

1 curtida

Então amigo, ontem eu tentei utilizar dessa lógica que tinha comentado logo ai acima, só que encontrei problemas ao me deparar com Usuário não era consistente então resolvi voltar ao que estava fazendo anteriormente. Atualizei minha UML e estou trabalhando com ela assim agora.

Empresa está ligado a pessoa devido ao proprietário em um relacionamento @OneToOne

Então seguindo essa mesma lógica que você propôs eu fiz a seguinte Query:

@SuppressWarnings("unchecked")
	public List<Pessoa> listarPorEmpresa(Long empresaCdg){
		EntityManager em = new ConnectionFactory().getConnection();
		List<Pessoa> pessoas = null;
		
		try {
			Query query = em.createQuery("select p from Pessoa p inner join Empresa e on p.codigo = e.pessoa where e.codigo = :cdg");
			query.setParameter("cdg", empresaCdg);
			pessoas = query.getResultList();
		} catch (RuntimeException erro) {
			System.err.println(erro);
			em.getTransaction().commit();
			throw erro;
		} finally {
			em.close();
		}
		return pessoas;
	}

e a chamada assim:

  <h:form id="formListagem">
	<p:panel header="Lista de Pessoas">
			<p:dataTable id="tabela" emptyMessage="Nenhum registro encontrado."
			paginator="true" value="#{pessoaBean.pessoasFiltro}" var="pessoa" rows="5">				
			<f:facet name="header">
				<p:commandButton value="Novo" actionListener="#{pessoaBean.novo}"
					oncomplete="PF('dialogo').show();"
					update=":mensagem :formCadastro:painel">
					<f:actionListener
						type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" />
				</p:commandButton>
			</f:facet>

Mas quando abro o XHTML não aparece nenhum dado. se eu altero o pessoasFiltro para pessoas ele me retorna todas as pessoas do banco.

1 curtida

Boa noite @Rafael_Victor. Desculpe só te responder agora.

Olhei teu código e estranhei alguns nomes de campos escritos diferentes no teu modelo e na tua query.

Eu escreveria a query da seguinte maneira:

select * from pessoa p inner join Empresa e on p.codigo = e.pessoa_codigo where e.codigo = cdg

Com esta sintaxe eu esperaria receber todas as pessoas que estejam relacionadas com uma determinada empresa.