Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.sigesimports;

import jomm.dao.impl.AbstractDao;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
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.jobs.ServiceJob;
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 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 extends ServiceJob 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);
    private static final int MAX_COMMIT = 100;

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

    /**
     * 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,1.5.0/docs/api/java/lang/String.html">String semestre, boolean cloneOnlyNews,boolean generateAllPdfs,boolean validate) throws ServiceException
    {

        1.5.0/docs/api/java/lang/String.html">String msgS = "STARTING SUMARIES IMPORT SERVICE FOR year: " + year + " semestre: " + semestre + " cloneOnlyNews: " + cloneOnlyNews + " generateAllPdfs: " + generateAllPdfs + " validate: " + validate;
        serviceLogInfo(msgS);
        logger.info(msgS);

        int foundTotal = 0;
        int found = 0;
        int updated=0;
        List<String> naoAfectadasPermissao = new ArrayList<String>();
        List<String> clonados = new ArrayList<String>();
        List<String> foundnprog = new ArrayList<String>();
        List<String> nfound = new ArrayList<String>();
        List<String> notChangedNotNew = 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 " + DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()));
            serviceLogInfo(logMessages.getLastMessage());

            int i = 0;
            List<Long> units = DaoFactory.getCourseUnitDaoImpl().loadIds(year,semestre);
            //List<CourseUnit> units = DaoFactory.getCourseUnitDaoImpl().loadYear(year);
            for (1.5.0/docs/api/java/lang/Long.html">Long cuId: units)
           // for (CourseUnit cu: units)
            {

                SaveCourseUnitProgram service = new SaveCourseUnitProgram();

                foundTotal++;

                if (i++ > MAX_COMMIT)
                {
                    i = 0;
                    setProgress((int) (((float)foundTotal)/((float)units.size())*100.0f));
                    commitPartially();
                }
                CourseUnit cu = DaoFactory.getCourseUnitDaoImpl().load(cuId);
                if(cu.getCourseUnitProgram() == null || !cloneOnlyNews)
                {

                    //todo cuidado que ignoro o semestre
                    List<CourseUnit> lista = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique(cu.getCode(),cu.getCourseCode(),importYearBefore);
                    if(lista != null && lista.size() > 0)
                    {

                        1.5.0/docs/api/java/lang/String.html">String msg = cu.getCourseUnitProgram() == null ? "OK - Unit siges: " + cu.getCode() + " without program will try found old to clone"
                                :  "OK - Unit siges: " + cu.getCode() + " cloning will check validation to found an old unit to clone";
                        logger.info(msg);
                        serviceLogInfo(msg);

                        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)
                            {
                                serviceLogInfo("Ficha NOVA nao existe vai tentar clonar");
                                novaFicha = true;
                                CourseUnitProgram program = new CourseUnitProgramImpl();
                                DaoFactory.getCourseUnitProgramDaoImpl().save(program);
                                program.setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
                                DaoFactory.getCourseUnitProgramPart2DaoImpl().save(program.getCourseUnitProgramPart2());
                                cu.setCourseUnitProgram(program);
                            }

                            //So clona a ficha no caso de nao estar validada pelo CC
                            if(novaFicha || (!cu.isValidProgram() && !cloneOnlyNews))
                            {
                                if(!novaFicha)
                                    serviceLogInfo("Clonando Ficha de unidade ja existente mas nao valida");
                                updated++;
                                CourseUnitProgramImpl cProgram = (CourseUnitProgramImpl) DaoFactory.getCourseUnitProgramDaoImpl().narrow(cu.getCourseUnitProgram());
                                cProgram.cloneFrom(cuOld.getCourseUnitProgram());
                                List<String> errors = new ArrayList<String>();
                                List<String> warnings = new ArrayList<String>();
                                clonados.add(cu.getCode());
                                cu.setValidProgram(validate);
                                service.createPdf(cu,errors);
                                if(errors.size() > 0)
                                {
                                    for(1.5.0/docs/api/java/lang/String.html">String error:errors)
                                    {
                                        serviceLogError(error);
                                        logMessages.addMessage(new DefaultLogMessage("Unit: " + cu.getCode() + " ERROR generating PDF:" + error, LogMessageTypeEnum.ERROR));
                                        serviceLogError(logMessages.getLastMessage());
                                        logger.error(logMessages.getLastMessage());
                                    }
                                }
                                if(warnings.size() > 0)
                                {
                                    for(1.5.0/docs/api/java/lang/String.html">String warning: warnings)
                                    {
                                        logMessages.addMessage(new DefaultLogMessage("import.warning",LogMessageTypeEnum.WARNING,"Unit: " + cu.getCode() + " Warning generating PDF:" + warning));
                                        serviceLogWarn(logMessages.getLastMessage());
                                        logger.warn(logMessages.getLastMessage());
                                    }
                                }

                            }
                            else
                            {
                                naoAfectadasPermissao.add(cu.getCode());
                                if(cu.isValidProgram())
                                    serviceLogInfo("Ficha nao alterada. razao: VALIDADA");
                                else
                                    serviceLogInfo("Ficha nao alterada. razao: cloneOnlyNews=true");
                            }

                        }
                        else
                        {
                            foundnprog.add(cu.getCode());
                            1.5.0/docs/api/java/lang/String.html">String msgN = "FOUND OLD Unit siges: " + cu.getCode() + " OK but NO program to clone";
                            logger.warn(msgN);
                            serviceLogWarn(msgN);
                        }
                    }
                    else
                    {
                        nfound.add(cu.getCode());
                        1.5.0/docs/api/java/lang/String.html">String msg = "NOT FOUND OLD for - Unit siges: " + cu.getCode();
                        logger.info(msg);
                        serviceLogWarn(msg);
                    }
                }
                else
                {
                    notChangedNotNew.add(cu.getCode());
                    serviceLogInfo("Ficha nao alterada. razao: cloneOnlyNews=true");
                    if(generateAllPdfs)
                    {
                       List<String> errors = new ArrayList<String>();
                       if(cu.getCourseUnitProgram() != null)
                            service.createPdf(cu,errors);
                    }
                }

                //cu.setValidProgram(true);
            }
            setProgress(100);
            logger.info("######################################");
            serviceLogInfo("######################################");
            logger.info("######################################");
            serviceLogInfo("######################################");
            logger.info("STATS " + year);
            serviceLogInfo("STATS " + year);
            logger.info("Total Analisadas: " + foundTotal);
            serviceLogInfo("Total Analisadas: " + foundTotal);
            logger.info("CANDIDATAS - Unidades antigas encontrada com programa : " + found);
            serviceLogInfo("CANDIDATAS - Unidades antigas encontrada com programa : " + found);
            logger.info("NADA FEITO - Unidade antiga encontrada mas sem programa: " + foundnprog.size());
            serviceLogInfo("NADA FEITO - Unidade antiga encontrada mas sem programa: " + foundnprog.size());
            logger.info("NADA FEITO - Unidade antiga nao encontrada: " + nfound.size());
            serviceLogInfo("NADA FEITO - Unidade antiga nao encontrada: " + nfound.size());
            logger.info("OK - Programas CLONADOS: " + updated);
            serviceLogInfo("OK - Programas CLONADOS: " + updated);
            logger.info("NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS: " + naoAfectadasPermissao.size());
            serviceLogInfo("NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS: " + naoAfectadasPermissao.size());



            if(cloneOnlyNews)
            {
                logger.info("NAO PERMITIDA (cloneOnlyNews = true) - Nao alterada por ja existir programa: " + notChangedNotNew.size());
                serviceLogInfo("NAO PERMITIDA (cloneOnlyNews = true) - Nao alterada por ja existir programa: " + notChangedNotNew.size());
            }

            logger.info("######################################");
            logger.info("###NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS (SIGES CODE):");
            serviceLogInfo("######################################");
            serviceLogInfo("###NAO CLONADOS - NAO PERMITIDOS JA EXISTIAM VALIDADOS (SIGES CODE):");
            for(1.5.0/docs/api/java/lang/String.html">String c : naoAfectadasPermissao)
            {
                logger.info(c);
                serviceLogInfo(c);
            }
            logger.info("###OK - Programas CLONADOS (SIGES CODE):");
            serviceLogInfo("###OK - Programas CLONADOS (SIGES CODE):");
            for(1.5.0/docs/api/java/lang/String.html">String c : clonados)
            {
                logger.info(c);
                serviceLogInfo(c);
            }

            logger.info("###NADA FEITO - Unidade antiga encontrada sem programa (SIGES CODE):");
            serviceLogInfo("###NADA FEITO - Unidade antiga encontrada sem programa (SIGES CODE):");
            for(1.5.0/docs/api/java/lang/String.html">String c : foundnprog)
            {
                logger.info(c);
                serviceLogInfo(c);
            }
            logger.info("###NADA FEITO -  Unidade antiga nao encontrada (SIGES CODE):");
            serviceLogInfo("###NADA FEITO -  Unidade antiga nao encontrada (SIGES CODE):");
            for(1.5.0/docs/api/java/lang/String.html">String c : nfound)
            {
                logger.info(c);
                serviceLogInfo(c);
            }

            if(cloneOnlyNews)
            {
                logger.info("###NAO PERMITIDA (cloneOnlyNews) - Nao alterada por ja existir programa (SIGES CODE):");
                serviceLogInfo("###NAO PERMITIDA (cloneOnlyNews) - Nao alterada por ja existir programa (SIGES CODE):");
                for(1.5.0/docs/api/java/lang/String.html">String c : notChangedNotNew)
                {
                    logger.info(c);
                    serviceLogInfo(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));
            serviceLogError(e.toString(),e);
        }
        logger.info("terminating programs sincronization");
        serviceLogInfo("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);
        }
        CourseUnitProgramImpl cProgram = (CourseUnitProgramImpl) DaoFactory.getCourseUnitProgramDaoImpl().narrow(cuInto.getCourseUnitProgram());
        cProgram.cloneFrom(cuFrom.getCourseUnitProgram());
        DaoFactory.getCourseUnitProgramDaoImpl().saveOrUpdate((cuInto.getCourseUnitProgram()));
        DaoFactory.getCourseUnitProgramPart2DaoImpl().saveOrUpdate((cuInto.getCourseUnitProgram()).getCourseUnitProgramPart2());

        SaveCourseUnitProgram service = new SaveCourseUnitProgram();
        List<String> errors = new ArrayList<String>();
        try {
            //Cria PDF's e envia-os para o i.online
            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 = DaoFactory.getConfigurationDaoImpl().getImportsDefaultImportYearCreateTransaction();
        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]);
        1.5.0/docs/api/java/lang/String.html">String semestre = null;
        if(args != null && args.length > 2)
            semestre = args[3];
        else
            throw new ServiceException("Nao pode correr este serviço sem escolher semestre");

        AbstractDao.getCurrentSession().beginTransaction();
        new SincronizeLastYearCourseUnitProgramsService().run(year,semestre,cloneOnlyNews,generateAllPdfs);
        AbstractDao.getCurrentSession().getTransaction().commit();
    }



    /**
     * Parameters for ServiceJob
     * importYear : String
     * cloneOnlyNews : Boolean
     * generateAllPdfs : Boolean
     *
     * @throws Throwable
     */

    @1.5.0/docs/api/java/lang/Override.html">Override
    protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable
    {
        1.5.0/docs/api/java/lang/String.html">String importYear =  getParametersMap().get(JOB_importYear_KEY).getObject();
        1.5.0/docs/api/java/lang/String.html">String semestre =  getParametersMap().get(JOB_semestre_KEY).getObject();
        1.5.0/docs/api/java/lang/String.html">String cloneOnlyNewsStr = getParametersMap().get(JOB_cloneOnlyNews_KEY).getObject();
        1.5.0/docs/api/java/lang/String.html">String generateAllPdfsStr = getParametersMap().get(JOB_generateAllPdfs_KEY).getObject();
        1.5.0/docs/api/java/lang/String.html">String validateStr = getParametersMap().get(JOB_validate_KEY).getObject();
        boolean cloneOnlyNews = cloneOnlyNewsStr != null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(cloneOnlyNewsStr);
        boolean generateAllPdfs = generateAllPdfsStr != null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(generateAllPdfsStr);
        boolean validate = validateStr != null && 1.5.0/docs/api/java/lang/Boolean.html">Boolean.parseBoolean(validateStr);
        return run(importYear,semestre,cloneOnlyNews,generateAllPdfs,validate);
    }

}