Package org.fenixedu.academic.ui.struts.action.phd.thesis.academicAdminOffice

Source Code of org.fenixedu.academic.ui.struts.action.phd.thesis.academicAdminOffice.PhdThesisProcessDA

/**
* 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.phd.thesis.academicAdminOffice;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

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.exceptions.DomainException;
import org.fenixedu.academic.domain.phd.PhdIndividualProgramDocumentType;
import org.fenixedu.academic.domain.phd.PhdIndividualProgramProcess;
import org.fenixedu.academic.domain.phd.PhdProcessState;
import org.fenixedu.academic.domain.phd.PhdProgramDocumentUploadBean;
import org.fenixedu.academic.domain.phd.PhdProgramInformation;
import org.fenixedu.academic.domain.phd.alert.AlertService;
import org.fenixedu.academic.domain.phd.conclusion.PhdConclusionProcessBean;
import org.fenixedu.academic.domain.phd.exceptions.PhdDomainOperationException;
import org.fenixedu.academic.domain.phd.thesis.PhdThesisJuryElementBean;
import org.fenixedu.academic.domain.phd.thesis.PhdThesisProcess;
import org.fenixedu.academic.domain.phd.thesis.PhdThesisProcessBean;
import org.fenixedu.academic.domain.phd.thesis.ThesisJuryElement;
import org.fenixedu.academic.domain.phd.thesis.activities.AddJuryElement;
import org.fenixedu.academic.domain.phd.thesis.activities.AddPresidentJuryElement;
import org.fenixedu.academic.domain.phd.thesis.activities.AddState;
import org.fenixedu.academic.domain.phd.thesis.activities.ConcludePhdProcess;
import org.fenixedu.academic.domain.phd.thesis.activities.DeleteJuryElement;
import org.fenixedu.academic.domain.phd.thesis.activities.EditJuryElement;
import org.fenixedu.academic.domain.phd.thesis.activities.EditPhdThesisProcessInformation;
import org.fenixedu.academic.domain.phd.thesis.activities.MoveJuryElementOrder;
import org.fenixedu.academic.domain.phd.thesis.activities.RatifyFinalThesis;
import org.fenixedu.academic.domain.phd.thesis.activities.RejectJuryElements;
import org.fenixedu.academic.domain.phd.thesis.activities.RejectJuryElementsDocuments;
import org.fenixedu.academic.domain.phd.thesis.activities.RemindJuryReviewToReporters;
import org.fenixedu.academic.domain.phd.thesis.activities.RemoveLastState;
import org.fenixedu.academic.domain.phd.thesis.activities.ReplaceDocument;
import org.fenixedu.academic.domain.phd.thesis.activities.RequestJuryElements;
import org.fenixedu.academic.domain.phd.thesis.activities.RequestJuryReviews;
import org.fenixedu.academic.domain.phd.thesis.activities.ScheduleThesisDiscussion;
import org.fenixedu.academic.domain.phd.thesis.activities.SetFinalGrade;
import org.fenixedu.academic.domain.phd.thesis.activities.SetPhdJuryElementRatificationEntity;
import org.fenixedu.academic.domain.phd.thesis.activities.SubmitJuryElementsDocuments;
import org.fenixedu.academic.domain.phd.thesis.activities.SubmitThesis;
import org.fenixedu.academic.domain.phd.thesis.activities.SwapJuryElementsOrder;
import org.fenixedu.academic.domain.phd.thesis.activities.ValidateJury;
import org.fenixedu.academic.report.phd.thesis.PhdThesisJuryElementsDocument;
import org.fenixedu.academic.service.services.caseHandling.ExecuteProcessActivity;
import org.fenixedu.academic.ui.struts.action.phd.PhdProcessStateBean;
import org.fenixedu.academic.ui.struts.action.phd.academicAdminOffice.PhdIndividualProgramProcessDA;
import org.fenixedu.academic.ui.struts.action.phd.thesis.CommonPhdThesisProcessDA;
import org.fenixedu.academic.util.report.ReportsUtils;
import org.fenixedu.bennu.struts.annotations.Forward;
import org.fenixedu.bennu.struts.annotations.Forwards;
import org.fenixedu.bennu.struts.annotations.Mapping;
import org.joda.time.LocalDate;

import pt.ist.fenixWebFramework.rendererExtensions.converters.DomainObjectKeyConverter;
import pt.ist.fenixWebFramework.renderers.DataProvider;
import pt.ist.fenixWebFramework.renderers.components.converters.Converter;
import pt.ist.fenixWebFramework.renderers.components.state.IViewState;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.utl.ist.fenix.tools.util.Pair;

@Mapping(path = "/phdThesisProcess", module = "academicAdministration", functionality = PhdIndividualProgramProcessDA.class)
@Forwards({
        @Forward(name = "requestJuryElements", path = "/phd/thesis/academicAdminOffice/requestJuryElements.jsp"),
        @Forward(name = "submitJuryElementsDocument", path = "/phd/thesis/academicAdminOffice/submitJuryElementsDocument.jsp"),
        @Forward(name = "manageThesisJuryElements", path = "/phd/thesis/academicAdminOffice/manageThesisJuryElements.jsp"),
        @Forward(name = "rejectJuryElements", path = "/phd/thesis/academicAdminOffice/rejectJuryElements.jsp"),
        @Forward(name = "addJuryElement", path = "/phd/thesis/academicAdminOffice/addJuryElement.jsp"),
        @Forward(name = "editJuryElement", path = "/phd/thesis/academicAdminOffice/editJuryElement.jsp"),
        @Forward(name = "validateJury", path = "/phd/thesis/academicAdminOffice/validateJury.jsp"),
        @Forward(name = "submitThesis", path = "/phd/thesis/academicAdminOffice/submitThesis.jsp"),
        @Forward(name = "requestJuryReviews", path = "/phd/thesis/academicAdminOffice/requestJuryReviews.jsp"),
        @Forward(name = "remindJuryReviews", path = "/phd/thesis/academicAdminOffice/remindJuryReviews.jsp"),
        @Forward(name = "addPresidentJuryElement", path = "/phd/thesis/academicAdminOffice/addPresidentJuryElement.jsp"),
        @Forward(name = "manageThesisDocuments", path = "/phd/thesis/academicAdminOffice/manageThesisDocuments.jsp"),
        @Forward(name = "scheduleThesisDiscussion", path = "/phd/thesis/academicAdminOffice/scheduleThesisDiscussion.jsp"),
        @Forward(name = "ratifyFinalThesis", path = "/phd/thesis/academicAdminOffice/ratifyFinalThesis.jsp"),
        @Forward(name = "setFinalGrade", path = "/phd/thesis/academicAdminOffice/setFinalGrade.jsp"),
        @Forward(name = "rejectJuryElementsDocuments", path = "/phd/thesis/academicAdminOffice/rejectJuryElementsDocuments.jsp"),
        @Forward(name = "viewMeetingSchedulingProcess", path = "/phd/thesis/academicAdminOffice/viewMeetingSchedulingProcess.jsp"),
        @Forward(name = "juryReporterFeedbackUpload", path = "/phd/thesis/academicAdminOffice/juryReporterFeedbackUpload.jsp"),
        @Forward(name = "replaceDocument", path = "/phd/thesis/academicAdminOffice/replaceDocument.jsp"),
        @Forward(name = "manageStates", path = "/phd/thesis/academicAdminOffice/manageStates.jsp"),
        @Forward(name = "editPhdThesisProcessInformation",
                path = "/phd/thesis/academicAdminOffice/editPhdThesisProcessInformation.jsp"),
        @Forward(name = "listConclusionProcess", path = "/phd/thesis/academicAdminOffice/conclusion/listConclusionProcess.jsp"),
        @Forward(name = "createConclusionProcess",
                path = "/phd/thesis/academicAdminOffice/conclusion/createConclusionProcess.jsp"),
        @Forward(name = "editPhdProcessState", path = "/phd/thesis/academicAdminOffice/editState.jsp"),
        @Forward(name = "viewLogs", path = "/phd/thesis/academicAdminOffice/logs/viewLogs.jsp") })
public class PhdThesisProcessDA extends CommonPhdThesisProcessDA {

    // Begin thesis jury elements management

    public ActionForward prepareRequestJuryElements(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        request.setAttribute("thesisProcessBean", bean);
        return mapping.findForward("requestJuryElements");
    }

    public ActionForward requestJuryElements(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        try {

            ExecuteProcessActivity.run(getProcess(request), RequestJuryElements.class, getRenderedObject("thesisProcessBean"));
            addSuccessMessage(request, "message.thesis.jury.elements.requested.with.success");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            request.setAttribute("thesisProcessBean", getRenderedObject("thesisProcessBean"));
            return mapping.findForward("requestJuryElements");
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    public ActionForward prepareSubmitJuryElementsDocument(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        final PhdThesisProcessBean bean = new PhdThesisProcessBean(getProcess(request).getIndividualProgramProcess());
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.JURY_ELEMENTS));
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.JURY_PRESIDENT_ELEMENT));
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.JURY_PRESIDENT_DECLARATION));
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.MAXIMUM_GRADE_GUIDER_PROPOSAL));

        return prepareSubmitJuryElementsDocument(mapping, actionForm, request, response, bean);
    }

    public ActionForward prepareSubmitJuryElementsDocument(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response, PhdThesisProcessBean bean) {
        request.setAttribute("thesisProcessBean", bean);

        return mapping.findForward("submitJuryElementsDocument");
    }

    public ActionForward submitJuryElementsDocumentInvalid(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getRenderedObject("thesisProcessBean"));
        return mapping.findForward("submitJuryElementsDocument");
    }

    public ActionForward submitJuryElementsDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        try {

            final IViewState viewState = RenderUtils.getViewState("thesisProcessBean.edit.documents");
            if (!viewState.isValid()) {
                RenderUtils.invalidateViewState("thesisProcessBean.edit.documents");
                return submitJuryElementsDocumentInvalid(mapping, actionForm, request, response);
            }
            ExecuteProcessActivity.run(getProcess(request), SubmitJuryElementsDocuments.class,
                    getRenderedObject("thesisProcessBean"));
            addSuccessMessage(request, "message.thesis.jury.elements.added.with.success");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            RenderUtils.invalidateViewState("thesisProcessBean.edit.documents");
            return submitJuryElementsDocumentInvalid(mapping, actionForm, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    public ActionForward manageThesisJuryElements(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        return mapping.findForward("manageThesisJuryElements");
    }

    public ActionForward prepareAddJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", new PhdThesisJuryElementBean(getProcess(request)));
        return mapping.findForward("addJuryElement");
    }

    public ActionForward prepareAddJuryElementInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", getRenderedObject("thesisJuryElementBean"));
        return mapping.findForward("addJuryElement");
    }

    public ActionForward prepareAddJuryElementPostback(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", getRenderedObject("thesisJuryElementBean"));
        RenderUtils.invalidateViewState();
        return mapping.findForward("addJuryElement");
    }

    public ActionForward addJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), AddJuryElement.class, getRenderedObject("thesisJuryElementBean"));
            addSuccessMessage(request, "message.thesis.added.jury.with.success");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareAddJuryElementInvalid(mapping, actionForm, request, response);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    static public class ExistingPhdParticipantsEvenInPhdThesisProcess implements DataProvider {

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

        @Override
        public Object provide(Object source, Object currentValue) {
            final PhdThesisJuryElementBean bean = (PhdThesisJuryElementBean) source;
            return bean.getExistingParticipants();
        }
    }

    public ActionForward prepareEditJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("thesisJuryElementBean", new PhdThesisJuryElementBean(getProcess(request), getJuryElement(request)));
        return mapping.findForward("editJuryElement");
    }

    public ActionForward editJuryElementInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("thesisJuryElementBean", getRenderedObject("thesisJuryElementBean"));
        return mapping.findForward("editJuryElement");
    }

    public ActionForward editJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), EditJuryElement.class, getRenderedObject("thesisJuryElementBean"));

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return editJuryElementInvalid(mapping, actionForm, request, response);
        }

        return redirect(String.format("/phdThesisProcess.do?method=manageThesisJuryElements&processId=%s", getProcess(request)
                .getExternalId()), request);
    }

    public ActionForward deleteJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), DeleteJuryElement.class, getJuryElement(request));
            addSuccessMessage(request, "message.thesis.jury.removed");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
        }

        return redirect(String.format("/phdThesisProcess.do?method=manageThesisJuryElements&processId=%s", getProcess(request)
                .getExternalId()), request);
    }

    private ThesisJuryElement getJuryElement(HttpServletRequest request) {
        return getDomainObject(request, "juryElementId");
    }

    private void swapJuryElements(HttpServletRequest request, ThesisJuryElement e1, ThesisJuryElement e2) {
        try {
            ExecuteProcessActivity.run(getProcess(request), SwapJuryElementsOrder.class,
                    new Pair<ThesisJuryElement, ThesisJuryElement>(e1, e2));
            addSuccessMessage(request, "message.thesis.jury.element.swapped");
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            throw e;
        }
    }

    private void moveElement(HttpServletRequest request, ThesisJuryElement element, Integer position) {
        try {
            ExecuteProcessActivity.run(getProcess(request), MoveJuryElementOrder.class, new Pair<ThesisJuryElement, Integer>(
                    element, position));
            addSuccessMessage(request, "message.thesis.jury.element.swapped");
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
        }
    }

    public ActionForward moveUp(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcess process = getProcess(request);
        final ThesisJuryElement juryElement = getJuryElement(request);
        final ThesisJuryElement lower = process.getOrderedThesisJuryElements().lower(juryElement);

        if (lower != null) {
            swapJuryElements(request, juryElement, lower);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward moveDown(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcess process = getProcess(request);
        final ThesisJuryElement juryElement = getJuryElement(request);
        final ThesisJuryElement higher = process.getOrderedThesisJuryElements().higher(juryElement);

        if (higher != null) {
            swapJuryElements(request, juryElement, higher);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward moveTop(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcess process = getProcess(request);
        final ThesisJuryElement juryElement = getJuryElement(request);
        final ThesisJuryElement first = process.getOrderedThesisJuryElements().first();

        if (juryElement != first) {
            moveElement(request, juryElement, first.getElementOrder() - 1);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward moveBottom(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcess process = getProcess(request);
        final ThesisJuryElement juryElement = getJuryElement(request);
        final ThesisJuryElement last = process.getOrderedThesisJuryElements().last();

        if (juryElement != last) {
            moveElement(request, juryElement, last.getElementOrder() - 1);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward prepareAddPresidentJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", new PhdThesisJuryElementBean(getProcess(request)));
        return mapping.findForward("addPresidentJuryElement");
    }

    public ActionForward prepareAddPresidentJuryElementInvalid(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", getRenderedObject("thesisJuryElementBean"));
        return mapping.findForward("addPresidentJuryElement");
    }

    public ActionForward prepareAddPresidentJuryElementPostback(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisJuryElementBean", getRenderedObject("thesisJuryElementBean"));
        RenderUtils.invalidateViewState();
        return mapping.findForward("addPresidentJuryElement");
    }

    public ActionForward addPresidentJuryElement(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), AddPresidentJuryElement.class,
                    getRenderedObject("thesisJuryElementBean"));
            addSuccessMessage(request, "message.thesis.added.jury.with.success");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareAddPresidentJuryElementInvalid(mapping, actionForm, request, response);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward prepareValidateJury(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        bean.setWhenJuryValidated(new LocalDate());

        request.setAttribute("thesisBean", bean);
        return mapping.findForward("validateJury");
    }

    public ActionForward prepareValidateJuryInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisBean", getRenderedObject("thesisBean"));
        return mapping.findForward("validateJury");
    }

    public ActionForward validateJury(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), ValidateJury.class, getRenderedObject("thesisBean"));

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareValidateJuryInvalid(mapping, actionForm, request, response);
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    public ActionForward printJuryElementsDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) throws IOException {

        final PhdThesisJuryElementsDocument report = new PhdThesisJuryElementsDocument(getProcess(request));

        writeFile(response, report.getReportFileName() + ".pdf", "application/pdf",
                ReportsUtils.exportToProcessedPdfAsByteArray(report));

        return null;
    }

    public ActionForward prepareRejectJuryElements(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisBean", new PhdThesisProcessBean());
        return mapping.findForward("rejectJuryElements");
    }

    public ActionForward rejectJuryElements(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {
            ExecuteProcessActivity.run(getProcess(request), RejectJuryElements.class, getRenderedObject("thesisBean"));

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            request.setAttribute("thesisBean", getRenderedObject("thesisBean"));
            return mapping.findForward("rejectJuryElements");
        }

        return manageThesisJuryElements(mapping, actionForm, request, response);
    }

    // end thesis jury elements management

    // Request Jury Reviews
    public ActionForward prepareRequestJuryReviews(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("requestJuryReviewsBean", new PhdThesisProcessBean());

        return mapping.findForward("requestJuryReviews");
    }

    public ActionForward prepareRequestJuryReviewsInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("requestJuryReviewsBean", getRenderedObject("requestJuryReviewsBean"));

        return mapping.findForward("requestJuryReviews");
    }

    public ActionForward requestJuryReviews(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        try {
            ExecuteProcessActivity
                    .run(getProcess(request), RequestJuryReviews.class, getRenderedObject("requestJuryReviewsBean"));
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareRequestJuryReviewsInvalid(mapping, form, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    // End of Request Jury Reviews

    // Remind Jury Reviews
    public ActionForward prepareRemindJuryReviews(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("remindJuryReviewsBean", new PhdThesisProcessBean());

        return mapping.findForward("remindJuryReviews");
    }

    public ActionForward prepareRemindJuryReviewsInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("remindJuryReviewsBean", getRenderedObject("remindJuryReviewsBean"));

        return mapping.findForward("remindJuryReviews");
    }

    public ActionForward remindJuryReviews(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        try {
            ExecuteProcessActivity.run(getProcess(request), RemindJuryReviewToReporters.class,
                    getRenderedObject("remindJuryReviewsBean"));
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareRemindJuryReviewsInvalid(mapping, form, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    // end remind jury reviews

    // Schedule thesis discussion

    public ActionForward prepareScheduleThesisDiscussion(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        final PhdThesisProcess thesisProcess = getProcess(request);

        bean.setThesisProcess(thesisProcess);
        setDefaultDiscussionMailInformation(bean, thesisProcess);

        request.setAttribute("thesisProcessBean", bean);
        return mapping.findForward("scheduleThesisDiscussion");
    }

    private void setDefaultDiscussionMailInformation(final PhdThesisProcessBean bean, final PhdThesisProcess thesisProcess) {
        final PhdIndividualProgramProcess process = thesisProcess.getIndividualProgramProcess();
        bean.setMailSubject(AlertService.getSubjectPrefixed(process,
                "message.phd.thesis.schedule.thesis.discussion.default.subject"));
        bean.setMailBody(AlertService.getBodyText(process, "message.phd.thesis.schedule.thesis.discussion.default.body"));
    }

    public ActionForward scheduleThesisDiscussionInvalid(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        return mapping.findForward("scheduleThesisDiscussion");
    }

    public ActionForward scheduleThesisDiscussionPostback(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        RenderUtils.invalidateViewState();
        return mapping.findForward("scheduleThesisDiscussion");
    }

    public ActionForward scheduleThesisDiscussion(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcess thesisProcess = getProcess(request);

        try {
            ExecuteProcessActivity.run(thesisProcess, ScheduleThesisDiscussion.class, getThesisProcessBean());

        } catch (final DomainException e) {
            addErrorMessage(request, e.getKey(), e.getArgs());
            return scheduleThesisDiscussionPostback(mapping, actionForm, request, response);
        }

        return viewIndividualProgramProcess(request, thesisProcess);
    }

    // End of schedule thesis discussion

    // Submit thesis
    public ActionForward prepareSubmitThesis(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.FINAL_THESIS));

        request.setAttribute("submitThesisBean", bean);

        return mapping.findForward("submitThesis");
    }

    public ActionForward prepareSubmitThesisInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("submitThesisBean", getRenderedObject("submitThesisBean"));
        RenderUtils.invalidateViewState("submitThesisBean.edit.documents");

        return mapping.findForward("submitThesis");
    }

    public ActionForward submitThesis(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        try {

            if (!RenderUtils.getViewState("submitThesisBean.edit.documents").isValid()) {
                addErrorMessage(request, "error.phd.invalid.documents");
                return prepareSubmitThesisInvalid(mapping, form, request, response);
            }

            ExecuteProcessActivity.run(getProcess(request), SubmitThesis.class, getRenderedObject("submitThesisBean"));

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return prepareSubmitThesisInvalid(mapping, form, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));

    }

    // End of submit thesis

    // Ratify final thesis
    public ActionForward prepareRatifyFinalThesis(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.FINAL_THESIS_RATIFICATION_DOCUMENT));

        request.setAttribute("thesisProcessBean", bean);
        return mapping.findForward("ratifyFinalThesis");
    }

    public ActionForward ratifyFinalThesisInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        return mapping.findForward("ratifyFinalThesis");
    }

    public ActionForward ratifyFinalThesis(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {

            if (!RenderUtils.getViewState("thesisProcessBean.edit").isValid()) {
                return ratifyFinalThesisInvalid(mapping, actionForm, request, response);
            }

            if (!RenderUtils.getViewState("thesisProcessBean.edit.documents").isValid()) {
                addErrorMessage(request, "error.phd.invalid.documents");
                return ratifyFinalThesisInvalid(mapping, actionForm, request, response);
            }

            ExecuteProcessActivity.run(getProcess(request), RatifyFinalThesis.class, getThesisProcessBean());

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return ratifyFinalThesisInvalid(mapping, actionForm, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));

    }

    // End of ratify final thesis

    // Set final grade

    public ActionForward prepareSetFinalGrade(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.CONCLUSION_DOCUMENT));

        request.setAttribute("thesisProcessBean", bean);
        return mapping.findForward("setFinalGrade");
    }

    public ActionForward setFinalGradeInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        return mapping.findForward("setFinalGrade");
    }

    public ActionForward setFinalGrade(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {

        try {

            if (!RenderUtils.getViewState("thesisProcessBean.edit").isValid()) {
                return setFinalGradeInvalid(mapping, actionForm, request, response);
            }

            if (!RenderUtils.getViewState("thesisProcessBean.edit.documents").isValid()) {
                addErrorMessage(request, "error.phd.invalid.documents");
                return setFinalGradeInvalid(mapping, actionForm, request, response);
            }

            ExecuteProcessActivity.run(getProcess(request), SetFinalGrade.class, getThesisProcessBean());

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return setFinalGradeInvalid(mapping, actionForm, request, response);
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    // End of set final grade

    // Reject jury elements documents

    public ActionForward prepareRejectJuryElementsDocuments(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        request.setAttribute("thesisProcessBean", bean);

        return mapping.findForward("rejectJuryElementsDocuments");
    }

    public ActionForward rejectJuryElementsDocuments(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        try {

            ExecuteProcessActivity.run(getProcess(request), RejectJuryElementsDocuments.class,
                    getRenderedObject("thesisProcessBean"));
            addSuccessMessage(request, "message.thesis.jury.elements.documents.rejected.with.success");

        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            request.setAttribute("thesisProcessBean", getRenderedObject("thesisProcessBean"));
            return mapping.findForward("rejectJuryElementsDocuments");
        }

        return viewIndividualProgramProcess(request, getProcess(request));
    }

    // End of reject jury elements document

    // Manage phd thesis process meetings
    public ActionForward viewMeetingSchedulingProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        final PhdThesisProcessBean bean = new PhdThesisProcessBean();
        request.setAttribute("thesisProcessBean", bean);

        return mapping.findForward("viewMeetingSchedulingProcess");
    }

    // End of manage phd thesis process meetings

    public ActionForward prepareReplaceDocument(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        final PhdProgramDocumentUploadBean bean =
                new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.valueOf(request.getParameter("type")));

        request.setAttribute("documentBean", bean);

        return mapping.findForward("replaceDocument");
    }

    public ActionForward replaceDocument(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        try {

            final IViewState viewState = RenderUtils.getViewState("documentBean");
            if (!viewState.isValid()) {
                return juryReportFeedbackUploadInvalid(mapping, form, request, response);
            }

            ExecuteProcessActivity.run(getProcess(request), ReplaceDocument.class, getRenderedObject("documentBean"));
            addSuccessMessage(request, "message.replace.document.done.with.success");
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
            return replaceDocumentInvalid(mapping, form, request, response);
        }

        return manageThesisDocuments(mapping, form, request, response);
    }

    public ActionForward replaceDocumentInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        return mapping.findForward("replaceDocument");
    }

    // jury report feedback operations

    @Override
    public ActionForward prepareJuryReportFeedbackUpload(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean(getProcess(request).getIndividualProgramProcess());
        bean.addDocument(new PhdProgramDocumentUploadBean(PhdIndividualProgramDocumentType.JURY_REPORT_FEEDBACK));

        request.setAttribute("thesisProcessBean", bean);
        request.setAttribute("thesisDocuments", getProcess(request).getThesisDocumentsToFeedback());

        return mapping.findForward("juryReporterFeedbackUpload");
    }

    public ActionForward juryReportFeedbackUploadPostback(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("thesisProcessBean", getThesisProcessBean());
        request.setAttribute("thesisDocuments", getProcess(request).getThesisDocumentsToFeedback());
        return mapping.findForward("juryReporterFeedbackUpload");
    }

    public ActionForward manageStates(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        final PhdThesisProcessBean bean = new PhdThesisProcessBean(getProcess(request).getIndividualProgramProcess());
        request.setAttribute("thesisProcessBean", bean);

        return mapping.findForward("manageStates");
    }

    public ActionForward addState(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        try {
            PhdThesisProcessBean bean = getRenderedObject("thesisProcessBean");
            ExecuteProcessActivity.run(getProcess(request), AddState.class, bean);
        } catch (PhdDomainOperationException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
        }

        return manageStates(mapping, form, request, response);
    }

    public ActionForward addStateInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdThesisProcessBean bean = getRenderedObject("thesisProcessBean");

        request.setAttribute("thesisProcessBean", bean);

        return mapping.findForward("manageStates");
    }

    public ActionForward removeLastState(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        try {
            ExecuteProcessActivity.run(getProcess(request), RemoveLastState.class, null);
        } catch (final DomainException e) {
            addErrorMessage(request, e.getMessage(), e.getArgs());
        }
        return manageStates(mapping, form, request, response);
    }

    // Phd Thesis process information edit
    public ActionForward prepareEditPhdThesisProcessInformation(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("phdThesisProcessBean", new PhdThesisProcessBean(getProcess(request).getIndividualProgramProcess()));
        return mapping.findForward("editPhdThesisProcessInformation");
    }

    public ActionForward editPhdThesisProcessInformationInvalid(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("phdThesisProcessBean", getRenderedObject("phdThesisProcessBean"));
        return mapping.findForward("editPhdThesisProcessInformation");
    }

    public ActionForward editPhdThesisProcessInformationPostback(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {
        request.setAttribute("phdThesisProcessBean", getRenderedObject("phdThesisProcessBean"));
        RenderUtils.invalidateViewState();
        return mapping.findForward("editPhdThesisProcessInformation");
    }

    public ActionForward editPhdThesisProcessInformation(ActionMapping mapping, ActionForm actionForm,
            HttpServletRequest request, HttpServletResponse response) {

        final PhdThesisProcessBean bean = getRenderedObject("phdThesisProcessBean");
        request.setAttribute("phdThesisProcessBean", bean);

        try {
            ExecuteProcessActivity.run(getProcess(request), EditPhdThesisProcessInformation.class.getSimpleName(), bean);
            addSuccessMessage(request, "message.phdThesisProcessInformation.edit.success");
            return viewIndividualProgramProcess(request, getProcess(request));

        } catch (DomainException e) {
            addErrorMessage(request, e.getKey(), e.getArgs());
            return mapping.findForward("editPhdThesisProcessInformation");
        }
    }

    // End of Phd Thesis process information edit

    /* Conclusion Process */

    public ActionForward listConclusionProcesses(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        return mapping.findForward("listConclusionProcess");
    }

    public ActionForward prepareCreateConclusionProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdIndividualProgramProcess individualProgramProcess = getProcess(request).getIndividualProgramProcess();
        PhdConclusionProcessBean bean = new PhdConclusionProcessBean(individualProgramProcess);

        LocalDate conclusionDate = null;
        if (!individualProgramProcess.getStudyPlan().isExempted()) {
            conclusionDate = individualProgramProcess.getRegistration().getConclusionDateForBolonha().toLocalDate();
        } else {
            conclusionDate = bean.getConclusionDate();
        }

        PhdProgramInformation phdProgramInformation =
                getProcess(request).getIndividualProgramProcess().getPhdProgram().getPhdProgramInformationByDate(conclusionDate);

        request.setAttribute("isExempted", individualProgramProcess.getStudyPlan().isExempted());
        request.setAttribute("conclusionDateForPhdInformation", conclusionDate);
        request.setAttribute("phdProgramInformation", phdProgramInformation);
        request.setAttribute("phdConclusionProcessBean", bean);

        return mapping.findForward("createConclusionProcess");
    }

    public ActionForward createConclusionProcess(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdConclusionProcessBean bean = getRenderedObject("phdConclusionProcessBean");
        try {
            ExecuteProcessActivity.run(getProcess(request), ConcludePhdProcess.class, bean);
        } catch (DomainException e) {
            addErrorMessage(request, e.getKey(), e.getArgs());
            return createConclusionProcessInvalid(mapping, form, request, response);
        }

        return listConclusionProcesses(mapping, form, request, response);
    }

    public ActionForward createConclusionProcessInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdConclusionProcessBean bean = getRenderedObject("phdConclusionProcessBean");
        PhdIndividualProgramProcess individualProgramProcess = getProcess(request).getIndividualProgramProcess();

        LocalDate conclusionDate = null;
        if (!individualProgramProcess.getStudyPlan().isExempted()) {
            conclusionDate = individualProgramProcess.getRegistration().getConclusionDateForBolonha().toLocalDate();
        } else {
            conclusionDate = bean.getConclusionDate();
        }

        PhdProgramInformation phdProgramInformation =
                getProcess(request).getIndividualProgramProcess().getPhdProgram().getPhdProgramInformationByDate(conclusionDate);

        request.setAttribute("isExempted", individualProgramProcess.getStudyPlan().isExempted());
        request.setAttribute("conclusionDateForPhdInformation", conclusionDate);
        request.setAttribute("phdProgramInformation", phdProgramInformation);
        request.setAttribute("phdConclusionProcessBean", bean);

        return mapping.findForward("createConclusionProcess");
    }

    public ActionForward setPhdJuryElementsRatificationEntity(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        final PhdThesisProcessBean bean = getRenderedObject("thesisProcessBean");
        final PhdThesisProcess process = getProcess(request);

        ExecuteProcessActivity.run(process, SetPhdJuryElementRatificationEntity.class, bean);

        return prepareSubmitJuryElementsDocument(mapping, form, request, response, bean);
    }

    public ActionForward setPhdJuryElementsRatificationEntityPostback(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        final PhdThesisProcessBean bean = getRenderedObject("thesisProcessBean");
        RenderUtils.invalidateViewState();
        return prepareSubmitJuryElementsDocument(mapping, form, request, response, bean);
    }

    public ActionForward setPhdJuryElementsRatificationEntityInvalid(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        final PhdThesisProcessBean bean = getRenderedObject("thesisProcessBean");
        return prepareSubmitJuryElementsDocument(mapping, form, request, response, bean);
    }

    /* EDIT PHD STATES */

    public ActionForward prepareEditState(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdProcessState state = getDomainObject(request, "stateId");
        PhdProcessStateBean bean = new PhdProcessStateBean(state);

        request.setAttribute("bean", bean);

        return mapping.findForward("editPhdProcessState");
    }

    public ActionForward editState(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdProcessStateBean bean = getRenderedObject("bean");
        bean.getState().editStateDate(bean);

        return manageStates(mapping, form, request, response);
    }

    public ActionForward editStateInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        PhdProcessStateBean bean = getRenderedObject("bean");
        request.setAttribute("bean", bean);

        return mapping.findForward("editPhdProcessState");
    }

    /* EDIT PHD STATES */

    public ActionForward viewLogs(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
            final HttpServletResponse response) {

        return mapping.findForward("viewLogs");
    }

    @SuppressWarnings("unchecked")
    protected List<PhdProgramDocumentUploadBean> getDocumentsToUpload() {
        return (List<PhdProgramDocumentUploadBean>) getObjectFromViewState("documentsToUpload");
    }

    protected boolean hasAnyDocumentToUpload() {
        for (final PhdProgramDocumentUploadBean each : getDocumentsToUpload()) {
            if (each.hasAnyInformation()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public ActionForward deleteDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        prepareDocumentsToUpload(request);
        return executeActivity(org.fenixedu.academic.domain.phd.thesis.activities.DeleteDocument.class,
                getDomainObject(request, "documentId"), request, mapping, "manageThesisDocuments", "manageThesisDocuments",
                "message.document.deleted.successfuly");
    }

    @Override
    public ActionForward manageThesisDocuments(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) {
        prepareDocumentsToUpload(request);

        return mapping.findForward("manageThesisDocuments");
    }

    private void prepareDocumentsToUpload(HttpServletRequest request) {
        request.setAttribute("documentsToUpload", Arrays.asList(new PhdProgramDocumentUploadBean(),
                new PhdProgramDocumentUploadBean(), new PhdProgramDocumentUploadBean()));
    }

    public ActionForward uploadDocumentsInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        request.setAttribute("documentsToUpload", getDocumentsToUpload());
        return mapping.findForward("manageThesisDocuments");
    }

    public ActionForward uploadDocuments(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {

        if (!hasAnyDocumentToUpload()) {
            request.setAttribute("documentsToUpload", getDocumentsToUpload());

            addErrorMessage(request, "message.no.documents.to.upload");

            return mapping.findForward("manageThesisDocuments");
        }

        final ActionForward result =
                executeActivity(org.fenixedu.academic.domain.phd.thesis.activities.UploadDocuments.class, getDocumentsToUpload(),
                        request, mapping, "manageThesisDocuments", "manageThesisDocuments",
                        "message.documents.uploaded.with.success");

        RenderUtils.invalidateViewState("documentsToUpload");

        prepareDocumentsToUpload(request);

        return result;

    }

}
TOP

Related Classes of org.fenixedu.academic.ui.struts.action.phd.thesis.academicAdminOffice.PhdThesisProcessDA

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.