Subversion Repositories bacoAlunos

Rev

Rev 796 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.services.sigesimports;

import com.lowagie.text.pdf.SimpleBookmark;
import jomm.dao.impl.AbstractDao;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.services.courseunits.SaveCourseUnitProgram;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import sun.tools.java.Imports;

import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author Jorge Machado
 */

public class SincronizeLastYearCourseUnitProgramsService implements IService
{
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(SincronizeLastYearCourseUnitProgramsService.class);


    /**
     * DESCRICAO DE SERVICO
     *
     * Unidades sem ficha �-lhes atribuida a ficha do ano anterior,
     *  1� � atribuido o mesmo professor como respons�vel
     *  2� a Ficha � clonada
     *  3� a Ficha fica com estado de n�o validada
     *
     * Restri��es por ordem de prioridade
     *  - Fichas com estado validadas n�o s�o clonadas
     *  - Fichas invalidas poder�o ser clonadas se:
     *      - N�o existir ficha
     *      - ou para fichas j� clonadas apenas s�o clonadas novamente se a condi��o
     *    de entrada cloneOnlyNews for false
     *
     * @param year
     * @param cloneOnlyNews
     * @return
     * @throws ServiceException
     */

    public ILogMessages run(1.5.0/docs/api/java/lang/String.html">String year,boolean cloneOnlyNews,boolean generateAllPdfs) throws ServiceException
    {

        1.5.0/docs/api/java/lang/System.html">System.out.println("Using year = " + year);
        1.5.0/docs/api/java/lang/System.html">System.out.println("Using only news = " + cloneOnlyNews);
        int foundTotal = 0;
        int found = 0;
        int updated=0;
        List<String> foundnprog = new ArrayList<String>();
        List<String> nfound = new ArrayList<String>();

        1.5.0/docs/api/java/lang/String.html">String importYearBefore = DatesUtils.getImportYearBefore(year);
        DefaultLogMessages logMessages = new DefaultLogMessages();
        try
        {
            logMessages.addMessage(new DefaultLogMessage("courseunitprograms.sincronization", LogMessageTypeEnum.INFO, "instituicao " + Globals.SIGES_INSTITUTION_CODE));
            logger.info("S1");
           
            List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadYear(year);
            for (CourseUnit cu: units)
            {
                SaveCourseUnitProgram service = new SaveCourseUnitProgram();

                foundTotal++;
                if(cu.getCourseUnitProgram() == null || !cloneOnlyNews)
                {

                    List<CourseUnit> lista = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique(cu.getCode(),cu.getCourseCode(),importYearBefore);
                    if(lista != null && lista.size() > 0)
                    {

                        logger.info("OK - Unit siges: " + cu.getCode() + " without program will try found old to clone");
                        CourseUnit cuOld = lista.get(0);
                        if(cuOld.getCourseUnitProgram() != null)
                        {
                            found++;
                            if(cuOld.getResponsableTeacher() != null && cu.getResponsableTeacher() == null)
                                cu.setResponsableTeacher(cuOld.getResponsableTeacher());

                            boolean novaFicha = false;

                            if(cu.getCourseUnitProgram() == null)
                            {
                                novaFicha = true;
                                CourseUnitProgram program = new CourseUnitProgramImpl();
                                DaoFactory.getCourseUnitProgramDaoImpl().save(program);
                                program.setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
                                DaoFactory.getCourseUnitProgramPart2DaoImpl().save(program.getCourseUnitProgramPart2());
                                cu.setCourseUnitProgram(program);
                                cu.setValidProgram(false);
                            }

                            //So clona a ficha no caso de n�o estar validada pelo CC
                            if(novaFicha || (!cu.isValidProgram() && !cloneOnlyNews))
                            {
                                updated++;
                                ((CourseUnitProgramImpl)cu.getCourseUnitProgram()).cloneFrom(cuOld.getCourseUnitProgram());
                                List<String> errors = new ArrayList<String>();
                                service.createPdf(cu,errors);
                            }

                        }
                        else
                        {
                            foundnprog.add(cu.getCode());

                        }
                    }
                    else
                    {
                        nfound.add(cu.getCode());
                        logger.info("NOT FOUND - Unit siges: " + cu.getCode() + " without program don't have old to clone");
                    }
                }
                else if(generateAllPdfs)
                {
                    List<String> errors = new ArrayList<String>();
                    if(cu.getCourseUnitProgram() != null)
                        service.createPdf(cu,errors);
                }

                cu.setValidProgram(true);
            }
            logger.info("STATS " + year);
            logger.info("Total: " + foundTotal);
            logger.info("Programas alterados: " + updated);
            logger.info("Previous Unit Found with program : " + found);
            logger.info("Previous Unit Found without program: " + foundnprog.size());
            logger.info("Previous Unit Not Found: " + nfound.size());
            logger.info("### Found No Prog:");
            for(1.5.0/docs/api/java/lang/String.html">String c : foundnprog)
            {
                logger.info(c);
            }
            logger.info("### Not Found:");
            for(1.5.0/docs/api/java/lang/String.html">String c : nfound)
            {
                logger.info(c);
            }

        }
        catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            logger.error(e,e);
            logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(), "see log for details", LogMessageTypeEnum.ERROR));
        }
        logger.info("terminating programs sincronization");
        logMessages.addMessage(new DefaultLogMessage("courseunitprograms.sincronization.terminating", LogMessageTypeEnum.INFO));
        return logMessages;
    }


    /**
     * Load all importYear on format 201213 201314 from units of previous ant forward years from the given unit
     * The search clause is based on sigesCode and CourseSigesCode
     * @param courseUnitId pattern unit to search for
     * @return sorted list of importYears
     */

    public List<String> findOtherYearsWithProgram(long courseUnitId,UserSession sess)
    {
        CourseUnit u = DaoFactory.getCourseUnitDaoImpl().load(courseUnitId);
        List<CourseUnit> cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodes(u.getCode(),u.getCourseCode());
        List<String> importYears = new ArrayList<String>();
        for(CourseUnit cu : cus)
        {
            if( cu.getImportYear() != null && !cu.getImportYear().equals(u.getImportYear()) &&
                    !importYears.contains(cu.getImportYear())
                    &&
                    cu.getCourseUnitProgram() != null)
                importYears.add(cu.getImportYear());
        }
        1.5.0/docs/api/java/util/Collections.html">Collections.sort(importYears,new Comparator<String>() {
            @1.5.0/docs/api/java/lang/Override.html">Override
            public int compare(1.5.0/docs/api/java/lang/String.html">String o1, 1.5.0/docs/api/java/lang/String.html">String o2) {
                return o1.compareTo(o2);

            }
        });
        return importYears;
    }

    /**
     * Load all units of previous ant forward years from the given unit
     * The search clause is based on sigesCode and CourseSigesCode
     * @param courseUnitId pattern unit to search for
     * @return sorted list of units with all information inside
     */

    public List<CourseUnitView> findOtherUnitsWithProgram(1.5.0/docs/api/java/lang/Long.html">Long courseUnitId,UserSession sess)
    {
        CourseUnit u = DaoFactory.getCourseUnitDaoImpl().load(courseUnitId);
        List<CourseUnit> cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodes(u.getCode(),u.getCourseCode());
        List<CourseUnitView> views = new ArrayList<CourseUnitView>();
        for(CourseUnit cu : cus)
        {
            if( cu.getImportYear() != null && !cu.getImportYear().equals(u.getImportYear()) &&
                    !views.contains(cu.getImportYear())
                    &&
                    cu.getCourseUnitProgram() != null)
                views.add(new CourseUnitView(cu));
        }
        1.5.0/docs/api/java/util/Collections.html">Collections.sort(views,new Comparator<CourseUnitView>() {
            @1.5.0/docs/api/java/lang/Override.html">Override
            public int compare(CourseUnitView o1, CourseUnitView o2) {
                return o1.getImportYear().compareTo(o2.getImportYear());

            }
        });
        return views;
    }

    /**
     * Given a courseunit the target intoUnit will have a cloned program from the fromUnit
     * The PDF file is Generated and saved into repository with SaveCourseUnitProgram Service
     * @param fromUnitId from unit
     * @param intoUnitId target unit
     * @return the cloned courseunit program
     */


    public CourseUnitProgram cloneProgram(long fromUnitId,long intoUnitId,UserSession sess)
    {
        CourseUnit cuFrom = DaoFactory.getCourseUnitDaoImpl().load(fromUnitId);
        CourseUnit cuInto = DaoFactory.getCourseUnitDaoImpl().load(intoUnitId);
        if(cuInto.getCourseUnitProgram() == null)
        {
            CourseUnitProgram program = new CourseUnitProgramImpl();
            DaoFactory.getCourseUnitProgramDaoImpl().save(program);
            program.setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
            DaoFactory.getCourseUnitProgramPart2DaoImpl().save(program.getCourseUnitProgramPart2());
            cuInto.setCourseUnitProgram(program);
            cuInto.setValidProgram(false);
        }
        logger.info("AQUI");
        ((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()).cloneFrom(cuFrom.getCourseUnitProgram());
        DaoFactory.getCourseUnitProgramDaoImpl().saveOrUpdate(((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()));
        DaoFactory.getCourseUnitProgramPart2DaoImpl().saveOrUpdate(((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()).getCourseUnitProgramPart2());

        SaveCourseUnitProgram service = new SaveCourseUnitProgram();
        List<String> errors = new ArrayList<String>();
        try {
            service.createPdf(cuInto,errors);
        } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
            e.printStackTrace();
        } catch (1.5.0/docs/api/javax/xml/transform/TransformerException.html">TransformerException e) {
            logger.error(e,e);
        } catch (FOPException e) {
            logger.error(e, e);
        }
        return cuInto.getCourseUnitProgram();
    }


    public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws ServiceException
    {
        1.5.0/docs/api/java/lang/String.html">String year = DatesUtils.getImportYear();
        if(args != null && args.length > 0)
            year = args[0];
        boolean cloneOnlyNews = true;
        if(args != null && args.length > 1)
            cloneOnlyNews = 1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(args[1]);
        boolean generateAllPdfs = false;
        if(args != null && args.length > 2)
            generateAllPdfs = 1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(args[2]);
        AbstractDao.getCurrentSession().beginTransaction();
        new SincronizeLastYearCourseUnitProgramsService().run(year,cloneOnlyNews,generateAllPdfs);
        AbstractDao.getCurrentSession().getTransaction().commit();
    }


}