package pt.estgp.estgweb.services.sigesimports;
import jomm.dao.impl.AbstractDao;
import jomm.utils.StringsUtils;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.StaleStateException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.common.CommonServicesManager;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.services.sigesimports.oracle.dao.AlunoDao;
import pt.estgp.estgweb.services.sigesimports.oracle.dao.TurmaDao;
import pt.estgp.estgweb.services.sigesimports.oracle.dao.connection.ConnectionManager;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Aluno;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.AlunoHistorico;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Disciplina;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Email;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.*;
/**
* @author Jorge Machado
* @date 11/May/2008
* @time 12:51:32
* @see pt.estgp.estgweb
*/
public class ImportStudentsService
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(ImportStudentsService.
class);
private static final int MAX_COMMIT =
5;
int studentsMerged =
0;
int studentsNew =
0;
int studentsZeroUnits =
0;
int unitsNotFound =
0;
int unitsNotFoundTurma =
0;
int unitsRemovedToStudents =
0;
int unitsLocalAddedNotRemoved =
0;
int unitsLocallyRemovedNotAdded =
0;
int unitsRepeated =
0;
int alunosFound =
0;
int studentsChangeBI =
0;
int unitsAddedToStudents =
0;
int alunosErasmusCadeirasEcontradas =
0;
int turmaMoreThanOneRegularCourse =
0;
int unidadesProcuradasNumCursoAleatorio =
0;
List
<String
> turmasMoreThanOneCourse =
new ArrayList
<String
>();
int turmasWrongSubscriptions =
0;
int estudantesDesaparecidosDoSigesNesteAno =
0;
int estudantesComCadeirasSemTurma =
0;
int turmasComCodigoNullRemovidas =
0;
int unidadesSoComAlunosExtra =
0;
//Vasco da Gama
//Cadeiras a Vulso
//Erasmus
//disciplinas a vulso ESS
static 1.5.0/docs/api/java/lang/Integer.html">Integer[] cursosFicticios =
null;
static boolean studentComUnidadesRepetidas =
false;
public ILogMessages run
(1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode
) throws ServiceException
{
studentsMerged =
0;
studentsNew =
0;
studentsZeroUnits =
0;
unitsNotFound =
0;
unitsNotFoundTurma =
0;
unitsRemovedToStudents =
0;
unitsLocalAddedNotRemoved =
0;
unitsLocallyRemovedNotAdded =
0;
alunosFound =
0;
studentsChangeBI =
0;
unitsAddedToStudents =
0;
alunosErasmusCadeirasEcontradas =
0;
unitsRepeated =
0;
turmaMoreThanOneRegularCourse =
0;
turmasMoreThanOneCourse =
new ArrayList
<String
>();
turmasWrongSubscriptions =
0;
estudantesDesaparecidosDoSigesNesteAno =
0;
estudantesComCadeirasSemTurma =
0;
turmasComCodigoNullRemovidas =
0;
unidadesSoComAlunosExtra =
0;
unidadesProcuradasNumCursoAleatorio =
0;
ImportCourseService.
resetCourseYearTurmaPolicy();
1.5.0/docs/api/java/lang/String.html">String activeImportYearParaVerificacaoDePropinasEmDia = DaoFactory.
getConfigurationDaoImpl().
getInterfaceImportYear();
1.5.0/docs/api/java/lang/String.html">String msgS =
"STARTING STUDENTS IMPORT SERVICE FOR YEAR: " + year
;
serviceLogInfo
(msgS
);
logger.
info(msgS
);
DefaultLogMessages logMessages =
new DefaultLogMessages
();
logMessages.
addMessage(new DefaultLogMessage
("import.students", LogMessageTypeEnum.
INFO,
"instituicao " + institutionCode
));
try
{
AlunoDao service = AlunoDao.
getInstance();
1.5.0/docs/api/java/sql/Connection.html">Connection conn = ConnectionManager.
openConnection();
/**
* Carrega alunos do SIGES com cadeiras no ano requerido
*/
List
<Integer
> codigos = service.
loadCodigosAlunos(institutionCode, year,conn
);
/**
* Este método vai procurar alunos no BACO neste ano que não vieram do SIGES
* Os alunos que não vieram da extração do SIGES e terão de ser consistidos
* pois as suas unidades ter desaparecido todas de uma vez e vão aqui ficar penduradas
* Se foram adicionadas manualmente então nao serao removidas
*/
removerUnidadesDosDesaparecidosDoSiges
(year, institutionCode, codigos
);
int i =
1;
for (1.5.0/docs/api/java/lang/Integer.html">Integer c : codigos
)
{
alunosFound++
;
if (i++
>= MAX_COMMIT
)
{
i =
0;
setProgress
((int) ((((float) alunosFound
) /
((float) codigos.
size())) * 0.95f
* 100.0f
));
conn.
close();
commitPartially
();
conn = ConnectionManager.
openConnection();
}
Aluno alunoSiges = service.
loadInscrito(c,institutionCode, year,conn
);
if(alunoSiges.
getCodigo()==15726
)
1.5.0/docs/api/java/lang/System.html">System.
out.
println("");
Student s = loadStudent
(alunoSiges
);
boolean newUser =
false;
if(s.
getId() <= 0
)
{
i = MAX_COMMIT+
1; //Para fazer commit já na póxima iteração
DaoFactory.
getStudentDaoImpl().
save(s
);
newUser =
true;
}
persist
(alunoSiges, s, newUser,year,institutionCode,activeImportYearParaVerificacaoDePropinasEmDia,logMessages,service
);
if(studentComUnidadesRepetidas
)
unitsRepeated++
;
if (newUser
)
{
CommonServicesManager.
getInstance().
adviseNew(s
);
}
else
{
//Advising CommonsServicesManager before change password at this time 03/2015 this does not do anything important
1.5.0/docs/api/java/lang/String.html">String password = s.
getPassword();
s.
setPassword(null);
CommonServicesManager.
getInstance().
adviseUpdate(s
);
s.
setPassword(password
);
}
}
logMessages.
addMessage(new DefaultLogMessage
("import.students.consisting.turmas", LogMessageTypeEnum.
INFO));
logger.
info("Consisting turma students");
serviceLogInfo
("Consisting turma students");
setProgress
(95
);
commitPartially
();
/**
* Este metodo vai remover inconsistencias de alunos que têm unidades em Turmas
* e depois não as têm na lista de unidades subscritas
* TURMAS SEPARADAS_ANALISE: Usa codigos de Turma do Baco não é necessario comparacoes por codigos siges
* logo nao e afetado com pelos detalhes das turmas separadas
*/
removeUnitsFromTurmaSubscriptionsThatAreNotInCourseUnitSubscriptions
(year,institutionCode,logMessages
);
/**
* Este metodo e apenas uma verificação de consistência
* O normal será não produzir resultados, pois caso os produza significa que os alunos não foram removidos das
* cadeiras tal como deveriam ter sido
* ou então são alunos adicionados manualmente às cadeiras
* TURMAS SEPARADAS_ANALISE: Usa codigos de Turma do Baco não é necessario comparacoes por codigos siges
* logo nao e afetado com pelos detalhes das turmas separadas
*/
obterAlunosInconsitentesComCadeirasSemTurma
(codigos,year,institutionCode
);
/**
* Turmas penduradas com código vazio serão removidas
*/
eliminarTurmasInvalidas
(year,logMessages
);
logMessages.
addMessage(new DefaultLogMessage
("import.students.terminating", LogMessageTypeEnum.
INFO));
logger.
info("terminating student import");
serviceLogInfo
("terminating student import");
conn.
close();
}
catch(StaleStateException e
)
{
AbstractDao.
getCurrentSession().
getTransaction().
rollback();
AbstractDao.
getCurrentSession().
beginTransaction();
logger.
error(e,e
);
logMessages.
addMessage(new DefaultLogMessage
("import.error",e.
toString(),
"see log for details", LogMessageTypeEnum.
ERROR));
serviceLogError
("Rolling back will lost previous updates: " + e.
toString(),e
);
sendNotificationAdmin
("Erro de importacao de alunos",e.
toString());
}
catch(HibernateException e
)
{
AbstractDao.
getCurrentSession().
getTransaction().
rollback();
AbstractDao.
getCurrentSession().
beginTransaction();
logger.
error(e,e
);
logMessages.
addMessage(new DefaultLogMessage
("import.error",e.
toString(),
"see log for details", LogMessageTypeEnum.
ERROR));
serviceLogError
("Rolling back will lost previous updates: " + e.
toString(),e
);
sendNotificationAdmin
("Erro de base de dados importacao de alunos, provavelmente chave errada, corrigir no MySql",e.
toString());
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
logger.
error(e,e
);
logMessages.
addMessage(new DefaultLogMessage
("import.error",e.
toString(),
"see log for details", LogMessageTypeEnum.
ERROR));
serviceLogError
(e.
toString(),e
);
sendNotificationAdmin
("Erro de importacao de alunos",e.
toString());
}
serviceLogInfo
("############################");
serviceLogInfo
("############################");
serviceLogInfo
("#Students found: " + alunosFound
);
serviceLogInfo
("#Students New: " + studentsNew
);
serviceLogInfo
("#Students Merged: " + studentsMerged
);
serviceLogInfo
("#Students Zero Units: " + studentsZeroUnits
);
serviceLogInfo
("#Units not found: " + unitsNotFound
);
serviceLogInfo
("#Units not found in real course (turma ok): " + unitsNotFoundTurma
);
serviceLogInfo
("#Units added to Students: " + unitsAddedToStudents
);
serviceLogInfo
("#Units removed to Students: " + unitsRemovedToStudents
);
serviceLogInfo
("#Units not Removed because localy added: " + unitsLocalAddedNotRemoved
);
serviceLogInfo
("#Units not Added because localy removed: " + unitsLocallyRemovedNotAdded
);
serviceLogInfo
("#Alunos com Unidades repetidas: " + unitsRepeated
);
serviceLogInfo
("#ERASMUS Sum Subscriptions Replaced: " + alunosErasmusCadeirasEcontradas
);
if(unidadesProcuradasNumCursoAleatorio
> 0)
serviceLogInfo
("######!!!!!Unidades atribuidas com curso aleatoriamente escolhido derivado a duvidas: " + unidadesProcuradasNumCursoAleatorio +
" (procurar por \"tem mais de um curso vamos procurar num qualquer\")");
if(turmaMoreThanOneRegularCourse
> 0)
{
serviceLogWarn
("#########!!!!!!!ATENÇÃO TURMAS COM MAIS DE UM CURSO: " + turmaMoreThanOneRegularCourse
);
serviceLogWarn
(turmasMoreThanOneCourse.
toString());
}
if(turmasWrongSubscriptions
> 0)
{
serviceLogWarn
("Inscrições em TURMAS sem correspondencia nas disciplinas foram removidas: " + turmasWrongSubscriptions
);
}
else
{
serviceLogInfo
("CHECK OK - Todas as TURMAS com correspondencia nas disciplinas: ");
}
if(estudantesComCadeirasSemTurma
> 0)
{
serviceLogWarn
("########!!!!!!!Estudantes com cadeiras sem TURMA no BACO: " + estudantesComCadeirasSemTurma
);
}
else
{
serviceLogInfo
("CHECK TURMAS REVERSE OK - Todas as disciplinas subsescritas com turmas verificadas");
}
if(estudantesDesaparecidosDoSigesNesteAno
> 0)
{
serviceLogWarn
("########!!!!!!!Estudantes que desapareceram do Siges neste ano e tinham cadeiras no BACO: " + estudantesDesaparecidosDoSigesNesteAno
);
}
else
{
serviceLogInfo
("CHECK DESAPARECIDOS OK - Não existem estudantes desaparecidos");
}
if(turmasComCodigoNullRemovidas
> 0)
{
serviceLogWarn
("########Turmas com codigo vazio removidas:" + turmasComCodigoNullRemovidas
);
}
else
{
serviceLogInfo
("CHECK OK zero Turmas com codigo vazio");
}
if(unidadesSoComAlunosExtra
> 0)
{
//Acontece com cadeiras criadas especialmente para alunos de erasmus
serviceLogInfo
("########Unidades sem Curso Real não criadas:" + unidadesSoComAlunosExtra
);
serviceLogInfo
("procure no log por: \"Problema Encontrado Turma não tem Curso Real\"");
}
logger.
info("############################");
logger.
info("############################");
logger.
info("#Students found: " + alunosFound
);
logger.
info("#Students New: " + studentsNew
);
logger.
info("#Students Merged: " + studentsMerged
);
logger.
info("#Students Zero Units: " + studentsZeroUnits
);
logger.
info("#Units not found: " + unitsNotFound
);
logger.
info("#Units not found in real course (turma ok): " + unitsNotFoundTurma
);
logger.
info("#Units added to Students: " + unitsAddedToStudents
);
logger.
info("#Units removed to Students: " + unitsRemovedToStudents
);
logger.
info("#Units not Removed because localy added: " + unitsLocalAddedNotRemoved
);
logger.
info("#Units not Added because localy removed: " + unitsLocallyRemovedNotAdded
);
logger.
info("#Alunos com Unidades repetidas: " + unitsRepeated
);
logger.
info("#ERASMUS Sum Subscriptions Replaced: " + alunosErasmusCadeirasEcontradas
);
if(unidadesProcuradasNumCursoAleatorio
> 0)
logger.
warn("######!!!!!Unidades atribuidas com curso aleatoriamente escolhido derivado a duvidas: " + unidadesProcuradasNumCursoAleatorio +
" (procurar por \"tem mais de um curso vamos procurar num qualquer\")");
if(turmaMoreThanOneRegularCourse
> 0)
{
logger.
warn("#########!!!!!!!ATENÇÃO TURMAS COM MAIS DE UM CURSO: " + turmaMoreThanOneRegularCourse
);
logger.
warn(turmasMoreThanOneCourse.
toString());
}
if(turmasWrongSubscriptions
> 0)
{
logger.
warn("Inscrições em TURMAS sem correspondencia nas disciplinas: " + turmasWrongSubscriptions
);
}
else
{
logger.
info("CHECK TURMAS OK - Todas as TURMAS com correspondencia nas disciplinas subscritas");
}
if(estudantesComCadeirasSemTurma
> 0)
{
logger.
warn("########!!!!!!!Estudantes com cadeiras sem TURMA no BACO: " + estudantesComCadeirasSemTurma
);
}
else
{
logger.
info("CHECK TURMAS REVERSE OK - Todas as disciplinas subsescritas com turmas verificadas");
}
if(estudantesDesaparecidosDoSigesNesteAno
> 0)
{
logger.
warn("########!!!!!!!Estudantes que desapareceram do Siges neste ano e tinham cadeiras no BACO: " + estudantesDesaparecidosDoSigesNesteAno
);
}
else
{
logger.
info("CHECK DESAPARECIDOS OK - Não existem estudantes desaparecidos");
}
if(turmasComCodigoNullRemovidas
> 0)
{
logger.
warn("########Turmas com codigo vazio removidas:" + turmasComCodigoNullRemovidas
);
}
else
{
logger.
info("CHECK OK zero Turmas com codigo vazio");
}
if(unidadesSoComAlunosExtra
> 0)
{
logger.
warn("########Unidades sem Curso Real não criadas:" + unidadesSoComAlunosExtra
);
logger.
warn("procure no log por: \"Problema Encontrado Turma não tem Curso Real\"");
}
if(studentsChangeBI
>0)
{
serviceLogInfo
("#>>>>>AVISO AVISO<<<<<<<<<: ");
serviceLogInfo
("#>>>>>AVISO AVISO<<<<<<<<<: ");
serviceLogInfo
("#>>>>>NUMEROS DE ALUNOS MUDARAM DE BI<<<<<<<<<: CONSULTAR LOG");
serviceLogInfo
("#CODIGO SIGES COM BIs DIFERENTES:" + studentsChangeBI
);
logger.
info("#>>>>>AVISO AVISO<<<<<<<<<: ");
logger.
info("#>>>>>AVISO AVISO<<<<<<<<<: ");
logger.
info("#>>>>>NUMEROS DE ALUNOS MUDARAM DE BI<<<<<<<<<: CONSULTAR LOG");
logger.
info("#CODIGO SIGES COM BIs DIFERENTES:" + studentsChangeBI
);
}
setProgress
(100
);
return logMessages
;
}
private void eliminarTurmasInvalidas
(1.5.0/docs/api/java/lang/String.html">String year,DefaultLogMessages logMessages
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
1.5.0/docs/api/java/sql/PreparedStatement.html">PreparedStatement ps = AbstractDao.
getCurrentSession().
connection().
prepareStatement(
"select courseunitturma.id as id, courseunit.code as code, courseunit.name as name, courseunit.coursename as coursename from courseunitturma " +
"join courseunit on courseunit.id = courseunitturma.courseunit " +
"where courseunit.importYear = \"" + year +
"\" and (courseunitturma.turma is null or courseunitturma.turma = \"\")");
1.5.0/docs/api/java/sql/ResultSet.html">ResultSet rs = ps.
executeQuery();
while(rs.
next())
{
CourseUnitTurma cut = DaoFactory.
getCourseUnitTurmaDaoImpl().
load(rs.
getLong("id"));
/****logging*****/
turmasComCodigoNullRemovidas++
;
1.5.0/docs/api/java/lang/String.html">String msg =
"Removing courseunit turma:" + cut.
getId() +
" from unit:" + rs.
getString("code") +
":" + rs.
getString("name") +
"(" + rs.
getString("coursename") +
")" +
" has null turma";
logger.
warn(msg
);
logMessages.
addMessage(new DefaultLogMessage
("import.warning",LogMessageTypeEnum.
WARNING,msg
));
serviceLogWarn
(msg
);
/****logging*****/
if(cut.
getStudents().
size() > 0
)
{
Iterator
<StudentImpl
> sd = cut.
getStudents().
iterator();
while(sd.
hasNext())
{
StudentImpl s = sd.
next();
/****logging*****/
msg =
"Removing student " + s.
getSigesCode() +
" from turma:" + cut.
getId() +
" from unit:" + rs.
getString("code") +
":" + rs.
getString("name") +
"(" + rs.
getString("coursename") +
")" +
" has null turma";
logger.
warn(msg
);
logMessages.
addMessage(new DefaultLogMessage
("import.warning",LogMessageTypeEnum.
WARNING,msg
));
serviceLogWarn
(msg
);
/****logging*****/
s.
getTurmas().
remove(cut
);
sd.
remove();
}
}
cut.
getCourseUnit().
getTurmas().
remove(cut
);
cut.
setCourseUnit(null);
}
rs.
close();
ps.
close();
}
private Student loadStudent
(Aluno alunoSiges
)
{
Student s =
null;
User u = DaoFactory.
getUserDaoImpl().
loadByUsernameOrSigesCode(alunoSiges.
getCodigo().
intValue());
boolean newUser =
false;
studentComUnidadesRepetidas =
false;
if(u
!=
null && !(u
instanceof Student
))
{
/*****logging*******/
1.5.0/docs/api/java/lang/String.html">String msgS =
"Student " + u.
getUsername() +
" already exist in system but is not a Student is a standard USER, will merge both users";
studentsMerged++
;
serviceLogWarn
(msgS
);
logger.
warn(msgS
);
/*****logging*******/
DaoFactory.
getUserDaoImpl().
delete(u
);
/*****logging*******/
msgS =
"Student " + u.
getUsername() +
"1";
logger.
warn(msgS
);
serviceLogWarn
(msgS
);
/*****logging*******/
AbstractDao.
getCurrentSession().
getTransaction().
commit();
AbstractDao.
getCurrentSession().
beginTransaction();
/*****logging*******/
msgS =
"Student " + u.
getUsername() +
"2";
logger.
warn(msgS
);
serviceLogWarn
(msgS
);
/*****logging*******/
s = DomainObjectFactory.
createStudentImpl();
}
else if(u
!=
null)
{
s = DaoFactory.
getStudentDaoImpl().
load(u.
getId());
}
if (s ==
null)
{
s = DomainObjectFactory.
createStudentImpl();
}
return s
;
}
/**
* Obter os alunos que tem cadeiras na lista de subscribed units que depois não têm uma associação com turma
* associada na CourseUnitTurma
* Este metodo usa dois selects
* O interior vai ler todas as possibilidades de unidade, estudante olhando para a tabela das turmas
* O exterior seleciona todas as ocorrencias da subscribedUnits e verifica com um left join quais
* não verificam correspondencia no select interior
* Assim ficamos a saber os alunos que estão subscritos numa unidade mas que não estão subscritos
* numa Turma com essa mesma unidade
* @param codigos
* @return
* @throws SQLException
*/
private List
<Integer
> obterAlunosInconsitentesComCadeirasSemTurma
(List
<Integer
> codigos,
1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
/**EXTRA PARA DETECTAR ALUNOS COM CADEIRAS SEM TURMA***/
1.5.0/docs/api/java/sql/PreparedStatement.html">PreparedStatement ps= AbstractDao.
getCurrentSession().
connection().
prepareStatement(
"select distinct (user.sigesCode)\n" +
"from subscribedunits \n" +
"join courseunit on subscribedunits.courseUnitId = courseunit.id\n" +
"join user on user.id = subscribedunits.studentid\n" +
"left join (\n" +
"select subscribedturmaunits.studentId,courseunitturma.courseUnit,courseunitturma.turma from subscribedturmaunits \n" +
"join courseunitturma on courseunitturma.id = subscribedturmaunits.courseunitturmaid\n" +
"join courseunit on courseunit.id = courseunitturma.courseUnit\n" +
"where courseunit.importYear=\"" + year +
"\") as turmas\n" +
"on turmas.studentId = subscribedunits.studentId and turmas.courseUnit = subscribedunits.courseunitid\n" +
"where courseunit.importYear=\"" + year +
"\" and courseunit.institutionCode = \"" + institutionCode +
"\" and turmas.studentId is null ");
1.5.0/docs/api/java/sql/ResultSet.html">ResultSet rs = ps.
executeQuery();
List
<Integer
> longs =
new ArrayList
<Integer
>();
while(rs.
next())
{
longs.
add(rs.
getInt("sigesCode"));
}
rs.
close();
ps.
close();
if(longs.
size() > 0
)
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"Existem estudantes no BACO com unidades sem turma respectiva ano: " + year +
" institution:" + institutionCode +
" possiveis adicionados manualmente, confirmar";
serviceLogWarn
(msgS
);
logger.
warn(msgS
);
msgS =
"";
for (1.5.0/docs/api/java/lang/Integer.html">Integer c : longs
)
{
msgS+=c +
", ";
}
serviceLogWarn
(msgS
);
logger.
warn(msgS
);
}
else
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"OK check - Estudantes no BACO todos com respectiva turma ano: " + year +
" institution:" + institutionCode +
" possiveis adicionados manualmente, confirmar";
serviceLogInfo
(msgS
);
logger.
info(msgS
);
}
return longs
;
}
/**
* Este métido vai consistir os alunos que não eram tratados porque não vinham do SIGES logo não constavam do
* ciclo
* @param year
* @param institutionCode
* @param codigos
*/
private void removerUnidadesDosDesaparecidosDoSiges
(1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode, List
<Integer
> codigos
) {
1.5.0/docs/api/java/lang/String.html">String msgS
;
List
<Integer
> codesInBaco = DaoFactory.
getStudentDaoImpl().
findAllSigesCodesYear(year,institutionCode
);
codesInBaco.
removeAll(codigos
);
if(codesInBaco.
size() > 0)
{
msgS =
"Existem estudantes no BACO que não estao no SIGES no ano: " + year +
" institution:" + institutionCode +
" possiveis adicionados manualmente, confirmar";
serviceLogWarn
(msgS
);
logger.
warn(msgS
);
msgS =
"";
for (1.5.0/docs/api/java/lang/Integer.html">Integer c : codesInBaco
)
{
msgS+=c +
", ";
}
serviceLogWarn
(msgS
);
logger.
warn(msgS
);
for (1.5.0/docs/api/java/lang/Integer.html">Integer c : codesInBaco
)
{
estudantesDesaparecidosDoSigesNesteAno++
;
Student s = DaoFactory.
getStudentDaoImpl().
loadBySigesCode(c
);
StudentImpl studentImpl =
(StudentImpl
) DaoFactory.
getStudentDaoImpl().
narrow(s
);
removerUnidadesQueDesapareceramNoSiges
(year,
new HashSet
<CourseUnit
>(), studentImpl
);
consistirTurmasAluno
(studentImpl, year,
new HashMap
<CourseUnit, String
>());
}
}
else
{
msgS =
"OK check - Não existem alunos desaparecidos no SIGES ano: " + year +
" institution:" + institutionCode +
" possiveis adicionados manualmente, confirmar";
serviceLogInfo
(msgS
);
logger.
info(msgS
);
}
}
/**
*
* QUERY DAS INCONSISTENCIAS PARA REMOVER ALUNOS DAS TURMAS
* Estes casos são aqueles em que temos alunos em turmas de disciplinas
* sem que os alunos estejam subscritos na tabela de subscrições antiga
* Estes casos sao para remover
*
* Este caso aconteceu quando se deu o caso do Bug do session.refresh
* que estragava o aluno e ia gravando alunos novos sempre com cadeiras penduradas
*
*
* @param year
* @param institutionCode
* @param logMessages
* @throws SQLException
*/
private void removeUnitsFromTurmaSubscriptionsThatAreNotInCourseUnitSubscriptions
(1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode,DefaultLogMessages logMessages
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
1.5.0/docs/api/java/lang/String.html">String query =
"select {0} " +
"from subscribedturmaunits " +
"join courseunitturma on courseunitturma.id = subscribedturmaunits.courseUnitTurmaId " +
"join courseunit on courseunitturma.courseUnit = courseunit.id " +
"join user on user.id = subscribedturmaunits.studentId " +
"left join subscribedunits on " +
"subscribedturmaunits.studentId = subscribedunits.studentId " +
"and subscribedunits.courseUnitId = courseunit.id " +
"where courseunit.importYear = \"" + year +
"\" and courseunit.institutionCode = " + institutionCode +
" and subscribedunits.studentId is null";
1.5.0/docs/api/java/lang/String.html">String fields =
"courseunit.code as unidSigesCode," +
"user.name as name, " +
"user.sigesCode as sigesCode, " +
"subscribedturmaunits.studentId as studentId, " +
"courseunit.id as unitId ," +
"courseunit.name as unitname ," +
"courseunitturma.id as turmaId ," +
"courseunitturma.turma as turma";
1.5.0/docs/api/java/sql/PreparedStatement.html">PreparedStatement ps = AbstractDao.
getCurrentSession().
connection().
prepareStatement(
1.5.0/docs/api/java/text/MessageFormat.html">MessageFormat.
format(query,
"count(*) as total"));
1.5.0/docs/api/java/sql/ResultSet.html">ResultSet rs = ps.
executeQuery();
rs.
next();
int size = rs.
getInt("total");
rs.
close();
ps.
close();
if(size
> 0)
{
/**********logging*********/
turmasWrongSubscriptions=size
;
1.5.0/docs/api/java/lang/String.html">String msg =
"Found " + size +
" subscritions in turmas wich are not in subscribedUnits will remove them";
logger.
warn(msg
);
serviceLogInfo
(msg
);
/**********logging*********/
ps = AbstractDao.
getCurrentSession().
connection().
prepareStatement(
1.5.0/docs/api/java/text/MessageFormat.html">MessageFormat.
format(query,fields
));
rs = ps.
executeQuery();
int i =
0;
while(rs.
next())
{
1.5.0/docs/api/java/lang/String.html">String unidSigesCode = rs.
getString("unidSigesCode");
1.5.0/docs/api/java/lang/String.html">String studentName = rs.
getString("name");
long sigesCode = rs.
getInt("sigesCode");
long studentId = rs.
getLong("studentId");
long unitId = rs.
getLong("unitId");
1.5.0/docs/api/java/lang/String.html">String unitname = rs.
getString("unitname");
long turmaId = rs.
getLong("turmaId");
1.5.0/docs/api/java/lang/String.html">String turma = rs.
getString("turma");
CourseUnitTurma cut = DaoFactory.
getCourseUnitTurmaDaoImpl().
load(turmaId
);
Student s = DaoFactory.
getStudentDaoImpl().
load(studentId
);
cut.
getStudents().
remove(s
);
s.
getTurmas().
remove(cut
);
/**********logging*********/
msg =
"Inconsistencia encontrada na turma " + turma +
" para o aluno " + studentName +
" siges: " + sigesCode +
" id:" + studentId +
" na unidade siges:" + unidSigesCode +
" unitid:" + unitId +
" " + unitname +
" O aluno nao tinha esta unidade e tinha uma turma para ela ";
logger.
warn(msg
);
serviceLogWarn
(msg
);
logMessages.
addMessage(new DefaultLogMessage
("import.students.consisting.turmas", LogMessageTypeEnum.
WARNING,msg
));
/**********logging*********/
}
rs.
close();
ps.
close();
}
else
{
1.5.0/docs/api/java/lang/String.html">String msgS =
"OK check - Todos os alunos com cadeiras em turmas tem a cadeira subscrita ano: " + year +
" institution:" + institutionCode +
" possiveis adicionados manualmente, confirmar";
serviceLogInfo
(msgS
);
logger.
info(msgS
);
}
}
/**
* Envio de Notificação aos operadores do CI
* @param subject
* @param cause
*/
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
)
{
List
<String
> emails = ConfigProperties.
getListValues("admin.email");
for(1.5.0/docs/api/java/lang/String.html">String email:emails
)
{
serviceLogWarn
(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email
);
logger.
warn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email
);
}
List
<String
> arguments =
new ArrayList
<String
>();
arguments.
add(cause.
replace("\n",
"<br/>"));
Email email =
new Email
(subject,emails,Globals.
SYSTEM_EMAIL_BOX,
"messageToAdmin_pt.txt",arguments
);
email.
setHtml(true);
try {
new SendEmailService
().
sendEmail(email
);
} catch (ServiceException e
) {
e.
printStackTrace();
}
}
public 1.5.0/docs/api/java/lang/Integer.html">Integer getRealCourse
(1.5.0/docs/api/java/lang/String.html">String turma,
1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode,
1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages messages
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
HashMap
<String,List
<Integer
>> pairs = getCourseTurmaPairs
(year,institutionCode,semestre,messages
);
List
<Integer
> cursos = pairs.
get(turma
);
if(cursos.
size() > 1
)
{
1.5.0/docs/api/java/lang/String.html">String msgAdmin =
"";
1.5.0/docs/api/java/lang/String.html">String msg =
"####Atenção existe um caso de dúvida nas inscrições : " + year +
"-" + semestre +
" turma " + turma
;
msgAdmin += msg +
"\n";
logger.
warn(msg
);
serviceLogWarn
(msg
);
msg =
"####A turma " + turma +
" tem " + cursos.
size() +
" cursos associados: ";
logger.
warn(msg
);
serviceLogWarn
(msg
);
msgAdmin += msg +
"\n";
for(1.5.0/docs/api/java/lang/Integer.html">Integer curso: cursos
)
{
msg =
"######->turma:" + turma +
" -> curso siges: " + curso.
longValue();
msgAdmin += msg +
"\n";
logger.
warn(msg
);
serviceLogWarn
(msg
);
}
sendNotificationAdmin
("Atenção existe um caso de dúvida nas inscrições vamos devolver código invalido de curso para o sistema atribuir o primeiro onde a unidade se encontre",msgAdmin
);
return -
1;
}
else if(cursos.
size() == 1
)
{
return cursos.
get(0
);
}
else
{
1.5.0/docs/api/java/lang/String.html">String msg =
"####Atenção existe uma turma que nao tem curso associado : " + year +
"-" + semestre +
" turma " + turma
;
sendNotificationAdmin
("Atenção existe uma turma que nao tem curso associado",msg
);
logger.
error(msg
);
serviceLogError
(msg
);
return null;
}
}
protected static boolean isCursoFicticio
(int cursoCode
)
{
if(cursosFicticios ==
null)
cursosFicticios = DaoFactory.
getConfigurationDaoImpl().
getCursosFicticios();
for(1.5.0/docs/api/java/lang/Integer.html">Integer cursoFicticio: cursosFicticios
)
{
if(cursoFicticio.
intValue() == cursoCode
)
{
return true;
}
}
return false;
}
HashMap
<String,HashMap
<String,List
<Integer
>>> semestreTurmaCursosPairs =
new HashMap
<String, HashMap
<String, List
<Integer
>>>();
private HashMap
<String,List
<Integer
>> getCourseTurmaPairs
(1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode,
1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages messages
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
HashMap
<String,List
<Integer
>> turmaCourses = semestreTurmaCursosPairs.
get(year +
";" + semestre
);
if(turmaCourses ==
null)
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Starting structure pairs turma curso para : " + year +
"-" + semestre
;
logger.
info(msg
);
serviceLogInfo
(msg
);
/* ArrayOfTurmaCurso arrayOfTurmaCurso = service.getSiGesWEBSoap().loadParesTurmaCurso(
new BigDecimal(DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode())
, year,semestre);*/
List
<pt.
estgp.
estgweb.
services.
sigesimports.
oracle.
domain.
TurmaCurso> turmaCursos = TurmaDao.
getInstance().
loadTurmasCurso(institutionCode, year, semestre
);
turmaCourses =
new HashMap
<String, List
<Integer
>>();
for(pt.
estgp.
estgweb.
services.
sigesimports.
oracle.
domain.
TurmaCurso turmaCursoPair: turmaCursos
)
{
List
<Integer
> cursos = turmaCourses.
get(turmaCursoPair.
getCdTurma());
if(cursos ==
null)
{
cursos =
new ArrayList
<Integer
>();
turmaCourses.
put(turmaCursoPair.
getCdTurma(),cursos
);
}
if(turmaCursoPair.
getCodigoCurso().
intValue() >= 0
)
{
boolean cursoFicticio = isCursoFicticio
(turmaCursoPair.
getCodigoCurso().
intValue());
if(!cursoFicticio
)
{
cursos.
add(turmaCursoPair.
getCodigoCurso());
msg =
"Adding:" + turmaCursoPair.
getCdTurma() +
"->" + turmaCursoPair.
getCodigoCurso();
logger.
info(msg
);
serviceLogInfo
(msg
);
if(cursos.
size()>1
)
{
turmaMoreThanOneRegularCourse++
;
turmasMoreThanOneCourse.
add(turmaCursoPair.
getCdTurma());
msg =
"Warning: turma " + turmaCursoPair.
getCdTurma() +
" has more than one regular course associated ";
logger.
warn(msg
);
serviceLogWarn
(msg
);
//Nao vamos reportar aviso neste caso
//messages.addMessage(new DefaultLogMessage("", LogMessageTypeEnum.WARNING,msg));
}
}
else
{
msg =
"Not adding:" + turmaCursoPair.
getCdTurma() +
"->" + turmaCursoPair.
getCodigoCurso() +
" -> Codigo de Curso Ficticio ->não vai ser considerado";
logger.
info(msg
);
serviceLogInfo
(msg
);
}
}
else
{
msg =
"Excluding:" + turmaCursoPair.
getCdTurma() +
"->" + turmaCursoPair.
getCodigoCurso();
logger.
warn(msg
);
serviceLogInfo
(msg
);
}
}
semestreTurmaCursosPairs.
put(year +
";" + semestre,turmaCourses
);
/***END INICIALIZACAO***/
}
/**Inicialização da Estrutura de Suporte aos Cursos/Turma*/
return turmaCourses
;
}
/**
* Nao esta testado
* jm
*
* @param alunoSiges Aluno
* @param student Student
*/
private void persist
(Aluno alunoSiges, Student student,
boolean newUser,
1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode,
1.5.0/docs/api/java/lang/String.html">String activeImportYear, DefaultLogMessages logMessages, AlunoDao service
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
updateStudentFields
(alunoSiges, student, newUser
);
updateSituacaoPropinas
(alunoSiges, student, activeImportYear
);
/*Desta forma as relacoes antigas sao ignoradas cria-se uma lista nova e atribui-se ao Teacher, o Hibernate faz resto e apaga as chaves estrangeiras antigas */
if (alunoSiges.
getDisciplinasInscrito() ==
null || alunoSiges.
getDisciplinasInscrito().
size() == 0
)
{
studentsZeroUnits++
;
serviceLogWarn
("ATENTION STUDENT WITH ZERO UNITS: codigo " + alunoSiges.
getCodigo());
logger.
warn("ATENTION STUDENT WITH ZERO UNITS: codigo " + alunoSiges.
getCodigo());
StudentImpl studentImpl =
(StudentImpl
) DaoFactory.
getStudentDaoImpl().
narrow(student
);
removerUnidadesQueDesapareceramNoSiges
(year,
new HashSet
<CourseUnit
>(), studentImpl
);
consistirTurmasAluno
(studentImpl, year,
new HashMap
<CourseUnit, String
>());
}
else
{
//1 - PROCEDIMENTO CADEIRAS SAO CARREGADAS DO BACO DA LISTA QUE VEM DO SIGES -> units CADEIRAS SIGES PERS BACO
//2 - Sao retiradas da lista units as que o aluno tem mas que foram removidas localmente CADEIRAS SIGES PERS BACO - REMOVIDAS LOCALMENTE = CADEIRAS SIGES PER BACO LIMPAS
//3 - Sao adicionadas ao aluno as que o aluno ainda nao tiver da lista units CADEIRAS SIGES LIMPAS ---> COPY ---> ALUNO CADEIRAS
//4 - Por fim Sao removidas da lista final as unidades que não vêm do SIGES e que não foram adicionadas localmente CADEIRAS ALUNO - CADEIRAS SIGES = CADEIRAS EXCEDENTES
//5 - Consistir Turmas do Aluno com novas cadeiras - Turmas do aluno sem cadeira correspondente sao apagadas, novas adicionadas
//Mapa de unidades carregadas a partir do Siges para o aluno associadas à turma que vinha do siges
//Para todas as cadeiras correspondentes 'as do SIGES no baco existira uma entrada com a turma nesta tabela
Map
<CourseUnit,String
> map_CourseUnit_x_Turma =
new HashMap
<CourseUnit, String
>();
//PASSO 1
//turmas separadas : depende da escolha de turmas separadas para o curso
//caso aconteca a unidade será discriminada pelo código de turma como unica o mesmo é feito na importacao de cursos
Set
<CourseUnit
> unitsFromSigesPersistentInBaco = obterCadeirasBacoCorrespondentes
(alunoSiges, student, year, institutionCode, logMessages, map_CourseUnit_x_Turma
);
//PASSO 2 - Sao retiradas da lista unitsFromSigesPersistentInBaco as que o aluno tem mas que foram removidas localmente
//turmas separadas : Nao afetado pelas turmas separadas usa apenas os codigos do baco nas verificacoes para remocoes
StudentImpl studentImpl = removerRemovidasLocalmente
(student, unitsFromSigesPersistentInBaco
);
student = studentImpl
;//just to be allays consistent
//PASSO 3 - Sao adicionadas ao aluno as unidades que o aluno ainda nao tiver da lista unitsFromSigesPersistentInBaco
//turmas separadas : Seguro a verificação de existencia é feita pelo id da unidade curricular no baco nas verificacoes para remocoes
adicionarCadeirasNovasAoAluno
(studentImpl, unitsFromSigesPersistentInBaco
);
//PASSO 4 - Remover unidades deste ano que nao vem do SIGES e que nao foram adicionadas localmente
//turmas separadas : Seguro a verificação de existencia é feita pelo id da unidade curricular no baco nas verificacoes para remocoes
removerUnidadesQueDesapareceramNoSiges
(year, unitsFromSigesPersistentInBaco, studentImpl
);
//PASSO 5 - Consistir Turmas do Aluno com novas cadeiras - Turmas do aluno sem cadeira correspondente sao apagadas, novas sao adicionadas
//Este metodo vai necessitar de obter as turmas das unidades que vieram do SIGES atraves do mapa map_CourseUnit_x_Turma
//de forma a garantir que as mesmas estão consistentes em
//em termos de relacoes com turmas na classe CourseUnitTurma
//deste modo se alguma unidade foi adicionada localmente poderá nao ser removida no PASSO 4 e nao havera correspondente
//para a turma nesta tabela map_CourseUnit_x_Turma logo essas turmas nessas unidades nao serao mechidas, um aviso e emitido
consistirTurmasAluno
(studentImpl, year, map_CourseUnit_x_Turma
);
}
}
private void consistirTurmasAluno
(StudentImpl student,
1.5.0/docs/api/java/lang/String.html">String year, Map
<CourseUnit, String
> map_CourseUnit_x_Turma
) {
//PASSO 1 Para cada cadeira onde o aluno se encontra inscrito
// obter a turma onde o aluno esta' colocado, se nao existir criar e afectar a turma
//PASSO 2 Colocar o aluno nessa turma se ele ainda lá nao estiver
//PASSO 3 Para todas as turmas do aluno de cadeiras do ano corrente
// se essa turma nao estiver na lista de Turmas afectadas
// remover a turma do aluno
// remove ao mesmo tempo da lista da turma da unidade
//PASSO 1
Map
<CourseUnitTurma,Boolean
> turmasAfectadas =
new HashMap
<CourseUnitTurma,Boolean
>();
for(CourseUnit cu: student.
getSubscribedUnits())
{
if(cu.
getImportYear().
equals(year
))
{
if(cu.
getTurmas() ==
null)
{
cu.
setTurmas(new HashSet
<CourseUnitTurma
>());
}
// TODO O CODIGO DA TURMA AQUI VEM ANUL NUM CASO QUALQUER ESQUISITO VER O QUE E NO RUN
1.5.0/docs/api/java/lang/String.html">String codigoTurma = map_CourseUnit_x_Turma.
get(cu
);
if(student.
isLocalUnit(cu
) && codigoTurma ==
null)
{
//nao tem correspondencia no mapa de turmas uma vez que nao foi carregada no siges
//mas foi mantida porque foi adicionada manualmente
//deste modo usaremos a turma antiga
//e nao afetaremos uma turma nao afetada, esta nao sera verificada
1.5.0/docs/api/java/lang/String.html">String msg =
"Atenção turma com código null nao sera verificada e' local unit:" + cu.
getCode() +
" aluno:" + student.
getSigesCode();
serviceLogInfo
(msg
);
logger.
info(msg
);
}
else if(codigoTurma ==
null)
{
//Este caso nao deverá acontecer porque no PASSO 4 da persistencia apenas nao se removem as adicionadas localmente
1.5.0/docs/api/java/lang/String.html">String msg =
"Atenção turma com código null e nao e' local unit:" + cu.
getCode() +
" aluno:" + student.
getSigesCode();
serviceLogError
(msg
);
logger.
error(msg
);
}
else
{
CourseUnitTurma courseUnitTurma = findOrCreateCourseUnitTurma
(codigoTurma, cu
);
turmasAfectadas.
put(courseUnitTurma,
true);
}
}
}
//PASSO 2
for(CourseUnitTurma turmaAfectada: turmasAfectadas.
keySet())
{
if(turmaAfectada.
getStudents() ==
null ||
!turmaAfectada.
getStudents().
contains(student
))
{
if(turmaAfectada.
getStudents() ==
null)
turmaAfectada.
setStudents(new HashSet
<StudentImpl
>());
turmaAfectada.
getStudents().
add(student
);
//student.getTurmas().add((CourseUnitTurmaImpl) turmaAfectada);
}
}
//PASSO 3
if(student.
getTurmas() !=
null)
{
Iterator
<CourseUnitTurmaImpl
> iter = student.
getTurmas().
iterator();
while(iter.
hasNext())
{
CourseUnitTurmaImpl turma = iter.
next();
if(turma.
getCourseUnit().
getImportYear().
equals(year
))
{
if(student.
isLocalUnit(turma.
getCourseUnit()) && turmasAfectadas.
get(turma
) ==
null)
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Atenção turma com código " + turma.
getTurma() +
" nao sera removida porque e' a turma da local unit:" + turma.
getCourseUnit().
getCode() +
" aluno:" + student.
getSigesCode();
serviceLogInfo
(msg
);
logger.
info(msg
);
}
else if(turmasAfectadas.
get(turma
) ==
null)
{
//Este caso nao devera acontecer mas fica aqui a seguranca
1.5.0/docs/api/java/lang/String.html">String msg =
"Atenção turma com código " + turma.
getTurma() +
" nao existe nas afetadas e vai ser removida ao aluno e nao e' local unit:" + turma.
getCourseUnit().
getCode() +
" aluno:" + student.
getSigesCode();
serviceLogError
(msg
);
logger.
error(msg
);
iter.
remove();
turma.
getStudents().
remove(student
);
}
}
}
}
}
/**
*
* @param cdturma
* @param cu
* @return
*/
private CourseUnitTurma findOrCreateCourseUnitTurma
(1.5.0/docs/api/java/lang/String.html">String cdturma, CourseUnit cu
) {
CourseUnitTurma courseUnitTurma =
null;
try{
for(CourseUnitTurma turma: cu.
getTurmas())
{
if(turma.
getTurma() !=
null && turma.
getTurma().
trim().
equals(cdturma.
trim()))
{
courseUnitTurma = turma
;
break;
}
}
if(courseUnitTurma ==
null)
{
courseUnitTurma = DomainObjectFactory.
createCourseUnitTurmaImpl();
courseUnitTurma.
setTurma(cdturma
);
DaoFactory.
getCourseUnitTurmaDaoImpl().
save(courseUnitTurma
);
courseUnitTurma.
setCourseUnit(cu
);
cu.
getTurmas().
add(courseUnitTurma
);
}
}catch(1.5.0/docs/api/java/lang/Exception.html">Exception e
)
{
e.
toString();
e.
printStackTrace();
}
return courseUnitTurma
;
}
/**
*
* @param student
* @param year
* @param unitsFromSigesPersistentInBaco
* @param student
*/
private void removerUnidadesQueDesapareceramNoSiges
(1.5.0/docs/api/java/lang/String.html">String year, Set
<CourseUnit
> unitsFromSigesPersistentInBaco, StudentImpl student
) {
Iterator
<CourseUnit
> iterNowUnits = student.
getSubscribedUnits().
iterator();
while(iterNowUnits.
hasNext())
{
CourseUnit cUNow = iterNowUnits.
next();
if(cUNow.
getImportYear().
equals(year
))
//Apenas tentamos apagar as unidades do ano corrente.
//Este servico trabalha com unidades importadas do ano que e passado como argumento
//Se importamos unidades desse ano, as dos outros anos nao vem na lista, logo
//iriamos constatar que nenhuma estava no SIGES o que nao e verdade.
//Assim so apagamos unidades do ano que estamos a importar e que nao venham
//na importacao desse ano
{
boolean added =
false;
for(CourseUnit c: unitsFromSigesPersistentInBaco
)
{
if(cUNow.
getId() == c.
getId())
{
added =
true;
break;
}
}
if(!added
)
{
if(!student.
isLocalUnit(cUNow
))
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Removendo unidade: " +
((CourseUnitImpl
)cUNow
).
getSigesUniqueIdentifiers() +
" - do aluno: " + student.
getSigesCode() +
" - Associacao desapareceu do SIGES";
serviceLogInfo
(msg
);
logger.
info(msg
);
iterNowUnits.
remove();
unitsRemovedToStudents++
;
}
else
{
1.5.0/docs/api/java/lang/String.html">String msg =
"NAO REMOVIDA - Unidade: " +
((CourseUnitImpl
)cUNow
).
getSigesUniqueIdentifiers() +
" - do aluno: " + student.
getSigesCode() +
" - Associacao desapareceu do SIGES mas foi adicionada localmente";
serviceLogInfo
(msg
);
logger.
info(msg
);
unitsLocalAddedNotRemoved++
;
}
}
}
}
}
private void adicionarCadeirasNovasAoAluno
(Student student, Set
<CourseUnit
> unitsFromSigesPersistentInBacoLimpas
) {
if(student.
getSubscribedUnits() !=
null)
{
for(CourseUnit c: unitsFromSigesPersistentInBacoLimpas
)
{
boolean isIn =
false;
for(CourseUnit tc : student.
getSubscribedUnits())
{
if(tc.
getId() == c.
getId())
{
isIn =
true;
break;
}
}
if(!isIn
)
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Adicionando unidade: " +
((CourseUnitImpl
)c
).
getSigesUniqueIdentifiers() +
" - ao aluno: " + student.
getSigesCode() +
" - Associacao nova no SIGES";
serviceLogInfo
(msg
);
logger.
info(msg
);
unitsAddedToStudents++
;
student.
getSubscribedUnits().
add(c
);
}
}
}
else
student.
setSubscribedUnits(unitsFromSigesPersistentInBacoLimpas
);
}
private StudentImpl removerRemovidasLocalmente
(Student student, Set
<CourseUnit
> unitsFromSigesPersistentInBaco
) {
Iterator
<CourseUnit
> iter = unitsFromSigesPersistentInBaco.
iterator();
StudentImpl studentImpl =
(StudentImpl
) DaoFactory.
getStudentDaoImpl().
narrow(student
);
while (iter.
hasNext())
{
CourseUnit courseUnit = iter.
next();
//In case of a comming proxy
if(studentImpl.
isLocalRemovedUnit(courseUnit
))
{
unitsLocallyRemovedNotAdded++
;
1.5.0/docs/api/java/lang/String.html">String msg =
"Removendo unidade: " +
((CourseUnitImpl
)courseUnit
).
getSigesUniqueIdentifiers() +
" - do aluno: " + student.
getSigesCode() +
" - Associacao existe no SIGES mas foi removido LOCALMENTE";
serviceLogInfo
(msg
);
logger.
info(msg
);
iter.
remove();
}
}
return studentImpl
;
}
private Set
<CourseUnit
> obterCadeirasBacoCorrespondentes
(Aluno alunoSiges, Student student,
1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode, DefaultLogMessages logMessages, Map
<CourseUnit, String
> map_CourseUnit_x_Turma
) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException {
Set
<CourseUnit
> unitsFromSigesPersistentInBaco =
new HashSet
<CourseUnit
>();
for (Disciplina disciplina : alunoSiges.
getDisciplinasInscrito())
{
boolean cursoFicticio = isCursoFicticio
(disciplina.
getCodigoCurso().
intValue());
1.5.0/docs/api/java/lang/Integer.html">Integer codigoDoCurso = disciplina.
getCodigoCurso().
intValue();
if( (disciplina.
getCdTipoDisciplina() !=
null
&&
disciplina.
getCdTipoDisciplina().
intValue() == ImportCourseService.
SIGES_CODIGO_TIPO_DISCIPLINA_EXTRA_CURRICULAR)
||
cursoFicticio
)
{
if(cursoFicticio
)
{
alunosErasmusCadeirasEcontradas++
;
1.5.0/docs/api/java/lang/String.html">String msg =
"Disciplina para Aluno " + student.
getSigesCode() +
" de Curso Ficticio " +disciplina.
getCodigoCurso().
intValue() +
" encontrada vamos trocar para código de curso real";
serviceLogInfo
(msg
);
logger.
info(msg
);
}
else
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Disciplina para Aluno " + student.
getSigesCode() +
" ExtraCurricular " +disciplina.
getCodigoCurso().
intValue() +
" encontrada vamos trocar para código de curso real";
serviceLogInfo
(msg
);
logger.
info(msg
);
}
codigoDoCurso = getRealCourse
(disciplina.
getCdTurma(),year,institutionCode,disciplina.
getCdDuracao(),logMessages
);
if(codigoDoCurso
!=
null)
{
if(codigoDoCurso
< 0
)
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Codigo de curso (" + disciplina.
getCodigoCurso() +
") da disciplina " + disciplina.
getCodigo() +
" tipo: " + disciplina.
getCdTipoDisciplina() +
" turma: " + disciplina.
getCdTurma() +
" tem mais de um curso vamos procurar num qualquer curso onde exista ";
serviceLogInfo
(msg
);
logger.
info(msg
);
}
else
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Codigo de curso (" + disciplina.
getCodigoCurso() +
") da disciplina " + disciplina.
getCodigo() +
" tipo: " + disciplina.
getCdTipoDisciplina() +
" turma: " + disciplina.
getCdTurma() +
" Modificado para o real: " + codigoDoCurso
;
serviceLogInfo
(msg
);
logger.
info(msg
);
}
}
else
{
1.5.0/docs/api/java/lang/String.html">String msg =
"Problema Encontrado Turma não tem Curso Real --> Codigo de curso (" + disciplina.
getCodigoCurso() +
") da disciplina " + disciplina.
getCodigo() +
" tipo: " + disciplina.
getCdTipoDisciplina() +
" turma: " + disciplina.
getCdTurma();
serviceLogWarn
(msg
);
logger.
warn(msg
);
msg =
"A unidade " + disciplina.
getCodigo() +
" não será adicionada ao aluno " + alunoSiges.
getCodigo() +
" porque nao foi encontrada, possivelmente apenas existe para alunos com inscrição NORMAL";
serviceLogWarn
(msg
);
logger.
warn(msg
);
unidadesSoComAlunosExtra++
;
continue;
}
}
//Politica de separação de turmas em unidades independentes neste curso
boolean separateTurmas = ImportCourseService.
loadCourseYearTurmasPolicy(codigoDoCurso, year, logMessages,
this);
List
<CourseUnit
> courseUnits
;
/*BLOCO DE LOAD DAS UNIDADES*/
if(codigoDoCurso
<=
0) //O curso encontrado foi mais que um vamos fazer o melhor esforço e atribuir um que dê isto apenas deverá acontecer com erasmus e em turmas com mais que um curso
{
unidadesProcuradasNumCursoAleatorio++
;
if(separateTurmas
)
courseUnits = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUniqueWithTurmaIgnoreCourse("" + disciplina.
getCodigo(), disciplina.
getCdDuracao(), disciplina.
getCdLectivo(), disciplina.
getCdTurma());
else
courseUnits = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUniqueIgnoreCourse("" + disciplina.
getCodigo(),disciplina.
getCdDuracao(),disciplina.
getCdLectivo());
if(courseUnits.
size() > 0)
{
//Neste caso adicionamos apenas a primeira
CourseUnit cu = courseUnits.
get(0
);
courseUnits =
new ArrayList
<CourseUnit
>();
courseUnits.
add(cu
);
}
}
else
{
if(separateTurmas
)
courseUnits = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUniqueWithTurma("" + disciplina.
getCodigo(),
"" + codigoDoCurso, disciplina.
getCdDuracao(), disciplina.
getCdLectivo(), disciplina.
getCdTurma());
else
courseUnits = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCodeUnique("" + disciplina.
getCodigo(),
"" + codigoDoCurso,disciplina.
getCdDuracao(),disciplina.
getCdLectivo());
}
/*BLOCO DE LOAD DAS UNIDADES*/
if(courseUnits
!=
null && courseUnits.
size() > 1
)
{
studentComUnidadesRepetidas=
true;
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"Unidade Repetida: (" + disciplina.
getCodigo() +
") curso: " + disciplina.
getCodigoCurso() +
" " + disciplina.
getCdDuracao() +
" " + year,
"see log for details", LogMessageTypeEnum.
WARNING));
logger.
fatal(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
}
//CourseUnit courseUnit = null;
//Special procedure for Aluno to check if turma not exist will find without turma code to keep old years compatibility
/*if(courseUnit == null)
{
unitsNotFoundTurma++;
courseUnit = tryFindCourseUnitWithOutTurma(logMessages,disciplina.getCdDuracao(),""+disciplina.getCodigo().intValue()
,"" + codigoDoCurso.intValue(),disciplina.getCdLectivo(),disciplina.getCdTurma());
}*/
if(courseUnits ==
null || courseUnits.
size() == 0
)
{
unitsNotFound++
;
1.5.0/docs/api/java/lang/String.html">String msg =
"Unit not found (student " + student.
getSigesCode() +
"): semestre:" + disciplina.
getCdDuracao() +
" codigo:" + disciplina.
getCodigo() +
" course:" + codigoDoCurso +
" year:" + disciplina.
getCdLectivo() +
" turma: " + disciplina.
getCdTurma();
serviceLogWarn
(msg
);
logger.
warn(msg
);
}
else
{
for(CourseUnit found: courseUnits
)
{
map_CourseUnit_x_Turma.
put(found,disciplina.
getCdTurma());
}
unitsFromSigesPersistentInBaco.
addAll(courseUnits
);
}
}
return unitsFromSigesPersistentInBaco
;
}
private void updateSituacaoPropinas
(Aluno alunoSiges, Student student,
1.5.0/docs/api/java/lang/String.html">String activeImportYear
) {
if(alunoSiges.
getHistoricos() ==
null || alunoSiges.
getHistoricos().
size() == 0
)
{
student.
setPropinasEmDia(false);
serviceLogWarn
("ATENTION Estudante sem historico de Matriculas para aferir propinas: codigo " + alunoSiges.
getCodigo());
logger.
warn("ATENTION Estudante sem historico de Matriculas para aferir propinas: codigo " + alunoSiges.
getCodigo());
}
else
{
student.
setPropinasEmDia(false);
student.
setPropinasEmDiaYear(activeImportYear
);
for(AlunoHistorico hist: alunoSiges.
getHistoricos())
{
if(hist.
getCodigoLectivo()!=
null && hist.
getCodigoLectivo().
equals(activeImportYear
))
{
if(hist.
getPropinaEmDia().
equalsIgnoreCase("s"))
{
student.
setPropinasEmDia(true);
student.
setPropinasEmDiaYear(activeImportYear
);
}
break;
}
}
if(!student.
isPropinasEmDia())
{
serviceLogInfo
("ATENTION Estudante sem propina em dia: codigo " + alunoSiges.
getCodigo());
logger.
info("ATENTION Estudante sem propina em dia: codigo " + alunoSiges.
getCodigo());
}
}
}
private void updateStudentFields
(Aluno alunoSiges, Student student,
boolean newUser
) {
if(newUser
)
{
studentsNew++
;
cloneFields
(alunoSiges, student
);
1.5.0/docs/api/java/lang/String.html">String msg =
"NOVO ALUNO ENCONTRADO: siges:" + student.
getSigesCode() +
" bi:" + student.
getBi() +
" nome:" + student.
getName();
serviceLogInfo
(msg
);
logger.
info(msg
);
}
//CASO EM QUE O ALUNO NO SIGES FOI ATRIBUIDO A OUTRO ESTUDANTE PARA PREENCHER BURACO NA NUMERACAO
else if(alunoSiges.
getNumeroBi() ==
null || student.
getBi() ==
null ||
! alunoSiges.
getNumeroBi().
equals(student.
getBi()))
{
studentsChangeBI++
;
1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder builder =
new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
builder.
append("ATENCAO NUMERO DE ALUNO " + alunoSiges.
getCodigo() +
" MUDOU DE DONO Confirme dados\n");
builder.
append("ALTERANDO DADOS DO ALUNO " + alunoSiges.
getCodigo() +
"\n");
builder.
append("-----ANTES: " +
"\n");
builder.
append("-----BI: " + student.
getBi() +
"\n");
builder.
append("-----Nome: " + student.
getName() +
"\n");
builder.
append("-----Username: " + student.
getUserNameNetpa() +
"\n");
builder.
append("-----Address: " + student.
getAddress() +
"\n");
builder.
append("-----Zip: " + student.
getZip() +
"\n");
builder.
append("-----Email: " + student.
getEmail() +
"\n");
builder.
append("-----Phone: " + student.
getPhonenumber() +
"\n");
cloneFields
(alunoSiges, student
);
//todo verificar isto
//student.setAutoBlockMode(false);
//student.setManualBlock(true);
builder.
append("DEPOIS: " +
"\n");
builder.
append("BI: " + student.
getBi() +
"\n");
builder.
append("Nome: " + student.
getName() +
"\n");
builder.
append("Username: " + student.
getUserNameNetpa() +
"\n");
builder.
append("Address: " + student.
getAddress() +
"\n");
builder.
append("Zip: " + student.
getZip() +
"\n");
builder.
append("Email: " + student.
getEmail() +
"\n");
builder.
append("Phone: " + student.
getPhonenumber() +
"\n");
serviceLogWarn
(builder.
toString());
sendNotificationAdmin
("CODIGO SIGES " + alunoSiges.
getCodigo() +
" MUDOU DE DONO - FOI BLOQUEADO ",builder.
toString());
}
}
/*private CourseUnit tryFindCourseUnitWithOutTurma(DefaultLogMessages logMessages, String cdDuracao, String codigo,String codigoCurso,String cdLectivo,String cdTurma)
{
CourseUnit courseUnit = null;
String msg = "Unit not found with turma code : semestre:" + cdDuracao + " codigo:" + codigo + " course:" + codigoCurso + " year:" + cdLectivo + " turma: " + cdTurma;
logMessages.addMessage(new DefaultLogMessage("", LogMessageTypeEnum.WARNING,msg));
serviceLogWarn(msg);
logger.warn(msg);
msg = "Trying without Turma code...";
serviceLogWarn(msg);
logger.warn(msg);
List<CourseUnit> cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCode("" + codigo,"" + codigoCurso,cdDuracao,cdLectivo);
if(cus != null && cus.size() == 1)
{
courseUnit = cus.get(0);
msg = "Found ok...";
serviceLogInfo(msg);
logger.info(msg);
}
else if(cus !=null && cus.size() > 1)
{
courseUnit = cus.get(0);
msg = "Found More than one, unexpected situation..." + cus.get(0).getId() + " - " + cus.get(1).getId();
logMessages.addMessage(new DefaultLogMessage("", LogMessageTypeEnum.WARNING,msg));
serviceLogWarn(msg);
logger.warn(msg);
}
else
{
msg = "Not Found ...";
serviceLogInfo(msg);
logger.info(msg);
}
return courseUnit;
}*/
private void cloneFields
(Aluno alunoSiges, Student student
) {
student.
setName(alunoSiges.
getNome());
student.
setEmail(alunoSiges.
getEmail());
student.
setSigesCode(alunoSiges.
getCodigo().
intValue());
student.
setAddress(alunoSiges.
getMorada());
student.
setPhonenumber(StringsUtils.
cleanKeepNumbers(alunoSiges.
getTelemovel()));
student.
setZip("" + alunoSiges.
getCodigoPostal().
intValue());
student.
setBi(alunoSiges.
getNumeroBi());
student.
setSex(alunoSiges.
getSexo());
student.
setUserNameNetpa(alunoSiges.
getUsernameNetpa());
student.
setBirthDate(alunoSiges.
getDataNascimento());
student.
setUsername("a" + alunoSiges.
getCodigo().
intValue());
}
@
1.5.0/docs/api/java/lang/Override.html">Override
protected ILogMessages runJobServiceTask
() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable {
1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap
().
get(JOB_importYear_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String institutionCode = getParametersMap
().
get(JOB_institution_KEY
).
getObject();
ILogMessages messages = run
(importYear,
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(institutionCode
));
return messages
;
}
/**
* Testar por aqui poi requer Super Role e assim e' autmatico
*
* @param args of main
* @throws 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();
1.5.0/docs/api/java/lang/System.html">System.
out.
println("YEAR:" + year
);
if(args
!=
null && args.
length > 0
)
year = args
[0
];
1.5.0/docs/api/java/lang/String.html">String institutionCode =
"3";
if(args
!=
null && args.
length > 1
)
institutionCode = args
[1
];
AbstractDao.
getCurrentSession().
beginTransaction();
new ImportStudentsService
().
run(year,
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(institutionCode
));
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
}