Subversion Repositories bacoAlunos

Rev

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

package pt.estgp.estgweb.services.sigesimports;

import jomm.dao.impl.AbstractDao;
import jomm.utils.TemplateUtils;
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.enums.LangEnum;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
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.services.sms.SMSJob;
import pt.ipportalegre.siges.web.services.ArrayOfNota;
import pt.ipportalegre.siges.web.services.Nota;
import pt.ipportalegre.siges.web.services.SiGesWEB;
import pt.utl.ist.berserk.logic.serviceManager.IService;

import javax.xml.namespace.QName;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * @author Jorge Machado
 * @date 11/May/2008
 * @time 12:51:32
 * @see pt.estgp.estgweb
 */

public class ImportGradesService 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(ImportGradesService.class);

    private static final int MAX_COMMIT = 20;

    private HashMap<Long,List<Long>> newGrades = new HashMap<Long,List<Long>>();

    public ILogMessages run(1.5.0/docs/api/java/lang/String.html">String year) throws ServiceException
    {
        DefaultLogMessages logMessages = new DefaultLogMessages();
        logMessages.addMessage(new DefaultLogMessage("import.grades", LogMessageTypeEnum.INFO, "instituicao " + DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode() + " ano : "  + year));
        logger.info(logMessages.getLastMessage());
        serviceLogInfo(logMessages.getLastMessage());
        Map<Integer,Integer> alunos = new HashMap<Integer,Integer>();
        Map<String,String> alunoCadeira = new HashMap<String,String>();

        int foundTotal = 0;

        try
        {
            logger.info("Loading Epocas de avaliacao");
            serviceLogInfo("Loading Epocas de avaliacao");
            List<ConfigurationGradesEpocaAvaliacao> epocas = DaoFactory.getConfigurationGradesEpocaAvaliacaoDaoImpl().findAll();
            if(epocas == null || epocas.size() == 0)
            {
                logMessages.addMessage(new DefaultLogMessage("import.grades",LogMessageTypeEnum.WARNING,"Sem Epocas de Avaliacao, por favor adicione as epocas ao sistema"));
                logger.warn(logMessages.getLastMessage());
                serviceLogWarn(logMessages.getLastMessage());
                return logMessages;
            }
            List<ConfigurationGradesStatusEpoca> statusEpocas = DaoFactory.getConfigurationGradesStatusEpocaDaoImpl().findAll();
            if(statusEpocas == null || statusEpocas.size() == 0)
            {
                logMessages.addMessage(new DefaultLogMessage("import.grades",LogMessageTypeEnum.WARNING,"Sem Status de epocas de avaliacao, por favor adicione as epocas ao sistema"));
                logger.warn(logMessages.getLastMessage());
                serviceLogWarn(logMessages.getLastMessage());
                return logMessages;
            }
            HashMap<String,String> mapaEpocasAvaliacao = new HashMap<String, String>();
            for(ConfigurationGradesEpocaAvaliacao epoca: epocas)
            {
                mapaEpocasAvaliacao.put(epoca.getCodigoEpoca() + "-" + epoca.getCodigoMomento(), epoca.getDescricao());
            }

            HashMap<String,String> mapaStatusEpocas = new HashMap<String, String>();
            for(ConfigurationGradesStatusEpoca statusEpoca: statusEpocas)
            {
                mapaStatusEpocas.put(statusEpoca.getStatus(), statusEpoca.getDescricao());
            }

            //AbstractDao.getCurrentSession().beginTransaction();
            1.5.0/docs/api/java/lang/String.html">String WSDL = DaoFactory.getConfigurationDaoImpl().getSigesWebServicesWsdl();
            SiGesWEB service;
            try
            {
                service = new SiGesWEB(new 1.5.0/docs/api/java/net/URL.html">URL(WSDL), new 1.5.0/docs/api/javax/xml/namespace/QName.html">QName(Globals.SIGES_WEBSERVICE_TARGET_NAMESPACE, "SiGesWEB"));
            }
            catch (1.5.0/docs/api/java/net/MalformedURLException.html">MalformedURLException e)
            {
                logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(),"erro na configuracao do WEB Service", LogMessageTypeEnum.INFO));
                logger.fatal(e, e);
                serviceLogFatal(logMessages.getLastMessage());
                return logMessages;
            }
            ArrayOfNota arrayOfNotas = service.getSiGesWEBSoap().getNotas(new 1.5.0/docs/api/java/math/BigDecimal.html">BigDecimal(DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()), year);
            List<Nota> notas = arrayOfNotas.getNota();

            int i = 0;
            for (Nota nota : notas)
            {
                foundTotal++;
                if (i++ > MAX_COMMIT)
                {
                    i = 0;
                    setProgress((int) (((float)foundTotal)/((float)notas.size())*100.0f));
                    commitPartially();
                }

                /**
                 *     n.codigo_aluno = getDecimal("CD_ALUNO",aReader);   -----  OK
                 n.codigo_curso = getDecimal("CD_CURSO", aReader);  -----  OK
                 n.codigo_disciplina = getDecimal("CD_DISCIP", aReader);-  OK
                 n.nota = getDecimal("NR_AVALIA", aReader);    ----------  OK
                 n.data_avaliacao = getDateTime("DT_AVALIA", aReader);  -  OK
                 n.status_epoca = getDecimal("CD_STA_EPO", aReader);   --  OK
                 n.cd_duracao = getString("CD_DURACAO",aReader); - ------  OK
                 */


                int codAluno = nota.getCodigoAluno().intValue();
                alunos.put(codAluno,codAluno);
                int codUnidade = nota.getCodigoDisciplina().intValue();
                alunoCadeira.put(codAluno + "$" + codUnidade,codAluno + "$" + codUnidade);
                int codCurso = nota.getCodigoCurso().intValue();
                1.5.0/docs/api/java/lang/String.html">String cdDuracao = nota.getCdDuracao();
                int valor = nota.getNota().intValue();
                int statusEpoca = nota.getStatusEpoca().intValue();
                5+0%2Fdocs%2Fapi+Date">Date data = nota.getDataAvaliacao().toGregorianCalendar().getTime();
                int momento = nota.getMomentoAvaliacao().intValue();
                int epoca = nota.getEpocaAvaliacao().intValue();
                //boolean eFinal = nota.get

                1.5.0/docs/api/java/lang/String.html">String descricaoEpoca = mapaEpocasAvaliacao.get(epoca + "-" + momento);
                1.5.0/docs/api/java/lang/String.html">String descricaoStatusEpoca = mapaStatusEpocas.get(""+statusEpoca) == null ? ""+statusEpoca : mapaStatusEpocas.get(statusEpoca+"");

                Student s = DaoFactory.getStudentDaoImpl().loadBySigesCode(codAluno);

                if(descricaoEpoca!= null && s != null)
                {
                    CourseUnit courseUnit;
                    try{

                        courseUnit = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + codUnidade, "" + codCurso,cdDuracao,year);
                        if(courseUnit != null)
                        {
                            CourseUnitGrade grade = DaoFactory.getCourseUnitGradeDaoImpl().find(courseUnit.getId(),s.getId(),""+momento,""+epoca);
                            if(grade == null)
                            {
                                grade = DomainObjectFactory.createCourseUnitGradeImpl();
                                grade.setStudent(s);
                                grade.setCourseUnit(courseUnit);
                                grade.setNormalizedCourseUnitName(courseUnit.getNormalizedName());
                                grade.setImportYear(year);
                                grade.setCodigoEpoca("" + epoca);
                                grade.setCodigoMomento("" + momento);
                                grade.setDescEpoca(descricaoEpoca);
                                grade.setStatusEpoca(statusEpoca);
                                grade.setDescStatusEpoca(descricaoStatusEpoca);
                                DaoFactory.getCourseUnitGradeDaoImpl().save(grade);

                                if(grade.getGrade() >= 0)
                                    addGrade(grade);
                            }
                            if(grade.getGrade() != valor || grade.getStatusEpoca() != statusEpoca || (grade.getPublishDate() != null && grade.getPublishDate().getTime() != data.getTime()))
                            {
                                grade.setPublishDate(data);
                                grade.setGrade(valor);
                                grade.setStatusEpoca(statusEpoca);
                                grade.setDescStatusEpoca(descricaoStatusEpoca);
                                if(grade.getGrade() >= 0)
                                    addGrade(grade);
                            }

                        }
                        else
                        {
                            logMessages.addMessage(new DefaultLogMessage("import.warning","","CourseUnit: " + codUnidade + " course: " + codCurso  + " searching for student"  + s.getSigesCode() + " semestre: " + cdDuracao + " year: " + year + " does not exist", LogMessageTypeEnum.WARNING));
                            logger.warn(logMessages.getLastMessage());
                            serviceLogWarn(logMessages.getLastMessage());
                        }
                    }catch(1.5.0/docs/api/java/lang/Exception.html">Exception e)
                    {

                        logMessages.addMessage(new DefaultLogMessage("import.warning","","Error :  unit:" + codUnidade +  " course:" + codCurso + " student:" + s.getId(), LogMessageTypeEnum.WARNING));
                        logger.warn(logMessages.getLastMessage());
                        serviceLogWarn(logMessages.getLastMessage());
                    }

                }
                else
                {
                    if(descricaoEpoca == null)
                    {
                        logMessages.addMessage(new DefaultLogMessage("import.warning","",epoca + "-" + momento + " nao esta catalogada para atribuicao de nota", LogMessageTypeEnum.WARNING));
                        logger.info(logMessages.getLastMessage());
                        serviceLogInfo(logMessages.getLastMessage());
                    }else
                    {
                        logMessages.addMessage(new DefaultLogMessage("import.warning","","Student: " + codAluno + " does not exist", LogMessageTypeEnum.WARNING));
                        logger.warn(logMessages.getLastMessage());
                        serviceLogWarn(logMessages.getLastMessage());
                    }

                }

            }
            sendSms(null);
            sendEmail(null);


            //AbstractDao.getCurrentSession().getTransaction().commit();
        }
        catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            logger.error(e, e);


            //AbstractDao.getCurrentSession().getTransaction().rollback();
            logMessages.addMessage(new DefaultLogMessage("import.error", e.toString(), "see log for details", LogMessageTypeEnum.ERROR));
            serviceLogError(logMessages.getLastMessage());
            throw new ServiceException(e.toString(), e);
        }
        setProgress(100);
        logger.info("######################################");
        serviceLogInfo("######################################");
        logger.info("######################################");
        serviceLogInfo("######################################");
        logger.info("STATS " + year);
        serviceLogInfo("STATS " + year);
        logger.info("Total Notas: " + foundTotal);
        serviceLogInfo("Total Notas: " + foundTotal);
        logger.info("Alunos: " + alunos.size());
        serviceLogInfo("Alunos: " + alunos.size());
        logger.info("Notas de Alunos em cadeiras: " + alunoCadeira.size());
        serviceLogInfo("Notas de Alunos em cadeiras: " + alunoCadeira.size());



        logMessages.addMessage(new DefaultLogMessage("import.teachers.terminating", LogMessageTypeEnum.INFO));
        logger.info(logMessages.getLastMessage());
        serviceLogInfo(logMessages.getLastMessage());
        return logMessages;
    }

    private void addGrade(CourseUnitGrade grade)
    {
        List<Long> studentGrades = newGrades.get(grade.getStudent().getId());
        if(studentGrades == null)
        {
            studentGrades = new ArrayList<Long>();
            newGrades.put(grade.getStudent().getId(),studentGrades);
        }
        studentGrades.add(grade.getId());
    }

    private void sendSms(UserSession userSession)
    {
        if(Globals.SMS_NEW_GRADES && newGrades.size() > 0)
        {
            Set<Map.Entry<Long,List<Long>>> set = newGrades.entrySet();
            for(1.5.0/docs/api/java/util/Map.html">Map.Entry<Long,List<Long>> entry: set)
            {
                long studentId = entry.getKey();
                List<Long> studentGrades = entry.getValue();
                Student s = DaoFactory.getStudentDaoImpl().get(studentId);
                if(SMSJob.validPhoneNumber(s.getPhonenumber()))
                {
                    1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder gradesBuilder = new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
                    for(long gradeId: studentGrades)
                    {
                        CourseUnitGrade grade = DaoFactory.getCourseUnitGradeDaoImpl().get(gradeId);
                        1.5.0/docs/api/java/lang/String.html">String gradeStr = TemplateUtils.formatMessageTemplate(Globals.TEMPLATE_SMS_NEW_GRADE,new 1.5.0/docs/api/java/lang/String.html">String[]{grade.getNormalizedCourseUnitName(),""+grade.getGrade()});
                        gradesBuilder.append(gradeStr);
                    }
                    SMSJob smsJob = new SMSJob(s,new 1.5.0/docs/api/java/lang/String.html">String[]{gradesBuilder.toString()},Globals.TEMPLATE_SMS_NEW_GRADES);
                    JobScheduleService.getInstance().scheduleNow(smsJob,"New Grades SMS: to" + s.getUsername(),userSession);
                }
            }
        }
    }
    public static SendEmailService sendEmailService = new SendEmailService();

    private void sendEmail(UserSession userSession)
    {

        if(Globals.EMAIL_NEW_GRADES && newGrades.size() > 0)
        {
            Set<Map.Entry<Long,List<Long>>> set = newGrades.entrySet();
            for(1.5.0/docs/api/java/util/Map.html">Map.Entry<Long,List<Long>> entry: set)
            {
                long studentId = entry.getKey();
                List<Long> studentGrades = entry.getValue();
                Student s = DaoFactory.getStudentDaoImpl().get(studentId);

                List<String[]> gradesArray = new ArrayList<String[]>();
                for(long gradeId: studentGrades)
                {
                    CourseUnitGrade grade = DaoFactory.getCourseUnitGradeDaoImpl().get(gradeId);
                    1.5.0/docs/api/java/lang/String.html">String[] gradeArray = new 1.5.0/docs/api/java/lang/String.html">String[] {grade.getNormalizedCourseUnitName(),""+grade.getGrade(),grade.getDescEpoca()};
                    gradesArray.add(gradeArray);
                }
                EMAILJob emailJob = new EMAILJob(sendEmailService.getNewGradesEmail(gradesArray, LangEnum.PORTUGUESE,s.getEmail(),s.getName()));
                JobScheduleService.getInstance().scheduleNow(emailJob,"New Grades EMAIL: to" + s.getUsername(),userSession);
            }
        }
    }


    /**
     * Testar por aqui poi requer Super Role e assim e' autmatico
     *
     * @param args of main
     * @throws pt.estgp.estgweb.services.expceptions.ServiceException on error
     */

    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];
        AbstractDao.getCurrentSession().beginTransaction();
        new ImportGradesService().run(year);
        AbstractDao.getCurrentSession().getTransaction().commit();
    }


    @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();
        return run(importYear);
    }
}