package br.gov.mj.sislegis.app.service.ejbs;
import br.gov.mj.sislegis.app.model.Comentario;
import br.gov.mj.sislegis.app.model.EncaminhamentoProposicao;
import br.gov.mj.sislegis.app.model.Tarefa;
import br.gov.mj.sislegis.app.service.AbstractPersistence;
import br.gov.mj.sislegis.app.service.ComentarioService;
import br.gov.mj.sislegis.app.service.EncaminhamentoProposicaoService;
import br.gov.mj.sislegis.app.service.TarefaService;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
@Stateless
public class EncaminhamentoProposicaoServiceEjb extends AbstractPersistence<EncaminhamentoProposicao, Long> implements
EncaminhamentoProposicaoService {
@PersistenceContext
private EntityManager em;
@Inject
private TarefaService tarefaService;
@Inject
private ComentarioService comentarioService;
public EncaminhamentoProposicaoServiceEjb() {
super(EncaminhamentoProposicao.class);
}
@Override
protected EntityManager getEntityManager() {
return em;
}
@Override
public EncaminhamentoProposicao salvarEncaminhamentoProposicao(EncaminhamentoProposicao encaminhamentoProposicao) {
EncaminhamentoProposicao savedEntity = this.save(encaminhamentoProposicao);
tarefaService.updateTarefa(savedEntity);
return savedEntity;
}
@Override
public List<EncaminhamentoProposicao> findByProposicao(Long idProposicao) {
TypedQuery<EncaminhamentoProposicao> findByIdQuery = em.createQuery(
"SELECT c FROM EncaminhamentoProposicao c where c.proposicao.id=:entityId",
EncaminhamentoProposicao.class);
findByIdQuery.setParameter("entityId", idProposicao);
final List<EncaminhamentoProposicao> results = findByIdQuery.getResultList();
return results;
}
// Por algum motivo esse metodo não está usando JPA, e está fazendo join na
// mao...
@Deprecated
public List<EncaminhamentoProposicao> findByProposicao2(Long idProposicao) {
TypedQuery<EncaminhamentoProposicao> findByIdQuery = em.createQuery("SELECT c FROM EncaminhamentoProposicao c "
+ "INNER JOIN FETCH c.responsavel res " + "INNER JOIN FETCH c.comentario com "
+ "INNER JOIN FETCH c.tipoEncaminhamento enc " + "INNER JOIN FETCH c.proposicao p WHERE p.id = :entityId",
EncaminhamentoProposicao.class);
findByIdQuery.setParameter("entityId", idProposicao);
final List<EncaminhamentoProposicao> results = findByIdQuery.getResultList();
return results;
}
@Override
public Integer totalByProposicao(Long idProposicao) {
Query query = em
.createNativeQuery("SELECT COUNT(1) FROM encaminhamentoproposicao WHERE proposicao_id = :idProposicao");
query.setParameter("idProposicao", idProposicao);
BigInteger total = (BigInteger) query.getSingleResult();
return total.intValue();
}
@Override
public void finalizar(Long idEncaminhamentoProposicao, String descricaoComentario) {
EncaminhamentoProposicao encaminhamento = findById(idEncaminhamentoProposicao);
encaminhamento.setFinalizado(true);
Comentario comentario = new Comentario();
comentario.setAutor(encaminhamento.getResponsavel());
comentario.setDataCriacao(new Date());
comentario.setDescricao(descricaoComentario);
comentario.setProposicao(encaminhamento.getProposicao());
encaminhamento.setComentarioFinalizacao(comentario);
Tarefa tarefa = tarefaService.buscarPorEncaminhamentoProposicaoId(idEncaminhamentoProposicao);
if (tarefa != null) {
tarefa.setFinalizada(true);
tarefa.setComentarioFinalizacao(comentario);
tarefaService.save(tarefa); // tarefa salva tambem o encaminhamento (cascade)
} else{
save(encaminhamento);
}
}
}