/** * 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.over23; import java.io.IOException; import java.text.MessageFormat; import java.util.HashSet; 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.Installation; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.PublicCandidacyHashCode; import org.fenixedu.academic.domain.candidacyProcess.CandidacyProcess; import org.fenixedu.academic.domain.candidacyProcess.DegreeOfficePublicCandidacyHashCode; import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcessBean; import org.fenixedu.academic.domain.candidacyProcess.over23.Over23CandidacyProcess; import org.fenixedu.academic.domain.candidacyProcess.over23.Over23IndividualCandidacyProcess; import org.fenixedu.academic.domain.candidacyProcess.over23.Over23IndividualCandidacyProcessBean; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.dto.person.PersonBean; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.ui.struts.action.publico.PublicApplication.PublicCandidaciesApp; import org.fenixedu.academic.ui.struts.action.publico.candidacies.RefactoredIndividualCandidacyProcessPublicDA; import org.fenixedu.bennu.struts.annotations.Forward; import org.fenixedu.bennu.struts.annotations.Forwards; import org.fenixedu.bennu.struts.annotations.Mapping; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @StrutsFunctionality(app = PublicCandidaciesApp.class, path = "over-23", titleKey = "title.application.name.over23") @Mapping(path = "/candidacies/caseHandlingOver23IndividualCandidacyProcess", module = "publico") @Forwards({ @Forward(name = "begin-candidacy-process-intro", path = "/publico/candidacy/over23/main.jsp"), @Forward(name = "open-candidacy-process-closed", path = "/publico/candidacy/candidacyProcessClosed.jsp"), @Forward(name = "show-pre-creation-candidacy-form", path = "/publico/candidacy/preCreationCandidacyForm.jsp"), @Forward(name = "show-email-message-sent", path = "/publico/candidacy/showEmailSent.jsp"), @Forward(name = "show-application-submission-conditions", path = "/publico/candidacy/applicationSubmissionConditions.jsp"), @Forward(name = "open-candidacy-processes-not-found", path = "/publico/candidacy/individualCandidacyNotFound.jsp"), @Forward(name = "show-candidacy-creation-page", path = "/publico/candidacy/over23/createCandidacyPartOne.jsp"), @Forward(name = "candidacy-continue-creation", path = "/publico/candidacy/over23/createCandidacyPartTwo.jsp"), @Forward(name = "inform-submited-candidacy", path = "/publico/candidacy/candidacySubmited.jsp"), @Forward(name = "show-candidacy-details", path = "/publico/candidacy/over23/viewCandidacy.jsp"), @Forward(name = "edit-candidacy", path = "/publico/candidacy/over23/editCandidacy.jsp"), @Forward(name = "edit-candidacy-habilitations", path = "/publico/candidacy/over23/editCandidacyHabilitations.jsp"), @Forward(name = "edit-candidacy-documents", path = "/publico/candidacy/over23/editCandidacyDocuments.jsp") }) public class Over23IndividualCandidacyProcessRefactoredDA extends RefactoredIndividualCandidacyProcessPublicDA { private static final Logger logger = LoggerFactory.getLogger(Over23IndividualCandidacyProcessRefactoredDA.class); @Override protected String getCandidacyInformationLinkDefaultLanguage() { String message = getStringFromDefaultBundle("link.candidacy.information.default.over23"); return MessageFormat.format(message, Installation.getInstance().getInstituitionURL()); } @Override protected String getCandidacyInformationLinkEnglish() { String message = getStringFromDefaultBundle("link.candidacy.information.english.over23"); return MessageFormat.format(message, Installation.getInstance().getInstituitionURL()); } @Override protected String getCandidacyNameKey() { return "title.application.name.over23"; } @Override public ActionForward viewCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Over23IndividualCandidacyProcess individualCandidacyProcess = (Over23IndividualCandidacyProcess) request.getAttribute("individualCandidacyProcess"); Over23IndividualCandidacyProcessBean bean = new Over23IndividualCandidacyProcessBean(individualCandidacyProcess); bean.setPersonBean(new PersonBean(individualCandidacyProcess.getPersonalDetails())); request.setAttribute("individualCandidacyProcessBean", bean); return mapping.findForward("show-candidacy-details"); } public ActionForward prepareCandidacyCreation(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ActionForward actionForwardError = verifySubmissionPreconditions(mapping); if (actionForwardError != null) { return actionForwardError; } CandidacyProcess candidacyProcess = getCurrentOpenParentProcess(); String hash = request.getParameter("hash"); DegreeOfficePublicCandidacyHashCode candidacyHashCode = (DegreeOfficePublicCandidacyHashCode) PublicCandidacyHashCode.getPublicCandidacyCodeByHash(hash); if (candidacyHashCode == null) { return mapping.findForward("open-candidacy-processes-not-found"); } if (candidacyHashCode.getIndividualCandidacyProcess() != null && candidacyHashCode.getIndividualCandidacyProcess().getCandidacyProcess() == candidacyProcess) { request.setAttribute("individualCandidacyProcess", candidacyHashCode.getIndividualCandidacyProcess()); return viewCandidacy(mapping, form, request, response); } else if (candidacyHashCode.getIndividualCandidacyProcess() != null && candidacyHashCode.getIndividualCandidacyProcess().getCandidacyProcess() != candidacyProcess) { return mapping.findForward("open-candidacy-processes-not-found"); } Over23IndividualCandidacyProcessBean bean = new Over23IndividualCandidacyProcessBean(); bean.setPersonBean(new PersonBean()); bean.setCandidacyProcess(candidacyProcess); bean.setPublicCandidacyHashCode(candidacyHashCode); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); bean.getPersonBean().setEmail(candidacyHashCode.getEmail()); return mapping.findForward("show-candidacy-creation-page"); } @Override protected void setParentProcess(HttpServletRequest request) { super.setParentProcess(request); if (request.getAttribute("parentProcess") == null) { request.setAttribute("parentProcess", getCurrentOpenParentProcess()); } } @Override public ActionForward addConcludedHabilitationsEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { IndividualCandidacyProcessBean bean = getIndividualCandidacyProcessBean(); bean.addConcludedFormationBean(); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } public ActionForward addNonConcludedHabilitationsEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { IndividualCandidacyProcessBean bean = getIndividualCandidacyProcessBean(); bean.addNonConcludedFormationBean(); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } @Override public ActionForward removeConcludedHabilitationsEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { IndividualCandidacyProcessBean bean = getIndividualCandidacyProcessBean(); Integer index = getIntegerFromRequest(request, "removeIndex"); bean.removeFormationConcludedBean(index); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } public ActionForward removeNonConcludedHabilitationsEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse reponse) { IndividualCandidacyProcessBean bean = getIndividualCandidacyProcessBean(); Integer index = getIntegerFromRequest(request, "removeIndex"); bean.removeFormationNonConcludedBean(index); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } public ActionForward addSelectedDegreesEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Over23IndividualCandidacyProcessBean bean = (Over23IndividualCandidacyProcessBean) getIndividualCandidacyProcessBean(); if (bean.hasDegreeToAdd() && !bean.containsDegree(bean.getDegreeToAdd())) { bean.addDegree(bean.getDegreeToAdd()); bean.setDegreeToAdd(null); } request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } public ActionForward removeSelectedDegreesEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Over23IndividualCandidacyProcessBean bean = (Over23IndividualCandidacyProcessBean) getIndividualCandidacyProcessBean(); Integer index = getIntegerFromRequest(request, "removeIndex"); bean.removeDegree(bean.getSelectedDegrees().get(index)); request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); invalidateDocumentFileRelatedViewStates(); return forwardTo(mapping, request); } private ActionForward forwardTo(ActionMapping mapping, HttpServletRequest request) { if (getFromRequest(request, "userAction").equals("createCandidacy")) { return mapping.findForward("candidacy-continue-creation"); } else if (getFromRequest(request, "userAction").equals("editCandidacyQualifications")) { return mapping.findForward("edit-candidacy-habilitations"); } return null; } @Override public ActionForward continueCandidacyCreation(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException { 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.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().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 { request.setAttribute(getIndividualCandidacyProcessBeanName(), bean); return mapping.findForward("candidacy-continue-creation"); } } request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("candidacy-continue-creation"); } public ActionForward submitCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, FenixServiceException { try { ActionForward actionForwardError = verifySubmissionPreconditions(mapping); if (actionForwardError != null) { return actionForwardError; } Over23IndividualCandidacyProcessBean bean = (Over23IndividualCandidacyProcessBean) getIndividualCandidacyProcessBean(); bean.setInternalPersonCandidacy(Boolean.TRUE); boolean isValid = validateOver23IndividualCandidacy(request, bean) && hasInvalidViewState(); if (!isValid) { invalidateDocumentFileRelatedViewStates(); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("candidacy-continue-creation"); } if (candidacyIndividualProcessExistsForThisEmail(bean.getPersonBean().getEmail(), bean.getSelectedDegrees())) { addActionMessage("error", request, "error.candidacy.hash.code.already.bounded"); invalidateDocumentFileRelatedViewStates(); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("candidacy-continue-creation"); } if (!bean.getHonorAgreement()) { addActionMessage("error", request, "error.must.agree.on.declaration.of.honor"); invalidateDocumentFileRelatedViewStates(); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("candidacy-continue-creation"); } /* * 10/05/2009 - Since we step candidacy information form we must * copy some fields */ Over23IndividualCandidacyProcess process = (Over23IndividualCandidacyProcess) createNewPublicProcess(bean); request.setAttribute("process", process); request.setAttribute("mappingPath", mapping.getPath()); request.setAttribute("individualCandidacyProcess", process); request.setAttribute("endSubmissionDate", getFormattedApplicationSubmissionEndDate()); return mapping.findForward("inform-submited-candidacy"); } catch (DomainException e) { addActionMessage("error", request, e.getMessage(), e.getArgs()); logger.error(e.getMessage(), e); getIndividualCandidacyProcessBean().getPersonBean().setPerson(null); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("candidacy-continue-creation"); } } private boolean validateOver23IndividualCandidacy(HttpServletRequest request, Over23IndividualCandidacyProcessBean bean) { boolean isValid = true; if (bean.getSelectedDegrees().isEmpty()) { addActionMessage("error", request, "error.formation.selectedDegrees.required"); isValid = false; } if (bean.getFormationConcludedBeanList().isEmpty() && bean.getFormationNonConcludedBeanList().isEmpty()) { addActionMessage("error", request, "error.formation.required"); return false; } return isValid; } public ActionForward editCandidacyProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { Over23IndividualCandidacyProcessBean bean = (Over23IndividualCandidacyProcessBean) getIndividualCandidacyProcessBean(); PersonBean personBean = bean.getPersonBean(); try { ActionForward actionForwardError = verifySubmissionPreconditions(mapping); if (actionForwardError != null) { return actionForwardError; } if (!isApplicationSubmissionPeriodValid()) { return beginCandidacyProcessIntro(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 prepareEditCandidacyProcess(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().equals(personBean.getDateOfBirth())) { // found person with diff date addActionMessage("individualCandidacyMessages", request, getProcessType().getSimpleName() + ".error.public.candidacies.fill.personal.information.and.institution.id.birth"); return prepareEditCandidacyProcess(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 prepareEditCandidacyProcess(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 prepareEditCandidacyProcess(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 prepareEditCandidacyProcess(mapping, form, request, response); } } executeActivity(bean.getIndividualCandidacyProcess(), "EditPublicCandidacyPersonalInformation", getIndividualCandidacyProcessBean()); } catch (final DomainException e) { addActionMessage(request, e.getMessage(), e.getArgs()); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("edit-candidacy"); } request.setAttribute("individualCandidacyProcess", bean.getIndividualCandidacyProcess()); return backToViewCandidacyInternal(mapping, form, request, response); } public ActionForward editCandidacyHabilitations(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { Over23IndividualCandidacyProcessBean bean = (Over23IndividualCandidacyProcessBean) getIndividualCandidacyProcessBean(); try { boolean isValid = validateOver23IndividualCandidacy(request, bean) && hasInvalidViewState(); if (!isValid) { request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("edit-candidacy-habilitations"); } if (!isApplicationSubmissionPeriodValid()) { return beginCandidacyProcessIntro(mapping, form, request, response); } executeActivity(bean.getIndividualCandidacyProcess(), "EditPublicCandidacyHabilitations", getIndividualCandidacyProcessBean()); } catch (final DomainException e) { addActionMessage(request, e.getMessage(), e.getArgs()); request.setAttribute(getIndividualCandidacyProcessBeanName(), getIndividualCandidacyProcessBean()); return mapping.findForward("edit-candidacy-habilitations"); } request.setAttribute("individualCandidacyProcess", bean.getIndividualCandidacyProcess()); return backToViewCandidacyInternal(mapping, form, request, response); } @Override protected Class getParentProcessType() { return Over23CandidacyProcess.class; } @Override protected Class getProcessType() { return Over23IndividualCandidacyProcess.class; } }