/* * @(#)SearchMissionsAction.java * * Copyright 2011 Instituto Superior Tecnico * Founding Authors: Luis Cruz, Nuno Ochoa, Paulo Abrantes * * https://fenix-ashes.ist.utl.pt/ * * This file is part of the Expenditure Tracking Module. * * The Expenditure Tracking Module 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. * * The Expenditure Tracking Module 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 the Expenditure Tracking Module. If not, see <http://www.gnu.org/licenses/>. * */ package module.mission.presentationTier.action; import java.io.IOException; import java.util.Collection; import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import module.mission.domain.Mission; import module.mission.domain.MissionFinancer; import module.mission.domain.MissionProcess; import module.mission.domain.util.MissionState; import module.mission.presentationTier.dto.SearchMissionsDTO; import module.organization.domain.Person; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.bennu.struts.annotations.Mapping; import org.fenixedu.bennu.struts.portal.EntryPoint; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.joda.time.DateTime; import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit; import pt.ist.expenditureTrackingSystem.domain.organization.Unit; import pt.ist.expenditureTrackingSystem.presentationTier.actions.BaseAction; import pt.ist.fenixWebFramework.renderers.utils.CollectionPager; import pt.utl.ist.fenix.tools.util.excel.Spreadsheet; import pt.utl.ist.fenix.tools.util.excel.Spreadsheet.Row; @StrutsFunctionality(app = MissionProcessAction.class, path = "searchMissionProcess", titleKey = "link.sideBar.missionSearch") /** * * @author Luis Cruz * */ @Mapping(path = "/searchMissions") public class SearchMissionsAction extends BaseAction { private static final int RESULTS_PER_PAGE = 50; @EntryPoint public ActionForward prepare(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { request.setAttribute("searchBean", new SearchMissionsDTO()); return forward("/mission/searchMissions.jsp"); } public ActionForward search(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SearchMissionsDTO searchMissions = getRenderedObject("searchBean") != null ? (SearchMissionsDTO) getRenderedObject("searchBean") : new SearchMissionsDTO( request); return search(searchMissions, request); } public ActionForward search(final SearchMissionsDTO searchMissions, final HttpServletRequest request) { final Collection<Mission> results = doPagination(request, searchMissions.sortedSearch()); request.setAttribute("searchResults", results); request.setAttribute("searchBean", searchMissions); return forward("/mission/searchMissions.jsp"); } public ActionForward searchByPayingUnit(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { final Unit unit = getDomainObject(request, "unitId"); if (unit == null) { return search(mapping, form, request, response); } final SearchMissionsDTO searchMissions = new SearchMissionsDTO(request); searchMissions.setPayingUnit(unit); searchMissions.setForeign(Boolean.TRUE); searchMissions.setNational(Boolean.TRUE); return search(searchMissions, request); } private static Collection<Mission> doPagination(final HttpServletRequest request, Collection<Mission> allResults) { final CollectionPager<Mission> pager = new CollectionPager<Mission>(allResults, RESULTS_PER_PAGE); request.setAttribute("collectionPager", pager); request.setAttribute("numberOfPages", Integer.valueOf(pager.getNumberOfPages())); final String pageParameter = request.getParameter("pageNumber"); final Integer page = StringUtils.isEmpty(pageParameter) ? Integer.valueOf(1) : Integer.valueOf(pageParameter); request.setAttribute("pageNumber", page); return pager.getPage(page); } public ActionForward downloadSearchResult(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { final SearchMissionsDTO searchMissions = new SearchMissionsDTO(request); final List<Mission> searchResult = searchMissions.sortedSearch(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; filename=searchResult.xls"); final Spreadsheet spreadsheet = new Spreadsheet("SearchResult"); spreadsheet.setHeader(getExpendituresMessage("label.acquisitionProcessId")); spreadsheet.setHeader(getMissionsMessage("label.mission.type")); spreadsheet.setHeader(getMissionsMessage("label.mission.destination")); spreadsheet.setHeader(getMissionsMessage("label.mission.departure")); spreadsheet.setHeader(getMissionsMessage("label.module.mission.front.page.list.duration")); spreadsheet.setHeader(getMissionsMessage("label.mission.items")); spreadsheet.setHeader(getMissionsMessage("label.mission.value")); spreadsheet.setHeader(getMissionsMessage("label.mission.financer")); spreadsheet.setHeader(getExpendituresMessage("label.accounting.units")); spreadsheet.setHeader(getMissionsMessage("label.mission.requester.person")); spreadsheet.setHeader(getMissionsMessage("label.mission.participants")); spreadsheet.setHeader(getMissionsMessage("label.mission.inactiveSince")); spreadsheet.setHeader(getMissionsMessage("label.mission.canceled")); addMissionStateHeaders(spreadsheet); for (final Mission mission : searchResult) { final MissionProcess missionProcess = mission.getMissionProcess(); final Row row = spreadsheet.addRow(); row.setCell(missionProcess.getProcessIdentification()); row.setCell(getMissionsMessage(mission.getGrantOwnerEquivalence() ? "title.mission.process.type.grantOwnerEquivalence" : "title.mission.process.type.dislocation")); row.setCell(mission.getDestinationDescription()); row.setCell(mission.getDaparture().toString("yyyy-MM-dd HH:mm")); row.setCell(mission.getDurationInDays()); row.setCell(mission.getMissionItemsCount()); row.setCell(mission.getValue().toFormatString()); row.setCell(getFinancingUnits(mission)); row.setCell(getAccountingUnits(mission)); row.setCell(mission.getRequestingPerson().getFirstAndLastName()); final StringBuilder builder = new StringBuilder(); for (final Person person : mission.getParticipantesSet()) { if (builder.length() > 0) { builder.append(", "); } builder.append(person.getUser().getProfile().getFullName()); } row.setCell(builder.toString()); final DateTime lastActivity = missionProcess.getDateFromLastActivity(); row.setCell(lastActivity == null ? "" : lastActivity.toString("yyyy-MM-dd HH:mm")); row.setCell(getExpendituresMessage(missionProcess.isCanceled() ? "button.yes" : "button.no")); addMissionStateContent(row, missionProcess); } try { ServletOutputStream writer = response.getOutputStream(); spreadsheet.exportToXLSSheet(writer); } catch (final IOException e) { throw new Error(e); } return null; } private void addMissionStateHeaders(Spreadsheet spreadsheet) { for (MissionState state : MissionState.values()) { spreadsheet.setHeader(state.getLocalizedName()); } } private void addMissionStateContent(Row row, MissionProcess process) { for (MissionState state : MissionState.values()) { if (!state.isRequired(process)) { row.setCell("-"); } else { row.setCell(state.getStateProgress(process).getLocalizedName()); } } } private String getMissionsMessage(String label) { return BundleUtil.getString("resources.MissionResources", label); } private String getExpendituresMessage(String label) { return BundleUtil.getString("resources.ExpenditureResources", label); } private String getFinancingUnits(Mission mission) { final StringBuilder builder = new StringBuilder(); for (final MissionFinancer financer : mission.getFinancerSet()) { final Unit unit = financer.getUnit(); if (unit != null) { if (builder.length() > 0) { builder.append(", "); } builder.append(unit.getUnit().getAcronym()); } } return builder.toString(); } private String getAccountingUnits(final Mission mission) { final StringBuilder builder = new StringBuilder(); for (final MissionFinancer financer : mission.getFinancerSet()) { final AccountingUnit accountingUnit = financer.getAccountingUnit(); if (accountingUnit != null) { if (builder.length() > 0) { builder.append(", "); } builder.append(accountingUnit.getName()); } } return builder.toString(); } }