package banco.DAO;
import java.util.Calendar;
import java.util.List;
import javax.persistence.Query;
import banco.connection.EclipseLinkConnection;
import banco.modelo.Pessoa;
import banco.modelo.TipoFuncionario;
import banco.utils.PessoaUtils;
import com.google.inject.persist.Transactional;
public class PessoaDAO extends EclipseLinkConnection implements PessoaUtils{
@Override
@Transactional
public void saveOrUpdate(Pessoa modelo) {
if(modelo.getId() != null)
merge(modelo);
else
persist(modelo);
}
@Override
@Transactional
public void delete(Pessoa modelo) {}
@Override
public Pessoa find(Long id) {
Query q = createQueryNoCache("select p from Pessoa p where p.id = :id");
q.setParameter("id", id);
return (Pessoa)q.getSingleResult();
}
@SuppressWarnings("unchecked")
@Override
public List<Pessoa> findAll() {
Query q = getEntityManager().createQuery("select p from Pessoa p");
return q.getResultList();
}
@SuppressWarnings("unchecked")
@Override
public List<Pessoa> findAllByTipoAndStatus(String tipo, Boolean status) {
boolean cliente = false;
boolean fornecedor = false;
boolean funcionario = false;
if(tipo != null){
cliente = tipo.equals(Pessoa.CLIENTE);
fornecedor = tipo.equals(Pessoa.FORNECEDOR);
funcionario = tipo.equals(Pessoa.FUNCIONARIO);
}
Query q = getEntityManager().createQuery("select p from Pessoa p where (p.ativo = cast(:status as boolean) or :status is null) " +
"and ((p.tipoCliente = cast(:cliente as boolean) and cast(:cliente as boolean) is true) " +
"or (p.tipoFornecedor = cast(:fornecedor as boolean) and cast(:fornecedor as boolean) is true) " +
"or (p.tipoFuncionario = cast(:funcionario as boolean) and cast(:funcionario as boolean) is true) " +
"or (:tipo is null))");
q.setParameter("status", status)
.setParameter("cliente", cliente)
.setParameter("fornecedor", fornecedor)
.setParameter("funcionario", funcionario)
.setParameter("tipo", tipo);
return q.getResultList();
}
@SuppressWarnings("unchecked")
@Override
public List<Pessoa> findAllByTipoFuncionario(TipoFuncionario tipo) {
Query q = getEntityManager().createQuery("select p from Pessoa p where p.tipo = :tipo");
q.setParameter("tipo", tipo);
return q.getResultList();
}
@SuppressWarnings("unchecked")
@Override
public List<Pessoa> findAllFuncionarioAPagar() {
Calendar primeiroDiaMes = Calendar.getInstance();
primeiroDiaMes.set(Calendar.DAY_OF_MONTH, 1);
Query q = getEntityManager().createQuery("select p from Pessoa p where p.ativo is true and p.tipoFuncionario is true "+
"and (p.dataUltimoPagto < :primeiroDiaMes or p.dataUltimoPagto is null)");
q.setParameter("primeiroDiaMes", primeiroDiaMes.getTime());
return q.getResultList();
}
}