Package org.fenixedu.academic.ui.struts.action.administrativeOffice.serviceRequests.documentRequests

Source Code of org.fenixedu.academic.ui.struts.action.administrativeOffice.serviceRequests.documentRequests.DocumentRequestsManagementDispatchAction

/**
* 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.administrativeOffice.serviceRequests.documentRequests;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jvstm.cps.ConsistencyException;

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.Enrolment;
import org.fenixedu.academic.domain.Exam;
import org.fenixedu.academic.domain.StudentCurricularPlan;
import org.fenixedu.academic.domain.accessControl.academicAdministration.AcademicAccessRule;
import org.fenixedu.academic.domain.accessControl.academicAdministration.AcademicOperationType;
import org.fenixedu.academic.domain.documents.GeneratedDocument;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.serviceRequests.AcademicServiceRequest;
import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentRequest;
import org.fenixedu.academic.domain.serviceRequests.documentRequests.DocumentRequestType;
import org.fenixedu.academic.domain.serviceRequests.documentRequests.IDocumentRequest;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.dto.degreeAdministrativeOffice.serviceRequest.documentRequest.certificates.ExamDateCertificateExamSelectionBean;
import org.fenixedu.academic.dto.serviceRequests.DocumentRequestCreateBean;
import org.fenixedu.academic.service.factoryExecutors.DocumentRequestCreator;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.ui.struts.action.administrativeOffice.serviceRequests.AcademicServiceRequestsManagementDispatchAction;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.bennu.core.security.Authenticate;
import org.fenixedu.bennu.struts.annotations.Forward;
import org.fenixedu.bennu.struts.annotations.Forwards;
import org.fenixedu.bennu.struts.annotations.Mapping;

import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.ist.fenixframework.FenixFramework;

@Mapping(path = "/documentRequestsManagement", module = "academicAdministration",
        formBeanClass = AcademicServiceRequestsManagementDispatchAction.AcademicServiceRequestsManagementForm.class,
        functionality = AcademicServiceRequestsManagementDispatchAction.class)
@Forwards({
        @Forward(name = "printDocument", path = "/academicAdminOffice/serviceRequests/documentRequests/printDocument.jsp"),
        @Forward(name = "createDocumentRequests",
                path = "/academicAdminOffice/serviceRequests/documentRequests/createDocumentRequests.jsp"),
        @Forward(name = "viewDocumentRequestsToCreate",
                path = "/academicAdminOffice/serviceRequests/documentRequests/viewDocumentRequestsToCreate.jsp"),
        @Forward(name = "chooseExamsToCreateExamDateCertificateRequest",
                path = "/academicAdminOffice/serviceRequests/documentRequests/chooseExamsToCreateExamDateCertificateRequest.jsp"),
        @Forward(name = "viewRegistrationDetails", path = "/academicAdminOffice/student/registration/viewRegistrationDetails.jsp"),
        @Forward(name = "processNewAcademicServiceRequest",
                path = "/academicAdministration/academicServiceRequestsManagement.do?method=processNewAcademicServiceRequest") })
public class DocumentRequestsManagementDispatchAction extends FenixDispatchAction {

    protected IDocumentRequest getDocumentRequest(HttpServletRequest request) {
        return (IDocumentRequest) getDomainObject(request, "documentRequestId");
    }

    private AcademicServiceRequest getAndSetAcademicServiceRequest(final HttpServletRequest request) {
        final AcademicServiceRequest academicServiceRequest = getDomainObject(request, "academicServiceRequestId");
        request.setAttribute("academicServiceRequest", academicServiceRequest);
        return academicServiceRequest;
    }

    public ActionForward downloadDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        final IDocumentRequest documentRequest = getDocumentRequest(request);
        GeneratedDocument doc = documentRequest.getLastGeneratedDocument();
        if (doc != null) {
            final ServletOutputStream writer = response.getOutputStream();
            try {
                response.setContentLength(doc.getSize().intValue());
                response.setContentType("application/pdf");
                response.addHeader("Content-Disposition", "attachment; filename=" + doc.getFilename());
                writer.write(doc.getContent());
                writer.flush();
            } finally {
                writer.close();
            }
        }
        return null;
    }

    public ActionForward printDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) throws IOException, FenixServiceException {
        final IDocumentRequest documentRequest = getDocumentRequest(request);
        try {
            byte[] data = documentRequest.generateDocument();

            response.setContentLength(data.length);
            response.setContentType("application/pdf");
            response.addHeader("Content-Disposition", "attachment; filename=" + documentRequest.getReportFileName() + ".pdf");

            final ServletOutputStream writer = response.getOutputStream();
            writer.write(data);
            writer.flush();
            writer.close();

            response.flushBuffer();
            return null;
        } catch (DomainException e) {
            throw e;
        }
    }

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

        if (request.getAttribute("academicServiceRequest") == null) {
            request.setAttribute("academicServiceRequest", getAndSetAcademicServiceRequest(request));
        }
        return mapping.findForward("printDocument");
    }

    private Registration getRegistration(final HttpServletRequest request) {
        final Registration registration = getDomainObject(request, "registrationId");
        request.setAttribute("registration", registration);
        return registration;
    }

    public ActionForward prepareCreateDocumentRequest(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        String schema = "DocumentRequestCreateBean.chooseDocumentRequestType";
        if (!getRegistration(request).isBolonha()) {
            schema += "_preBolonha";
        }
        return prepareCreateDocumentRequest(mapping, form, request, response, schema);
    }

    public ActionForward prepareCreateDocumentRequestQuick(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        return prepareCreateDocumentRequest(mapping, form, request, response,
                "DocumentRequestCreateBean.chooseDocumentRequestQuickType");
    }

    private ActionForward prepareCreateDocumentRequest(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response, String schema) {

        final DocumentRequestCreator creator = new DocumentRequestCreator(getRegistration(request));
        creator.setSchema(schema);
        request.setAttribute("documentRequestCreateBean", creator);
        return mapping.findForward("createDocumentRequests");
    }

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

        final DocumentRequestCreateBean requestCreateBean = getRenderedObject();

        if (requestCreateBean.getChosenDocumentRequestType() != null) {
            getAndSetSpecialEnrolments(request, requestCreateBean);
        }
        setAdditionalInformationSchemaName(request, requestCreateBean);
        request.setAttribute("documentRequestCreateBean", requestCreateBean);
        return mapping.findForward("createDocumentRequests");
    }

    public ActionForward documentRequestTypeChosenPostBack(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) {
        return createDocumentRequestPostback(mapping, request);
    }

    private ActionForward createDocumentRequestPostback(ActionMapping mapping, HttpServletRequest request) {
        final DocumentRequestCreateBean requestCreateBean =
                (DocumentRequestCreateBean) RenderUtils.getViewState().getMetaObject().getObject();
        RenderUtils.invalidateViewState();

        if (requestCreateBean.getChosenDocumentRequestType() != null) {
            getAndSetSpecialEnrolments(request, requestCreateBean);
        }
        setAdditionalInformationSchemaName(request, requestCreateBean);
        request.setAttribute("documentRequestCreateBean", requestCreateBean);
        return mapping.findForward("createDocumentRequests");
    }

    private void getAndSetSpecialEnrolments(HttpServletRequest request, DocumentRequestCreateBean requestCreateBean) {
        final StudentCurricularPlan curricularPlan = requestCreateBean.getRegistration().getLastStudentCurricularPlan();
        final DocumentRequestType requestType = requestCreateBean.getChosenDocumentRequestType();
        if (requestType.equals(DocumentRequestType.EXTRA_CURRICULAR_CERTIFICATE)) {
            List<Enrolment> enrolments = curricularPlan.getExtraCurricularApprovedEnrolmentsNotInDismissal();
            if (enrolments.size() == 0) {
                addActionMessage("warning", request, "warning.ExtraCurricularCertificateRequest.no.enrolments.available");
            }
            requestCreateBean.setEnrolments(enrolments);
        }
        if (requestType.equals(DocumentRequestType.STANDALONE_ENROLMENT_CERTIFICATE)) {
            List<Enrolment> enrolments = curricularPlan.getStandaloneApprovedEnrolmentsNotInDismissal();
            if (enrolments.size() == 0) {
                addActionMessage("warning", request, "warning.StandaloneEnrolmentCertificateRequest.no.enrolments.available");
            }
            requestCreateBean.setEnrolments(enrolments);
        }
    }

    private void setAdditionalInformationSchemaName(HttpServletRequest request, final DocumentRequestCreateBean requestCreateBean) {
        if (!requestCreateBean.getHasAdditionalInformation()) {
            return;
        }
        DocumentRequestType requestType = requestCreateBean.getChosenDocumentRequestType();
        final StringBuilder schemaName = new StringBuilder();
        schemaName.append("DocumentRequestCreateBean.");
        schemaName.append(requestType.name());

        if (requestType.equals(DocumentRequestType.APPROVEMENT_MOBILITY_CERTIFICATE)
                && !requestCreateBean.getRegistrationProtocol().isEnrolmentByStudentAllowed()) {
            schemaName.append("_mobility");
        }

        if (!requestCreateBean.getRegistration().isBolonha() && requestType.withBranch()) {
            schemaName.append("_WithBranch");
        }

        schemaName.append(".AdditionalInformation");
        request.setAttribute("additionalInformationSchemaName", schemaName.toString());
    }

    public ActionForward executionYearToCreateDocumentChangedPostBack(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        return createDocumentRequestPostback(mapping, request);
    }

    public ActionForward executionPeriodToCreateDocumentChangedPostBack(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        return createDocumentRequestPostback(mapping, request);
    }

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

        final DocumentRequestCreateBean requestCreateBean =
                (DocumentRequestCreateBean) RenderUtils.getViewState().getMetaObject().getObject();

        if (requestCreateBean.getChosenDocumentRequestType() == DocumentRequestType.EXAM_DATE_CERTIFICATE) {
            return prepareChooseExamsToCreateExamDateCertificateRequest(mapping, actionForm, request, response, requestCreateBean);
        }

        setAdditionalInformationSchemaName(request, requestCreateBean);
        request.setAttribute("documentRequestCreateBean", requestCreateBean);
        return mapping.findForward("viewDocumentRequestsToCreate");
    }

    public ActionForward prepareChooseExamsToCreateExamDateCertificateRequest(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response, DocumentRequestCreateBean requestCreateBean) {

        request.setAttribute("documentRequestCreateBean", requestCreateBean);
        final ExamDateCertificateExamSelectionBean examSelectionBean =
                ExamDateCertificateExamSelectionBean.buildFor(requestCreateBean.getEnrolments(),
                        requestCreateBean.getExecutionPeriod());
        request.setAttribute("examSelectionBean", examSelectionBean);
        request.setAttribute("enrolmentsWithoutExam",
                examSelectionBean.getEnrolmentsWithoutExam(requestCreateBean.getEnrolments()));

        return mapping.findForward("chooseExamsToCreateExamDateCertificateRequest");

    }

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

        final DocumentRequestCreateBean requestCreateBean = getRenderedObject("documentRequestCreateBean");
        requestCreateBean.setExams(getSelectedExams(request));

        setAdditionalInformationSchemaName(request, requestCreateBean);
        request.setAttribute("documentRequestCreateBean", requestCreateBean);
        return mapping.findForward("viewDocumentRequestsToCreate");
    }

    private List<Exam> getSelectedExams(final HttpServletRequest request) {
        final String[] examIds = request.getParameterValues("selectedExams");

        if (examIds == null) {
            return Collections.emptyList();
        }

        final List<Exam> result = new ArrayList<Exam>();
        for (final String examId : examIds) {
            result.add((Exam) FenixFramework.getDomainObject(examId));
        }

        return result;

    }

    public ActionForward create(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
            HttpServletResponse response) throws FenixServiceException {

        final DocumentRequestCreateBean documentRequestCreateBean = getRenderedObject();
        final Registration registration = documentRequestCreateBean.getRegistration();
        request.setAttribute("registration", registration);

        DocumentRequest documentRequest = null;
        try {
            documentRequest = (DocumentRequest) executeFactoryMethod();
        } catch (DomainException ex) {
            addActionMessage(request, ex.getKey(), ex.getArgs());
            return mapping.findForward("viewRegistrationDetails");
        } catch (ConsistencyException ce) {
            addActionMessage(request, "error." + ce.getMethodFullname());
            return mapping.findForward("viewRegistrationDetails");
        }

        if (documentRequestCreateBean.getChosenDocumentRequestType().isAllowedToQuickDeliver()) {
            request.setAttribute("academicServiceRequestId", documentRequest.getExternalId());
            return mapping.findForward("processNewAcademicServiceRequest");
        } else {
            addActionMessage(request, "document.request.created.with.success");
            return mapping.findForward("viewRegistrationDetails");
        }
    }

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

        final DocumentRequestCreateBean documentRequestCreateBean = getRenderedObject();
        if (documentRequestCreateBean.isToUseAll()) {
            Set<Degree> degrees =
                    AcademicAccessRule.getDegreesAccessibleToFunction(AcademicOperationType.SERVICE_REQUESTS,
                            Authenticate.getUser()).collect(Collectors.toSet());
            Set<Enrolment> aprovedEnrolments = new HashSet<Enrolment>();
            for (Degree degree : degrees) {
                for (final Registration registration : documentRequestCreateBean.getStudent().getRegistrationsFor(degree)) {
                    aprovedEnrolments.addAll(registration.getApprovedEnrolments());
                }
            }
            documentRequestCreateBean.setEnrolments(new ArrayList<Enrolment>(aprovedEnrolments));
        } else {
            documentRequestCreateBean.setEnrolments(new ArrayList<Enrolment>());
        }
        RenderUtils.invalidateViewState();
        request.setAttribute("documentRequestCreateBean", documentRequestCreateBean);
        setAdditionalInformationSchemaName(request, documentRequestCreateBean);

        return mapping.findForward("createDocumentRequests");
    }
}
TOP

Related Classes of org.fenixedu.academic.ui.struts.action.administrativeOffice.serviceRequests.documentRequests.DocumentRequestsManagementDispatchAction

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.