br.eti.danielcamargo.backend.hsnpts.core.business.MicrocicloService.java Source code

Java tutorial

Introduction

Here is the source code for br.eti.danielcamargo.backend.hsnpts.core.business.MicrocicloService.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.eti.danielcamargo.backend.hsnpts.core.business;

import br.eti.danielcamargo.backend.hsnpts.core.business.exceptions.ProgramaFinalizadoException;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.FrequenciaSemanal;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.Microciclo;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.ObjetivoPrograma;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.Programa;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.Sessao;
import br.eti.danielcamargo.backend.hsnpts.core.persistence.Treino;
import br.eti.danielcamargo.backend.hsnpts.core.xml.HsnPersonal;
import br.eti.danielcamargo.backend.hsnpts.core.xml.HsnPersonalUtils;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Daniel
 */
@Service
public class MicrocicloService {

    @PersistenceContext
    private EntityManager em;

    /**
     * Se o microciclo existir e for incompleto, ele  retornado.
     * <br />
     * Se o microciclo no existir ou estiver completo, cria um novo.
     *
     * @param alunoId
     * @return
     * @throws
     * br.eti.danielcamargo.backend.hsnpts.core.business.exceptions.ProgramaFinalizadoException
     */
    @Transactional
    public Microciclo resolverMicrociclo(Long alunoId) throws ProgramaFinalizadoException {

        StringBuilder hql = new StringBuilder();

        hql.append("SELECT ");
        hql.append(" p ");
        hql.append("FROM ");
        hql.append("  Programa p ");
        hql.append("WHERE ");
        hql.append("  p.aluno.id = :alunoId ");
        hql.append("  AND p.dataTermino IS NULL ");

        TypedQuery<Programa> queryPrograma = em.createQuery(hql.toString(), Programa.class);
        queryPrograma.setParameter("alunoId", alunoId);
        Programa programa = queryPrograma.getSingleResult();

        hql.append("SELECT ");
        hql.append(" m ");
        hql.append("FROM ");
        hql.append(" Microciclo m ");
        hql.append("WHERE ");
        hql.append(" m.programa = :programa ");
        hql.append("ORDER BY ");
        hql.append(" m.numero DESC ");

        TypedQuery<Microciclo> queryMicrociclo = em.createQuery(hql.toString(), Microciclo.class);
        queryMicrociclo.setParameter("programa", programa);
        queryMicrociclo.setMaxResults(1);

        List<Microciclo> result = queryMicrociclo.getResultList();

        HsnPersonal hsnPersonal = HsnPersonalUtils.getInstance();
        ObjetivoPrograma objetivoPrograma = programa.getObjetivoPrograma();
        FrequenciaSemanal frequenciaSemanal = programa.getFrequenciaSemanal();

        if (result.isEmpty()) {
            //criar primeiro microciclo
            Microciclo microciclo = hsnPersonal.buscarMicrociclo(objetivoPrograma, frequenciaSemanal, 1);
            microciclo.setPrograma(programa);
            save(microciclo);
            return microciclo;
        } else {
            //verificar se o programa esta finalizado
            Microciclo microciclo = result.get(0);
            if (microciclo.getDataTermino() != null) {
                if (microciclo.getNumero().equals(24)) {
                    throw new ProgramaFinalizadoException();
                }
                microciclo = hsnPersonal.buscarMicrociclo(objetivoPrograma, frequenciaSemanal, 1);
                microciclo.setPrograma(programa);
                save(microciclo);
                return microciclo;
            }
            return microciclo;
        }
    }

    private void save(Microciclo microciclo) {
        microciclo.setDataInicio(new Date());
        em.persist(microciclo);

        Set<Treino> treinos = microciclo.getTreinos();
        for (Treino treino : treinos) {
            treino.setMicrociclo(microciclo);
            em.persist(treino);
            Set<Sessao> sessoes = treino.getSessoes();
            for (Sessao sessao : sessoes) {
                sessao.setTreino(treino);
                em.persist(sessao);
            }
        }
    }

}