/** * 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.dto.serviceRequests; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.stream.Stream; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.Enrolment; import org.fenixedu.academic.domain.Exam; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.degreeStructure.CycleType; import org.fenixedu.academic.domain.degreeStructure.ProgramConclusion; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.organizationalStructure.UnitName; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentPurposeType; import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentRequestType; import org.fenixedu.academic.domain.student.MobilityProgram; import org.fenixedu.academic.domain.student.Registration; import org.fenixedu.academic.domain.student.RegistrationProtocol; import org.fenixedu.academic.domain.studentCurriculum.CurriculumGroup; import org.fenixedu.academic.util.Money; import org.fenixedu.academic.util.MultiLanguageString; import org.joda.time.LocalDate; import org.joda.time.YearMonthDay; import pt.ist.fenixWebFramework.renderers.DataProvider; import pt.ist.fenixWebFramework.renderers.components.converters.Converter; import pt.ist.fenixWebFramework.renderers.converters.EnumConverter; public class DocumentRequestCreateBean extends RegistrationAcademicServiceRequestCreateBean implements IDocumentRequestBean { public static class CycleTypeProvider implements DataProvider { @Override public Converter getConverter() { return new EnumConverter(); } @Override public Object provide(Object source, Object currentValue) { DocumentRequestCreateBean bean = (DocumentRequestCreateBean) source; return bean.getRegistration().getDegreeType().getCycleTypes(); } } private static final long serialVersionUID = 1L; private DocumentRequestType chosenDocumentRequestType; private DocumentPurposeType chosenDocumentPurposeType; private String otherPurpose; private CurriculumGroup branchCurriculumGroup; private ProgramConclusion programConclusion; private String branch; private Boolean average = Boolean.FALSE; private Boolean detailed = Boolean.FALSE; private Boolean technicalEngineer = Boolean.FALSE; private Boolean internshipAbolished = Boolean.FALSE; private Boolean internshipApproved = Boolean.FALSE; private Boolean studyPlan = Boolean.FALSE; private YearMonthDay exceptionalConclusionDate; private Boolean toBeCreated; private String schema; private Collection<String> warningsToReport; private Integer year; private CycleType requestedCycle; private String givenNames; private String familyNames; private MobilityProgram mobilityProgram; private boolean ignoreExternalEntries = false; private boolean ignoreCurriculumInAdvance = false; private boolean toUseAll = false; private List<Enrolment> enrolments; private ExecutionSemester executionSemester; private List<Exam> exams; private Integer numberOfCourseLoads; private Unit institution; private Integer numberOfPrograms; private Money pastPaymentAmount; private LocalDate pastRequestDate; private LocalDate pastPaymentDate; private LocalDate pastEmissionDate; private LocalDate pastDispatchDate; private RegistrationProtocol registrationProtocol; public DocumentRequestCreateBean(Registration registration) { super(registration); this.enrolments = new ArrayList<Enrolment>(); this.exams = new ArrayList<Exam>(); pastRequestDate = new LocalDate(); this.registrationProtocol = registration.getRegistrationProtocol(); if (registrationProtocol != null && registrationProtocol.isMobilityAgreement()) { setLanguage(MultiLanguageString.en); } else { setLanguage(MultiLanguageString.pt); } } public RegistrationProtocol getRegistrationProtocol() { return this.registrationProtocol; } public void setRegistrationProtocol(final RegistrationProtocol registrationProtocol) { this.registrationProtocol = registrationProtocol; } public DocumentRequestType getChosenDocumentRequestType() { return chosenDocumentRequestType; } public void setChosenDocumentRequestType(DocumentRequestType chosenDocumentRequestType) { this.chosenDocumentRequestType = chosenDocumentRequestType; } public DocumentPurposeType getChosenDocumentPurposeType() { return chosenDocumentPurposeType; } public void setChosenDocumentPurposeType(DocumentPurposeType chosenDocumentPurposeType) { this.chosenDocumentPurposeType = chosenDocumentPurposeType; } public String getOtherPurpose() { return otherPurpose; } public void setOtherPurpose(String otherPurpose) { this.otherPurpose = otherPurpose; } public Boolean getAverage() { return average; } public void setAverage(Boolean average) { this.average = average; } public Boolean getDetailed() { return detailed; } public void setDetailed(Boolean detailed) { this.detailed = detailed; } public Boolean getTechnicalEngineer() { return technicalEngineer; } public void setTechnicalEngineer(Boolean technicalEngineer) { this.technicalEngineer = technicalEngineer; } public Boolean getInternshipAbolished() { return internshipAbolished; } public void setInternshipAbolished(Boolean internshipAbolished) { this.internshipAbolished = internshipAbolished; } public Boolean getInternshipApproved() { return internshipApproved; } public void setInternshipApproved(Boolean internshipApproved) { this.internshipApproved = internshipApproved; } public Boolean getStudyPlan() { return studyPlan; } public void setStudyPlan(Boolean studyPlan) { this.studyPlan = studyPlan; } public YearMonthDay getExceptionalConclusionDate() { return exceptionalConclusionDate; } public void setExceptionalConclusionDate(YearMonthDay exceptionalConclusionDate) { this.exceptionalConclusionDate = exceptionalConclusionDate; } public Integer getYear() { return this.year; } public void setYear(Integer year) { this.year = year; } public Boolean getToBeCreated() { return toBeCreated; } public void setToBeCreated(Boolean toBeCreated) { this.toBeCreated = toBeCreated; } /** * This method is only needed to report warnings to the user. While we don't * have enough info in our database to decide on what cases the document * request should abort (acording to the Administrative Office rules shown * in the use cases), warnings must be shown to the user. * * @return */ public Collection<String> getWarningsToReport() { if (warningsToReport == null) { warningsToReport = new HashSet<String>(); if (chosenDocumentRequestType == DocumentRequestType.APPROVEMENT_CERTIFICATE) { if (chosenDocumentPurposeType == DocumentPurposeType.PROFESSIONAL) { warningsToReport.add("aprovementType.professionalPurpose.thirdGrade"); } warningsToReport.add("aprovementType.finished.degree"); } if (chosenDocumentRequestType == DocumentRequestType.DEGREE_FINALIZATION_CERTIFICATE) { warningsToReport.add("degreeFinalizationType.withoutDegreeCertificate"); } } return warningsToReport; } public boolean hasWarningsToReport() { if (warningsToReport == null) { getWarningsToReport(); } return !warningsToReport.isEmpty(); } public void setPurpose(DocumentPurposeType chosenDocumentPurposeType, String otherPurpose) { otherPurpose = otherPurpose.trim(); if (chosenDocumentPurposeType != null && chosenDocumentPurposeType.equals(DocumentPurposeType.OTHER) && (otherPurpose == null || otherPurpose.length() == 0)) { throw new DomainException("DocumentRequestCreateBean.error.other.purpose.required"); } this.chosenDocumentPurposeType = chosenDocumentPurposeType; this.otherPurpose = otherPurpose; } public String getSchema() { return schema; } public void setSchema(String schema) { this.schema = schema; } public CycleType getRequestedCycle() { return requestedCycle; } public void setRequestedCycle(final CycleType cycleType) { this.requestedCycle = cycleType; } @Override protected void setRegistration(Registration registration) { super.setRegistration(registration); if (registration.getPerson().getGivenNames() == null) { String[] parts = registration.getStudent().getPerson().getName().split("\\s+"); int split = parts.length > 3 ? 2 : 1; setGivenNames(StringUtils.join(Arrays.copyOfRange(parts, 0, split), " ")); setFamilyNames(StringUtils.join(Arrays.copyOfRange(parts, split, parts.length), " ")); } else { setGivenNames(registration.getPerson().getGivenNames()); setFamilyNames(registration.getPerson().getFamilyNames()); } } public void validateNames() { final String fullName = getRegistration().getStudent().getPerson().getName(); final String familyName = getFamilyNames(); final String composedName = familyName == null || familyName.isEmpty() ? getGivenNames() : getGivenNames() + " " + familyName; if (!fullName.equals(composedName)) { throw new DomainException("error.serviceRequests.diplomaRequest.name.split.not.matching.fullname"); } } public String getGivenNames() { return givenNames; } public void setGivenNames(String givenNames) { this.givenNames = givenNames; } public String getFamilyNames() { return familyNames; } public void setFamilyNames(String familyNames) { this.familyNames = familyNames; } final public boolean getHasAdditionalInformation() { return getChosenDocumentRequestType() == null ? false : getChosenDocumentRequestType().getHasAdditionalInformation(); } final public boolean getHasCycleTypeDependency() { return !getIsForProgramConclusionPurposes() && getChosenDocumentRequestType().getHasCycleTypeDependency(getRegistration().getDegreeType()); } final public boolean getIsForProgramConclusionPurposes() { return Stream.of(DocumentRequestType.DEGREE_FINALIZATION_CERTIFICATE, DocumentRequestType.REGISTRY_DIPLOMA_REQUEST, DocumentRequestType.DIPLOMA_REQUEST, DocumentRequestType.DIPLOMA_SUPPLEMENT_REQUEST).anyMatch( type -> type.equals(getChosenDocumentRequestType())); } final public boolean getHasMobilityProgramDependency() { return chosenDocumentRequestType == DocumentRequestType.APPROVEMENT_CERTIFICATE || chosenDocumentRequestType == DocumentRequestType.DEGREE_FINALIZATION_CERTIFICATE; } final public MobilityProgram getMobilityProgram() { return mobilityProgram; } final public void setMobilityProgram(final MobilityProgram mobilityProgram) { this.mobilityProgram = mobilityProgram; } public boolean isIgnoreExternalEntries() { return ignoreExternalEntries; } public void setIgnoreExternalEntries(final boolean ignoreExternalEntries) { this.ignoreExternalEntries = ignoreExternalEntries; } public boolean isIgnoreCurriculumInAdvance() { return ignoreCurriculumInAdvance; } public void setIgnoreCurriculumInAdvance(boolean ignoreCurriculumInAdvance) { this.ignoreCurriculumInAdvance = ignoreCurriculumInAdvance; } public boolean isToUseAll() { return toUseAll; } public void setToUseAll(boolean toUseAll) { this.toUseAll = toUseAll; } public List<Enrolment> getEnrolments() { final List<Enrolment> result = new ArrayList<Enrolment>(); for (final Enrolment each : this.enrolments) { result.add(each); } return result; } public void setEnrolments(List<Enrolment> enrolments) { final List<Enrolment> enrolmentsToSet = new ArrayList<Enrolment>(); for (final Enrolment enrolment : enrolments) { enrolmentsToSet.add(enrolment); } this.enrolments = enrolmentsToSet; } public List<Exam> getExams() { final List<Exam> result = new ArrayList<Exam>(); for (final Exam each : this.exams) { result.add(each); } return result; } public void setExams(List<Exam> exams) { final List<Exam> result = new ArrayList<Exam>(); for (final Exam each : exams) { result.add(each); } this.exams = result; } public ExecutionSemester getExecutionPeriod() { return this.executionSemester; } public void setExecutionPeriod(ExecutionSemester executionSemester) { this.executionSemester = executionSemester; } public Integer getNumberOfCourseLoads() { return numberOfCourseLoads; } public void setNumberOfCourseLoads(Integer numberOfCourseLoads) { this.numberOfCourseLoads = numberOfCourseLoads; } public UnitName getInstitutionName() { return (this.institution != null) ? this.institution.getUnitName() : null; } public void setInstitutionName(final UnitName institutionName) { this.institution = (institutionName != null) ? institutionName.getUnit() : null; } public Unit getInstitution() { return this.institution; } public Integer getNumberOfPrograms() { return numberOfPrograms; } public void setNumberOfPrograms(Integer numberOfPrograms) { this.numberOfPrograms = numberOfPrograms; } public void setBranch(String branch) { this.branch = branch; } public String getBranch() { return branch; } public CurriculumGroup getBranchCurriculumGroup() { return branchCurriculumGroup; } public void setBranchCurriculumGroup(CurriculumGroup branchCurriculumGroup) { this.branchCurriculumGroup = (branchCurriculumGroup); } public String getBranchName() { if (getBranchCurriculumGroup() == null) { return branch; } return getBranchCurriculumGroup().getName().getContent(); } public boolean getHasPurposeNeed() { return !(chosenDocumentRequestType.isDiploma() || chosenDocumentRequestType.isRegistryDiploma() || chosenDocumentRequestType.isPastDiploma() || chosenDocumentRequestType.isDiplomaSupplement()); } public void setPastPaymentAmount(Money paymentAmount) { this.pastPaymentAmount = paymentAmount; } public Money getPastPaymentAmount() { return pastPaymentAmount; } public void setPastPaymentDate(LocalDate paymentDate) { this.pastPaymentDate = paymentDate; } public LocalDate getPastPaymentDate() { return pastPaymentDate; } public LocalDate getPastEmissionDate() { return pastEmissionDate; } public void setPastEmissionDate(LocalDate emissionDate) { this.pastEmissionDate = emissionDate; } public LocalDate getPastDispatchDate() { return pastDispatchDate; } public void setPastDispatchDate(LocalDate dispatchDate) { this.pastDispatchDate = dispatchDate; } public LocalDate getPastRequestDate() { return pastRequestDate; } public void setPastRequestDate(LocalDate pastRequestDate) { this.pastRequestDate = pastRequestDate; } @Override public boolean hasRegistration() { return getRegistration() != null; } public ProgramConclusion getProgramConclusion() { return programConclusion; } public void setProgramConclusion(ProgramConclusion programConclusion) { this.programConclusion = programConclusion; } }