/**
* 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) {
Exam exam = (Exam) FenixFramework.getDomainObject(examId);
if (!exam.isExamsMapPublished()) {
continue;
}
result.add(exam);
}
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");
}
}