/** * 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.mobility.outbound; import java.io.IOException; import java.math.BigDecimal; import java.util.Collections; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.fenixedu.academic.domain.ExecutionDegree; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacy; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyContest; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyContestGroup; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyPeriod; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyPeriodConfirmationOption; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacySubmission; import org.fenixedu.academic.domain.util.email.EmailBean; import org.fenixedu.academic.domain.util.email.PersonSender; import org.fenixedu.academic.domain.util.email.Recipient; import org.fenixedu.academic.predicate.AccessControl; import org.fenixedu.academic.ui.struts.action.academicAdministration.AcademicAdministrationApplication.AcademicAdminCandidaciesApp; import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction; import org.fenixedu.academic.util.Bundle; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.core.i18n.BundleUtil; 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.EntryPoint; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.fenixedu.commons.spreadsheet.Spreadsheet; import pt.ist.fenixWebFramework.renderers.utils.RenderUtils; import pt.ist.fenixWebFramework.servlets.filters.contentRewrite.GenericChecksumRewriter; @StrutsFunctionality(app = AcademicAdminCandidaciesApp.class, path = "outbound-mobility", titleKey = "label.mobility.outbound", accessGroup = "academic(MANAGE_MOBILITY_OUTBOUND)") @Mapping(path = "/outboundMobilityCandidacy", module = "academicAdministration") @Forwards({ @Forward(name = "prepare", path = "/mobility/outbound/OutboundMobilityCandidacy.jsp"), @Forward(name = "viewContest", path = "/mobility/outbound/viewContest.jsp"), @Forward(name = "manageCandidacies", path = "/mobility/outbound/manageCandidacies.jsp"), @Forward(name = "viewCandidate", path = "/mobility/outbound/viewCandidate.jsp"), @Forward(name = "sendEmail", path = "/messaging/emails.do?method=newEmail") }) public class OutboundMobilityCandidacyDA extends FenixDispatchAction { @EntryPoint public ActionForward prepare(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); if (outboundMobilityContextBean == null) { outboundMobilityContextBean = new OutboundMobilityContextBean(); } return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward prepare(final ActionMapping mapping, final HttpServletRequest request, final OutboundMobilityContextBean outboundMobilityContextBean) { RenderUtils.invalidateViewState(); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("prepare"); } public ActionForward invalidadeAndPrepare(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward createNewOutboundMobilityCandidacyPeriod(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); outboundMobilityContextBean.createNewOutboundMobilityCandidacyPeriod(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward createNewOutboundMobilityCandidacyContest(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); outboundMobilityContextBean.createNewOutboundMobilityCandidacyContest(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward editCandidacyPeriod(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacyPeriod candidacyPeriod = getRenderedObject(); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setExecutionYear((ExecutionYear) candidacyPeriod.getExecutionInterval()); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(candidacyPeriod)); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward deletePeriod(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacyPeriod candidacyPeriod = getDomainObject(request, "candidacyPeriodOid"); candidacyPeriod.delete(); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward addCandidateOption(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); outboundMobilityContextBean.addCandidateOption(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward addDegreeToGroup(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); outboundMobilityContextBean.addDegreeToGroup(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward removeDegreeFromGroup(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); final ExecutionDegree executionDegree = getDomainObject(request, "executionDegreeOid"); outboundMobilityContextBean.setExecutionDegree(executionDegree); outboundMobilityContextBean.removeDegreeFromGroup(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward deleteContest(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); final OutboundMobilityCandidacyContest contest = getDomainObject(request, "contestOid"); if (contest != null) { try { final OutboundMobilityCandidacyContestGroup mobilityGroup = contest.getOutboundMobilityCandidacyContestGroup(); if (mobilityGroup.getOutboundMobilityCandidacyContestSet().size() == 1) { outboundMobilityContextBean.getMobilityGroups().remove(mobilityGroup); } contest.delete(); } catch (Exception e) { addErrorMessage(request, "errors", e.getMessage()); } } RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward viewContest(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacyContest contest = getDomainObject(request, "contestOid"); request.setAttribute("contest", contest); return mapping.findForward("viewContest"); } public ActionForward viewContestForm(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacyContest contest = getDomainObject(request, "contestOid"); request.setAttribute("contest", contest); return new ActionForward(viewContestPath(mapping, request, contest), true); } private String viewContestPath(final ActionMapping mapping, final HttpServletRequest request, final OutboundMobilityCandidacyContest contest) { final StringBuilder path = new StringBuilder(); path.append(mapping.getModuleConfig().getPrefix()); path.append("/outboundMobilityCandidacy.do?method=viewContest&contestOid="); path.append(contest.getExternalId()); return constructRedirectPath(mapping, request, path); } private String constructRedirectPath(final ActionMapping mapping, final HttpServletRequest request, final StringBuilder path) { final String result = GenericChecksumRewriter.injectChecksumInUrl(request.getContextPath(), path.toString(), request.getSession()); return result.substring(mapping.getModuleConfig().getPrefix().length()); } public ActionForward removeMobilityCoordinator(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); final Person person = getDomainObject(request, "personOid"); mobilityGroup.removeMobilityCoordinatorService(person); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward addMobilityCoordinator(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); outboundMobilityContextBean.addMobilityCoordinator(); RenderUtils.invalidateViewState(); return prepare(mapping, request, outboundMobilityContextBean); } public ActionForward manageCandidacies(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); //There's no mobility groups if (outboundMobilityContextBean.getMobilityGroups().size() == 0) { return prepare(mapping, request, outboundMobilityContextBean); } request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward editGrade(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacySubmission submission = getDomainObject(request, "candidacySubmissionOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); final String grade = (String) getFromRequest(request, "grade"); submission.setGrade(mobilityGroup, new BigDecimal(grade)); return null; } public ActionForward editVacancies(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacyContest contest = getDomainObject(request, "contestOid"); final String vacancies = (String) getFromRequest(request, "vacancies"); contest.editVacancies(vacancies == null || vacancies.isEmpty() ? null : new Integer(vacancies)); return null; } public ActionForward viewCandidate(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); final Person person = getDomainObject(request, "personOid"); if (person != null) { outboundMobilityContextBean.setPerson(person); } final ExecutionYear executionYear = getDomainObject(request, "executionYearOid"); if (executionYear != null) { outboundMobilityContextBean.setExecutionYear(executionYear); } RenderUtils.invalidateViewState(); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("viewCandidate"); } public ActionForward selectCandite(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacy candidacy = getDomainObject(request, "candidacyOid"); candidacy.select(); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setPerson(candidacy.getOutboundMobilityCandidacySubmission().getRegistration().getPerson()); RenderUtils.invalidateViewState(); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("viewCandidate"); } public ActionForward unselectCandite(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { final OutboundMobilityCandidacy candidacy = getDomainObject(request, "candidacyOid"); candidacy.unselect(); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setPerson(candidacy.getOutboundMobilityCandidacySubmission().getRegistration().getPerson()); RenderUtils.invalidateViewState(); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("viewCandidate"); } public ActionForward downloadCandidatesInformation(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); final String filename = BundleUtil.getString(Bundle.ACADEMIC, "label.mobility.candidates.information.filename"); response.setHeader("Content-disposition", "attachment; filename=" + filename + ".xls"); response.setContentType("application/vnd.ms-excel"); final ServletOutputStream outputStream = response.getOutputStream(); final Spreadsheet spreadsheet = mobilityGroup.getCandidatesInformationSpreadSheet(period); spreadsheet.exportToXLSSheet(outputStream); outputStream.close(); return null; } public ActionForward downloadSelectedCandidates(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final String filename = BundleUtil.getString(Bundle.ACADEMIC, "label.mobility.outbound.period.export.selected.candiadates.filename"); response.setHeader("Content-disposition", "attachment; filename=" + filename + ".xls"); response.setContentType("application/vnd.ms-excel"); final ServletOutputStream outputStream = response.getOutputStream(); final Spreadsheet spreadsheet = period.getSelectedCandidateSpreadSheet(period); spreadsheet.exportToXLSSheet(outputStream); outputStream.close(); return null; } public ActionForward uploadClassifications(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityContextBean outboundMobilityContextBean = getRenderedObject(); try { outboundMobilityContextBean.uploadClassifications(); addActionMessage("success", request, "message.outbound.upload.success"); } catch (DomainException ex) { addActionMessage("error", request, ex.getMessage(), ex.getArgs()); } RenderUtils.invalidateViewState(); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward selectCandidates(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); mobilityGroup.selectCandidates(period); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); outboundMobilityContextBean.setMobilityGroupsAsList(Collections.singletonList(mobilityGroup)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward selectCandidatesForAllGroups(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); try { final String result = period.selectCandidatesForAllGroups(); request.setAttribute("result", result); } catch (final DomainException ex) { final String error = ex.getKey(); request.setAttribute("error", error); } final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("prepare"); } public ActionForward concludeCandidateSelection(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); mobilityGroup.concludeCandidateSelection(period); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); outboundMobilityContextBean.setMobilityGroupsAsList(Collections.singletonList(mobilityGroup)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward revertConcludeCandidateSelection(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); mobilityGroup.revertConcludeCandidateSelection(period); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); outboundMobilityContextBean.setMobilityGroupsAsList(Collections.singletonList(mobilityGroup)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward concludeCandidateNotification(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); mobilityGroup.concludeCandidateNotification(period); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); outboundMobilityContextBean.setMobilityGroupsAsList(Collections.singletonList(mobilityGroup)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward revertConcludeCandidateNotification(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); mobilityGroup.revertConcludeCandidateNotification(period); final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); outboundMobilityContextBean.setMobilityGroupsAsList(Collections.singletonList(mobilityGroup)); request.setAttribute("outboundMobilityContextBean", outboundMobilityContextBean); return mapping.findForward("manageCandidacies"); } public ActionForward sendEmailToCandidates(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyContestGroup mobilityGroup = getDomainObject(request, "mobilityGroupOid"); final String toGroupName = BundleUtil.getString(Bundle.ACADEMIC, "label.send.email.to.candidates.group.to.name", mobilityGroup.getDescription(), period.getExecutionInterval().getName()); final Group group = Group.users(period.getOutboundMobilityCandidacySubmissionSet().stream() .filter(s -> s.hasContestInGroup(mobilityGroup)).map(s -> s.getRegistration().getPerson().getUser())); final Recipient recipient = Recipient.newInstance(toGroupName, group); final EmailBean bean = new EmailBean(); bean.setRecipients(Collections.singletonList(recipient)); final Person person = AccessControl.getPerson(); if (person != null) { final PersonSender sender = person.getSender(); if (sender != null) { bean.setSender(sender); } } request.setAttribute("emailBean", bean); return mapping.findForward("sendEmail"); } public ActionForward deleteOption(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final OutboundMobilityCandidacyPeriod period = getDomainObject(request, "candidacyPeriodOid"); final OutboundMobilityCandidacyPeriodConfirmationOption option = getDomainObject(request, "optionOid"); if (option != null) { option.delete(); } final OutboundMobilityContextBean outboundMobilityContextBean = new OutboundMobilityContextBean(); outboundMobilityContextBean.setCandidacyPeriodsAsList(Collections.singletonList(period)); return prepare(mapping, request, outboundMobilityContextBean); } }