/**
* 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/>.
*/
package org.fenixedu.academic.ui.struts.action.administrativeOffice.scholarship.utl.report;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.Money;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ReportStudentsUTLCandidates implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(ReportStudentsUTLCandidates.class);
protected ExecutionYear forExecutionYear;
protected List<StudentLine> correctStudentLines;
protected List<StudentLine> erroneousStudentLines;
protected CellStyle headerStyle;
public ReportStudentsUTLCandidates(final ExecutionYear forExecutionYear) {
this.forExecutionYear = forExecutionYear;
this.correctStudentLines = new ArrayList<StudentLine>();
this.erroneousStudentLines = new ArrayList<StudentLine>();
}
public ReportStudentsUTLCandidates(final ExecutionYear forExecutionYear, final HSSFSheet sheet) {
this(forExecutionYear);
getStudentLines(sheet);
}
protected void getStudentLines(HSSFSheet sheet) {
int i = 2;
HSSFRow row;
while ((row = sheet.getRow(i)) != null) {
StudentLine studentLine = new StudentLine();
boolean filledWithSuccess = studentLine.fillWithSpreadsheetRow(forExecutionYear, row);
try {
testIt(studentLine);
} catch (Exception e) {
filledWithSuccess = false;
}
if (filledWithSuccess) {
correctStudentLines.add(studentLine);
} else {
erroneousStudentLines.add(studentLine);
}
i++;
}
}
public HSSFWorkbook generateReport() {
HSSFWorkbook wb = new HSSFWorkbook();
headerStyle = headerBackgroundStyle(wb);
HSSFSheet sheet = wb.createSheet("Dados Academicos");
addHeaders(sheet);
addValues(sheet);
return wb;
}
public HSSFWorkbook generateErrors() {
HSSFWorkbook wb = new HSSFWorkbook();
headerStyle = headerBackgroundStyle(wb);
HSSFSheet sheet = wb.createSheet("Errors");
addHeadersForErrors(sheet);
addValuesForErrors(sheet);
return wb;
}
private void addValuesForErrors(HSSFSheet sheet) {
int i = 2;
for (StudentLine studentLine : getErroneousStudentLines()) {
try {
String institutionCode = studentLine.getInstitutionCode();
String institutionName = studentLine.getInstitutionName();
String candidacyNumber = studentLine.getCandidacyNumber();
String studentNumberForPrint = studentLine.getStudentNumberForPrint();
String studentName = studentLine.getStudentName();
String documentTypeName = studentLine.getDocumentTypeName();
String documentNumber = studentLine.getDocumentNumber();
HSSFRow row = sheet.createRow(i);
addCellValue(row, onNullEmptyString(institutionCode), 0);
addCellValue(row, onNullEmptyString(institutionName), 1);
addCellValue(row, onNullEmptyString(candidacyNumber), 2);
addCellValue(row, onNullEmptyString(studentNumberForPrint), 3);
addCellValue(row, onNullEmptyString(studentName), 4);
addCellValue(row, onNullEmptyString(documentTypeName), 5);
addCellValue(row, onNullEmptyString(documentNumber), 6);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
i++;
}
}
private void addHeadersForErrors(HSSFSheet sheet) {
sheet.createRow(0);
sheet.createRow(1);
addHeaderCell(sheet, getHeaderInBundle("institutionCode"), 0);
addHeaderCell(sheet, getHeaderInBundle("institutionName"), 1);
addHeaderCell(sheet, getHeaderInBundle("candidacyNumber"), 2);
addHeaderCell(sheet, getHeaderInBundle("studentNumberForPrint"), 3);
addHeaderCell(sheet, getHeaderInBundle("studentName"), 4);
addHeaderCell(sheet, getHeaderInBundle("documentTypeName"), 5);
addHeaderCell(sheet, getHeaderInBundle("documentNumber"), 6);
}
private void fillRegimeTable(HSSFWorkbook wb) {
HSSFSheet sheet = wb.createSheet("Regime");
for (int i = 0; i <= 7; i++) {
HSSFRow row = sheet.createRow(i);
row.createCell(0).setCellValue(false);
row.createCell(1).setCellValue(false);
}
}
protected void testIt(final StudentLine studentLine) {
String institutionCode = studentLine.getInstitutionCode();
String institutionName = studentLine.getInstitutionName();
String candidacyNumber = studentLine.getCandidacyNumber();
String studentNumberForPrint = studentLine.getStudentNumberForPrint();
String studentName = studentLine.getStudentName();
String documentTypeName = studentLine.getDocumentTypeName();
String documentNumber = studentLine.getDocumentNumber();
String degreeCode = studentLine.getDegreeCode();
String degreeName = studentLine.getDegreeName();
String degreeTypeName = studentLine.getDegreeTypeName();
Integer countNumberOfDegreeChanges = studentLine.getCountNumberOfDegreeChanges();
Boolean hasMadeDegreeChange = studentLine.getHasMadeDegreeChange();
LocalDate firstEnrolmentOnCurrentExecutionYear = studentLine.getFirstEnrolmentOnCurrentExecutionYear();
String regime = studentLine.getRegime();
String firstRegistrationExecutionYear = studentLine.getFirstRegistrationExecutionYear();
Integer countNumberOfEnrolmentsYearsSinceRegistrationStart =
studentLine.getCountNumberOfEnrolmentsYearsSinceRegistrationStart();
Integer countNumberOfEnrolmentsYearsInIntegralRegime = studentLine.getCountNumberOfEnrolmentsYearsInIntegralRegime();
Integer numberOfDegreeCurricularYears = studentLine.getNumberOfDegreeCurricularYears();
Integer curricularYearOneYearAgo = studentLine.getCurricularYearOneYearAgo();
BigDecimal numberOfEnrolledEctsOneYearAgo = studentLine.getNumberOfEnrolledEctsOneYearAgo();
BigDecimal numberOfApprovedEctsOneYearAgo = studentLine.getNumberOfApprovedEctsOneYearAgo();
Integer curricularYearInCurrentYear = studentLine.getCurricularYearInCurrentYear();
Double numberOfEnrolledECTS = studentLine.getNumberOfEnrolledECTS();
double numberOfDoneECTS = studentLine.getNumberOfDoneECTS();
Money gratuityAmount = studentLine.getGratuityAmount();
Integer numberOfMonthsExecutionYear = studentLine.getNumberOfMonthsExecutionYear();
String firstMonthOfPayment = studentLine.getFirstMonthOfPayment();
Boolean ownerOfCETQualification = studentLine.getOwnerOfCETQualification();
boolean degreeQualificationOwner = studentLine.isDegreeQualificationOwner();
boolean masterQualificationOwner = studentLine.isMasterQualificationOwner();
boolean phdQualificationOwner = studentLine.isPhdQualificationOwner();
boolean ownerOfCollegeQualification = studentLine.isOwnerOfCollegeQualification();
String observations = studentLine.getObservations();
String lastEnrolmentExecutionYear = studentLine.getLastEnrolledExecutionYear();
String nif = studentLine.getNif();
}
protected void addValues(HSSFSheet sheet) {
int i = 2;
for (StudentLine studentLine : getCorrectStudentLines()) {
try {
String institutionCode = studentLine.getInstitutionCode();
String institutionName = studentLine.getInstitutionName();
String candidacyNumber = studentLine.getCandidacyNumber();
String studentNumberForPrint = studentLine.getStudentNumberForPrint();
String studentName = studentLine.getStudentName();
String documentTypeName = studentLine.getDocumentTypeName();
String documentNumber = studentLine.getDocumentNumber();
String degreeCode = studentLine.getDegreeCode();
String degreeName = studentLine.getDegreeName();
String degreeTypeName = studentLine.getDegreeTypeName();
Integer countNumberOfDegreeChanges = studentLine.getCountNumberOfDegreeChanges();
Boolean hasMadeDegreeChange = studentLine.getHasMadeDegreeChange();
LocalDate firstEnrolmentOnCurrentExecutionYear = studentLine.getFirstEnrolmentOnCurrentExecutionYear();
String regime = studentLine.getRegime();
String firstRegistrationExecutionYear = studentLine.getFirstRegistrationExecutionYear();
Integer countNumberOfEnrolmentsYearsSinceRegistrationStart =
studentLine.getCountNumberOfEnrolmentsYearsSinceRegistrationStart();
Integer countNumberOfEnrolmentsYearsInIntegralRegime =
studentLine.getCountNumberOfEnrolmentsYearsInIntegralRegime();
double achievedDegreeEcts = studentLine.getNumberOfDoneECTS();
Integer numberOfDegreeCurricularYears = studentLine.getNumberOfDegreeCurricularYears();
Integer curricularYearOneYearAgo = studentLine.getCurricularYearOneYearAgo();
BigDecimal numberOfEnrolledEctsOneYearAgo = studentLine.getNumberOfEnrolledEctsOneYearAgo();
BigDecimal numberOfApprovedEctsOneYearAgo = studentLine.getNumberOfApprovedEctsOneYearAgo();
Integer curricularYearInCurrentYear = studentLine.getCurricularYearInCurrentYear();
Double numberOfEnrolledECTS = studentLine.getNumberOfEnrolledECTS();
Money gratuityAmount = studentLine.getGratuityAmount();
Integer numberOfMonthsExecutionYear = studentLine.getNumberOfMonthsExecutionYear();
String firstMonthOfPayment = studentLine.getFirstMonthOfPayment();
Boolean ownerOfCETQualification = studentLine.getOwnerOfCETQualification();
boolean degreeQualificationOwner = studentLine.isDegreeQualificationOwner();
boolean masterQualificationOwner = studentLine.isMasterQualificationOwner();
boolean phdQualificationOwner = studentLine.isPhdQualificationOwner();
boolean ownerOfCollegeQualification = studentLine.isOwnerOfCollegeQualification();
String observations = studentLine.getObservations();
String lastEnrolmentExecutionYear = studentLine.getLastEnrolledExecutionYear();
String nif = studentLine.getNif();
HSSFRow row = sheet.createRow(i);
addCellValue(row, onNullEmptyString(institutionCode), 0);
addCellValue(row, onNullEmptyString(institutionName), 1);
addCellValue(row, onNullEmptyString(candidacyNumber), 2);
addCellValue(row, onNullEmptyString(studentNumberForPrint), 3);
addCellValue(row, onNullEmptyString(studentName), 4);
addCellValue(row, onNullEmptyString(documentTypeName), 5);
addCellValue(row, onNullEmptyString(documentNumber), 6);
addCellValue(row, onNullEmptyString(degreeCode), 7);
addCellValue(row, onNullEmptyString(degreeName), 8);
addCellValue(row, onNullEmptyString(degreeTypeName), 9);
addCellValue(row, "", 10);
addCellValue(row, onNullEmptyString(countNumberOfDegreeChanges), 11);
addCellValue(row, onNullEmptyString(hasMadeDegreeChange), 12);
addCellValue(row, onNullEmptyString(firstEnrolmentOnCurrentExecutionYear), 13);
addCellValue(row, onNullEmptyString(regime), 14);
addCellValue(row, "", 15);
addCellValue(row, onNullEmptyString(firstRegistrationExecutionYear), 16);
addCellValue(row, onNullEmptyString(countNumberOfEnrolmentsYearsSinceRegistrationStart), 17);
addCellValue(row, onNullEmptyString(countNumberOfEnrolmentsYearsInIntegralRegime), 18);
addCellValue(row, onNullEmptyString(achievedDegreeEcts), 19);
addCellValue(row, onNullEmptyString(numberOfDegreeCurricularYears), 20);
addCellValue(row, onNullEmptyString(curricularYearOneYearAgo), 21);
addCellValue(row, onNullEmptyString(numberOfEnrolledEctsOneYearAgo != null ? numberOfEnrolledEctsOneYearAgo
.toString().replace('.', ',') : ""), 22);
addCellValue(row, onNullEmptyString(numberOfApprovedEctsOneYearAgo != null ? numberOfApprovedEctsOneYearAgo
.toString().replace('.', ',') : ""), 23);
addCellValue(row, onNullEmptyString(curricularYearInCurrentYear), 24);
addCellValue(row,
onNullEmptyString(numberOfEnrolledECTS != null ? numberOfEnrolledECTS.toString().replace('.', ',') : ""),
25);
addCellValue(row,
onNullEmptyString(gratuityAmount != null ? gratuityAmount.toPlainString().replace('.', ',') : ""), 26);
addCellValue(row, onNullEmptyString(numberOfMonthsExecutionYear), 27);
addCellValue(row, onNullEmptyString(firstMonthOfPayment), 28);
addCellValue(row, onNullEmptyString(ownerOfCETQualification), 29);
addCellValue(row, onNullEmptyString(degreeQualificationOwner), 30);
addCellValue(row, onNullEmptyString(masterQualificationOwner), 31);
addCellValue(row, onNullEmptyString(phdQualificationOwner), 32);
addCellValue(row, onNullEmptyString(ownerOfCollegeQualification), 33);
addCellValue(row, onNullEmptyString(observations), 34);
addCellValue(row, onNullEmptyString(lastEnrolmentExecutionYear), 35);
addCellValue(row, onNullEmptyString(nif), 36);
addCellValue(row, "", 37);
i++;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
protected String onNullEmptyString(Object value) {
if (value == null) {
return "";
} else if (value instanceof String) {
return (String) value;
} else if (value instanceof Boolean) {
return BundleUtil.getString(Bundle.ACADEMIC, ((Boolean) value) ? "label.yes" : "label.no");
}
return value.toString();
}
protected void addHeaders(HSSFSheet sheet) {
sheet.createRow(0);
sheet.createRow(1);
addHeaderCell(sheet, getHeaderInBundle("institutionCode"), 0);
addHeaderCell(sheet, getHeaderInBundle("institutionName"), 1);
addHeaderCell(sheet, getHeaderInBundle("candidacyNumber"), 2);
addHeaderCell(sheet, getHeaderInBundle("studentNumberForPrint"), 3);
addHeaderCell(sheet, getHeaderInBundle("studentName"), 4);
addHeaderCell(sheet, getHeaderInBundle("documentTypeName"), 5);
addHeaderCell(sheet, getHeaderInBundle("documentNumber"), 6);
addHeaderCell(sheet, getHeaderInBundle("degreeCode"), 7);
addHeaderCell(sheet, getHeaderInBundle("degreeName"), 8);
addHeaderCell(sheet, getHeaderInBundle("degreeTypeName"), 9);
addHeaderCell(sheet, getHeaderInBundle("code"), 10);
addHeaderCell(sheet, getHeaderInBundle("countNumberOfDegreeChanges"), 11);
addHeaderCell(sheet, getHeaderInBundle("hasMadeDegreeChange"), 12);
addHeaderCell(sheet, getHeaderInBundle("firstEnrolmentOnCurrentExecutionYear"), 13);
addHeaderCell(sheet, getHeaderInBundle("regime"), 14);
addHeaderCell(sheet, getHeaderInBundle("code"), 15);
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.createCell(16);
cell.setCellValue(getHeaderInBundle("ingression.year.on.cycle.studies"));
cell.setCellStyle(headerStyle);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 16, 18));
cell = sheet.getRow(1).createCell(16);
cell.setCellValue(getHeaderInBundle("ingression.year.on.cycle.studies.year"));
cell.setCellStyle(headerStyle);
cell = sheet.getRow(1).createCell(17);
cell.setCellValue(getHeaderInBundle("ingression.year.on.cycle.studies.count"));
cell.setCellStyle(headerStyle);
cell = sheet.getRow(1).createCell(18);
cell.setCellValue(getHeaderInBundle("ingression.year.on.cycle.studies.integral.count"));
cell.setCellStyle(headerStyle);
addHeaderCell(sheet, getHeaderInBundle("numberOfDoneECTS"), 19);
addHeaderCell(sheet, getHeaderInBundle("numberOfDegreeCurricularYears"), 20);
addHeaderCell(sheet, getHeaderInBundle("curricularYearOneYearAgo"), 21);
addHeaderCell(sheet, getHeaderInBundle("numberOfEnrolledEctsOneYearAgo"), 22);
addHeaderCell(sheet, getHeaderInBundle("numberOfApprovedEctsOneYearAgo"), 23);
addHeaderCell(sheet, getHeaderInBundle("curricularYearInCurrentYear"), 24);
addHeaderCell(sheet, getHeaderInBundle("numberOfEnrolledECTS"), 25);
addHeaderCell(sheet, getHeaderInBundle("gratuityAmount"), 26);
addHeaderCell(sheet, getHeaderInBundle("numberOfMonthsExecutionYear"), 27);
addHeaderCell(sheet, getHeaderInBundle("firstMonthOfPayment"), 28);
addHeaderCell(sheet, getHeaderInBundle("ownerOfCETQualification"), 29);
addHeaderCell(sheet, getHeaderInBundle("degreeQualificationOwner"), 30);
addHeaderCell(sheet, getHeaderInBundle("masterQualificationOwner"), 31);
addHeaderCell(sheet, getHeaderInBundle("phdQualificationOwner"), 32);
addHeaderCell(sheet, getHeaderInBundle("ownerOfCollegeQualification"), 33);
addHeaderCell(sheet, getHeaderInBundle("observations"), 34);
addHeaderCell(sheet, getHeaderInBundle("lastEnrolledExecutionYear"), 35);
addHeaderCell(sheet, getHeaderInBundle("nif"), 36);
addHeaderCell(sheet, getHeaderInBundle("last.conclusion.academic.facts"), 37);
}
protected String getHeaderInBundle(String field) {
return BundleUtil.getString(Bundle.ACADEMIC,
"label.org.fenixedu.academic.ui.struts.action.administrativeOffice.scholarship.utl.report.StudentLine." + field);
}
protected void addHeaderCell(HSSFSheet sheet, String value, int columnNumber) {
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.createCell(columnNumber);
cell.setCellValue(value);
cell.setCellStyle(headerStyle);
sheet.addMergedRegion(new CellRangeAddress(0, 1, columnNumber, columnNumber));
}
private CellStyle headerBackgroundStyle(final HSSFWorkbook wb) {
CellStyle style = wb.createCellStyle();
style.setFillBackgroundColor(IndexedColors.AQUA.getIndex());
style.setFillPattern(CellStyle.BIG_SPOTS);
return style;
}
protected void addCellValue(HSSFRow row, String value, int cellNumber) {
HSSFCell cell = row.createCell(cellNumber);
cell.setCellValue(value);
}
private void addCellFormula(HSSFRow row, String value, int cellNumber) {
HSSFCell cell = row.createCell(cellNumber);
cell.setCellFormula(value);
}
public List<StudentLine> getCorrectStudentLines() {
return correctStudentLines;
}
public List<StudentLine> getErroneousStudentLines() {
return erroneousStudentLines;
}
}