package br.gov.mj.sislegis.app.service.ejbs; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; 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 br.gov.mj.sislegis.app.model.Comentario; import br.gov.mj.sislegis.app.model.EncaminhamentoProposicao; import br.gov.mj.sislegis.app.model.Notificacao; import br.gov.mj.sislegis.app.model.Tarefa; import br.gov.mj.sislegis.app.service.AbstractPersistence; import br.gov.mj.sislegis.app.service.NotificacaoService; import br.gov.mj.sislegis.app.service.TarefaService; @Stateless public class TarefaServiceEjb extends AbstractPersistence<Tarefa, Long> implements TarefaService { private static final String CATEGORIA_TAREFAS = "TAREFAS"; @PersistenceContext private EntityManager em; @Inject NotificacaoService notificacaoService; public TarefaServiceEjb() { super(Tarefa.class); } @Override protected EntityManager getEntityManager() { return em; } @Override public Tarefa save(Tarefa entity) { boolean criando = (entity.getId() == null); entity = super.save(entity); if (criando) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM kk:mm"); // cria notificacao EncaminhamentoProposicao enc = entity.getEncaminhamentoProposicao(); String notTxt = enc.getTipoEncaminhamento().getNome(); if (enc.getDetalhes() != null && !enc.getDetalhes().isEmpty()) { notTxt += enc.getDetalhes(); } if (enc.getDataHoraLimite() != null) { notTxt += " - " + sdf.format(enc.getDataHoraLimite()); } Notificacao not = new Notificacao(entity.getUsuario(), notTxt, entity.getId().toString(), CATEGORIA_TAREFAS); notificacaoService.save(not); } else if (entity.isFinalizada()) { deleteNotificacaoAssociada(entity.getId()); } return entity; } @Override public Tarefa buscarPorId(Long idTarefa) { TypedQuery<Tarefa> findByIdQuery = em .createQuery("SELECT t FROM Tarefa t WHERE t.id = :idTarefa", Tarefa.class); findByIdQuery.setParameter("idTarefa", idTarefa); List<Tarefa> resultList = findByIdQuery.getResultList(); if (resultList.size() > 0) { for (Tarefa tarefa : resultList) { if (tarefa.getEncaminhamentoProposicao() != null) { tarefa.getEncaminhamentoProposicao().getProposicao(); } } return resultList.get(0); } return null; } @Override public List<Tarefa> buscarPorUsuario(Long idUsuario) { TypedQuery<Tarefa> findByIdQuery = em.createQuery("SELECT t FROM Tarefa t WHERE t.usuario.id = :idUsuario", Tarefa.class); findByIdQuery.setParameter("idUsuario", idUsuario); List<Tarefa> resultList = findByIdQuery.getResultList(); return resultList; } @Override public Tarefa buscarPorEncaminhamentoProposicaoId(Long idEncaminhamentoProposicao) { TypedQuery<Tarefa> findByIdQuery = em.createQuery( "SELECT t FROM Tarefa t WHERE t.encaminhamentoProposicao.id = :idEncaminhamentoProposicao", Tarefa.class); findByIdQuery.setParameter("idEncaminhamentoProposicao", idEncaminhamentoProposicao); List<Tarefa> resultList = findByIdQuery.getResultList(); if (resultList.size() > 0) { return resultList.get(0); } return null; } @Override public void marcarComoVisualizadas(List<Long> idTarefas) { for (Long id : idTarefas) { Query query = em.createQuery("UPDATE Tarefa SET isVisualizada = TRUE WHERE id = :id", Tarefa.class); query.setParameter("id", id); query.executeUpdate(); } } private void deleteNotificacaoAssociada(Long idTarefa) { Notificacao n = notificacaoService.buscarPorCategoriaEntidade(CATEGORIA_TAREFAS, idTarefa.toString()); if (n != null) { notificacaoService.deleteById(n.getId().longValue()); } } @Override public void deleteById(Long id) { deleteNotificacaoAssociada(id); super.deleteById(id); } @Override public void updateTarefa(EncaminhamentoProposicao savedEntity) { // Caso uma tarefa já exista, significa que foi atualizada. Excluímos a // antiga antes de atualizar. Tarefa tarefaPorEncaminhamentoProposicaoId = buscarPorEncaminhamentoProposicaoId(savedEntity.getId()); if (tarefaPorEncaminhamentoProposicaoId != null) { if (savedEntity.getResponsavel() != null) { tarefaPorEncaminhamentoProposicaoId.setUsuario(savedEntity.getResponsavel()); save(tarefaPorEncaminhamentoProposicaoId); } else { deleteById(tarefaPorEncaminhamentoProposicaoId.getId()); } } else { if (savedEntity.getResponsavel() != null) { // Criamos a nova tarefa Tarefa tarefa = Tarefa.createTarefaEncaminhamento(savedEntity.getResponsavel(), savedEntity); save(tarefa); } } } @Override public void finalizar(Long idTarefa, String comentarioFinalizacao) { Tarefa tarefa = findById(idTarefa); tarefa.setFinalizada(true); tarefa.getEncaminhamentoProposicao().setFinalizado(true); deleteNotificacaoAssociada(idTarefa); Comentario comentario = new Comentario(); comentario.setProposicao(tarefa.getEncaminhamentoProposicao().getProposicao()); comentario.setDescricao(comentarioFinalizacao); comentario.setDataCriacao(new Date()); comentario.setAutor(tarefa.getUsuario()); tarefa.setComentarioFinalizacao(comentario); tarefa.getEncaminhamentoProposicao().setComentarioFinalizacao(comentario); save(tarefa); } }