/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fenix IST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
package pt.ist.fenix.task.exportData.academic;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import org.fenixedu.academic.domain.DegreeCurricularPlan;
import org.fenixedu.academic.domain.Enrolment;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.StudentCurricularPlan;
import org.fenixedu.academic.domain.degree.DegreeType;
import org.fenixedu.academic.dto.GenericPair;
import org.fenixedu.bennu.scheduler.annotation.Task;
import org.fenixedu.bennu.scheduler.custom.CustomTask;
import com.google.common.base.Strings;
@Task(englishTitle = "EnrolmentStatistics", readOnly = true)
public class EnrolmentStatistics extends CustomTask {
final Map<StudentCurricularPlan, Set<Enrolment>> studentsEnrolments = new HashMap<StudentCurricularPlan, Set<Enrolment>>();
final Map<DegreeCurricularPlan, GenericPair<Integer, Integer>> degreesMap =
new TreeMap<DegreeCurricularPlan, GenericPair<Integer, Integer>>(DegreeCurricularPlan.COMPARATOR_BY_NAME);
final Map<Integer, Integer> enrolmentsNumber = new TreeMap<Integer, Integer>();
int totalEnrolments = 0;
@Override
public void runTask() {
final ExecutionSemester executionPeriod = ExecutionSemester.readActualExecutionSemester();
for (final Enrolment enrolment : executionPeriod.getEnrolmentsSet()) {
addToStudentsEnrolmentsMap(enrolment);
}
for (final Entry<StudentCurricularPlan, Set<Enrolment>> studentEnrolmentEntry : studentsEnrolments.entrySet()) {
final Set<Enrolment> enrolments = studentEnrolmentEntry.getValue();
totalEnrolments += enrolments.size();
final StudentCurricularPlan studentCurricularPlan = studentEnrolmentEntry.getKey();
addToEnrolmentsNumberMap(studentCurricularPlan, enrolments);
addToDegreesMap(studentCurricularPlan.getDegreeCurricularPlan(), enrolments);
}
writeResults();
}
private void writeResults() {
taskLog("Total -> " + totalEnrolments);
taskLog("********************************");
int total = 0;
for (Entry<Integer, Integer> entry : enrolmentsNumber.entrySet()) {
Integer value = entry.getValue();
taskLog(entry.getKey() + " Inscricao -> " + value);
total += value;
}
taskLog("Total de alunos inscritos -> " + total);
taskLog("********************************");
int totalEnrolments = 0;
for (Entry<DegreeCurricularPlan, GenericPair<Integer, Integer>> entry : degreesMap.entrySet()) {
String degreeName = Strings.padEnd(entry.getKey().getName(), 12, ' ');
//degree name -> students enrolled - number of enrolments
taskLog(degreeName + " -> " + Strings.padStart(entry.getValue().getLeft().toString(), 3, ' ') + " "
+ Strings.padStart(entry.getValue().getRight().toString(), 3, ' '));
totalEnrolments += entry.getValue().getRight();
}
taskLog("********************************");
taskLog("Total inscrições -> " + totalEnrolments);
}
private void addToDegreesMap(DegreeCurricularPlan degreeCurricularPlan, Set<Enrolment> enrolments) {
GenericPair<Integer, Integer> genericPair = degreesMap.get(degreeCurricularPlan);
if (genericPair == null) {
genericPair = new GenericPair<Integer, Integer>(Integer.valueOf(0), Integer.valueOf(0));
degreesMap.put(degreeCurricularPlan, genericPair);
}
genericPair.setLeft(genericPair.getLeft() + 1);
genericPair.setRight(genericPair.getRight() + enrolments.size());
}
private void addToEnrolmentsNumberMap(StudentCurricularPlan studentCurricularPlan, final Set<Enrolment> enrolments) {
int size = enrolments.size();
Integer value = enrolmentsNumber.get(Integer.valueOf(size));
if (value == null) {
value = Integer.valueOf(0);
}
enrolmentsNumber.put(Integer.valueOf(size), value + 1);
}
private void addToStudentsEnrolmentsMap(final Enrolment enrolment) {
final StudentCurricularPlan studentCurricularPlan = enrolment.getStudentCurricularPlan();
if (isDegree(studentCurricularPlan.getDegreeCurricularPlan())) {
Set<Enrolment> enrolmentsSet = studentsEnrolments.get(studentCurricularPlan);
if (enrolmentsSet == null) {
enrolmentsSet = new HashSet<Enrolment>();
studentsEnrolments.put(studentCurricularPlan, enrolmentsSet);
}
enrolmentsSet.add(enrolment);
}
}
private boolean isDegree(final DegreeCurricularPlan degreeCurricularPlan) {
final DegreeType degreeType = degreeCurricularPlan.getDegreeType();
return degreeType == DegreeType.BOLONHA_DEGREE || degreeType == DegreeType.BOLONHA_MASTER_DEGREE
|| degreeType == DegreeType.BOLONHA_INTEGRATED_MASTER_DEGREE;
}
}