Subversion Repositories bacoAlunos

Rev

Rev 1312 | Rev 1315 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
110 susana 1
package pt.estgp.estgweb.services.sigesimports;
2
 
165 jmachado 3
import jomm.dao.impl.AbstractDao;
4
import org.apache.log4j.Logger;
5
import pt.estgp.estgweb.Globals;
1312 jmachado 6
import pt.estgp.estgweb.domain.*;
995 jmachado 7
import pt.estgp.estgweb.domain.dao.DaoFactory;
214 jmachado 8
import pt.estgp.estgweb.domain.views.CourseView;
995 jmachado 9
import pt.estgp.estgweb.services.courses.CoursesService;
10
import pt.estgp.estgweb.services.email.SendEmailService;
165 jmachado 11
import pt.estgp.estgweb.services.expceptions.ServiceException;
995 jmachado 12
import pt.estgp.estgweb.services.jobs.ServiceJob;
165 jmachado 13
import pt.estgp.estgweb.services.logresults.ILogMessages;
14
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
15
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
16
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
1296 jmachado 17
import pt.estgp.estgweb.services.sigesimports.oracle.dao.DisciplinaDao;
18
import pt.estgp.estgweb.services.sigesimports.oracle.dao.connection.ConnectionManager;
19
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Disciplina;
1312 jmachado 20
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasHorario;
21
import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasSumario;
995 jmachado 22
import pt.estgp.estgweb.utils.ConfigProperties;
863 jmachado 23
import pt.estgp.estgweb.utils.Email;
110 susana 24
import pt.utl.ist.berserk.logic.serviceManager.IService;
25
 
1296 jmachado 26
import java.sql.Connection;
27
import java.sql.SQLException;
863 jmachado 28
import java.util.*;
110 susana 29
 
30
/**
31
 * @author Jorge Machado
32
 */
995 jmachado 33
public class ImportCourseService extends ServiceJob implements IService
163 jmachado 34
{
110 susana 35
    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(ImportCourseService.class);
36
 
214 jmachado 37
    private CoursesService coursesService = new CoursesService();
38
 
995 jmachado 39
    int newUnits = 0;
40
    int newCourses = 0;
1277 jmachado 41
    int unitsRepeated = 0;
1296 jmachado 42
    int unitsAtualizadas = 0;
1312 jmachado 43
    int turmasSeparadasComInconsistencias = 0;
44
    int turmasSeparadasTratadasOk = 0;
45
    int erroGraveAObterTipologias = 0;
46
    static Map<String,Boolean> courseYearTurmasPolicy = new HashMap<String, Boolean>();
47
 
48
    public static void resetCourseYearTurmaPolicy()
110 susana 49
    {
1312 jmachado 50
        courseYearTurmasPolicy.clear();
51
    }
52
 
53
    public ILogMessages run(1.5.0/docs/api/java/lang/String.html">String year,int institutionCode) throws ServiceException
54
    {
55
        1.5.0/docs/api/java/lang/String.html">String msgS = "STARTING COURSES IMPORT SERVICE FOR YEAR: " + year + " " + institutionCode;
995 jmachado 56
        serviceLogInfo(msgS);
57
        logger.info(msgS);
110 susana 58
 
995 jmachado 59
        newUnits = 0;
60
        newCourses = 0;
1277 jmachado 61
        unitsRepeated = 0;
1296 jmachado 62
        unitsAtualizadas = 0;
1312 jmachado 63
        turmasSeparadasComInconsistencias = 0;
64
        turmasSeparadasTratadasOk = 0;
65
        erroGraveAObterTipologias=0;
66
        resetCourseYearTurmaPolicy();
995 jmachado 67
 
165 jmachado 68
        DefaultLogMessages logMessages = new DefaultLogMessages();
69
        try
110 susana 70
        {
1312 jmachado 71
            logMessages.addMessage(new DefaultLogMessage("import.semestre.separated", LogMessageTypeEnum.INFO, "instituicao " + institutionCode));
995 jmachado 72
            serviceLogInfo(logMessages.getLastMessage());
110 susana 73
 
165 jmachado 74
            HashMap<String, Disciplina> disciplinasMap = new HashMap<String, Disciplina>();
75
            HashMap<String, Disciplina> disciplinasMapS1 = new HashMap<String, Disciplina>();
76
            HashMap<String, Disciplina> disciplinasMapS2 = new HashMap<String, Disciplina>();
727 jmachado 77
            HashMap<String, Disciplina> disciplinasMapA = new HashMap<String, Disciplina>();
1040 jmachado 78
            HashMap<String, Disciplina> disciplinasMapT1 = new HashMap<String, Disciplina>();
79
            HashMap<String, Disciplina> disciplinasMapT2 = new HashMap<String, Disciplina>();
80
            HashMap<String, Disciplina> disciplinasMapT3 = new HashMap<String, Disciplina>();
81
            HashMap<String, Disciplina> disciplinasMapT4 = new HashMap<String, Disciplina>();
345 jmachado 82
            HashMap<String, Disciplina> cursosMap = new HashMap<String, Disciplina>();
163 jmachado 83
 
165 jmachado 84
            /**
85
             * Build Course Units Maps
86
             */
1296 jmachado 87
            /*SiGesWEB service;
1017 jmachado 88
            String WSDL = DaoFactory.getConfigurationDaoImpl().getSigesWebServicesWsdl();
165 jmachado 89
            try
90
            {
1017 jmachado 91
                serviceLogInfo("STARTING WEB SERVICE AT " + WSDL);
92
                service = new SiGesWEB(new URL(WSDL), new QName(Globals.SIGES_WEBSERVICE_TARGET_NAMESPACE, "SiGesWEB"));
165 jmachado 93
            }
94
            catch (MalformedURLException e)
95
            {
96
                logger.fatal(e, e);
97
                logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(),"erro na configuracao do WEB Service", LogMessageTypeEnum.INFO));
995 jmachado 98
                serviceLogError(logMessages.getLastMessage(), e);
165 jmachado 99
                return logMessages;
100
            }
1296 jmachado 101
            */
102
            DisciplinaDao service = DisciplinaDao.getInstance();
103
            1.5.0/docs/api/java/sql/Connection.html">Connection conn = ConnectionManager.openConnection();
163 jmachado 104
 
1312 jmachado 105
            importUnitsSemestre(service,conn, "S1", year,institutionCode, disciplinasMap, disciplinasMapS1, cursosMap, logMessages);
106
            importUnitsSemestre(service,conn, "S2", year,institutionCode, disciplinasMap, disciplinasMapS2, cursosMap, logMessages);
107
            importUnitsSemestre(service,conn, "A", year,institutionCode, disciplinasMap, disciplinasMapA, cursosMap, logMessages);
108
            importUnitsSemestre(service,conn, "T1", year,institutionCode, disciplinasMap, disciplinasMapT1, cursosMap, logMessages);
109
            importUnitsSemestre(service,conn, "T2", year,institutionCode, disciplinasMap, disciplinasMapT2, cursosMap, logMessages);
110
            importUnitsSemestre(service,conn, "T3", year,institutionCode, disciplinasMap, disciplinasMapT3, cursosMap, logMessages);
111
            importUnitsSemestre(service,conn, "T4", year,institutionCode, disciplinasMap, disciplinasMapT4, cursosMap, logMessages);
1115 jmachado 112
 
165 jmachado 113
            /**
114
             * Import Courses
115
             */
116
            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.courses", LogMessageTypeEnum.INFO));
995 jmachado 117
            serviceLogInfo("updating courses");
165 jmachado 118
            logger.info("updating courses");
345 jmachado 119
            Set<Map.Entry<String, Disciplina>> set2 = cursosMap.entrySet();
120
            for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set2)
165 jmachado 121
            {
122
                Disciplina d = entry.getValue();
214 jmachado 123
                CourseView c = coursesService.loadCourseByCode("" + d.getCodigoCurso().intValue(),false);
124
 
125
//                Course c = DaoFactory.getCourseDaoImpl().findCourseByCode("" + d.getCodigoCurso());
219 jmachado 126
                if (c == null)
127
                {
128
                    c = new CourseView();
995 jmachado 129
                    newCourses++;
130
                    serviceLogInfo("New Course Found: (" +  d.getCodigoCurso() + ") " + d.getNomeCurso());
214 jmachado 131
//                    DaoFactory.getCourseDaoImpl().save(c);
219 jmachado 132
                }
165 jmachado 133
                c.setName(d.getNomeCurso());
1189 jmachado 134
                if(d.getGrauCurso() == null || d.getGrauCurso().trim().length() == 0)
135
                    d.setGrauCurso("unknown");
409 jmachado 136
                1.5.0/docs/api/java/lang/String.html">String grauBaco = ConfigProperties.getProperty("siges.degree."+d.getGrauCurso());
1189 jmachado 137
 
138
                c.setDegree(grauBaco);
165 jmachado 139
                c.setCode("" + d.getCodigoCurso().intValue());
206 jmachado 140
                c.setImportYear(year);
165 jmachado 141
                c.setInstitutionalCode("" + d.getCodigoInstituicao().intValue());
214 jmachado 142
                coursesService.submitCourse(c,null,null,0,null,null);
165 jmachado 143
            }
163 jmachado 144
 
165 jmachado 145
            /**
146
             * Update Course Units
147
             */
1312 jmachado 148
            updateCourseUnits(disciplinasMapS1, "S1",logMessages,year,institutionCode,service,conn);
149
            updateCourseUnits(disciplinasMapS2, "S2",logMessages,year,institutionCode,service,conn);
150
            updateCourseUnits(disciplinasMapA, "A",logMessages,year,institutionCode,service,conn);
151
            updateCourseUnits(disciplinasMapT1, "T1",logMessages,year,institutionCode,service,conn);
152
            updateCourseUnits(disciplinasMapT2, "T2",logMessages,year,institutionCode,service,conn);
153
            updateCourseUnits(disciplinasMapT3, "T3",logMessages,year,institutionCode,service,conn);
154
            updateCourseUnits(disciplinasMapT4, "T4",logMessages,year,institutionCode,service,conn);
995 jmachado 155
 
1296 jmachado 156
            conn.close();
157
 
995 jmachado 158
            serviceLogInfo("######################################");
159
            serviceLogInfo("######################################");
160
            serviceLogInfo("#Courses Imported:" + cursosMap.size());
161
            serviceLogInfo("#Units Imported S1:" + disciplinasMapS1.size());
162
            serviceLogInfo("#Units Imported S2:" + disciplinasMapS2.size());
163
            serviceLogInfo("#Units Imported A:" + disciplinasMapA.size());
1040 jmachado 164
            serviceLogInfo("#Units Imported T1:" + disciplinasMapT1.size());
165
            serviceLogInfo("#Units Imported T2:" + disciplinasMapT2.size());
166
            serviceLogInfo("#Units Imported T3:" + disciplinasMapT3.size());
167
            serviceLogInfo("#Units Imported T4:" + disciplinasMapT4.size());
995 jmachado 168
            serviceLogInfo("#New Courses Found:" + newCourses);
169
            serviceLogInfo("#New Units Found:" + newUnits);
1296 jmachado 170
            serviceLogInfo("#Regular Updated Units:" + unitsAtualizadas);
171
            serviceLogInfo("#Unidades Repetidas (A mesma para o conjunto (Codigo,Curso,Ano,Semestre)):" + unitsRepeated);
1312 jmachado 172
            serviceLogInfo("#Turmas Separadas Tratadas com sucesso:" + turmasSeparadasTratadasOk);
173
            if(turmasSeparadasComInconsistencias > 0)
174
            {
175
                serviceLogInfo("!!!CHECK IN LOG######Units with Courses with Turmas Separadas with problems:" + turmasSeparadasComInconsistencias);
176
            }
177
            if(erroGraveAObterTipologias > 0)
178
            {
179
                serviceLogInfo("!!!Na trasnformacao do JSON em class nas tipologias:" + erroGraveAObterTipologias);
180
            }
995 jmachado 181
 
1025 jmachado 182
            logger.info("######################################");
183
            logger.info("######################################");
184
            logger.info("#Courses Imported:" + cursosMap.size());
185
            logger.info("#Units Imported S1:" + disciplinasMapS1.size());
186
            logger.info("#Units Imported S2:" + disciplinasMapS2.size());
187
            logger.info("#Units Imported A:" + disciplinasMapA.size());
1040 jmachado 188
            logger.info("#Units Imported T1:" + disciplinasMapT1.size());
189
            logger.info("#Units Imported T2:" + disciplinasMapT2.size());
190
            logger.info("#Units Imported T3:" + disciplinasMapT3.size());
191
            logger.info("#Units Imported T4:" + disciplinasMapT4.size());
1025 jmachado 192
            logger.info("#New Courses Found:" + newCourses);
193
            logger.info("#New Units Found:" + newUnits);
1296 jmachado 194
            logger.info("#Regular Updated Units:" + unitsAtualizadas);
195
            logger.info("#Unidades Repetidas (A mesma para o conjunto (Codigo,Curso,Ano,Semestre)):" + unitsRepeated);
1312 jmachado 196
            logger.info("#Turmas Separadas Tratadas com sucesso:" + turmasSeparadasTratadasOk);
197
            if(turmasSeparadasComInconsistencias > 0)
198
            {
199
                logger.info("!!!CHECK IN LOG######Units with Courses with Turmas Separadas with problems:" + turmasSeparadasComInconsistencias);
200
            }
201
            if(erroGraveAObterTipologias > 0)
202
            {
203
                logger.info("!!!Na trasnformacao do JSON em class nas tipologias:" + erroGraveAObterTipologias);
204
            }
995 jmachado 205
 
1025 jmachado 206
 
110 susana 207
        }
165 jmachado 208
        catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
110 susana 209
        {
358 jmachado 210
            logger.error(e,e);
211
            logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(), "see log for details", LogMessageTypeEnum.ERROR));
995 jmachado 212
            serviceLogError(logMessages.getLastMessage(), e);
863 jmachado 213
            1.5.0/docs/api/java/lang/String.html">String cause = e.getCause() == null ? "" : e.getCause().toString();
1000 jmachado 214
            sendNotificationAdmin("Erro na importacao de sumarios",cause);
110 susana 215
        }
358 jmachado 216
        logger.info("terminating course import");
995 jmachado 217
        serviceLogInfo("terminating course import");
165 jmachado 218
        logMessages.addMessage(new DefaultLogMessage("import.course.terminating", LogMessageTypeEnum.INFO));
995 jmachado 219
        setProgress(100);
165 jmachado 220
        return logMessages;
221
    }
110 susana 222
 
1000 jmachado 223
    /**
224
     * Envio de Notificação aos operadores do CI
225
     * @param subject
226
     * @param cause
227
     */
228
    private void sendNotificationAdmin(1.5.0/docs/api/java/lang/String.html">String subject, 1.5.0/docs/api/java/lang/String.html">String cause)
229
    {
230
 
1024 jmachado 231
 
1000 jmachado 232
        List<String> emails = ConfigProperties.getListValues("admin.email");
233
        for(1.5.0/docs/api/java/lang/String.html">String email:emails)
234
        {
235
            serviceLogWarn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email);
236
            logger.warn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email);
237
        }
238
        List<String> arguments = new ArrayList<String>();
239
        arguments.add(cause.replace("\n","<br/>"));
240
        Email email = new Email(subject,emails,Globals.SYSTEM_EMAIL_BOX,"messageToAdmin_pt.txt",arguments);
1029 jmachado 241
        email.setHtml(true);
1000 jmachado 242
        try {
243
            new SendEmailService().sendEmail(email);
244
        } catch (ServiceException e) {
245
            e.printStackTrace();
246
        }
247
 
248
    }
249
 
1312 jmachado 250
 
251
 
252
    /**
253
     * This method loads turmas separated policy from CourseYear
254
     * uses the cache courseYearTurmasPolicy
255
     * @param codigoDoCurso
256
     * @param year
257
     * @param logMessages
258
     * @return
259
     */
260
    protected static boolean loadCourseYearTurmasPolicy(int codigoDoCurso,1.5.0/docs/api/java/lang/String.html">String year,DefaultLogMessages logMessages,ServiceJob service) {
261
 
262
        1.5.0/docs/api/java/lang/Boolean.html">Boolean turmasSeparated = courseYearTurmasPolicy.get(codigoDoCurso + "-" + year);
263
        if(turmasSeparated != null)
264
            return turmasSeparated;
265
 
266
        List<CourseYear> courseYears = DaoFactory.getCourseYearDaoImpl().findCourseYear(""+codigoDoCurso,year);
267
        if(courseYears == null || courseYears.size() == 0)
268
        {
269
            checkOrCreateCourseYear(logMessages, year, "" + codigoDoCurso, service);
270
            courseYears = DaoFactory.getCourseYearDaoImpl().findCourseYear(""+codigoDoCurso,year);
271
        }
272
        if(courseYears != null && courseYears.size() > 0)
273
        {
274
            CourseYear cY = courseYears.get(0);
275
            courseYearTurmasPolicy.put(codigoDoCurso + "-" + year,cY.isSeparatedTurmas());
276
            return cY.isSeparatedTurmas();
277
        }
278
        return false;
279
    }
280
 
1296 jmachado 281
    private void importUnitsSemestre(DisciplinaDao service,
282
                                     1.5.0/docs/api/java/sql/Connection.html">Connection conn,
165 jmachado 283
                                     1.5.0/docs/api/java/lang/String.html">String semestre,
284
                                     1.5.0/docs/api/java/lang/String.html">String year,
1312 jmachado 285
                                     int institutionCode,
165 jmachado 286
                                     HashMap<String, Disciplina> disciplinasMap,
287
                                     HashMap<String, Disciplina> disciplinasMapSemestre,
345 jmachado 288
                                     HashMap<String, Disciplina> cursosMap,
1296 jmachado 289
                                     DefaultLogMessages logMessages) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
1115 jmachado 290
 
291
 
165 jmachado 292
        logMessages.addMessage(new DefaultLogMessage("import.semestre.course.units." + semestre, LogMessageTypeEnum.INFO));
995 jmachado 293
        serviceLogInfo("importing " + semestre + " course units");
165 jmachado 294
        logger.info("importing " + semestre + " course units");
1312 jmachado 295
        List<Disciplina> disciplinas = service.loadDisciplinas(institutionCode, year, semestre,conn);
1296 jmachado 296
 
165 jmachado 297
        for (Disciplina d : disciplinas)
110 susana 298
        {
1312 jmachado 299
            if(ImportStudentsService.isCursoFicticio(d.getCodigoCurso()))
300
                continue;
301
 
302
            boolean turmasSeparatedPolicy = loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this);
303
            Disciplina inCache = disciplinasMap.get(getDisciplinaUniqueRef(d,year,logMessages));
304
 
305
            if (inCache != null
306
               // && !turmasSeparatedPolicy // Com politica de turmas separadas no curso a repeticao é normal uma por turma
307
            )
165 jmachado 308
            {
1312 jmachado 309
                logMessages.addMessage(new DefaultLogMessage("import.semestre." + semestre, LogMessageTypeEnum.INFO,"Other turma for a unit in " + semestre + ":" + d.getCodigo().intValue() + " -> " + d.getCdTurma()));
310
                serviceLogInfo("Other turma for a unit in " + semestre + ":" + d.getCodigo().intValue() + " -> " + d.getCdTurma());
311
                logger.info("Other turma for unit in " + semestre + ":" + d.getCodigo().intValue()  + " -> " + d.getCdTurma());
165 jmachado 312
            }
1312 jmachado 313
 
314
            //se houver mais que uma ocorrencia de turmas na disciplina sobrepoe, nao importa se forem de turmas juntas
315
            //So vai ser criada uma de qualquer maneira e a turma nao é usada neste caso. Apenas depois na imortação de alunos
316
            //para escolher a turma
317
            disciplinasMap.put(getDisciplinaUniqueRef(d,year,logMessages), d);
318
            disciplinasMapSemestre.put(getDisciplinaUniqueRef(d, year, logMessages), d);
319
            //para o caso do serviço ser chamado para varios anos
345 jmachado 320
            cursosMap.put(d.getCodigoCurso().intValue()+":"+year, d);
110 susana 321
        }
165 jmachado 322
    }
163 jmachado 323
 
1312 jmachado 324
    private 1.5.0/docs/api/java/lang/String.html">String getDisciplinaUniqueRef(Disciplina d,1.5.0/docs/api/java/lang/String.html">String year,DefaultLogMessages logMessages)
165 jmachado 325
    {
1312 jmachado 326
        boolean turmasSeparatedPolicy = loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this);
327
        if(turmasSeparatedPolicy)
328
            return d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + d.getCdDuracao() + ":" + d.getCdTurma();
329
        else
330
            return d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + d.getCdDuracao();
1115 jmachado 331
    }
332
 
1141 jmachado 333
    public static final int SIGES_CODIGO_TIPO_DISCIPLINA_EXTRA_CURRICULAR = ConfigProperties.getIntProperty("siges.codigo.tipo.disciplina.extra.curricular");
1312 jmachado 334
    private void updateCourseUnits(HashMap<String, Disciplina> disciplinasMapS, 1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages, 1.5.0/docs/api/java/lang/String.html">String year,int institutionCode, DisciplinaDao service,1.5.0/docs/api/java/sql/Connection.html">Connection conn)
1115 jmachado 335
    {
165 jmachado 336
        logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO));
1115 jmachado 337
 
1141 jmachado 338
 
165 jmachado 339
        logger.info("updating " + semestre + " course units");
995 jmachado 340
        serviceLogInfo("updating " + semestre + " course units");
165 jmachado 341
        Set<Map.Entry<String, Disciplina>> set = disciplinasMapS.entrySet();
163 jmachado 342
        for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set)
343
        {
344
            Disciplina d = entry.getValue();
1141 jmachado 345
            //TIPO 6 é uma EXTRA CURRICULAR
1296 jmachado 346
            if(ImportStudentsService.isCursoFicticio(d.getCodigoCurso()))
1115 jmachado 347
            {
1296 jmachado 348
                logMessages.addMessage(new DefaultLogMessage("import.error","Ignorando disciplina com codigo de curso ficticio - codigo: " + d.getCodigoCurso(), " see log for details", LogMessageTypeEnum.WARNING));
1115 jmachado 349
                logger.warn(logMessages.getLastMessage());
350
                serviceLogWarn(logMessages.getLastMessage());
351
 
352
                continue;
353
            }
1277 jmachado 354
            //CourseUnit c = null;
355
            List<CourseUnit> cus = null;
356
 
1312 jmachado 357
            cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + d.getCodigo(), "" + d.getCodigoCurso(), semestre, year);
358
 
359
            //NOVO NOVO NOVO
360
            //Politica de separação de turmas em unidades independentes neste curso
361
            boolean separateTurmas = ImportCourseService.loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this);
362
            //NOVO NOVO NOVO
363
            if(separateTurmas)
364
            {
365
                /***logging*****/
366
                logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Unidade de curso com turmas separadas encontrada siges: " + d.getCodigo() + " para curso:" + d.getCodigoCurso() + " turma:" + d.getCdTurma()));
367
                logger.info(logMessages.getLastMessage());
368
                serviceLogInfo(logMessages.getLastMessage());
369
                /**
370
                 * Este metodo aplicado apenas a cursos de turma separada
371
                 * vai retirar da lista de cus todas as que não tenham a turma em questão no campo cdTurma
372
                 * Caso haja inconsistencias ete metodo informa no LOG e tenta corrigir a situação
373
                 * O objectivo do metodo e econtrar a undade da turma em causa que obtemos
374
                 * da disciplina
375
                 * Relembrar que as disciplinas sao colocadas no mapa segundo o seu tipo
376
                 * se forem de turmasSeparada é colocada uma por turma, portanto
377
                 * vao vir para aqui as multiplas todas com as varias turmas
378
                 * e assim vamos filtrar todas as que vem na lista que nao sao da turma
379
                 * em tratamento neste momento, ou dar a turma a uma no caso de
380
                 * haver alguma sem turma, se nao houver nenhuma o metodo limpa todas
381
                 * e seguidamente vamos ter de a criar
382
                 */
383
                consistirUnidadesEmCursosTurmasSeparadas(semestre, logMessages, d, cus);
384
            }//NOVO NOVO NOVO
385
 
386
 
387
 
388
 
1277 jmachado 389
            if(cus != null && cus.size() > 1 )
750 jmachado 390
            {
1277 jmachado 391
                unitsRepeated++;
1278 jmachado 392
                logMessages.addMessage(new DefaultLogMessage("import.warning","Unidade Repetida: (" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year, "see log for details, vai atualizar as duas", LogMessageTypeEnum.WARNING));
1115 jmachado 393
                logger.fatal(logMessages.getLastMessage());
394
                serviceLogWarn(logMessages.getLastMessage());
750 jmachado 395
            }
1296 jmachado 396
            else if(cus != null && cus.size() == 1)
397
            {
398
                unitsAtualizadas++;
399
                1.5.0/docs/api/java/lang/String.html">String msg = "Regular unit update: " + "(" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year;
400
                logger.info(msg);
401
                serviceLogInfo(msg);
402
            }
1115 jmachado 403
 
1277 jmachado 404
 
405
            if (cus == null || cus.size() == 0)
225 jmachado 406
            {
1277 jmachado 407
                CourseUnitImpl c = DomainObjectFactory.createCourseUnitImpl();
1312 jmachado 408
                if(separateTurmas)
409
                    c.setCdTurma(d.getCdTurma());
410
                else
411
                    c.setCdTurma("");
726 jmachado 412
                DaoFactory.getCourseUnitDaoImpl().save(c);
1230 jmachado 413
                logMessages.addMessage(new DefaultLogMessage("import.error", "New Unit Found: (" +  d.getCodigo() + ") " + d.getNome() + " - curso (" + d.getNomeCurso() + ") " + d.getNomeCurso() + " turma(" + d.getCdTurma() + ")", "see log for details", LogMessageTypeEnum.INFO));
1115 jmachado 414
                logger.info(logMessages.getLastMessage());
415
                serviceLogInfo(logMessages.getLastMessage());
995 jmachado 416
                newUnits++;
1277 jmachado 417
                cus = new ArrayList<CourseUnit>();
418
                cus.add(c);
225 jmachado 419
            }
1115 jmachado 420
            //NOVO
421
 
1277 jmachado 422
            for(CourseUnit c: cus)
423
            {
1312 jmachado 424
 
425
                if(separateTurmas)
426
                    c.setCdTurma(d.getCdTurma());
427
                else
428
                    c.setCdTurma("");
1277 jmachado 429
                c.setName(d.getNome());
1312 jmachado 430
                c.setInstitutionCode("" + institutionCode);
1277 jmachado 431
                c.setCode("" + d.getCodigo().intValue());
432
                c.setCourseCode("" + d.getCodigoCurso());
433
                c.setCourseName("" + d.getNomeCurso());
434
                c.setSemestre(semestre);
435
                c.setImportYear(year);
436
                Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(c.getCourseCode());
437
                c.setCourse(course);
1312 jmachado 438
                checkOrCreateCourseYear(logMessages, year, c.getCourseCode(), this);
1313 jmachado 439
                //Obter as tipologias de sumarios e aulas e colocar na unidade
440
                fillTipologias(d, (CourseUnitImpl) c);
441
            }
442
        }
443
    }
1312 jmachado 444
 
1313 jmachado 445
    private void fillTipologias(Disciplina d, CourseUnitImpl c) {
446
        try {
447
            CourseUnitImpl.Tipologias t = ((CourseUnitImpl)c).getTipologiasClass();
448
            if(t == null)
449
                t = new CourseUnitImpl.Tipologias();
450
            for(TipologiasSumario.TipologiaSumario tipologiaSumario : d.getTipologiasSumario().getTipologias())
451
            {
452
                CourseUnitImpl.Tipologia tipoSum = new CourseUnitImpl.Tipologia();
453
                tipoSum.setOcorrencias(tipologiaSumario.getNumeroOcorrencias());
454
                tipoSum.setDsTipologia(ConfigProperties.getProperty("netpa.tipo.aula." + tipologiaSumario.getCdTipoAula()));
455
                tipoSum.setCdTurma(tipologiaSumario.getCdTurma());
456
                tipoSum.setCdDocente("" + tipologiaSumario.getCdDocente());
457
                tipoSum.setCdTipologia(""+tipologiaSumario.getCdTipoAula());
458
                t.getTipologiasSumarios().add(tipoSum);
459
            }
460
            for(TipologiasHorario.TipologiaHorario tipologiaHorario : d.getTipologiasHorario().getTipologias())
461
            {
462
                CourseUnitImpl.Tipologia tipoSum = new CourseUnitImpl.Tipologia();
463
                1.5.0/docs/api/java/lang/String.html">String codigoCorrespondenteTipoAula =
464
                        ConfigProperties.getProperty("netpa.code.ocup." + tipologiaHorario.getCdTipoOcupacao() + ".tipo.aula");
465
                if(codigoCorrespondenteTipoAula != null && codigoCorrespondenteTipoAula.length() > 0)
466
                {
467
                    tipoSum.setOcorrencias(null);
468
                    tipoSum.setDsTipologia(ConfigProperties.getProperty("netpa.tipo.aula." + codigoCorrespondenteTipoAula));
469
                    tipoSum.setCdTipologia("" + codigoCorrespondenteTipoAula);
470
                    tipoSum.setCdTurma(tipologiaHorario.getCdTurma());
471
                    tipoSum.setCdDocente("" + tipologiaHorario.getCdDocente());
472
                    t.getTipologiasHorarioReferencia().add(tipoSum);
1312 jmachado 473
                }
1313 jmachado 474
                else
475
                {
476
                    1.5.0/docs/api/java/lang/System.html">System.out.println("Tipologia: cd tipo ocup ignorado:" + tipologiaHorario.getCdTipoOcupacao());
477
                }
1312 jmachado 478
 
1277 jmachado 479
            }
1313 jmachado 480
            c.setTipologiasClass(t);
481
        } catch (1.5.0/docs/api/java/lang/Exception.html">Exception e) {
482
            logger.error(e, e);
483
            erroGraveAObterTipologias++;
163 jmachado 484
        }
110 susana 485
    }
486
 
1312 jmachado 487
    private void consistirUnidadesEmCursosTurmasSeparadas(1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages, Disciplina d, List<CourseUnit> cus) {
488
        Iterator<CourseUnit> iterUnits = cus.iterator();
489
        //Retira todas as unidades com código de turma preenchido e diferente
490
        //sobram apenas cadeiras com o NOSSO código de TURMA ou cadeiras sem codigo de turma NENHUM
491
        while(iterUnits.hasNext())
492
        {
493
            CourseUnit cu = iterUnits.next();
494
            if(cu.getCdTurma() != null && cu.getCdTurma().trim().length() > 0 && !cu.getCdTurma().trim().equals(d.getCdTurma().trim()))
495
            {
496
                iterUnits.remove();
497
            }
498
        }
499
        if(cus.size() == 0)
500
        {
501
            /***logging*****/
502
            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Sem unidade para a turma separada: " + d.getCdTurma()));
503
            logger.info(logMessages.getLastMessage());
504
            serviceLogInfo(logMessages.getLastMessage());
505
            //turma ainda nao existe vai ser criada
506
            turmasSeparadasTratadasOk++;
507
            /***logging*****/
508
        }
509
        else if(cus.size() == 1 && (cus.get(0).getCdTurma() == null || cus.get(0).getCdTurma().trim().length() == 0))
510
        {
511
            /***logging*****/
512
            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Ja existe unidade mas sem turma vai ser alocada à a turma separada: " + d.getCdTurma()));
513
            logger.info(logMessages.getLastMessage());
514
            serviceLogInfo(logMessages.getLastMessage());
515
            //Ja existia nao tinha codigo de turma vamos colocar no lugar do codigo unico
516
            //que so serve para este controlo
517
            turmasSeparadasTratadasOk++;
518
            /****logging*****/
995 jmachado 519
 
1312 jmachado 520
            cus.get(0).setCdTurma(d.getCdTurma());
521
        }
522
        else if(cus.size() == 1 && cus.get(0).getCdTurma() != null && cus.get(0).getCdTurma().trim().equals(d.getCdTurma().trim()))
523
        {
524
            /***logging*****/
525
            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Encontrada a unidade para a turma separada: " + d.getCdTurma()));
526
            logger.info(logMessages.getLastMessage());
527
            serviceLogInfo(logMessages.getLastMessage());
528
            turmasSeparadasTratadasOk++;
529
            //ok e' a turma certa nao se faz mais nada
530
        }
531
        else if(cus.size() > 1)
532
        {
533
            turmasSeparadasComInconsistencias++;
534
            /*****logging*******/
535
            logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.ERROR,"Problema grave nas importações de unidades com turmas separadas para o codigo siges " + d.getCodigo() + ", mais que uma unidade sem turma ou com varias turmas iguais com o mesmo codigo siges, vamos tentar corrigir e reportar de seguida"));
536
            logger.error(logMessages.getLastMessage());
537
            serviceLogError(logMessages.getLastMessage());
538
            //Isto e' um problema muito grave, nao devera acontecer haver mais que uma unidade
539
            //repetida e ainda por cima com mais que um código de turma igual ou nosso ou a vazio
540
            //vamos remover todos os vazio, se não sobrar nenhum metemos a nossa turma num deles
541
            //se encontrarmos o nosso usamo-lo, se for mais que um usamos um e colocamos as turmas nos outros a vazio
542
            Iterator<CourseUnit> iter = cus.iterator();
543
            CourseUnit last = null;
544
            while(iter.hasNext())
545
            {
546
                last = iter.next();
547
                if(last.getCdTurma()==null || last.getCdTurma().trim().length() == 0)
548
                {
549
                    logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"removendo unidade da lista com turma vazia baco id:" + last.getId()));
550
                    logger.info(logMessages.getLastMessage());
551
                    serviceLogInfo(logMessages.getLastMessage());
552
                    iter.remove();
553
                }
554
            }
555
 
556
            if(cus.size() > 0)
557
            {
558
                logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"Sobraram unidades com o nosso código de turma:" + d.getCdTurma() + " vamos remover todas excepto a primeira"));
559
                logger.info(logMessages.getLastMessage());
560
                serviceLogInfo(logMessages.getLastMessage());
561
                //vamos deixar apenas uma com a nossa turma
562
                while(cus.size() > 1)
563
                {
564
                    logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"removendo baco id:" + cus.get(1).getId() + " e colocando a turma a vazio "));
565
                    logger.info(logMessages.getLastMessage());
566
                    serviceLogInfo(logMessages.getLastMessage());
567
                    cus.get(1).setCdTurma("");
568
                    cus.remove(1);
569
                }
570
            }
571
            else if(cus.size() == 0)
572
            {
573
                logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"ficamos sem unidades para usar, nenhuma tinha a nossa turma " + d.getCdTurma() + ", vamos usar a ultima com baco id:" + last.getId() + " e colocando a turma a " + d.getCdTurma()));
574
                logger.info(logMessages.getLastMessage());
575
                serviceLogInfo(logMessages.getLastMessage());
576
                cus.add(last);
577
                last.setCdTurma(d.getCdTurma());
578
            }
579
        }
580
    }
581
 
582
    /**
583
     * This method finds or create a courseYear for a courseUnit
584
     * @param logMessages
585
     * @param year
586
     * @param c
587
     * @param course
588
     * @return
589
     */
590
    private static Map<String,Boolean> courseYearServiceCache = new HashMap<String, Boolean>();
591
    protected static void checkOrCreateCourseYear(DefaultLogMessages logMessages, 1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String code, ServiceJob service) {
592
        if(courseYearServiceCache.get(code + "-" + year) != null)
593
        {
594
            return;
595
        }
596
        List<CourseYear> cYs = DaoFactory.getCourseYearDaoImpl().findCourseYear(code,year);
597
        CourseYear cY;
598
        if(cYs == null || cYs.size() == 0)
599
        {
600
 
601
            Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
602
            if(course == null)
603
                return; //does not exist yet
604
            /*****logging******/
605
            logMessages.addMessage(new DefaultLogMessage("import.ok", "Creating new CourseYear  course(" +  code + ") year" + year + ")", "see log for details", LogMessageTypeEnum.INFO));
606
            logger.info(logMessages.getLastMessage());
607
            service.serviceLogInfo(logMessages.getLastMessage());
608
            /*****logging******/
609
            if(course.getCourseYears() == null)
610
                course.setCourseYears(new HashSet<CourseYear>());
611
            cY = DomainObjectFactory.createCourseYearImpl();
612
            cY.setImportYear(year);
613
            cY.setSeparatedTurmas(false);
614
            DaoFactory.getCourseYearDaoImpl().save(cY);
615
            course.getCourseYears().add(cY); //adiciona só de um lado
616
        }
617
        else if(cYs.size() > 1)
618
        {
619
            /*****logging******/
620
            logMessages.addMessage(new DefaultLogMessage("import.error", "CourseYear more than one ocurrence course(" +  code + ") year" + year + ")", "see log for details", LogMessageTypeEnum.ERROR));
621
            logger.error(logMessages.getLastMessage());
622
            service.serviceLogError(logMessages.getLastMessage());
623
            /*****logging******/
624
            //Never happen while year are created only here
625
        }
626
        courseYearServiceCache.put(code + "-" + year,true);
627
    }
628
 
629
 
995 jmachado 630
    @1.5.0/docs/api/java/lang/Override.html">Override
1070 jmachado 631
    protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable {
995 jmachado 632
 
1070 jmachado 633
        1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap().get(JOB_importYear_KEY).getObject();
1312 jmachado 634
        1.5.0/docs/api/java/lang/String.html">String institutionCode = getParametersMap().get(JOB_institution_KEY).getObject();
635
        ILogMessages messages = run(importYear,1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(institutionCode));
1070 jmachado 636
        return messages;
995 jmachado 637
 
638
    }
639
 
640
 
163 jmachado 641
    public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws ServiceException
642
    {
1123 jmachado 643
        1.5.0/docs/api/java/lang/String.html">String year = DaoFactory.getConfigurationDaoImpl().getImportsDefaultImportYearCreateTransaction();
1312 jmachado 644
        int institutionCode = DaoFactory.getConfigurationDaoImpl().getInstitutionCodeCreateTransaction();
491 jmachado 645
        if(args != null && args.length > 0)
646
            year = args[0];
1312 jmachado 647
        if(args != null && args.length > 1)
648
            institutionCode = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(args[1]);
119 fvelez 649
        AbstractDao.getCurrentSession().beginTransaction();
1312 jmachado 650
        new ImportCourseService().run(year,institutionCode);
1123 jmachado 651
        AbstractDao.getCurrentSession().getTransaction().commit();
110 susana 652
    }
653
 
654
 
655
}