/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic 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.
*
* FenixEdu Academic 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 FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created on Jan 16, 2006
* by mrsp
*/
package org.fenixedu.academic.ui.struts.action.departmentAdmOffice;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;
import org.fenixedu.academic.domain.CurricularCourse;
import org.fenixedu.academic.domain.Department;
import org.fenixedu.academic.domain.ExecutionCourse;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.Lesson;
import org.fenixedu.academic.domain.LessonInstance;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.Professorship;
import org.fenixedu.academic.domain.Shift;
import org.fenixedu.academic.domain.Summary;
import org.fenixedu.academic.domain.Teacher;
import org.fenixedu.academic.domain.TeacherAuthorization;
import org.fenixedu.academic.dto.directiveCouncil.DepartmentSummaryElement;
import org.fenixedu.academic.dto.directiveCouncil.DepartmentSummaryElement.SummaryControlCategory;
import org.fenixedu.academic.dto.directiveCouncil.DetailSummaryElement;
import org.fenixedu.academic.dto.directiveCouncil.ExecutionCourseSummaryElement;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.ui.struts.action.academicAdministration.AcademicAdministrationApplication;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.Pair;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.struts.annotations.Forward;
import org.fenixedu.bennu.struts.annotations.Mapping;
import org.fenixedu.bennu.struts.portal.EntryPoint;
import org.fenixedu.bennu.struts.portal.StrutsFunctionality;
import org.fenixedu.commons.spreadsheet.StyledExcelSpreadsheet;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.YearMonthDay;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.ist.fenixframework.FenixFramework;
@StrutsFunctionality(app = AcademicAdministrationApplication.class, path = "summaries-control",
titleKey = "link.summaries.control", bundle = "ApplicationResources", accessGroup = "academic(SUMMARIES_CONTROL)")
@Mapping(path = "/summariesControl")
@Forward(name = "success", path = "/departmentAdmOffice/summariesControl/listTeacherSummariesControl.jsp")
public final class SummariesControlAction extends FenixDispatchAction {
private final BigDecimal EMPTY = BigDecimal.ZERO;
@EntryPoint
public ActionForward prepareSummariesControl(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DepartmentSummaryElement departmentSummaryElement = new DepartmentSummaryElement(null, null);
request.setAttribute("executionSemesters", departmentSummaryElement);
return mapping.findForward("success");
}
public ActionForward listSummariesControl(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DepartmentSummaryElement departmentSummaryElement = getRenderedObject();
String executionSemesterID = null;
if (departmentSummaryElement != null) {
executionSemesterID = departmentSummaryElement.getExecutionSemester().getExternalId();
} else {
executionSemesterID = (String) getFromRequest(request, "executionSemesterID");
ExecutionSemester executionSemester = FenixFramework.getDomainObject(executionSemesterID);
departmentSummaryElement = new DepartmentSummaryElement(null, executionSemester);
}
request.setAttribute("executionSemesters", departmentSummaryElement);
setAllDepartmentsSummaryResume(request, executionSemesterID);
return mapping.findForward("success");
}
public ActionForward listDepartmentSummariesControl(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
DepartmentSummaryElement departmentSummaryElement = getRenderedObject();
SummaryControlCategory summaryControlCategory = departmentSummaryElement.getSummaryControlCategory();
departmentSummaryElement =
getDepartmentSummaryResume(departmentSummaryElement.getExecutionSemester(),
departmentSummaryElement.getDepartment());
departmentSummaryElement.setSummaryControlCategory(summaryControlCategory);
request.setAttribute("departmentResume", departmentSummaryElement);
List<DepartmentSummaryElement> departmentList = new ArrayList<DepartmentSummaryElement>();
departmentList.add(departmentSummaryElement);
request.setAttribute("departmentResumeList", departmentList);
RenderUtils.invalidateViewState();
return mapping.findForward("success");
}
public ActionForward departmentSummariesResume(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String departmentID = request.getParameter("departmentID");
String executionPeriodID = request.getParameter("executionSemesterID");
String categoryControl = (String) getFromRequest(request, "categoryControl");
SummaryControlCategory summaryControlCategory = null;
if (!StringUtils.isEmpty(categoryControl)) {
summaryControlCategory = SummaryControlCategory.valueOf(categoryControl);
}
final ExecutionSemester executionSemester = FenixFramework.getDomainObject(executionPeriodID);
final Department department = FenixFramework.getDomainObject(departmentID);
DepartmentSummaryElement departmentSummaryResume = getDepartmentSummaryResume(executionSemester, department);
departmentSummaryResume.setSummaryControlCategory(summaryControlCategory);
request.setAttribute("departmentResume", departmentSummaryResume);
List<DepartmentSummaryElement> departmentList = new ArrayList<DepartmentSummaryElement>();
departmentList.add(departmentSummaryResume);
request.setAttribute("departmentResumeList", departmentList);
return mapping.findForward("success");
}
public ActionForward executionCourseSummariesControl(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
String departmentID = (String) getFromRequest(request, "departmentID");
String categoryControl = (String) getFromRequest(request, "categoryControl");
String executionCourseId = (String) getFromRequest(request, "executionCourseID");
ExecutionCourse executionCourse = FenixFramework.getDomainObject(executionCourseId);
List<DetailSummaryElement> executionCoursesResume =
getExecutionCourseResume(executionCourse.getExecutionPeriod(), executionCourse.getProfessorshipsSet());
request.setAttribute("departmentID", departmentID);
request.setAttribute("categoryControl", categoryControl);
request.setAttribute("executionCourse", executionCourse);
request.setAttribute("executionCoursesResume", executionCoursesResume);
return mapping.findForward("success");
}
public ActionForward teacherSummariesControl(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) {
String departmentID = (String) getFromRequest(request, "departmentID");
String categoryControl = (String) getFromRequest(request, "categoryControl");
String executionSemesterId = (String) getFromRequest(request, "executionSemesterID");
String personId = (String) getFromRequest(request, "personID");
Person person = FenixFramework.getDomainObject(personId);
List<Pair<ExecutionSemester, List<DetailSummaryElement>>> last4SemestersSummaryControl =
new ArrayList<Pair<ExecutionSemester, List<DetailSummaryElement>>>();
ExecutionSemester executionSemesterToPresent = ExecutionSemester.readActualExecutionSemester();
List<DetailSummaryElement> executionCoursesResume =
getExecutionCourseResume(executionSemesterToPresent, person.getProfessorships(executionSemesterToPresent));
last4SemestersSummaryControl.add(new Pair<ExecutionSemester, List<DetailSummaryElement>>(executionSemesterToPresent,
executionCoursesResume));
for (int iter = 0; iter < 3; iter++) {
executionSemesterToPresent = executionSemesterToPresent.getPreviousExecutionPeriod();
executionCoursesResume =
getExecutionCourseResume(executionSemesterToPresent, person.getProfessorships(executionSemesterToPresent));
last4SemestersSummaryControl.add(new Pair<ExecutionSemester, List<DetailSummaryElement>>(executionSemesterToPresent,
executionCoursesResume));
}
request.setAttribute("last4SemestersSummaryControl", last4SemestersSummaryControl);
request.setAttribute("person", person);
request.setAttribute("departmentID", departmentID);
request.setAttribute("categoryControl", categoryControl);
request.setAttribute("executionSemesterID", executionSemesterId);
return mapping.findForward("success");
}
private List<DetailSummaryElement> getExecutionCourseResume(final ExecutionSemester executionSemester,
Collection<Professorship> professorships) {
List<DetailSummaryElement> allListElements = new ArrayList<DetailSummaryElement>();
LocalDate today = new LocalDate();
LocalDate oneWeekBeforeToday = today.minusDays(8);
for (Professorship professorship : professorships) {
BigDecimal lessonsGiven = EMPTY;
BigDecimal summariesGiven = EMPTY;
BigDecimal summariesGivenPercentage = EMPTY;
BigDecimal notTaughtSummaries = EMPTY;
BigDecimal notTaughtSummariesPercentage = EMPTY;
if (professorship.belongsToExecutionPeriod(executionSemester)) {
for (Shift shift : professorship.getExecutionCourse().getAssociatedShifts()) {
lessonsGiven = lessonsGiven.add(BigDecimal.valueOf(shift.getNumberOfLessonInstances()));
// Get the number of summaries given
summariesGiven = getSummariesGiven(professorship, shift, summariesGiven, oneWeekBeforeToday);
// Get the number of not taught summaries
notTaughtSummaries = getNotTaughtSummaries(professorship, shift, notTaughtSummaries, oneWeekBeforeToday);
}
summariesGiven = summariesGiven.setScale(1, RoundingMode.HALF_UP);
notTaughtSummaries = notTaughtSummaries.setScale(1, RoundingMode.HALF_UP);
summariesGivenPercentage = summariesGiven.divide(lessonsGiven, 3, BigDecimal.ROUND_CEILING)
.multiply(BigDecimal.valueOf(100));
notTaughtSummariesPercentage = notTaughtSummaries.divide(lessonsGiven, 3, BigDecimal.ROUND_CEILING)
.multiply(BigDecimal.valueOf(100));
Teacher teacher = professorship.getTeacher();
String categoryName = null;
if (teacher != null) {
final Optional<TeacherAuthorization> authorization =
teacher.getTeacherAuthorization(executionSemester.getAcademicInterval());
categoryName =
authorization.isPresent() ? authorization.get().getTeacherCategory().getName().getContent() : null;
}
String siglas = getSiglas(professorship);
String teacherEmail =
professorship.getPerson().getDefaultEmailAddress() != null ? professorship.getPerson()
.getDefaultEmailAddress().getPresentationValue() : null;
DetailSummaryElement listElementDTO =
new DetailSummaryElement(professorship.getPerson().getName(), professorship.getExecutionCourse()
.getNome(), teacher != null ? teacher.getTeacherId() : null, teacherEmail, categoryName,
summariesGiven, notTaughtSummaries, siglas, lessonsGiven, summariesGivenPercentage,
notTaughtSummariesPercentage);
allListElements.add(listElementDTO);
}
}
return allListElements;
}
private void setAllDepartmentsSummaryResume(HttpServletRequest request, String executionPeriodOID)
throws FenixServiceException {
final ExecutionSemester executionSemester = FenixFramework.getDomainObject(executionPeriodOID);
List<DepartmentSummaryElement> allDepartmentsSummariesResume = new ArrayList<DepartmentSummaryElement>();
for (Department department : rootDomainObject.getDepartmentsSet()) {
DepartmentSummaryElement departmentSummariesElement = getDepartmentSummaryResume(executionSemester, department);
allDepartmentsSummariesResume.add(departmentSummariesElement);
}
if (executionSemester.isCurrent()) {
LocalDate oneWeekBeforeDate = new LocalDate();
request.setAttribute("currentSemester", "true");
request.setAttribute("oneWeekBeforeDate", oneWeekBeforeDate.minusDays(8));
}
Collections.sort(allDepartmentsSummariesResume, new BeanComparator("department.realName"));
request.setAttribute("summariesResumeMap", allDepartmentsSummariesResume);
}
private DepartmentSummaryElement getDepartmentSummaryResume(final ExecutionSemester executionSemester,
final Department department) {
DepartmentSummaryElement departmentSummariesElement = new DepartmentSummaryElement(department, executionSemester);
Set<ExecutionCourse> allDepartmentExecutionCourses = getDepartmentExecutionCourses(department, executionSemester);
if (allDepartmentExecutionCourses != null) {
LocalDate today = new LocalDate();
LocalDate oneWeekBeforeToday = today.minusDays(8);
for (ExecutionCourse executionCourse : allDepartmentExecutionCourses) {
int instanceLessonsTotal[] = { 0, 0, 0 };
for (Shift shift : executionCourse.getAssociatedShifts()) {
getInstanceLessonsTotalsByShift(shift, instanceLessonsTotal, oneWeekBeforeToday);
}
BigDecimal result = BigDecimal.valueOf(0);
BigDecimal numberOfLessonInstances = BigDecimal.valueOf(instanceLessonsTotal[0]);
BigDecimal numberOfLessonInstancesWithSummary = BigDecimal.valueOf(0);
BigDecimal percentageOfLessonsWithNotTaughtSummary = BigDecimal.valueOf(0);
BigDecimal numberOfLessonInstancesWithNotTaughtSummary = BigDecimal.valueOf(0);
if (instanceLessonsTotal[0] == 0) {
continue;
}
if (instanceLessonsTotal[1] != 0) {
numberOfLessonInstancesWithSummary = BigDecimal.valueOf(instanceLessonsTotal[1]);
result =
numberOfLessonInstancesWithSummary.divide(numberOfLessonInstances, 3, BigDecimal.ROUND_CEILING)
.multiply(BigDecimal.valueOf(100));
}
if (instanceLessonsTotal[2] != 0) {
numberOfLessonInstancesWithNotTaughtSummary = BigDecimal.valueOf(instanceLessonsTotal[2]);
percentageOfLessonsWithNotTaughtSummary =
numberOfLessonInstancesWithNotTaughtSummary.divide(numberOfLessonInstances, 3,
BigDecimal.ROUND_CEILING).multiply(BigDecimal.valueOf(100));
}
SummaryControlCategory resumeClassification = getResumeClassification(result);
Map<SummaryControlCategory, List<ExecutionCourseSummaryElement>> departmentResumeMap =
departmentSummariesElement.getExecutionCoursesResume();
List<ExecutionCourseSummaryElement> executionCoursesSummary = null;
if (departmentResumeMap == null) {
departmentResumeMap = new HashMap<SummaryControlCategory, List<ExecutionCourseSummaryElement>>();
executionCoursesSummary = new ArrayList<ExecutionCourseSummaryElement>();
ExecutionCourseSummaryElement executionCourseSummaryElement =
new ExecutionCourseSummaryElement(executionCourse, numberOfLessonInstances,
numberOfLessonInstancesWithSummary, result, numberOfLessonInstancesWithNotTaughtSummary,
percentageOfLessonsWithNotTaughtSummary);
executionCoursesSummary.add(executionCourseSummaryElement);
departmentResumeMap.put(resumeClassification, executionCoursesSummary);
departmentSummariesElement.setExecutionCoursesResume(departmentResumeMap);
} else {
executionCoursesSummary = departmentResumeMap.get(resumeClassification);
if (executionCoursesSummary == null) {
executionCoursesSummary = new ArrayList<ExecutionCourseSummaryElement>();
ExecutionCourseSummaryElement executionCourseSummaryElement =
new ExecutionCourseSummaryElement(executionCourse, numberOfLessonInstances,
numberOfLessonInstancesWithSummary, result, numberOfLessonInstancesWithNotTaughtSummary,
percentageOfLessonsWithNotTaughtSummary);
executionCoursesSummary.add(executionCourseSummaryElement);
departmentResumeMap.put(resumeClassification, executionCoursesSummary);
} else {
ExecutionCourseSummaryElement executionCourseSummaryElement =
new ExecutionCourseSummaryElement(executionCourse, numberOfLessonInstances,
numberOfLessonInstancesWithSummary, result, numberOfLessonInstancesWithNotTaughtSummary,
percentageOfLessonsWithNotTaughtSummary);
executionCoursesSummary.add(executionCourseSummaryElement);
}
}
}
}
return departmentSummariesElement;
}
private Set<ExecutionCourse> getDepartmentExecutionCourses(Department department, ExecutionSemester executionSemester) {
Set<ExecutionCourse> executionCourses = new HashSet<ExecutionCourse>();
List<Teacher> allDepartmentTeachers = department.getAllTeachers(executionSemester);
for (Teacher teacher : allDepartmentTeachers) {
for (Professorship professorship : teacher.getProfessorships()) {
if (professorship.belongsToExecutionPeriod(executionSemester)
&& !professorship.getExecutionCourse().isMasterDegreeDFAOrDEAOnly()) {
executionCourses.add(professorship.getExecutionCourse());
}
}
}
return executionCourses;
}
private SummaryControlCategory getResumeClassification(BigDecimal result) {
if (result.compareTo(BigDecimal.valueOf(20)) < 0) {
return SummaryControlCategory.BETWEEN_0_20;
}
if (result.compareTo(BigDecimal.valueOf(40)) < 0) {
return SummaryControlCategory.BETWEEN_20_40;
}
if (result.compareTo(BigDecimal.valueOf(60)) < 0) {
return SummaryControlCategory.BETWEEN_40_60;
}
if (result.compareTo(BigDecimal.valueOf(80)) < 0) {
return SummaryControlCategory.BETWEEN_60_80;
}
return SummaryControlCategory.BETWEEN_80_100;
}
// private BigDecimal getDeclaredLesson(Double percentage, Shift shift, BigDecimal lessonGiven, LocalDate oneWeekBeforeToday) {
// BigDecimal shiftLessonSum = EMPTY;
// for (Lesson lesson : shift.getAssociatedLessonsSet()) {
// shiftLessonSum =
// shiftLessonSum.add(BigDecimal.valueOf(lesson.getAllLessonDatesUntil(new YearMonthDay(oneWeekBeforeToday))
// .size()));
// }
// return lessonGiven.add(BigDecimal.valueOf((percentage / 100)).multiply(shiftLessonSum));
// }
/**
* Receives a shift and an array of int, with two positions filled in at
* index 0 is the total number of lessonsInstance at index 1 is the total
* number of lessonsInstance with a summary For the given shift this values
* are checked and added in the correspondent position of the array
*
* @param shift
* @param instanceLessonsTotals
* @param oneWeekBeforeToday
*/
private void getInstanceLessonsTotalsByShift(Shift shift, int[] instanceLessonsTotals, LocalDate oneWeekBeforeToday) {
int numberOfPossibleInstanceLessons = 0;
int numberOfInstanceLessonsWithSummary = 0;
int numberOfInstanceLessonsWithNotTaughtSummary = 0;
for (Lesson lesson : shift.getAssociatedLessonsSet()) {
List<LessonInstance> allLessonInstanceUntil = lesson.getAllLessonInstancesUntil(oneWeekBeforeToday);
Set<YearMonthDay> allPossibleDates = lesson.getAllLessonDatesUntil(new YearMonthDay(oneWeekBeforeToday));
numberOfPossibleInstanceLessons += allPossibleDates.size();
for (LessonInstance lessonInstance : allLessonInstanceUntil) {
if (lessonInstance.getSummary() != null) {
numberOfInstanceLessonsWithSummary++;
if (lessonInstance.getSummary().getTaught() != null && lessonInstance.getSummary().getTaught() == false) {
numberOfInstanceLessonsWithNotTaughtSummary++;
}
}
}
}
instanceLessonsTotals[0] = instanceLessonsTotals[0] + numberOfPossibleInstanceLessons;
instanceLessonsTotals[1] = instanceLessonsTotals[1] + numberOfInstanceLessonsWithSummary;
instanceLessonsTotals[2] = instanceLessonsTotals[2] + numberOfInstanceLessonsWithNotTaughtSummary;
}
private BigDecimal getSummariesGiven(Professorship professorship, Shift shift, BigDecimal summariesGiven,
LocalDate oneWeekBeforeToday) {
for (Summary summary : shift.getAssociatedSummariesSet()) {
if (summary.getProfessorship() != null && summary.getProfessorship() == professorship && !summary.getIsExtraLesson()
&& !summary.getLessonInstance().getBeginDateTime().toLocalDate().isAfter(oneWeekBeforeToday)) {
summariesGiven = summariesGiven.add(BigDecimal.ONE);
}
}
return summariesGiven;
}
private BigDecimal getNotTaughtSummaries(Professorship professorship, Shift shift, BigDecimal notTaughtSummaries,
LocalDate oneWeekBeforeToday) {
for (Summary summary : shift.getAssociatedSummariesSet()) {
if (summary.getProfessorship() != null && summary.getProfessorship() == professorship && !summary.getIsExtraLesson()
&& !summary.getLessonInstance().getBeginDateTime().toLocalDate().isAfter(oneWeekBeforeToday)) {
if (summary.getTaught() != null && summary.getTaught() == false) {
notTaughtSummaries = notTaughtSummaries.add(BigDecimal.ONE);
}
}
}
return notTaughtSummaries;
}
// private BigDecimal getDifference(BigDecimal lessonHours, BigDecimal summaryHours) {
// Double difference;
// difference = (1 - ((lessonHours.doubleValue() - summaryHours.doubleValue()) / lessonHours.doubleValue())) * 100;
// if (difference.isNaN() || difference.isInfinite()) {
// difference = 0.0;
// }
// return BigDecimal.valueOf(difference).setScale(2, RoundingMode.HALF_UP);
// }
private String getSiglas(Professorship professorship) {
ExecutionCourse executionCourse = professorship.getExecutionCourse();
int numberOfCurricularCourse = executionCourse.getAssociatedCurricularCoursesSet().size();
List<String> siglas = new ArrayList<String>();
StringBuilder buffer = new StringBuilder();
for (CurricularCourse curricularCourse : executionCourse.getAssociatedCurricularCoursesSet()) {
String sigla = curricularCourse.getDegreeCurricularPlan().getDegree().getSigla();
if (!siglas.contains(sigla)) {
if (numberOfCurricularCourse < executionCourse.getAssociatedCurricularCoursesSet().size()) {
buffer.append(",");
}
buffer.append(sigla);
siglas.add(sigla);
}
numberOfCurricularCourse--;
}
return buffer.toString();
}
private List<LabelValueBean> getAllDepartments(Collection<Department> allDepartments) {
List<LabelValueBean> departments = new ArrayList<LabelValueBean>();
for (Department department : allDepartments) {
LabelValueBean labelValueBean = new LabelValueBean();
labelValueBean.setValue(department.getExternalId().toString());
labelValueBean.setLabel(department.getRealName());
departments.add(labelValueBean);
}
Collections.sort(departments, new BeanComparator("label"));
return departments;
}
protected void readAndSaveAllDepartments(HttpServletRequest request) throws FenixServiceException {
Collection<Department> allDepartments = rootDomainObject.getDepartmentsSet();
List<LabelValueBean> departments = getAllDepartments(allDepartments);
request.setAttribute("allDepartments", allDepartments);
request.setAttribute("departments", departments);
}
/**
* Method responsible for exporting 'departmentSummaryResume' to excel file
*
* @param mapping
* @param actionForm
* @param request
* @param response
* @return
* @throws IOException
*/
public ActionForward exportInfoToExcel(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws IOException {
String departmentID = request.getParameter("departmentID");
String executionSemesterID = request.getParameter("executionSemesterID");
String categoryControl = request.getParameter("categoryControl");
final ExecutionSemester executionSemester = FenixFramework.getDomainObject(executionSemesterID);
final Department department = FenixFramework.getDomainObject(departmentID);
SummaryControlCategory summaryControlCategory = null;
String controlCategory = null;
if (!StringUtils.isEmpty(categoryControl)) {
summaryControlCategory = SummaryControlCategory.valueOf(categoryControl);
controlCategory = BundleUtil.getString(Bundle.ENUMERATION, summaryControlCategory.toString());
} else {
controlCategory = "0-100";
}
DepartmentSummaryElement departmentSummaryResume = getDepartmentSummaryResume(executionSemester, department);
departmentSummaryResume.setSummaryControlCategory(summaryControlCategory);
if (departmentSummaryResume != null) {
String sigla = departmentSummaryResume.getDepartment().getAcronym();
DateTime dt = new DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("dd-MM-yyyy");
String date = fmt.print(dt);
final String filename =
BundleUtil.getString(Bundle.APPLICATION, "link.summaries.control").replaceAll(" ", "_") + "_"
+ controlCategory + "_" + sigla + "_" + date + ".xls";
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=" + filename);
ServletOutputStream writer = response.getOutputStream();
exportToXls(departmentSummaryResume, departmentSummaryResume.getDepartment(), executionSemester, writer);
writer.flush();
response.flushBuffer();
}
return null;
}
private void exportToXls(DepartmentSummaryElement departmentSummaryResume, final Department department,
final ExecutionSemester executionSemester, final OutputStream os) throws IOException {
final StyledExcelSpreadsheet spreadsheet =
new StyledExcelSpreadsheet(BundleUtil.getString(Bundle.APPLICATION, "link.summaries.control"));
fillSpreadSheet(departmentSummaryResume, department, executionSemester, spreadsheet);
spreadsheet.getWorkbook().write(os);
}
/**
* Method responsible for filling the spreadsheet with department summary
* information
*
* @param departmentSummaryResume
* @param department
* @param semester
* @param sheet
*/
private void fillSpreadSheet(DepartmentSummaryElement departmentSummaryResume, Department department,
ExecutionSemester semester, final StyledExcelSpreadsheet sheet) {
setHeaders(sheet);
int counter = 0;
List<ExecutionCourseSummaryElement> executionCourses = departmentSummaryResume.getExecutionCourses();
// Iterate on all executionCourses and print them
for (ExecutionCourseSummaryElement executionCourse : executionCourses) {
counter = 0;
List<DetailSummaryElement> executionCoursesResume =
getExecutionCourseResume(executionCourse.getExecutionCourse().getExecutionPeriod(), executionCourse
.getExecutionCourse().getProfessorshipsSet());
int lessons = executionCourse.getNumberOfLessonInstances().intValue();
int lessonsWithSummaries = executionCourse.getNumberOfLessonInstancesWithSummary().intValue();
double lessonsWithSummariesPercentage = executionCourse.getPercentageOfLessonsWithSummary().doubleValue();
int lessonsWithNotTaughtSummaries = executionCourse.getNumberOfLessonInstancesWithNotTaughtSummary().intValue();
double lessonsWithNotTaughtSummariesPercentage =
executionCourse.getPercentageOfLessonsWithNotTaughtSummary().doubleValue();
for (DetailSummaryElement detailSummaryElement : executionCoursesResume) {
if (counter == 0) {
sheet.newRow();
sheet.addCell(semester.getName(), sheet.getExcelStyle().getLabelStyle());
sheet.addCell(department.getName(), sheet.getExcelStyle().getLabelStyle());
sheet.addCell(executionCourse.getExecutionCourse().getName(), sheet.getExcelStyle().getLabelStyle());
sheet.addCell(lessons, sheet.getExcelStyle().getLabelStyle());
sheet.addCell(lessonsWithSummaries, sheet.getExcelStyle().getLabelStyle());
sheet.addCell(lessonsWithSummariesPercentage, sheet.getExcelStyle().getLabelStyle());
sheet.addCell(lessonsWithNotTaughtSummaries, sheet.getExcelStyle().getLabelStyle());
sheet.addCell(lessonsWithNotTaughtSummariesPercentage, sheet.getExcelStyle().getLabelStyle());
}
sheet.newRow();
sheet.addCell(null);
sheet.addCell(null);
sheet.addCell(null);
sheet.addCell(detailSummaryElement.getGivenLessons());
sheet.addCell(detailSummaryElement.getGivenSummaries());
sheet.addCell(detailSummaryElement.getGivenSummariesPercentage());
sheet.addCell(detailSummaryElement.getGivenNotTaughtSummaries());
sheet.addCell(detailSummaryElement.getGivenNotTaughtSummariesPercentage());
sheet.addCell(detailSummaryElement.getTeacherName());
sheet.addCell(detailSummaryElement.getTeacherId());
sheet.addCell(detailSummaryElement.getTeacherEmail());
counter++;
}
}
}
private void setHeaders(final StyledExcelSpreadsheet spreadsheet) {
spreadsheet.newHeaderRow();
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.semester"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.department"), 10000);
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.course"), 10000);
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.lessons"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.lessons.summaries"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.lessons.summaries.percentage"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.lessons.notTaught.summaries"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.lessons.notTaught.summaries.percentage"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.professorName"), 10000);
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.professorUsername"));
spreadsheet.addHeader(BundleUtil.getString(Bundle.PEDAGOGICAL, "label.excel.professorEmail"), 10000);
}
}