/**
* 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.publico.candidacies;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.fenixedu.academic.domain.Degree;
import org.fenixedu.academic.domain.Installation;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.PublicCandidacyHashCode;
import org.fenixedu.academic.domain.StudentCurricularPlan;
import org.fenixedu.academic.domain.candidacyProcess.CandidacyProcess;
import org.fenixedu.academic.domain.candidacyProcess.CandidacyProcessDocumentUploadBean;
import org.fenixedu.academic.domain.candidacyProcess.DegreeOfficePublicCandidacyHashCode;
import org.fenixedu.academic.domain.candidacyProcess.DegreeOfficePublicCandidacyHashCodeOperations;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyDocumentFile;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyDocumentFileType;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcess;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcessBean;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcessWithPrecedentDegreeInformationBean;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcessWithPrecedentDegreeInformationBean.PrecedentDegreeType;
import org.fenixedu.academic.domain.candidacyProcess.degreeChange.DegreeChangeIndividualCandidacyProcess.SendEmailForApplicationSubmission;
import org.fenixedu.academic.domain.candidacyProcess.exceptions.HashCodeForEmailAndProcessAlreadyBounded;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.person.IDDocumentType;
import org.fenixedu.academic.dto.candidacy.PrecedentDegreeInformationBean;
import org.fenixedu.academic.dto.person.PersonBean;
import org.fenixedu.academic.service.services.caseHandling.CreateNewProcess;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.ui.struts.action.candidacy.IndividualCandidacyProcessDA;
import org.fenixedu.academic.ui.struts.action.publico.KaptchaAction;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.Pair;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.struts.portal.EntryPoint;
import org.fenixedu.commons.i18n.I18N;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class RefactoredIndividualCandidacyProcessPublicDA extends IndividualCandidacyProcessDA {
private static final Logger logger = LoggerFactory.getLogger(RefactoredIndividualCandidacyProcessPublicDA.class);
@Override
public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setAttribute("application.name", getStringFromDefaultBundle(getCandidacyNameKey()));
request.setAttribute("mappingPath", mapping.getPath());
request.setAttribute("isApplicationSubmissionPeriodValid", isApplicationSubmissionPeriodValid());
request.setAttribute("application.information.link.default", getCandidacyInformationLinkDefaultLanguage());
request.setAttribute("application.information.link.english", getCandidacyInformationLinkEnglish());
setProcess(request);
return super.execute(mapping, actionForm, request, response);
}
protected String getStringFromDefaultBundle(String key) {
return BundleUtil.getString(Bundle.CANDIDATE, key);
}
@Override
protected void prepareInformationForBindPersonToCandidacyOperation(HttpServletRequest request,
IndividualCandidacyProcess process) {
// TODO Auto-generated method stub
}
protected ActionForward verifySubmissionPreconditions(ActionMapping mapping) {
if (getCurrentOpenParentProcess() == null) {
return mapping.findForward("open-candidacy-process-closed");
}
return null;
}
protected ActionForward verifyEditPreconditions(ActionMapping mapping) {
if (getCurrentOpenParentProcess() == null) {
return mapping.findForward("open-candidacy-process-closed");
}
return null;
}
public ActionForward beginCandidacyProcessIntro(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) {
if (isInEnglishLocale()) {
return mapping.findForward("begin-candidacy-process-intro-en");
}
return mapping.findForward("begin-candidacy-process-intro");
}
@EntryPoint
public ActionForward preparePreCreationOfCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute("candidacyPreCreationBean", new CandidacyPreCreationBean());
return mapping.findForward("show-pre-creation-candidacy-form");
}
public ActionForward preparePreCreationOfCandidacyInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
return preparePreCreationOfCandidacy(mapping, form, request, response);
}
protected CandidacyProcess getCurrentOpenParentProcess() {
return Bennu.getInstance().getProcessesSet().stream().filter((getParentProcessType())::isInstance)
.filter(CandidacyProcess.class::isInstance).map(p -> (CandidacyProcess) p)
.filter(CandidacyProcess::hasOpenCandidacyPeriod)
.findFirst().orElse(null);
}
public ActionForward bindEmailWithHashCodeAndSendMailWithLink(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
if (getObjectFromViewState("PublicAccessCandidacy.preCreationForm") == null) { //if locale changes after a validation error
return preparePreCreationOfCandidacy(mapping, form, request, response);
}
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
if (!validateCaptcha(mapping, request)) {
invalidateDocumentFileRelatedViewStates();
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("show-pre-creation-candidacy-form");
}
try {
String email = (String) getObjectFromViewState("PublicAccessCandidacy.preCreationForm");
DegreeOfficePublicCandidacyHashCode hash =
DegreeOfficePublicCandidacyHashCodeOperations
.getUnusedOrCreateNewHashCodeAndSendEmailForApplicationSubmissionToCandidate(getProcessType(),
getCurrentOpenParentProcess(), email);
String link =
String.format(BundleUtil.getString(Bundle.CANDIDATE, getProcessType().getSimpleName()
+ ".const.public.application.submission.link"), hash.getValue(), I18N.getLocale().getLanguage());
request.setAttribute("link", link);
return mapping.findForward("show-email-message-sent");
} catch (HashCodeForEmailAndProcessAlreadyBounded e) {
addActionMessage(request, "error.candidacy.hash.code.already.bounded");
return mapping.findForward("show-pre-creation-candidacy-form");
}
}
public ActionForward showApplicationSubmissionConditions(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
String hash = request.getParameter("hash");
DegreeOfficePublicCandidacyHashCode candidacyHashCode =
(DegreeOfficePublicCandidacyHashCode) DegreeOfficePublicCandidacyHashCode.getPublicCandidacyCodeByHash(hash);
if (candidacyHashCode == null) {
return mapping.findForward("open-candidacy-processes-not-found");
}
if (candidacyHashCode.getIndividualCandidacyProcess() != null) {
request.setAttribute("individualCandidacyProcess", candidacyHashCode.getIndividualCandidacyProcess());
return viewCandidacy(mapping, form, request, response);
}
request.setAttribute("hash", hash);
return mapping.findForward("show-application-submission-conditions");
}
protected abstract String getCandidacyNameKey();
protected abstract String getCandidacyInformationLinkDefaultLanguage();
protected abstract String getCandidacyInformationLinkEnglish();
public abstract ActionForward viewCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response);
protected boolean validateCaptcha(ActionMapping mapping, HttpServletRequest request) {
final String captchaResponse = request.getParameter("j_captcha_response");
if (!KaptchaAction.validateResponse(request.getSession(), captchaResponse)) {
addActionMessage("captcha.error", request, "captcha.wrong.word");
return false;
}
return true;
}
private boolean isInEnglishLocale() {
Locale locale = I18N.getLocale();
return locale.getLanguage().equals(Locale.ENGLISH.getLanguage());
}
public ActionForward continueCandidacyCreation(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws IOException {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
IndividualCandidacyProcessBean bean = getIndividualCandidacyProcessBean();
final PersonBean personBean = bean.getPersonBean();
if (existsIndividualCandidacyProcessForDocumentId(request, personBean.getIdDocumentType(),
personBean.getDocumentIdNumber())) {
addActionMessage("individualCandidacyMessages", request, "error.candidacy.for.person.already.exists");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
}
final Set<Person> persons = new HashSet<Person>(Person.readByDocumentIdNumber(personBean.getDocumentIdNumber()));
if (persons.size() > 1) {
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.person.already.exist");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
}
final Person person = persons.size() == 1 ? persons.iterator().next() : null;
// check if person already exists
if (person != null) {
if (isPersonStudentAndNumberIsCorrect(person, bean.getPersonNumber())) {
if (person.getDateOfBirthYearMonthDay() == null
|| !person.getDateOfBirthYearMonthDay().equals(personBean.getDateOfBirth())) {
// found person with diff date
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.birth");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
} else if (!StringUtils.isEmpty(personBean.getSocialSecurityNumber())
&& !StringUtils.isEmpty(person.getSocialSecurityNumber())
&& !person.getSocialSecurityNumber().equals(personBean.getSocialSecurityNumber())) {
// found person with diff social security number
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.contributorNumber");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
} else {
personBean.setPerson(person);
}
} else {
// found person with diff ist userid
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.userId");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
}
} else {
if (Person.readByContributorNumber(personBean.getSocialSecurityNumber()) != null) {
// found person with same contributor number
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.contributorNumber");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
}
// person does not exist (neither by document Id nor by contributor number)
if (!StringUtils.isEmpty(bean.getPersonNumber())) {
// userid field was filled
addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName()
+ ".error.public.candidacies.fill.personal.information.and.institution.id.userId.wrongIdorNewPerson");
return executeCreateCandidacyPersonalInformationInvalid(mapping, form, request, response);
} else {
fillExternalPrecedentInformation(mapping, form, request, response);
}
}
IndividualCandidacyDocumentFile photoDocumentFile =
createIndividualCandidacyDocumentFile(bean.getPhotoDocument(), bean.getPersonBean().getDocumentIdNumber());
bean.getPhotoDocument().setDocumentFile(photoDocumentFile);
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("candidacy-continue-creation");
}
public ActionForward continueCandidacyCreationInvalid(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
invalidateDocumentFileRelatedViewStates();
return mapping.findForward("candidacy-continue-creation");
}
protected boolean isPersonStudentAndNumberIsCorrect(Person person, String personNumber) {
return (person.getStudent() != null && person.getStudent().getNumber().toString().equals(personNumber))
|| (person.getStudent() == null && StringUtils.isEmpty(personNumber));
}
public ActionForward executeCreateCandidacyPersonalInformationInvalid(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
invalidateDocumentFileRelatedViewStates();
return mapping.findForward("show-candidacy-creation-page");
}
protected boolean candidacyIndividualProcessExistsForThisEmail(String email) {
return candidacyIndividualProcessExistsForThisEmail(email, new ArrayList<Degree>());
}
protected boolean candidacyIndividualProcessExistsForThisEmail(String email, List<Degree> degreeList) {
return DegreeOfficePublicCandidacyHashCode.getPublicCandidacyHashCodeByEmailAndCandidacyProcessType(email,
getProcessType(), getCurrentOpenParentProcess(), degreeList) != null;
}
protected IndividualCandidacyProcess createNewPublicProcess(IndividualCandidacyProcessBean bean) throws DomainException,
FenixServiceException {
return (IndividualCandidacyProcess) CreateNewProcess.run(getProcessType(), bean,
buildActivitiesForApplicationSubmission(bean.getPublicCandidacyHashCode()));
}
private List<Pair<Class<?>, Object>> buildActivitiesForApplicationSubmission(DegreeOfficePublicCandidacyHashCode hashCode) {
final List<Pair<Class<?>, Object>> result = new ArrayList<Pair<Class<?>, Object>>();
result.add(pair(SendEmailForApplicationSubmission.class, hashCode));
return result;
}
private Pair<Class<?>, Object> pair(final Class<?> class1, final Object object) {
return new Pair<Class<?>, Object>(class1, object);
}
public ActionForward fillInternalPrecedentInformation(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
final IndividualCandidacyProcessWithPrecedentDegreeInformationBean bean =
(IndividualCandidacyProcessWithPrecedentDegreeInformationBean) getIndividualCandidacyProcessBean();
StudentCurricularPlan studentCurricularPlan = bean.getLastPrecedentStudentCurricularPlan();
if (studentCurricularPlan == null) {
addActionMessage("candidacyMessages", request, "error.public.candidacies.message.no.student.curricular.plan", null);
} else {
if (studentCurricularPlan.getRegistration().isTransited()) {
addActionMessage("candidacyMessages", request, "error.public.candidacies.message.no.student.curricular.plan",
null);
} else {
bean.setPrecedentDegreeType(PrecedentDegreeType.INSTITUTION_DEGREE);
bean.setPrecedentStudentCurricularPlan(studentCurricularPlan);
createCandidacyPrecedentDegreeInformation(bean, bean.getPrecedentStudentCurricularPlan());
}
}
request.setAttribute(getIndividualCandidacyProcessBeanName(), bean);
return mapping.findForward("candidacy-continue-creation");
}
public ActionForward fillExternalPrecedentInformation(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
final IndividualCandidacyProcessWithPrecedentDegreeInformationBean bean =
(IndividualCandidacyProcessWithPrecedentDegreeInformationBean) getIndividualCandidacyProcessBean();
bean.setPrecedentDegreeType(PrecedentDegreeType.EXTERNAL_DEGREE);
bean.setPrecedentDegreeInformation(new PrecedentDegreeInformationBean());
request.setAttribute(getIndividualCandidacyProcessBeanName(), bean);
return mapping.findForward("candidacy-continue-creation");
}
public ActionForward prepareEditCandidacyProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("edit-candidacy");
}
public ActionForward editCandidacyProcessInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("edit-candidacy");
}
@Override
protected void setStartInformation(ActionForm form, HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
protected String getFormattedApplicationSubmissionEndDate() {
DateTime end = getCurrentOpenParentProcess().getCandidacyEnd();
if (isInEnglishLocale()) {
return end.toString("dd', 'MMMM' of 'yyyy", I18N.getLocale());
}
return end.toString("dd' de 'MMMM' de 'yyyy", I18N.getLocale());
}
@Override
protected boolean existsIndividualCandidacyProcessForDocumentId(HttpServletRequest request, IDDocumentType documentType,
String identification) {
return getCurrentOpenParentProcess().getOpenChildProcessByDocumentId(documentType, identification) != null;
}
protected boolean isApplicationSubmissionPeriodValid() {
CandidacyProcess process = getCurrentOpenParentProcess();
if (process == null) {
return false;
}
DateTime now = new DateTime(System.currentTimeMillis());
return now.isAfter(process.getCandidacyStart()) && now.isBefore(process.getCandidacyEnd());
}
public ActionForward backToViewCandidacyInternal(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
IndividualCandidacyProcess individualCandidacyProcess =
(IndividualCandidacyProcess) request.getAttribute("individualCandidacyProcess");
return forward(request, mapping.getPath() + ".do?method=prepareCandidacyCreation&hash="
+ individualCandidacyProcess.getCandidacyHashCode().getValue());
}
public ActionForward prepareEditCandidacyQualifications(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("edit-candidacy-habilitations");
}
private ActionForward forward(HttpServletRequest request, String windowLocation) {
final ActionForward actionForward = new ActionForward();
actionForward.setName(windowLocation);
actionForward.setPath(windowLocation);
actionForward.setRedirect(true);
return actionForward;
}
public static class CandidacyPreCreationBean implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String email;
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
public ActionForward backToViewCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
IndividualCandidacyProcess individualCandidacyProcess = getDomainObject(request, "individualCandidacyProcess");
return forward(
request,
getLinkFromPublicCandidacyHashCodeForInternalUse(mapping, request,
individualCandidacyProcess.getCandidacyHashCode()));
}
protected String getLinkFromPublicCandidacyHashCodeForInternalUse(ActionMapping mapping, HttpServletRequest request,
PublicCandidacyHashCode hashCode) {
return mapping.getPath() + ".do?method=prepareCandidacyCreation&hash=" + hashCode.getValue();
}
public ActionForward prepareEditCandidacyDocuments(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(getIndividualCandidacyProcessBean().getIndividualCandidacyProcess());
request.setAttribute("candidacyDocumentUploadBean", bean);
return mapping.findForward("edit-candidacy-documents");
}
public ActionForward prepareEditCandidacyDocumentsInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(getIndividualCandidacyProcessBean().getIndividualCandidacyProcess());
request.setAttribute("candidacyDocumentUploadBean", bean);
return mapping.findForward("edit-candidacy-documents");
}
public ActionForward editCandidacyDocuments(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException, IOException {
CandidacyProcessDocumentUploadBean uploadBean =
(CandidacyProcessDocumentUploadBean) getObjectFromViewState("individualCandidacyProcessBean.document.file");
try {
IndividualCandidacyDocumentFile documentFile =
createIndividualCandidacyDocumentFile(uploadBean, uploadBean.getIndividualCandidacyProcess()
.getPersonalDetails().getDocumentIdNumber());
uploadBean.setDocumentFile(documentFile);
executeActivity(uploadBean.getIndividualCandidacyProcess(), "EditPublicCandidacyDocumentFile", uploadBean);
request.setAttribute("individualCandidacyProcess", uploadBean.getIndividualCandidacyProcess());
return backToViewCandidacyInternal(mapping, form, request, response);
} catch (final DomainException e) {
invalidateDocumentFileRelatedViewStates();
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(uploadBean.getIndividualCandidacyProcess());
request.setAttribute("candidacyDocumentUploadBean", bean);
addActionMessage("error", request, e.getMessage(), e.getArgs());
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("edit-candidacy-documents");
}
}
public ActionForward backCandidacyCreation(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("show-candidacy-creation-page");
}
public ActionForward prepareRecoverAccessLink(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
ActionForward actionForwardError = verifySubmissionPreconditions(mapping);
if (actionForwardError != null) {
return actionForwardError;
}
request.setAttribute("candidacyPreCreationBean", new CandidacyPreCreationBean());
return mapping.findForward("show-recover-access-link-form");
}
public ActionForward prepareRecoverAccessLinkInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
request.setAttribute("candidacyPreCreationBean", new CandidacyPreCreationBean());
return mapping.findForward("show-recover-access-link-form");
}
public ActionForward sendAccessLinkEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
String email = (String) getObjectFromViewState("PublicAccessCandidacy.preCreationForm");
DegreeOfficePublicCandidacyHashCode hash =
DegreeOfficePublicCandidacyHashCode.getPublicCandidacyHashCodeByEmailAndCandidacyProcessTypeOrNotAssociated(
email, getProcessType(), getCurrentOpenParentProcess());
if (hash != null) {
hash.sendEmailFoAccessLinkRecovery();
}
return mapping.findForward("show-recovery-email-sent");
}
public ActionForward prepareUploadPhoto(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(getIndividualCandidacyProcessBean().getIndividualCandidacyProcess());
bean.setType(IndividualCandidacyDocumentFileType.PHOTO);
request.setAttribute("candidacyDocumentUploadBean", bean);
return mapping.findForward("upload-photo");
}
public ActionForward uploadPhotoInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(getIndividualCandidacyProcessBean().getIndividualCandidacyProcess());
request.setAttribute("candidacyDocumentUploadBean", bean);
return mapping.findForward("upload-photo");
}
public ActionForward uploadPhoto(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException, IOException {
CandidacyProcessDocumentUploadBean uploadBean =
(CandidacyProcessDocumentUploadBean) getObjectFromViewState("individualCandidacyProcessBean.document.file");
try {
IndividualCandidacyDocumentFile documentFile =
createIndividualCandidacyDocumentFile(uploadBean, uploadBean.getIndividualCandidacyProcess()
.getPersonalDetails().getDocumentIdNumber());
uploadBean.setDocumentFile(documentFile);
executeActivity(uploadBean.getIndividualCandidacyProcess(), "EditPublicCandidacyDocumentFile", uploadBean);
request.setAttribute("individualCandidacyProcess", uploadBean.getIndividualCandidacyProcess());
return backToViewCandidacyInternal(mapping, form, request, response);
} catch (final DomainException e) {
invalidateDocumentFileRelatedViewStates();
CandidacyProcessDocumentUploadBean bean = new CandidacyProcessDocumentUploadBean();
bean.setIndividualCandidacyProcess(uploadBean.getIndividualCandidacyProcess());
request.setAttribute("candidacyDocumentUploadBean", bean);
addActionMessage(request, e.getMessage(), e.getArgs());
request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean());
return mapping.findForward("upload-photo");
}
}
public ActionForward candidaciesTypesInformationIntro(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
Locale locale = I18N.getLocale();
String countryCode = readCountryCode(locale);
String institutionalURL = Installation.getInstance().getInstituitionURL();
if ("PT".equals(countryCode)) {
return redirect(institutionalURL + "pt/candidatos/candidaturas/", request);
}
return redirect(institutionalURL + "en/prospective-students/admissions/", request);
}
static private String readCountryCode(final Locale locale) {
String country = locale.getCountry();
String language = locale.getLanguage();
String result = null;
if (!StringUtils.isEmpty(country)) {
result = country.toUpperCase();
} else if (!StringUtils.isEmpty(language)) {
result = language.toUpperCase();
}
if (!StringUtils.isEmpty(result)) {
return result;
}
return "PT";
}
}