Subversion Repositories bacoAlunos

Rev

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