/**
* 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.domain.candidacyProcess.over23;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Formatter;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang.StringUtils;
import org.fenixedu.academic.domain.Degree;
import org.fenixedu.academic.domain.DegreeCurricularPlan;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.accounting.events.candidacy.Over23IndividualCandidacyEvent;
import org.fenixedu.academic.domain.candidacy.IngressionType;
import org.fenixedu.academic.domain.candidacyProcess.Formation;
import org.fenixedu.academic.domain.candidacyProcess.FormationBean;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcess;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcessBean;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyState;
import org.fenixedu.academic.domain.degreeStructure.CycleType;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.joda.time.LocalDate;
public class Over23IndividualCandidacy extends Over23IndividualCandidacy_Base {
private Over23IndividualCandidacy() {
super();
}
Over23IndividualCandidacy(final Over23IndividualCandidacyProcess process, final Over23IndividualCandidacyProcessBean bean) {
this();
Person person = init(bean, process);
setDisabilities(bean.getDisabilities());
setEducation(bean.getEducation());
setLanguages(bean.getLanguages());
setLanguagesRead(bean.getLanguagesRead());
setLanguagesWrite(bean.getLanguagesWrite());
setLanguagesSpeak(bean.getLanguagesSpeak());
createDegreeEntries(bean.getSelectedDegrees());
createFormationEntries(bean.getFormationConcludedBeanList(), bean.getFormationNonConcludedBeanList());
/*
* 06/04/2009 - The candidacy may not be associated with a person. In this case we will not create an Event
*/
/*
* 08/05/2009 - Now all candidacies are external (even made in academic administrative office)
*
* TODO Anil : Are other candidacies created as an external
*/
if (bean.getInternalPersonCandidacy()) {
createDebt(person);
}
}
@Override
protected void createFormationEntries(List<FormationBean> formationConcludedBeanList,
List<FormationBean> formationNonConcludedBeanList) {
for (FormationBean formation : formationConcludedBeanList) {
this.addFormations(new Formation(this, formation));
}
for (FormationBean formation : formationNonConcludedBeanList) {
this.addFormations(new Formation(this, formation));
}
}
@Override
protected void checkParameters(final Person person, final IndividualCandidacyProcess process,
final IndividualCandidacyProcessBean bean) {
Over23IndividualCandidacyProcess over23Process = (Over23IndividualCandidacyProcess) process;
Over23IndividualCandidacyProcessBean over23ProcessBean = (Over23IndividualCandidacyProcessBean) bean;
LocalDate candidacyDate = bean.getCandidacyDate();
List<Degree> degrees = over23ProcessBean.getSelectedDegrees();
checkParameters(person, over23Process, candidacyDate, degrees);
}
private void checkParameters(final Person person, final Over23IndividualCandidacyProcess process,
final LocalDate candidacyDate, final List<Degree> degrees) {
checkParameters(person, process, candidacyDate);
/*
* 31/03/2009 - The candidacy may be submited externally hence may not be associated to a person
*
*
* if (person.hasStudent()) { throw new DomainException("error.Over23IndividualCandidacy.invalid.person"); }
*
* if(person.hasValidOver23IndividualCandidacy(process. getCandidacyExecutionInterval())) { throw newDomainException(
* "error.Over23IndividualCandidacy.person.already.has.candidacy", process .getCandidacyExecutionInterval().getName()); }
*/
/*
* 08/05/2009 - The candidacy process may be created with candidate personal information only. So we will not check the chosen
* degrees in initialisation
*
* checkDegrees(degrees);
*/
}
private void checkDegrees(final List<Degree> degrees) {
if (degrees == null || degrees.isEmpty()) {
throw new DomainException("error.Over23IndividualCandidacy.invalid.degrees");
}
}
private void createDegreeEntries(final List<Degree> degrees) {
for (int index = 0; index < degrees.size(); index++) {
new Over23IndividualCandidacyDegreeEntry(this, degrees.get(index), index + 1);
}
}
private void removeExistingDegreeEntries() {
while (!getOver23IndividualCandidacyDegreeEntriesSet().isEmpty()) {
getOver23IndividualCandidacyDegreeEntriesSet().iterator().next().delete();
}
}
@Override
protected void createDebt(final Person person) {
new Over23IndividualCandidacyEvent(this, person);
}
void saveChoosedDegrees(final List<Degree> degrees) {
if (!degrees.isEmpty()) {
removeExistingDegreeEntries();
createDegreeEntries(degrees);
}
}
@Override
public Over23IndividualCandidacyProcess getCandidacyProcess() {
return (Over23IndividualCandidacyProcess) super.getCandidacyProcess();
}
void editCandidacyInformation(final LocalDate candidacyDate, final List<Degree> degrees, final String disabilities,
final String education, final String languagesRead, final String languagesWrite, final String languagesSpeak) {
checkParameters(getPersonalDetails().getPerson(), getCandidacyProcess(), candidacyDate);
checkDegrees(degrees);
setCandidacyDate(candidacyDate);
saveChoosedDegrees(degrees);
setDisabilities(disabilities);
setEducation(education);
setLanguagesRead(languagesRead);
setLanguagesSpeak(languagesSpeak);
setLanguagesWrite(languagesWrite);
}
List<Degree> getSelectedDegrees() {
final List<Degree> result = new ArrayList<Degree>(getOver23IndividualCandidacyDegreeEntriesSet().size());
for (final Over23IndividualCandidacyDegreeEntry entry : getOver23IndividualCandidacyDegreeEntriesSet()) {
result.add(entry.getDegree());
}
return result;
}
List<Degree> getSelectedDegreesSortedByOrder() {
final Set<Over23IndividualCandidacyDegreeEntry> entries =
new TreeSet<Over23IndividualCandidacyDegreeEntry>(Over23IndividualCandidacyDegreeEntry.COMPARATOR_BY_ORDER);
entries.addAll(getOver23IndividualCandidacyDegreeEntriesSet());
final List<Degree> result = new ArrayList<Degree>(entries.size());
for (final Over23IndividualCandidacyDegreeEntry entry : entries) {
result.add(entry.getDegree());
}
return result;
}
@Override
public Collection<Degree> getAllDegrees() {
List<Degree> result = new ArrayList<Degree>();
result.addAll(getSelectedDegrees());
return result;
}
void editCandidacyResult(final IndividualCandidacyState state, final Degree acceptedDegree) {
checkParameters(state, acceptedDegree);
setAcceptedDegree(acceptedDegree);
if (isCandidacyResultStateValid(state)) {
setState(state);
}
}
private void checkParameters(final IndividualCandidacyState state, final Degree acceptedDegree) {
if (state != null) {
if (state == IndividualCandidacyState.ACCEPTED
&& (acceptedDegree == null || !getSelectedDegrees().contains(acceptedDegree))) {
throw new DomainException("error.Over23IndividualCandidacy.invalid.acceptedDegree");
}
if (isAccepted() && state != IndividualCandidacyState.ACCEPTED && getRegistration() != null) {
throw new DomainException("error.Over23IndividualCandidacy.cannot.change.state.from.accepted.candidacies");
}
}
}
@Override
protected ExecutionYear getCandidacyExecutionInterval() {
return (ExecutionYear) super.getCandidacyExecutionInterval();
}
@Override
protected Registration createRegistration(Person person, DegreeCurricularPlan degreeCurricularPlan, CycleType cycleType,
IngressionType ingressionType) {
final Registration registration = super.createRegistration(person, degreeCurricularPlan, cycleType, ingressionType);
registration.setRegistrationYear(getCandidacyExecutionInterval());
return registration;
}
@Override
public void exportValues(StringBuilder result) {
super.exportValues(result);
Formatter formatter = new Formatter(result);
formatter.format("%s: %s\n", BundleUtil.getString(Bundle.CANDIDATE, "label.over23.languages.read"),
StringUtils.isEmpty(getLanguagesRead()) ? StringUtils.EMPTY : getLanguagesRead());
formatter.format("%s: %s\n", BundleUtil.getString(Bundle.CANDIDATE, "label.over23.languages.write"),
StringUtils.isEmpty(getLanguagesWrite()) ? StringUtils.EMPTY : getLanguagesWrite());
formatter.format("%s: %s\n", BundleUtil.getString(Bundle.CANDIDATE, "label.over23.languages.speak"),
StringUtils.isEmpty(getLanguagesSpeak()) ? StringUtils.EMPTY : getLanguagesSpeak());
formatter.close();
}
@Override
public String getDescription() {
return getCandidacyProcess().getDisplayName()
+ (getAcceptedDegree() != null ? ": " + getAcceptedDegree().getNameI18N() : "");
}
@Override
public boolean isOver23() {
return true;
}
}