Package org.fenixedu.academic.ui.struts.action.candidacy.erasmus

Source Code of org.fenixedu.academic.ui.struts.action.candidacy.erasmus.ErasmusCandidacyProcessDA$ErasmusCandidacyDegreesProvider

/**
* 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.candidacy.erasmus;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

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.Degree;
import org.fenixedu.academic.domain.ExecutionInterval;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.candidacyProcess.CandidacyProcess;
import org.fenixedu.academic.domain.candidacyProcess.IndividualCandidacyProcess;
import org.fenixedu.academic.domain.candidacyProcess.mobility.MobilityApplicationProcess;
import org.fenixedu.academic.domain.candidacyProcess.mobility.MobilityApplicationProcessBean;
import org.fenixedu.academic.domain.candidacyProcess.mobility.MobilityIndividualApplicationProcess;
import org.fenixedu.academic.domain.candidacyProcess.mobility.MobilityProgram;
import org.fenixedu.academic.domain.degree.DegreeType;
import org.fenixedu.academic.domain.period.MobilityApplicationPeriod;
import org.fenixedu.academic.ui.struts.action.academicAdministration.AcademicAdministrationApplication.AcademicAdminCandidaciesApp;
import org.fenixedu.academic.ui.struts.action.candidacy.CandidacyProcessDA;
import org.fenixedu.bennu.core.domain.Bennu;
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 pt.ist.fenixWebFramework.rendererExtensions.converters.DomainObjectKeyConverter;
import pt.ist.fenixWebFramework.renderers.DataProvider;
import pt.ist.fenixWebFramework.renderers.components.converters.Converter;
import pt.ist.fenixframework.Atomic;
import pt.ist.fenixframework.FenixFramework;
import pt.utl.ist.fenix.tools.util.excel.Spreadsheet;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;

@StrutsFunctionality(app = AcademicAdminCandidaciesApp.class, path = "mobility", titleKey = "label.application.mobility",
        accessGroup = "(academic(MANAGE_CANDIDACY_PROCESSES) | academic(MANAGE_INDIVIDUAL_CANDIDACIES))")
@Mapping(path = "/caseHandlingMobilityApplicationProcess", module = "academicAdministration",
        formBeanClass = ErasmusCandidacyProcessDA.ErasmusCandidacyProcessForm.class)
@Forwards({
        @Forward(name = "intro", path = "/candidacy/erasmus/mainCandidacyProcess.jsp"),
        @Forward(name = "prepare-create-new-process", path = "/candidacy/createCandidacyPeriod.jsp"),
        @Forward(name = "prepare-edit-candidacy-period", path = "/candidacy/editCandidacyPeriod.jsp"),
        @Forward(name = "view-child-process-with-missing.required-documents",
                path = "/candidacy/erasmus/viewChildProcessesWithMissingRequiredDocuments.jsp"),
        @Forward(name = "view-child-process-with-missing.shifts",
                path = "/candidacy/erasmus/viewChildProcessesWithMissingShifts.jsp") })
public class ErasmusCandidacyProcessDA extends CandidacyProcessDA {

    static public class ErasmusCandidacyProcessForm extends CandidacyProcessForm {
        private String selectedProcessId;

        private String[] selectedProcesses;

        public String getSelectedProcessId() {
            return selectedProcessId;
        }

        public void setSelectedProcessId(String selectedProcessId) {
            this.selectedProcessId = selectedProcessId;
        }

        public String[] getSelectedProcesses() {
            return selectedProcesses;
        }

        public void setSelectedProcesses(String[] selectedProcesses) {
            this.selectedProcesses = selectedProcesses;
        }
    }

    @Override
    public ActionForward prepareCreateNewProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("candidacyProcessBean", new MobilityApplicationProcessBean(ExecutionYear.readCurrentExecutionYear()));
        return mapping.findForward("prepare-create-new-process");
    }

    @Override
    public ActionForward prepareExecuteEditCandidacyPeriod(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        final CandidacyProcess process = getProcess(request);
        final MobilityApplicationProcess map = (MobilityApplicationProcess) process;
        final MobilityApplicationProcessBean bean = new MobilityApplicationProcessBean(process);
        bean.setForSemester(((MobilityApplicationProcess) process).getForSemester());
        request.setAttribute("candidacyProcessBean", bean);
        if (!map.getChildProcessesSet().isEmpty()) {
            request.setAttribute("preLoadLevel", "Error");
        } else if (!map.getCoordinatorsSet().isEmpty() || map.getCandidacyPeriod().getMobilityQuotasSet().size() > 0
                || map.getCandidacyPeriod().getEmailTemplatesSet().size() > 0) {
            request.setAttribute("preLoadLevel", "Warn");
        } else {
            request.setAttribute("preLoadLevel", "Ok");
        }

        return mapping.findForward("prepare-edit-candidacy-period");
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        setChooseDegreeBean(request);
        setChooseMobilityProgramBean(request);
        request.setAttribute("chooseDegreeBeanSchemaName", "ErasmusChooseDegreeBean.selectDegree");
        request.setAttribute("chooseMobilityProgramBeanSchemaName", "MobilityChooseProgramBean.selectMobilityProgram");
        return super.execute(mapping, actionForm, request, response);
    }

    public ActionForward preLoadLastConfigurations(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        String processEid = request.getParameter("processEid");
        MobilityApplicationProcess process = FenixFramework.getDomainObject(processEid);
        preLoadLastProcessConfigurations(process);
        return listProcessAllowedActivities(mapping, actionForm, request, response);
    }

    @Atomic
    private void preLoadLastProcessConfigurations(MobilityApplicationProcess process) {
        process.resetConfigurations();
        process.preLoadLastConfigurations();
    }

    protected void setChooseMobilityProgramBean(HttpServletRequest request) {
        ChooseMobilityProgramBean chooseMobilityProgramBean =
                (ChooseMobilityProgramBean) getObjectFromViewState("choose.mobility.program.bean");
        if (chooseMobilityProgramBean == null) {
            chooseMobilityProgramBean = new ChooseMobilityProgramBean(getProcess(request));
            String mobilityProgramEid = request.getParameter("mobilityProgramEid");
            if (mobilityProgramEid != null && !mobilityProgramEid.isEmpty()) {
                MobilityProgram mobilityProgram = FenixFramework.getDomainObject(mobilityProgramEid);
                chooseMobilityProgramBean.setMobilityProgram(mobilityProgram);
            }
        }
        request.setAttribute("chooseMobilityProgramBean", chooseMobilityProgramBean);
    }

    protected ChooseMobilityProgramBean getChooseMobilityProgramBean(HttpServletRequest request) {
        return (ChooseMobilityProgramBean) request.getAttribute("chooseMobilityProgramBean");
    }

    protected void setChooseDegreeBean(HttpServletRequest request) {
        ChooseDegreeBean chooseDegreeBean = (ChooseDegreeBean) getObjectFromViewState("choose.degree.bean");
        if (chooseDegreeBean == null) {
            chooseDegreeBean = new ChooseDegreeBean(getProcess(request));
            String degreeEid = request.getParameter("degreeEid");
            if (degreeEid != null && !degreeEid.isEmpty()) {
                Degree degree = FenixFramework.getDomainObject(degreeEid);
                chooseDegreeBean.setDegree(degree);
            }
        }
        request.setAttribute("chooseDegreeBean", chooseDegreeBean);
    }

    protected ChooseDegreeBean getChooseDegreeBean(HttpServletRequest request) {
        return (ChooseDegreeBean) request.getAttribute("chooseDegreeBean");
    }

    @Override
    protected Spreadsheet buildIndividualCandidacyReport(Spreadsheet spreadsheet,
            IndividualCandidacyProcess individualCandidacyProcess) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected List<CandidacyDegreeBean> createCandidacyDegreeBeans(HttpServletRequest request) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Class getCandidacyPeriodType() {
        return MobilityApplicationPeriod.class;
    }

    @Override
    protected Class getChildProcessType() {
        return MobilityIndividualApplicationProcess.class;
    }

    @Override
    protected void setStartInformation(ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) {
        if (!hasExecutionInterval(request)) {
            final List<ExecutionInterval> executionIntervals = getExecutionIntervalsWithCandidacyPeriod();

            if (executionIntervals.size() == 1) {
                final ExecutionInterval executionInterval = executionIntervals.iterator().next();
                final List<MobilityApplicationProcess> candidacyProcesses = getCandidacyProcesses(executionInterval);

                if (candidacyProcesses.size() == 1) {
                    setCandidacyProcessInformation(request, candidacyProcesses.iterator().next());
                    setCandidacyProcessInformation(actionForm, getProcess(request));
                    request.setAttribute("candidacyProcesses", candidacyProcesses);
                    return;
                }
            }

            request.setAttribute("canCreateProcess", canCreateProcess(getProcessType().getName()));
            request.setAttribute("executionIntervals", executionIntervals);

        } else {
            final ExecutionInterval executionInterval = getExecutionInterval(request);
            final MobilityApplicationProcess candidacyProcess = getCandidacyProcess(request, executionInterval);

            if (candidacyProcess != null) {
                setCandidacyProcessInformation(request, candidacyProcess);
                setCandidacyProcessInformation(actionForm, getProcess(request));
            } else {
                final List<MobilityApplicationProcess> candidacyProcesses = getCandidacyProcesses(executionInterval);

                if (candidacyProcesses.size() == 1) {
                    setCandidacyProcessInformation(request, candidacyProcesses.iterator().next());
                    setCandidacyProcessInformation(actionForm, getProcess(request));
                    request.setAttribute("candidacyProcesses", candidacyProcesses);
                    return;
                }

                request.setAttribute("canCreateProcess", canCreateProcess(getProcessType().getName()));
                request.setAttribute("executionIntervals", getExecutionIntervalsWithCandidacyPeriod());
            }
            request.setAttribute("candidacyProcesses", getCandidacyProcesses(executionInterval));
        }
    }

    protected List<MobilityApplicationProcess> getCandidacyProcesses(final ExecutionInterval executionInterval) {
        final List<MobilityApplicationProcess> result = new ArrayList<MobilityApplicationProcess>();
        for (final MobilityApplicationPeriod period : executionInterval.getMobilityApplicationPeriods()) {
            result.add(period.getMobilityApplicationProcess());
        }
        return result;
    }

    protected List<ExecutionInterval> getExecutionIntervalsWithCandidacyPeriod() {
        return ExecutionInterval.readExecutionIntervalsWithCandidacyPeriod(getCandidacyPeriodType());
    }

    @Override
    protected MobilityApplicationProcess getCandidacyProcess(final HttpServletRequest request,
            final ExecutionInterval executionInterval) {

        final String selectedProcessId = getStringFromRequest(request, "selectedProcessId");
        if (selectedProcessId != null) {
            for (final MobilityApplicationPeriod applicationPeriod : executionInterval.getMobilityApplicationPeriods()) {
                if (applicationPeriod.getMobilityApplicationProcess().getExternalId().equals(selectedProcessId)) {
                    return applicationPeriod.getMobilityApplicationProcess();
                }
            }
        }
        return null;
    }

    @Override
    protected Class getProcessType() {
        return MobilityApplicationProcess.class;
    }

    protected void setCandidacyProcessInformation(final ActionForm actionForm, final MobilityApplicationProcess process) {
        final ErasmusCandidacyProcessForm form = (ErasmusCandidacyProcessForm) actionForm;
        form.setSelectedProcessId(process.getExternalId());
        form.setExecutionIntervalId(process.getCandidacyExecutionInterval().getExternalId());
    }

    @Override
    protected MobilityApplicationProcess getProcess(HttpServletRequest request) {
        return (MobilityApplicationProcess) super.getProcess(request);
    }

    @Override
    protected Predicate<IndividualCandidacyProcess> getChildProcessSelectionPredicate(final CandidacyProcess process,
            HttpServletRequest request) {
        final Degree selectedDegree = getChooseDegreeBean(request).getDegree();
        final MobilityProgram mobilityProgram = getChooseMobilityProgramBean(request).getMobilityProgram();
        if (selectedDegree == null) {
            if (mobilityProgram == null) {
                return Predicates.alwaysTrue();
            } else {
                return new Predicate<IndividualCandidacyProcess>() {
                    @Override
                    public boolean apply(IndividualCandidacyProcess process) {
                        return ((MobilityIndividualApplicationProcess) process).getMobilityProgram().equals(mobilityProgram);
                    }
                };
            }
        } else {
            return new Predicate<IndividualCandidacyProcess>() {
                @Override
                public boolean apply(IndividualCandidacyProcess process) {

                    MobilityIndividualApplicationProcess mobilityProcess = (MobilityIndividualApplicationProcess) process;

                    if (mobilityProgram != null && !mobilityProcess.getMobilityProgram().equals(mobilityProgram)) {
                        return false;
                    }

                    return ((MobilityIndividualApplicationProcess) process).getCandidacy().getSelectedDegree() == selectedDegree;
                }
            };
        }
    }

    @Override
    protected ActionForward introForward(ActionMapping mapping) {
        return mapping.findForward("intro");
    }

    @Override
    public ActionForward listProcessAllowedActivities(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        setCandidacyProcessInformation(request, getProcess(request));
        setCandidacyProcessInformation(form, getProcess(request));
        request.setAttribute("candidacyProcesses", getCandidacyProcesses(getProcess(request).getCandidacyExecutionInterval()));
        return introForward(mapping);
    }

    public ActionForward prepareExecuteViewChildProcessWithMissingRequiredDocumentFiles(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        setCandidacyProcessInformation(request, getProcess(request));
        setCandidacyProcessInformation(form, getProcess(request));
        request.setAttribute("candidacyProcesses", getCandidacyProcesses(getProcess(request).getCandidacyExecutionInterval()));

        return mapping.findForward("view-child-process-with-missing.required-documents");
    }

    public ActionForward prepareExecuteViewChildProcessWithMissingShifts(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        setCandidacyProcessInformation(request, getProcess(request));
        setCandidacyProcessInformation(form, getProcess(request));
        List<MobilityApplicationProcess> candidacyProcesses =
                getCandidacyProcesses(getProcess(request).getCandidacyExecutionInterval());

        request.setAttribute("candidacyProcesses", candidacyProcesses);

        return mapping.findForward("view-child-process-with-missing.shifts");
    }

    public static class ErasmusCandidacyDegreesProvider implements DataProvider {

        @Override
        public Object provide(Object source, Object currentValue) {
            final List<Degree> degrees =
                    new ArrayList<Degree>(Degree.readAllByDegreeType(DegreeType.BOLONHA_INTEGRATED_MASTER_DEGREE,
                            DegreeType.BOLONHA_MASTER_DEGREE));

            degrees.remove(Degree.readBySigla("MSCIT"));

            java.util.Collections.sort(degrees, Degree.COMPARATOR_BY_DEGREE_TYPE_AND_NAME_AND_ID);

            return degrees;
        }

        @Override
        public Converter getConverter() {
            return null;
        }

    }

    public static class MobilityApplicationsMobilityProgramsProvider implements DataProvider {

        @Override
        public Converter getConverter() {
            return new DomainObjectKeyConverter();
        }

        @Override
        public Object provide(Object arg0, Object arg1) {
            final Set<MobilityProgram> mobilityPrograms =
                    new TreeSet<MobilityProgram>(MobilityProgram.COMPARATOR_BY_REGISTRATION_AGREEMENT);
            mobilityPrograms.addAll(Bennu.getInstance().getProgramsSet());
            return mobilityPrograms;
        }

    }

}
TOP

Related Classes of org.fenixedu.academic.ui.struts.action.candidacy.erasmus.ErasmusCandidacyProcessDA$ErasmusCandidacyDegreesProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.