/** * 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.report.academicAdministrativeOffice; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.accounting.postingRules.serviceRequests.CertificateRequestPR; import org.fenixedu.academic.domain.degreeStructure.ProgramConclusion; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.serviceRequests.documentRequests.ApprovementCertificateRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.CertificateRequest; import org.fenixedu.academic.domain.serviceRequests.documentRequests.IDocumentRequest; import org.fenixedu.academic.domain.student.Registration; import org.fenixedu.academic.domain.student.curriculum.Curriculum; import org.fenixedu.academic.domain.student.curriculum.ICurriculum; import org.fenixedu.academic.domain.student.curriculum.ICurriculumEntry; import org.fenixedu.academic.domain.studentCurriculum.CycleCurriculumGroup; import org.fenixedu.academic.domain.studentCurriculum.NoCourseGroupCurriculumGroup; import org.fenixedu.academic.util.FenixStringTools; import org.fenixedu.academic.util.Money; public class ApprovementCertificate extends AdministrativeOfficeDocument { private static final long serialVersionUID = 1L; protected ApprovementCertificate(final IDocumentRequest documentRequest) { super(documentRequest); } @Override protected void fillReport() { super.fillReport(); addParameter("approvementsInfo", getApprovementsInfo()); } @Override protected ApprovementCertificateRequest getDocumentRequest() { return (ApprovementCertificateRequest) super.getDocumentRequest(); } @Override protected String getDegreeDescription() { return getDocumentRequest().getRegistration().getDegreeDescription(getDocumentRequest().getExecutionYear(), (ProgramConclusion) null, getLocale()); } final private String getApprovementsInfo() { final ApprovementCertificateRequest request = getDocumentRequest(); final StringBuilder res = new StringBuilder(); final SortedSet<ICurriculumEntry> entries = new TreeSet<ICurriculumEntry>(ICurriculumEntry.COMPARATOR_BY_EXECUTION_PERIOD_AND_NAME_AND_ID); final Registration registration = getDocumentRequest().getRegistration(); final Map<Unit, String> ids = new HashMap<Unit, String>(); if (registration.isBolonha()) { reportCycles(res, entries, ids); } else { final ICurriculum curriculum = registration.getCurriculum(request.getFilteringDate()); ApprovementCertificateRequest.filterEntries(entries, request, curriculum); reportEntries(res, entries, ids); } entries.clear(); entries.addAll(request.getExtraCurricularEntriesToReport()); if (!entries.isEmpty()) { reportRemainingEntries(res, entries, ids, registration.getLastStudentCurricularPlan().getExtraCurriculumGroup()); } entries.clear(); entries.addAll(request.getPropaedeuticEntriesToReport()); if (!entries.isEmpty()) { reportRemainingEntries(res, entries, ids, registration.getLastStudentCurricularPlan() .getPropaedeuticCurriculumGroup()); } if (getDocumentRequest().isToShowCredits()) { res.append(getRemainingCreditsInfo(request.getRegistration().getCurriculum())); } res.append(generateEndLine()); if (!ids.isEmpty()) { res.append(LINE_BREAK).append(getAcademicUnitInfo(ids, request.getMobilityProgram())); } return res.toString(); } final private void reportEntries(final StringBuilder result, final Collection<ICurriculumEntry> entries, final Map<Unit, String> academicUnitIdentifiers) { ExecutionYear lastReportedExecutionYear = null; for (final ICurriculumEntry entry : entries) { final ExecutionYear executionYear = entry.getExecutionYear(); if (lastReportedExecutionYear == null) { lastReportedExecutionYear = executionYear; } if (executionYear != lastReportedExecutionYear) { lastReportedExecutionYear = executionYear; // result.append(LINE_BREAK); } reportEntry(result, entry, academicUnitIdentifiers, executionYear); } } final private void reportCycles(final StringBuilder result, final SortedSet<ICurriculumEntry> entries, final Map<Unit, String> academicUnitIdentifiers) { final Collection<CycleCurriculumGroup> cycles = new TreeSet<CycleCurriculumGroup>(CycleCurriculumGroup.COMPARATOR_BY_CYCLE_TYPE_AND_ID); cycles.addAll(getDocumentRequest().getRegistration().getLastStudentCurricularPlan().getInternalCycleCurriculumGrops()); CycleCurriculumGroup lastReported = null; for (final CycleCurriculumGroup cycle : cycles) { if (!cycle.isConclusionProcessed() || isDEARegistration()) { final ApprovementCertificateRequest request = (getDocumentRequest()); final Curriculum curriculum = cycle.getCurriculum(request.getFilteringDate()); ApprovementCertificateRequest.filterEntries(entries, request, curriculum); if (!entries.isEmpty()) { if (lastReported == null) { lastReported = cycle; } else { result.append(generateEndLine()).append(LINE_BREAK); } result.append(getMLSTextContent(cycle.getName())).append(":").append(LINE_BREAK); reportEntries(result, entries, academicUnitIdentifiers); } entries.clear(); } } } // TODO: remove this after DEA diplomas and certificates private boolean isDEARegistration() { return getDocumentRequest().getRegistration().getDegreeType().isAdvancedSpecializationDiploma(); } final private void reportRemainingEntries(final StringBuilder result, final Collection<ICurriculumEntry> entries, final Map<Unit, String> academicUnitIdentifiers, final NoCourseGroupCurriculumGroup group) { result.append(generateEndLine()).append(LINE_BREAK).append(getMLSTextContent(group.getName())).append(":") .append(LINE_BREAK); for (final ICurriculumEntry entry : entries) { reportEntry(result, entry, academicUnitIdentifiers, entry.getExecutionYear()); } } final private void reportEntry(final StringBuilder result, final ICurriculumEntry entry, final Map<Unit, String> academicUnitIdentifiers, final ExecutionYear executionYear) { result.append( FenixStringTools.multipleLineRightPadWithSuffix(getCurriculumEntryName(academicUnitIdentifiers, entry), LINE_LENGTH, END_CHAR, getCreditsAndGradeInfo(entry, executionYear))).append(LINE_BREAK); } @Override protected void addPriceFields() { final CertificateRequest certificateRequest = getDocumentRequest(); final CertificateRequestPR certificateRequestPR = (CertificateRequestPR) getPostingRule(); final Money amountPerPage = certificateRequestPR.getAmountPerPage(); final Money baseAmountPlusAmountForUnits = certificateRequestPR.getBaseAmount().add( certificateRequestPR.getAmountForUnits(certificateRequest.getNumberOfUnits())); final Money urgencyAmount = certificateRequest.getUrgentRequest() ? certificateRequestPR.getBaseAmount() : Money.ZERO; addParameter("amountPerPage", amountPerPage); addParameter("baseAmountPlusAmountForUnits", baseAmountPlusAmountForUnits); addParameter("urgencyAmount", urgencyAmount); addParameter("printPriceFields", printPriceParameters(certificateRequest)); } }