/**
* 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.publicRelationsOffice;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.fenixedu.academic.domain.Degree;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.alumni.CerimonyInquiry;
import org.fenixedu.academic.domain.alumni.CerimonyInquiryAnswer;
import org.fenixedu.academic.domain.alumni.CerimonyInquiryPerson;
import org.fenixedu.academic.domain.contacts.MobilePhone;
import org.fenixedu.academic.domain.contacts.PartyContact;
import org.fenixedu.academic.domain.contacts.Phone;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.domain.student.Student;
import org.fenixedu.academic.domain.util.email.Recipient;
import org.fenixedu.academic.domain.util.email.Sender;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.academic.ui.struts.action.messaging.EmailsDA;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.struts.annotations.Forward;
import org.fenixedu.bennu.struts.annotations.Forwards;
import org.fenixedu.bennu.struts.annotations.Mapping;
import org.fenixedu.bennu.struts.portal.EntryPoint;
import org.fenixedu.bennu.struts.portal.StrutsFunctionality;
import org.fenixedu.commons.spreadsheet.StyledExcelSpreadsheet;
import org.joda.time.DateTime;
import com.google.common.io.CharStreams;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
@StrutsFunctionality(app = PublicRelationsApplication.class, path = "alumni-cerimony",
titleKey = "label.publicRelationOffice.alumniCerimony.inquiries")
@Mapping(path = "/alumniCerimony", module = "publicRelations")
@Forwards({ @Forward(name = "manageAlumniCerimony", path = "/publicRelations/alumni/manageAlumniCerimony.jsp"),
@Forward(name = "viewAlumniCerimonyInquiry", path = "/publicRelations/alumni/viewAlumniCerimonyInquiry.jsp"),
@Forward(name = "editAlumniCerimonyInquiry", path = "/publicRelations/alumni/editAlumniCerimonyInquiry.jsp"),
@Forward(name = "editAlumniCerimonyInquiryAnswer", path = "/publicRelations/alumni/editAlumniCerimonyInquiryAnswer.jsp"),
@Forward(name = "viewAlumniCerimonyInquiryAnswer", path = "/publicRelations/alumni/viewAlumniCerimonyInquiryAnswer.jsp"),
@Forward(name = "addPeopleToCerimonyInquiry", path = "/publicRelations/alumni/addPeopleToCerimonyInquiry.jsp"),
@Forward(name = "viewInquiryPeople", path = "/publicRelations/alumni/viewInquiryPeople.jsp") })
public class AlumniCerimonyDA extends FenixDispatchAction {
private static final String LOCALDATE_FORMAT = "yyyy-MM-dd";
protected static final String MODULE = "alumni";
@EntryPoint
public ActionForward manage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
final Set<CerimonyInquiry> cerimonyInquirySet = rootDomainObject.getCerimonyInquirySet();
request.setAttribute("cerimonyInquirySet", new TreeSet<CerimonyInquiry>(cerimonyInquirySet));
return mapping.findForward("manageAlumniCerimony");
}
public ActionForward deleteInquiry(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
cerimonyInquiry.delete();
return manage(mapping, form, request, response);
}
public ActionForward forwardToInquiry(final ActionMapping mapping, final HttpServletRequest request, final String forward)
throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
return forwardToInquiry(mapping, request, forward, cerimonyInquiry);
}
public ActionForward forwardToInquiry(final ActionMapping mapping, final HttpServletRequest request, final String forward,
final CerimonyInquiry cerimonyInquiry) throws Exception {
request.setAttribute("cerimonyInquiry", cerimonyInquiry);
return mapping.findForward(forward);
}
public ActionForward viewInquiry(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
return forwardToInquiry(mapping, request, "viewAlumniCerimonyInquiry");
}
public ActionForward createNewInquiry(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = CerimonyInquiry.createNew();
return forwardToInquiry(mapping, request, "editAlumniCerimonyInquiry", cerimonyInquiry);
}
public ActionForward editInquiry(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
return forwardToInquiry(mapping, request, "editAlumniCerimonyInquiry");
}
public ActionForward addInquiryAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
final CerimonyInquiryAnswer cerimonyInquiryAnswer = cerimonyInquiry.createNewAnswer();
return editInquiryAnswer(mapping, request, cerimonyInquiryAnswer);
}
public ActionForward editInquiryAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiryAnswer cerimonyInquiryAnswer = getDomainObject(request, "cerimonyInquiryAnswerId");
return editInquiryAnswer(mapping, request, cerimonyInquiryAnswer);
}
public ActionForward editInquiryAnswer(ActionMapping mapping, HttpServletRequest request,
CerimonyInquiryAnswer cerimonyInquiryAnswer) throws Exception {
request.setAttribute("cerimonyInquiryAnswer", cerimonyInquiryAnswer);
return forwardToInquiry(mapping, request, "editAlumniCerimonyInquiryAnswer");
}
public ActionForward deleteInquiryAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiryAnswer cerimonyInquiryAnswer = getDomainObject(request, "cerimonyInquiryAnswerId");
final CerimonyInquiry cerimonyInquiry = cerimonyInquiryAnswer.getCerimonyInquiry();
cerimonyInquiryAnswer.delete();
RenderUtils.invalidateViewState();
return forwardToInquiry(mapping, request, "viewAlumniCerimonyInquiry", cerimonyInquiry);
}
public ActionForward viewInquiryAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiryAnswer cerimonyInquiryAnswer = getDomainObject(request, "cerimonyInquiryAnswerId");
request.setAttribute("cerimonyInquiryAnswer", cerimonyInquiryAnswer);
return forwardToInquiry(mapping, request, "viewAlumniCerimonyInquiryAnswer");
}
public ActionForward toggleObservationFlag(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
cerimonyInquiry.toggleObservationFlag();
return forwardToInquiry(mapping, request, "viewAlumniCerimonyInquiry", cerimonyInquiry);
}
public ActionForward prepareAddPeople(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
request.setAttribute("cerimonyInquiry", cerimonyInquiry);
final UsernameFileBean usernameFileBean = new UsernameFileBean();
request.setAttribute("usernameFileBean", usernameFileBean);
return mapping.findForward("addPeopleToCerimonyInquiry");
}
public ActionForward addPeople(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
final UsernameFileBean usernameFileBean = getRenderedObject();
final String contents =
CharStreams.toString(new InputStreamReader(usernameFileBean.getInputStream(), Charset.defaultCharset()));
final Set<String> usernames = findUsernames(contents);
cerimonyInquiry.addPeople(usernames);
return forwardToInquiry(mapping, request, "viewAlumniCerimonyInquiry", cerimonyInquiry);
}
private Set<String> findUsernames(final String contents) {
final Set<String> result = new HashSet<String>();
for (final String string : contents.split("\n")) {
result.add(string.trim());
}
return result;
}
public ActionForward viewInquiryPeople(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
request.setAttribute("cerimonyInquiry", cerimonyInquiry);
return mapping.findForward("viewInquiryPeople");
}
public ActionForward sendEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
final Sender sender = getPublicRelationsSender();
final Recipient recipient = cerimonyInquiry.createRecipient();
return EmailsDA.sendEmail(request, sender, recipient);
}
private Sender getPublicRelationsSender() {
for (final Sender sender : Sender.getAvailableSenders()) {
if (sender.getFromName().equalsIgnoreCase("Gabinete de Comunica��o e Rela��es P�blicas")) {
return sender;
}
}
return null;
}
public ActionForward exportInfoToExcel(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws IOException {
final CerimonyInquiry cerimonyInquiry = getDomainObject(request, "cerimonyInquiryId");
if (cerimonyInquiry != null) {
Collection<CerimonyInquiryPerson> requests = cerimonyInquiry.getCerimonyInquiryPersonSet();
String inquiryName = (cerimonyInquiry.getDescription() != null ? cerimonyInquiry.getDescription() : "UnnamedInquiry")
.replaceAll(" ", "_");
final String filename =
BundleUtil.getString(Bundle.ALUMNI, "label.publicRelationOffice.alumniCerimony.inquiry.report") + "_"
+ inquiryName + "_" + new DateTime().toString("ddMMyyyyHHmmss");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=\"" + filename + ".xls\"");
ServletOutputStream writer = response.getOutputStream();
exportToXls(requests, writer);
writer.flush();
response.flushBuffer();
}
return null;
}
private void exportToXls(final Collection<CerimonyInquiryPerson> requests, final OutputStream os) throws IOException {
final StyledExcelSpreadsheet spreadsheet = new StyledExcelSpreadsheet(getResourceMessage("label.alumni.main.title"));
fillSpreadSheet(requests, spreadsheet);
spreadsheet.getWorkbook().write(os);
}
private void fillSpreadSheet(final Collection<CerimonyInquiryPerson> requests, final StyledExcelSpreadsheet sheet) {
setHeaders(sheet);
for (CerimonyInquiryPerson inquiryPerson : requests) {
final Person person = inquiryPerson.getPerson();
final CerimonyInquiryAnswer inquiryAnswer = inquiryPerson.getCerimonyInquiryAnswer();
sheet.newRow();
sheet.addCell(person.getUsername());
sheet.addCell(person.getName());
sheet.addCell(person.getEmail());
final StringBuilder contacts = new StringBuilder();
for (final PartyContact partyContact : person.getPartyContactsSet()) {
if (partyContact instanceof Phone || partyContact instanceof MobilePhone) {
if (contacts.length() > 0) {
contacts.append(", ");
}
contacts.append(partyContact.getPresentationValue());
}
}
sheet.addCell(contacts.toString());
sheet.addCell((inquiryAnswer != null ? inquiryAnswer.getText() : new String("-")));
sheet.addCell(getDegrees(person));
sheet.addCell(inquiryPerson.getComment());
}
}
private String getDegrees(final Person person) {
final StringBuilder stringBuilder = new StringBuilder();
final Student student = person.getStudent();
if (student != null) {
final Set<String> names = new TreeSet<String>();
for (final Registration registration : student.getRegistrationsSet()) {
final Degree degree = registration.getDegree();
names.add(degree.getSigla());
}
for (final String name : names) {
if (stringBuilder.length() > 0) {
stringBuilder.append(", ");
}
stringBuilder.append(name);
}
}
return stringBuilder.toString();
}
private void setHeaders(final StyledExcelSpreadsheet spreadsheet) {
spreadsheet.newHeaderRow();
spreadsheet.addHeader(getResourceMessage("label.username"));
spreadsheet.addHeader(getResourceMessage("label.name"));
spreadsheet.addHeader(getResourceMessage("label.email"));
spreadsheet.addHeader(getResourceMessage("label.phone"));
spreadsheet.addHeader(getResourceMessage("label.publicRelationOffice.alumniCerimony.inquiry.people.answer"));
spreadsheet.addHeader(getResourceMessage("label.degrees"));
spreadsheet.addHeader(getResourceMessage("label.observations"));
}
static private String getResourceMessage(String key) {
return BundleUtil.getString(Bundle.ALUMNI, key);
}
}