package pt.estgp.estgweb.services.sigesimports;
import jomm.dao.impl.AbstractDao;
import jomm.utils.TemplateUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.enums.LangEnum;
import pt.estgp.estgweb.services.email.EMAILJob;
import pt.estgp.estgweb.services.email.SendEmailService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.jobs.JobScheduleService;
import pt.estgp.estgweb.services.jobs.ServiceJob;
import pt.estgp.estgweb.services.logresults.ILogMessages;
import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage;
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.services.sigesimports.oracle.dao.NotaDao;
import pt.estgp.estgweb.services.sigesimports.oracle.domain.Nota;
import pt.estgp.estgweb.services.sms.SMSJob;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import java.util.*;
/**
* @author Jorge Machado
* @date 11/May/2008
* @time 12:51:32
* @see pt.estgp.estgweb
*/
public class ImportGradesService
extends ServiceJob
implements IService
{
private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger =
1.5.0/docs/api/java/util/logging/Logger.html">Logger.
getLogger(ImportGradesService.
class);
private static final int MAX_COMMIT =
20;
private HashMap
<Long,List
<Long
>> newGrades =
new HashMap
<Long,List
<Long
>>();
public ILogMessages run
(1.5.0/docs/api/java/lang/String.html">String year,
int institutionCode
) throws ServiceException
{
DefaultLogMessages logMessages =
new DefaultLogMessages
();
logMessages.
addMessage(new DefaultLogMessage
("import.grades", LogMessageTypeEnum.
INFO,
"instituicao " + institutionCode +
" ano : " + year
));
logger.
info(logMessages.
getLastMessage());
serviceLogInfo
(logMessages.
getLastMessage());
Map
<Integer,Integer
> alunos =
new HashMap
<Integer,Integer
>();
Map
<String,String
> alunoCadeira =
new HashMap
<String,String
>();
int foundTotal =
0;
try
{
logger.
info("Loading Epocas de avaliacao");
serviceLogInfo
("Loading Epocas de avaliacao");
List
<ConfigurationGradesEpocaAvaliacao
> epocas = DaoFactory.
getConfigurationGradesEpocaAvaliacaoDaoImpl().
findAll();
if(epocas ==
null || epocas.
size() == 0
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.grades",LogMessageTypeEnum.
WARNING,
"Sem Epocas de Avaliacao, por favor adicione as epocas ao sistema"));
logger.
warn(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
return logMessages
;
}
List
<ConfigurationGradesStatusEpoca
> statusEpocas = DaoFactory.
getConfigurationGradesStatusEpocaDaoImpl().
findAll();
if(statusEpocas ==
null || statusEpocas.
size() == 0
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.grades",LogMessageTypeEnum.
WARNING,
"Sem Status de epocas de avaliacao, por favor adicione as epocas ao sistema"));
logger.
warn(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
return logMessages
;
}
HashMap
<String,String
> mapaEpocasAvaliacao =
new HashMap
<String, String
>();
for(ConfigurationGradesEpocaAvaliacao epoca: epocas
)
{
mapaEpocasAvaliacao.
put(epoca.
getCodigoEpoca() +
"-" + epoca.
getCodigoMomento(), epoca.
getDescricao());
}
HashMap
<String,String
> mapaStatusEpocas =
new HashMap
<String, String
>();
for(ConfigurationGradesStatusEpoca statusEpoca: statusEpocas
)
{
mapaStatusEpocas.
put(statusEpoca.
getStatus(), statusEpoca.
getDescricao());
}
//AbstractDao.getCurrentSession().beginTransaction();
/*String WSDL = DaoFactory.getConfigurationDaoImpl().getSigesWebServicesWsdl();
SiGesWEB service;
try
{
service = new SiGesWEB(new URL(WSDL), new QName(Globals.SIGES_WEBSERVICE_TARGET_NAMESPACE, "SiGesWEB"));
}
catch (MalformedURLException e)
{
logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(),"erro na configuracao do WEB Service", LogMessageTypeEnum.INFO));
logger.fatal(e, e);
serviceLogFatal(logMessages.getLastMessage());
return logMessages;
}*/
NotaDao service = NotaDao.
getInstance();
//ArrayOfNota arrayOfNotas = service.getSiGesWEBSoap().getNotas(new BigDecimal(DaoFactory.getConfigurationDaoImpl().getSigesInstitutionCode()), year);
List
<Nota
> notas = service.
loadNotas(institutionCode, year
);
int i =
0;
for (Nota nota : notas
)
{
foundTotal++
;
if (i++
> MAX_COMMIT
)
{
i =
0;
setProgress
((int) (((float)foundTotal
)/
((float)notas.
size())*100.0f
));
commitPartially
();
}
/**
* n.codigo_aluno = getDecimal("CD_ALUNO",aReader); ----- OK
n.codigo_curso = getDecimal("CD_CURSO", aReader); ----- OK
n.codigo_disciplina = getDecimal("CD_DISCIP", aReader);- OK
n.nota = getDecimal("NR_AVALIA", aReader); ---------- OK
n.data_avaliacao = getDateTime("DT_AVALIA", aReader); - OK
n.status_epoca = getDecimal("CD_STA_EPO", aReader); -- OK
n.cd_duracao = getString("CD_DURACAO",aReader); - ------ OK
*/
int codAluno = nota.
getCodigo_aluno().
intValue();
alunos.
put(codAluno,codAluno
);
int codUnidade = nota.
getCodigo_disciplina().
intValue();
alunoCadeira.
put(codAluno +
"$" + codUnidade,codAluno +
"$" + codUnidade
);
int codCurso = nota.
getCodigo_curso().
intValue();
1.5.0/docs/api/java/lang/String.html">String cdDuracao = nota.
getCd_duracao();
int valor = nota.
getNota().
intValue();
int statusEpoca = nota.
getStatus_epoca().
intValue();
5+0%2Fdocs%2Fapi+Date">Date data = nota.
getData_avaliacao();
int momento = nota.
getMomento_avaliacao().
intValue();
int epoca = nota.
getEpoca_avaliacao().
intValue();
//boolean eFinal = nota.get
1.5.0/docs/api/java/lang/String.html">String descricaoEpoca = mapaEpocasAvaliacao.
get(epoca +
"-" + momento
);
1.5.0/docs/api/java/lang/String.html">String descricaoStatusEpoca = mapaStatusEpocas.
get(""+statusEpoca
) ==
null ? ""+statusEpoca : mapaStatusEpocas.
get(statusEpoca+
"");
Student s = DaoFactory.
getStudentDaoImpl().
loadBySigesCode(codAluno
);
if(descricaoEpoca
!=
null && s
!=
null)
{
CourseUnit courseUnit =
null;
try{
List
<CourseUnit
> cus = DaoFactory.
getCourseUnitDaoImpl().
loadBySigesCode("" + codUnidade,
"" + codCurso,cdDuracao,year
);
//Uma cadeira atribuida a uma nota que pode nao ser de facto a turma dela
//A nota tem de passar a deixar de ter obrigatoriamente a cadeira
//ha que mudar isso na interface e colocar apenas o descritivo nesses casos e manter a cadeira
//a null para nao haver hipoteses de confusao
if(cus
!=
null && cus.
size() > 0
)
courseUnit = cus.
get(0
);
if(cus.
size() > 1
)
{
CourseUnit c1 = cus.
get(0
);
CourseUnit c2 = cus.
get(1
);
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"",
"Mais que uma unidade para o código(unidade,curso): " + codUnidade +
"," + codCurso +
" -> " + courseUnit.
getName() +
" possiveis duas turmas: " + c1.
getCdTurma() +
" - " + c2.
getCdTurma() , LogMessageTypeEnum.
INFO));
logger.
info(logMessages.
getLastMessage());
serviceLogInfo
(logMessages.
getLastMessage());
}
if(courseUnit
!=
null)
{
CourseUnitGrade grade = DaoFactory.
getCourseUnitGradeDaoImpl().
find(courseUnit.
getId(),s.
getId(),
""+momento,
""+epoca
);
if(grade ==
null)
{
grade = DomainObjectFactory.
createCourseUnitGradeImpl();
grade.
setStudent(s
);
grade.
setCourseUnit(courseUnit
);
grade.
setNormalizedCourseUnitName(courseUnit.
getNormalizedName());
grade.
setImportYear(year
);
grade.
setCodigoEpoca("" + epoca
);
grade.
setCodigoMomento("" + momento
);
grade.
setDescEpoca(descricaoEpoca
);
grade.
setStatusEpoca(statusEpoca
);
grade.
setDescStatusEpoca(descricaoStatusEpoca
);
DaoFactory.
getCourseUnitGradeDaoImpl().
save(grade
);
if(grade.
getGrade() >= 0
)
addGrade
(grade
);
}
if(grade.
getGrade() != valor || grade.
getStatusEpoca() != statusEpoca ||
(grade.
getPublishDate() !=
null && grade.
getPublishDate().
getTime() != data.
getTime()))
{
grade.
setPublishDate(data
);
grade.
setGrade(valor
);
grade.
setStatusEpoca(statusEpoca
);
grade.
setDescStatusEpoca(descricaoStatusEpoca
);
if(grade.
getGrade() >= 0
)
addGrade
(grade
);
}
}
else
{
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"",
"CourseUnit: " + codUnidade +
" course: " + codCurso +
" searching for student" + s.
getSigesCode() +
" semestre: " + cdDuracao +
" year: " + year +
" does not exist", LogMessageTypeEnum.
WARNING));
logger.
warn(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
}
}catch(1.5.0/docs/api/java/lang/Exception.html">Exception e
)
{
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"",
"Error : unit:" + codUnidade +
" course:" + codCurso +
" student:" + s.
getId(), LogMessageTypeEnum.
WARNING));
logger.
warn(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
}
}
else
{
if(descricaoEpoca ==
null)
{
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"",epoca +
"-" + momento +
" nao esta catalogada para atribuicao de nota", LogMessageTypeEnum.
WARNING));
logger.
info(logMessages.
getLastMessage());
serviceLogInfo
(logMessages.
getLastMessage());
}else
{
logMessages.
addMessage(new DefaultLogMessage
("import.warning",
"",
"Student: " + codAluno +
" does not exist", LogMessageTypeEnum.
WARNING));
logger.
warn(logMessages.
getLastMessage());
serviceLogWarn
(logMessages.
getLastMessage());
}
}
}
sendSms
(null);
sendEmail
(null);
//AbstractDao.getCurrentSession().getTransaction().commit();
}
catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
logger.
error(e, e
);
//AbstractDao.getCurrentSession().getTransaction().rollback();
logMessages.
addMessage(new DefaultLogMessage
("import.error", e.
toString(),
"see log for details", LogMessageTypeEnum.
ERROR));
serviceLogError
(logMessages.
getLastMessage());
throw new ServiceException
(e.
toString(), e
);
}
setProgress
(100
);
logger.
info("######################################");
serviceLogInfo
("######################################");
logger.
info("######################################");
serviceLogInfo
("######################################");
logger.
info("STATS " + year
);
serviceLogInfo
("STATS " + year
);
logger.
info("Total Notas: " + foundTotal
);
serviceLogInfo
("Total Notas: " + foundTotal
);
logger.
info("Alunos: " + alunos.
size());
serviceLogInfo
("Alunos: " + alunos.
size());
logger.
info("Notas de Alunos em cadeiras: " + alunoCadeira.
size());
serviceLogInfo
("Notas de Alunos em cadeiras: " + alunoCadeira.
size());
logMessages.
addMessage(new DefaultLogMessage
("import.teachers.terminating", LogMessageTypeEnum.
INFO));
logger.
info(logMessages.
getLastMessage());
serviceLogInfo
(logMessages.
getLastMessage());
return logMessages
;
}
private void addGrade
(CourseUnitGrade grade
)
{
List
<Long
> studentGrades = newGrades.
get(grade.
getStudent().
getId());
if(studentGrades ==
null)
{
studentGrades =
new ArrayList
<Long
>();
newGrades.
put(grade.
getStudent().
getId(),studentGrades
);
}
studentGrades.
add(grade.
getId());
}
private void sendSms
(UserSession userSession
)
{
if(Globals.
SMS_NEW_GRADES && newGrades.
size() > 0
)
{
Set
<Map.
Entry<Long,List
<Long
>>> set = newGrades.
entrySet();
for(1.5.0/docs/api/java/util/Map.html">Map.
Entry<Long,List
<Long
>> entry: set
)
{
long studentId = entry.
getKey();
List
<Long
> studentGrades = entry.
getValue();
Student s = DaoFactory.
getStudentDaoImpl().
get(studentId
);
if(SMSJob.
validPhoneNumber(s.
getPhonenumber()))
{
1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder gradesBuilder =
new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
for(long gradeId: studentGrades
)
{
CourseUnitGrade grade = DaoFactory.
getCourseUnitGradeDaoImpl().
get(gradeId
);
1.5.0/docs/api/java/lang/String.html">String gradeStr = TemplateUtils.
formatMessageTemplate(Globals.
TEMPLATE_SMS_NEW_GRADE,
new 1.5.0/docs/api/java/lang/String.html">String[]{grade.
getNormalizedCourseUnitName(),
""+grade.
getGrade()});
gradesBuilder.
append(gradeStr
);
}
SMSJob smsJob =
new SMSJob
(s,
new 1.5.0/docs/api/java/lang/String.html">String[]{gradesBuilder.
toString()},Globals.
TEMPLATE_SMS_NEW_GRADES);
JobScheduleService.
getInstance().
scheduleNow(smsJob,
"New Grades SMS: to" + s.
getUsername(),userSession
);
}
}
}
}
public static SendEmailService sendEmailService =
new SendEmailService
();
private void sendEmail
(UserSession userSession
)
{
if(Globals.
EMAIL_NEW_GRADES && newGrades.
size() > 0
)
{
Set
<Map.
Entry<Long,List
<Long
>>> set = newGrades.
entrySet();
for(1.5.0/docs/api/java/util/Map.html">Map.
Entry<Long,List
<Long
>> entry: set
)
{
long studentId = entry.
getKey();
List
<Long
> studentGrades = entry.
getValue();
Student s = DaoFactory.
getStudentDaoImpl().
get(studentId
);
List
<String
[]> gradesArray =
new ArrayList
<String
[]>();
for(long gradeId: studentGrades
)
{
CourseUnitGrade grade = DaoFactory.
getCourseUnitGradeDaoImpl().
get(gradeId
);
1.5.0/docs/api/java/lang/String.html">String[] gradeArray =
new 1.5.0/docs/api/java/lang/String.html">String[] {grade.
getNormalizedCourseUnitName(),
""+grade.
getGrade(),grade.
getDescEpoca()};
gradesArray.
add(gradeArray
);
}
EMAILJob emailJob =
new EMAILJob
(sendEmailService.
getNewGradesEmail(gradesArray, LangEnum.
PORTUGUESE,s.
getEmail(),s.
getName()));
JobScheduleService.
getInstance().
scheduleNow(emailJob,
"New Grades EMAIL: to" + s.
getUsername(),userSession
);
}
}
}
/**
* Testar por aqui poi requer Super Role e assim e' autmatico
*
* @param args of main
* @throws pt.estgp.estgweb.services.expceptions.ServiceException on error
*/
public static void main
(1.5.0/docs/api/java/lang/String.html">String[] args
) throws ServiceException
{
1.5.0/docs/api/java/lang/String.html">String year = DaoFactory.
getConfigurationDaoImpl().
getImportsDefaultImportYearCreateTransaction();;
1.5.0/docs/api/java/lang/String.html">String institutionCode =
"1";
if(args
!=
null && args.
length > 0
)
year = args
[0
];
if(args
!=
null && args.
length > 1
)
institutionCode = args
[1
];
AbstractDao.
getCurrentSession().
beginTransaction();
new ImportGradesService
().
run(year,
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(institutionCode
));
AbstractDao.
getCurrentSession().
getTransaction().
commit();
}
@
1.5.0/docs/api/java/lang/Override.html">Override
protected ILogMessages runJobServiceTask
() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable {
1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap
().
get(JOB_importYear_KEY
).
getObject();
1.5.0/docs/api/java/lang/String.html">String institutionCode = getParametersMap
().
get(JOB_institution_KEY
).
getObject();
return run
(importYear,
1.5.0/docs/api/java/lang/Integer.html">Integer.
parseInt(institutionCode
));
}
}