/* * @(#)SearchPaymentProcessesAction.java * * Copyright 2009 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 pt.ist.expenditureTrackingSystem.presentationTier.actions.acquisitions; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.MissingResourceException; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import module.finance.util.Money; import module.workflow.domain.ActivityLog; import module.workflow.domain.WorkflowLog; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.comparators.ComparatorChain; import org.apache.commons.collections.comparators.ReverseComparator; 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.StrutsApplication; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.joda.time.DateTime; import org.joda.time.LocalDate; import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem; import pt.ist.expenditureTrackingSystem.domain.ProcessState; import pt.ist.expenditureTrackingSystem.domain.SavedSearch; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionItemClassification; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionProcess; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionProcessState; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionProcessStateType; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionRequest; import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionRequestItem; import pt.ist.expenditureTrackingSystem.domain.acquisitions.CPVReference; import pt.ist.expenditureTrackingSystem.domain.acquisitions.Financer; import pt.ist.expenditureTrackingSystem.domain.acquisitions.Invoice; import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcess; import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcessYear; import pt.ist.expenditureTrackingSystem.domain.acquisitions.PurchaseOrderDocument; import pt.ist.expenditureTrackingSystem.domain.acquisitions.RefundProcessState; import pt.ist.expenditureTrackingSystem.domain.acquisitions.RefundProcessStateType; import pt.ist.expenditureTrackingSystem.domain.acquisitions.activities.commons.Approve; import pt.ist.expenditureTrackingSystem.domain.acquisitions.activities.commons.Authorize; import pt.ist.expenditureTrackingSystem.domain.acquisitions.refund.RefundProcess; import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.SearchPaymentProcess; import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.SearchProcessValues; import pt.ist.expenditureTrackingSystem.domain.acquisitions.simplified.SimplifiedProcedureProcess; import pt.ist.expenditureTrackingSystem.domain.acquisitions.simplified.activities.SubmitForFundAllocation; import pt.ist.expenditureTrackingSystem.domain.dto.PayingUnitTotalBean; import pt.ist.expenditureTrackingSystem.domain.dto.UserSearchBean; import pt.ist.expenditureTrackingSystem.domain.dto.VariantBean; import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit; import pt.ist.expenditureTrackingSystem.domain.organization.Person; import pt.ist.expenditureTrackingSystem.domain.organization.Supplier; import pt.ist.expenditureTrackingSystem.domain.organization.Unit; import pt.ist.expenditureTrackingSystem.presentationTier.actions.BaseAction; import pt.ist.fenixWebFramework.renderers.utils.RenderUtils; import pt.utl.ist.fenix.tools.util.CollectionPager; import pt.utl.ist.fenix.tools.util.excel.StyledExcelSpreadsheet; @StrutsApplication(bundle = "ExpenditureResources", path = "expenditure", titleKey = "link.topBar.acquisitionProcesses", accessGroup = "logged", hint = "Expendutures") @StrutsFunctionality(app = SearchPaymentProcessesAction.class, path = "search", titleKey = "link.sideBar.acquisitionProcess.search") @Mapping(path = "/search") /** * * @author João Neves * @author Pedro Santos * @author Paulo Abrantes * @author Luis Cruz * */ public class SearchPaymentProcessesAction extends BaseAction { private static final int REQUESTS_PER_PAGE = 50; private static final String DEFAULT_SORT = "acquisitionProcessId"; private static final String STATE_SORT = "processStateDescription"; private static final Comparator<PaymentProcess> STATE_SORT_COMPARATOR = new BeanComparator("processStateOrder"); private static final ComparatorChain DEFAULT_COMPARATOR = new ComparatorChain(); static { DEFAULT_COMPARATOR.addComparator(new Comparator<PaymentProcess>() { @Override public int compare(PaymentProcess process1, PaymentProcess process2) { return process1.getPaymentProcessYear().getYear().compareTo(process2.getPaymentProcessYear().getYear()); } }); DEFAULT_COMPARATOR.addComparator(new Comparator<PaymentProcess>() { @Override public int compare(PaymentProcess process1, PaymentProcess process2) { return process1.getAcquisitionProcessNumber().compareTo(process2.getAcquisitionProcessNumber()); } }); } public ActionForward search(final ActionMapping mapping, final HttpServletRequest request, SearchPaymentProcess searchBean, boolean advanced) { return search(mapping, request, searchBean, advanced, false, getComparator(request)); } private ActionForward search(final ActionMapping mapping, final HttpServletRequest request, SearchPaymentProcess searchBean, boolean advanced, boolean skipSearch, Comparator<PaymentProcess> comparator) { Person loggedPerson = getLoggedPerson(); List<PaymentProcess> processes = new ArrayList<PaymentProcess>(); if (!skipSearch) { processes.addAll(searchBean.search()); Collections.sort(processes, comparator); } final CollectionPager<SearchPaymentProcess> pager = new CollectionPager<SearchPaymentProcess>((Collection) processes, REQUESTS_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); request.setAttribute("resultPage", pager.getPage(page)); request.setAttribute("results", pager.getPage(page)); request.setAttribute("searchBean", searchBean); request.setAttribute("person", loggedPerson); UserSearchBean userSearchBean = new UserSearchBean(loggedPerson); if (searchBean.isSearchObjectAvailable()) { userSearchBean.setSelectedSearch(searchBean.getSavedSearch()); } request.setAttribute("savingName", new VariantBean()); request.setAttribute("mySearches", userSearchBean); request.setAttribute("advanced", advanced); request.setAttribute("pagerString", getJumpParameters(searchBean)); return forward("/acquisitions/search/searchProcesses.jsp"); } public ActionForward searchJump(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SearchPaymentProcess searchBean = materializeBeanFromRequest(request); return search(mapping, request, searchBean, false); } @EntryPoint public ActionForward search(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SearchPaymentProcess searchBean = getRenderedObject("searchBean"); Person loggedPerson = getLoggedPerson(); if (searchBean == null) { searchBean = loggedPerson.hasDefaultSearch() ? new SearchPaymentProcess(loggedPerson.getDefaultSearch()) : new SearchPaymentProcess(); return search(mapping, request, searchBean, false); } else { searchBean.setSavedSearch(null); return search(mapping, request, searchBean, true); } } public ActionForward exportCurrentSearchToExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { SearchPaymentProcess searchBean = getRenderedObject("searchBean"); final Set<PaymentProcess> processes = searchBean.search(); /* final SearchProcessValues searchProcess = searchBean.getSearchProcess(); final Integer year = searchBean.getPaymentProcessYear().getYear(); final String filename = searchProcess == null ? year.toString() : searchProcess.getLocalizedName() + " - " + year; */ final String filename = "res"; exportInfoToExcel(processes, filename, response); return null; } public ActionForward viewSearch(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SavedSearch search = getDomainObject(request, "searchOID"); return search(mapping, request, new SearchPaymentProcess(search), false); } public ActionForward saveSearch(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SearchPaymentProcess searchBean = getRenderedObject("beanToSave"); String name = getRenderedObject("searchName"); if (name != null && name.length() > 0) { searchBean.persistSearch(name); RenderUtils.invalidateViewState("searchName"); } else { request.setAttribute("invalidName", true); } return search(mapping, request, searchBean, true); } public ActionForward changeSelectedClass(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SearchPaymentProcess searchBean = getRenderedObject("searchBean"); RenderUtils.invalidateViewState("searchBean"); return search(mapping, request, searchBean, true, true, getComparator(request)); } public ActionForward mySearches(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { UserSearchBean bean = getRenderedObject("mySearches"); SavedSearch search = bean.getSelectedSearch(); if (search == null) { search = getLoggedPerson().getDefaultSearch(); bean.setSelectedSearch(search); RenderUtils.invalidateViewState("mySearches"); } return search(mapping, request, new SearchPaymentProcess(search), false); } public ActionForward exportMySearchToExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { UserSearchBean bean = getRenderedObject("mySearches"); SavedSearch search = bean.getSelectedSearch(); SearchPaymentProcess searchBean = new SearchPaymentProcess(search); final Set<PaymentProcess> processes = searchBean.search(); exportInfoToExcel(processes, search.getSearchName(), response); return null; } private void exportInfoToExcel(Set<PaymentProcess> processes, String filename, HttpServletResponse response) { filename = filename.replace(' ', '_'); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; filename=" + filename + ".xls"); StyledExcelSpreadsheet spreadsheet = new StyledExcelSpreadsheet(filename); try { ServletOutputStream writer = response.getOutputStream(); fillXlsInfo(processes, spreadsheet, writer); spreadsheet.getWorkbook().write(writer); writer.flush(); response.flushBuffer(); } catch (IOException e) { throw new RuntimeException(); } } private void fillXlsInfo(Set<PaymentProcess> processes, StyledExcelSpreadsheet spreadsheet, OutputStream outputStream) throws IOException { spreadsheet.newRow(); spreadsheet.addCell(processes.size() + " " + getAcquisitionResourceMessage("label.processes")); spreadsheet.newRow(); setHeaders(spreadsheet); TreeSet<PaymentProcess> sortedProcesses = new TreeSet<PaymentProcess>(PaymentProcess.COMPARATOR_BY_YEAR_AND_ACQUISITION_PROCESS_NUMBER); sortedProcesses.addAll(processes); for (PaymentProcess process : sortedProcesses) { spreadsheet.newRow(); spreadsheet.addCell(process.getAcquisitionProcessId()); spreadsheet.addCell(process.getTypeShortDescription()); AcquisitionItemClassification classification = process.getGoodsOrServiceClassification(); spreadsheet.addCell(classification == null ? " " : classification.getLocalizedName()); spreadsheet.addCell(process.getSuppliersDescription()); spreadsheet.addCell(process.getRequest().getRequestItemsSet().size()); spreadsheet.addCell(process.getProcessStateDescription()); DateTime time = new DateTime(); if (process.getPaymentProcessYear().getYear() != time.getYear()) { time = new DateTime(process.getPaymentProcessYear().getYear().intValue(), 12, 31, 23, 59, 59, 0); } spreadsheet.addCell(describeState(process, time)); DateTime date = process.getDateFromLastActivity(); spreadsheet.addCell((date == null) ? "" : date.getDayOfMonth() + "-" + date.getMonthOfYear() + "-" + date.getYear() + " " + date.getHourOfDay() + ":" + date.getMinuteOfHour()); spreadsheet.addCell(process.getRequest().getRequester().getFirstAndLastName()); spreadsheet.addCell(process.getRequest().getRequestingUnit().getName()); final StringBuilder builderAccountingUnit = new StringBuilder(); final StringBuilder builderUnits = new StringBuilder(); for (final Financer financer : process.getFinancersWithFundsAllocated()) { final AccountingUnit accountingUnit = financer.getAccountingUnit(); if (accountingUnit != null) { if (builderAccountingUnit.length() > 0) { builderAccountingUnit.append(", "); } builderAccountingUnit.append(accountingUnit.getName()); } final Unit unit = financer.getUnit(); if (unit != null) { if (builderUnits.length() > 0) { builderUnits.append(", "); } builderUnits.append(unit.getUnit().getAcronym()); } } spreadsheet.addCell(builderAccountingUnit.length() == 0 ? " " : builderAccountingUnit.toString()); spreadsheet.addCell(builderUnits.length() == 0 ? " " : builderUnits.toString()); final Money totalValue = process.getTotalValue(); spreadsheet.addCell((totalValue == null ? Money.ZERO : totalValue).toFormatString()); final StringBuilder fundAllocationNumbers = new StringBuilder(); final StringBuilder commitmentNumbers = new StringBuilder(); final StringBuilder efectiveFundAllocationNumbers = new StringBuilder(); final StringBuilder requestOrderNumber = new StringBuilder(); LocalDate invoiceDate = null; Money invoiceValue = Money.ZERO; if (process instanceof SimplifiedProcedureProcess) { SimplifiedProcedureProcess simplifiedProcedureProcess = (SimplifiedProcedureProcess) process; final AcquisitionRequest acquisitionRequest = simplifiedProcedureProcess.getAcquisitionRequest(); for (PayingUnitTotalBean payingUnitTotal : acquisitionRequest.getTotalAmountsForEachPayingUnit()) { if ((simplifiedProcedureProcess.getFundAllocationPresent()) && (payingUnitTotal.getFinancer().isFundAllocationPresent())) { if (fundAllocationNumbers.length() > 0) { fundAllocationNumbers.append(", "); } fundAllocationNumbers.append(payingUnitTotal.getFinancer().getFundAllocationIds().trim()); } if (commitmentNumbers.length() > 0) { fundAllocationNumbers.append(", "); } String commitmentNumber = payingUnitTotal.getFinancer().getCommitmentNumber(); if (commitmentNumber != null) { commitmentNumber = commitmentNumber.trim(); if (commitmentNumber.length() > 0) { commitmentNumbers.append(commitmentNumber); } } if ((simplifiedProcedureProcess.getEffectiveFundAllocationPresent()) && (payingUnitTotal.getFinancer().isEffectiveFundAllocationPresent())) { if (efectiveFundAllocationNumbers.length() > 0) { efectiveFundAllocationNumbers.append(", "); } efectiveFundAllocationNumbers .append(payingUnitTotal.getFinancer().getEffectiveFundAllocationIds().trim()); } } boolean hasFullInvoice = false; for (final Invoice invoice : acquisitionRequest.getInvoices()) { // final AcquisitionInvoice acquisitionInvoice = (AcquisitionInvoice) invoice; final LocalDate localDate = invoice.getInvoiceDate(); if (invoiceDate == null || invoiceDate.isBefore(localDate)) { invoiceDate = localDate; } hasFullInvoice = true; // if (!hasFullInvoice) { // final String confirmationReport = acquisitionInvoice.getConfirmationReport(); // if (confirmationReport == null) { // hasFullInvoice = true; // } else { // for (int i = 0; i < confirmationReport.length(); ) { // final int ulli = confirmationReport.indexOf("<ul><li>", i); // final int q = confirmationReport.indexOf(" - Quantidade:", ulli); // final int ulliClose = confirmationReport.indexOf("</li></ul>", q); // final String itemDescription = confirmationReport.substring(i + "<ul><li>".length(), q); // final int quantity = Integer.parseInt(confirmationReport.substring(q + " - Quantidade:".length(), ulliClose)); // // invoiceValue = invoiceValue.add(calculate(acquisitionRequest, itemDescription, quantity)); // } // } // } } if (hasFullInvoice) { invoiceValue = totalValue; } final PurchaseOrderDocument purchaseOrderDocument = simplifiedProcedureProcess.getPurchaseOrderDocument(); if (purchaseOrderDocument != null) { requestOrderNumber.append(purchaseOrderDocument.getRequestId()); } } spreadsheet.addCell(fundAllocationNumbers.length() == 0 ? " " : fundAllocationNumbers.toString()); spreadsheet.addCell(commitmentNumbers.length() == 0 ? " " : commitmentNumbers.toString()); spreadsheet.addCell(requestOrderNumber.length() == 0 ? " " : requestOrderNumber.toString()); spreadsheet.addCell(efectiveFundAllocationNumbers.length() == 0 ? " " : efectiveFundAllocationNumbers.toString()); spreadsheet.addCell(invoiceDate == null ? " " : invoiceDate.toString("yyyy-MM-dd")); spreadsheet.addCell(invoiceValue.toFormatString()); DateTime creationDate = process.getCreationDate(); spreadsheet.addCell(creationDate == null ? " " : creationDate.toString("yyyy-MM-dd")); SortedSet<WorkflowLog> executionLogsSet = new TreeSet<WorkflowLog>(WorkflowLog.COMPARATOR_BY_WHEN_REVERSED); executionLogsSet.addAll(process.getExecutionLogsSet()); DateTime approvalDate = getApprovalDate(process, executionLogsSet); spreadsheet.addCell(approvalDate == null ? " " : approvalDate.toString("yyyy-MM-dd")); DateTime authorizationDate = getAuthorizationDate(process, executionLogsSet); spreadsheet.addCell(authorizationDate == null ? " " : authorizationDate.toString("yyyy-MM-dd")); } } private String describeState(PaymentProcess process, DateTime time) { if (time != new DateTime()) { DateTime lastLogInstant = process.getDateFromLastActivity(); if (lastLogInstant != null && lastLogInstant.isAfter(time)) { if (process instanceof RefundProcess) { RefundProcessState processState = findProcessState(process, time); return processState == null ? "???" : processState.getLocalizedName(); } if (process instanceof AcquisitionProcess) { AcquisitionProcessState processState = findProcessState(process, time); return processState == null ? "???" : processState.getLocalizedName(); } } } return process.getProcessStateName(); } private <StateType extends ProcessState> StateType findProcessState(PaymentProcess process, DateTime time) { ProcessState result = null; for (ProcessState processState : process.getProcessStatesSet()) { DateTime when = processState.getWhenDateTime(); if (when.getYear() == process.getPaymentProcessYear().getYear() && (result == null || when.isAfter(result.getWhenDateTime()))) { result = processState; } } return (StateType) result; } private DateTime getApprovalDate(PaymentProcess process, SortedSet<WorkflowLog> executionLogsSet) { for (WorkflowLog log : executionLogsSet) { if (log instanceof ActivityLog) { ActivityLog activityLog = (ActivityLog) log; if (SubmitForFundAllocation.class.getSimpleName().equals(activityLog.getOperation()) || Approve.class.getSimpleName().equals(activityLog.getOperation())) { return log.getWhenOperationWasRan(); } } } return null; } private DateTime getAuthorizationDate(PaymentProcess process, SortedSet<WorkflowLog> executionLogsSet) { for (WorkflowLog log : executionLogsSet) { if (log instanceof ActivityLog) { ActivityLog activityLog = (ActivityLog) log; if (Authorize.class.getSimpleName().equals(activityLog.getOperation())) { return log.getWhenOperationWasRan(); } } } return null; } private Money calculate(final AcquisitionRequest acquisitionRequest, final String itemDescription, final int quantity) { for (final AcquisitionRequestItem requestItem : acquisitionRequest.getAcquisitionRequestItemsSet()) { if (requestItem.getDescription().equals(itemDescription)) { final Money unitValue = requestItem.getCurrentUnitValue(); //final Integer currentQuantity = requestItem.getCurrentQuantity(); final BigDecimal currentVatValue = requestItem.getCurrentVatValue(); return unitValue.multiply(quantity).addPercentage(currentVatValue); } } return Money.ZERO; } private void setHeaders(StyledExcelSpreadsheet spreadsheet) { spreadsheet.newHeaderRow(); spreadsheet.addHeader(getExpenditureResourceMessage("label.acquisitionProcessId")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.acquisitionType")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.classification")); spreadsheet.addHeader(getExpenditureResourceMessage("label.suppliersDescription")); spreadsheet.addHeader(getExpenditureResourceMessage("label.itemsCount")); spreadsheet.addHeader(getExpenditureResourceMessage("label.process.state.description")); spreadsheet.addHeader(getExpenditureResourceMessage("label.processState.atEndOfYear")); spreadsheet.addHeader(getExpenditureResourceMessage("label.inactiveSince")); spreadsheet.addHeader(getExpenditureResourceMessage("label.requesterName")); spreadsheet.addHeader(getAcquisitionResourceMessage("acquisitionProcess.label.requestingUnit")); spreadsheet.addHeader(getExpenditureResourceMessage("label.accounting.units")); spreadsheet.addHeader(getExpenditureResourceMessage("label.financing.units")); spreadsheet.addHeader(getExpenditureResourceMessage("label.value")); spreadsheet.addHeader(getAcquisitionResourceMessage("financer.label.fundAllocation.identification")); spreadsheet.addHeader(getExpenditureResourceMessage("label.commitmentNumbers")); spreadsheet.addHeader(getExpenditureResourceMessage("label.requestId")); spreadsheet.addHeader(getAcquisitionResourceMessage("financer.label.effectiveFundAllocation.identification")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.invoice.date")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.invoice.value.acumulated")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.creation.date")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.approval.date")); spreadsheet.addHeader(getAcquisitionResourceMessage("label.authorization.date")); } private static String getAcquisitionResourceMessage(String key) { return getResourceMessage("resources/AcquisitionResources", key); } private static String getExpenditureResourceMessage(String key) { return getResourceMessage("resources/ExpenditureResources", key); } private static String getResourceMessage(String bundle, String key) { try { return replaceAllXMLTags(BundleUtil.getString(bundle, key), " "); } catch (MissingResourceException ex) { return key; } } private static String replaceAllXMLTags(String source, String replacement) { return source.replaceAll("<.*>", replacement); } public ActionForward configurateMySearches(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { Set<SavedSearch> systemSearches = ExpenditureTrackingSystem.getInstance().getSystemSearches(); Set<SavedSearch> userSearches = getLoggedPerson().getSaveSearches(); request.setAttribute("systemSearches", systemSearches); request.setAttribute("userSearches", userSearches); return forward("/acquisitions/search/manageMySearches.jsp"); } public ActionForward deleteMySearch(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SavedSearch search = getDomainObject(request, "savedSearchOID"); Person person = getLoggedPerson(); if (person == search.getPerson()) { search.delete(); } return configurateMySearches(mapping, form, request, response); } public ActionForward setSearchAsDefault(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request, final HttpServletResponse response) { SavedSearch search = getDomainObject(request, "savedSearchOID"); Person person = getLoggedPerson(); person.setDefaultSearch(search); return configurateMySearches(mapping, form, request, response); } private String getJumpParameters(SearchPaymentProcess searchBean) { StringBuilder builder = new StringBuilder("&processId="); if (searchBean.getProcessId() != null) { builder.append(searchBean.getProcessId()); } builder.append("&payingUnit="); if (searchBean.getPayingUnit() != null) { builder.append(searchBean.getPayingUnit().getExternalId()); } builder.append("&requestDocumentId="); if (searchBean.getRequestDocumentId() != null) { builder.append(searchBean.getRequestDocumentId()); } builder.append("&proposalId="); if (searchBean.getProposalId() != null) { builder.append(searchBean.getProposalId()); } builder.append("&refundeeName="); if (searchBean.getRefundeeName() != null) { builder.append(searchBean.getRefundeeName()); } builder.append("&requestingPerson="); if (searchBean.getRequestingPerson() != null) { builder.append(searchBean.getRequestingPerson().getExternalId()); } builder.append("&taker="); if (searchBean.getTaker() != null) { builder.append(searchBean.getTaker().getExternalId()); } builder.append("&accountManager="); if (searchBean.getAccountManager() != null) { builder.append(searchBean.getAccountManager().getExternalId()); } builder.append("&requestingUnit="); if (searchBean.getRequestingUnit() != null) { builder.append(searchBean.getRequestingUnit().getExternalId()); } builder.append("&savedSearch="); if (searchBean.getSavedSearch() != null) { builder.append(searchBean.getSavedSearch().getExternalId()); } builder.append("&supplier="); if (searchBean.getSupplier() != null) { builder.append(searchBean.getSupplier().getExternalId()); } builder.append("&accountingUnit="); if (searchBean.getAccountingUnit() != null) { builder.append(searchBean.getAccountingUnit().getExternalId()); } builder.append("&year="); if (searchBean.getPaymentProcessYear() != null) { builder.append(searchBean.getPaymentProcessYear().getExternalId()); } builder.append("&hasAvailableAndAccessibleActivityForUser="); builder.append(searchBean.getHasAvailableAndAccessibleActivityForUser()); builder.append("&responsibleUnitSetOnly="); builder.append(searchBean.getResponsibleUnitSetOnly()); builder.append("&showOnlyAcquisitionsExcludedFromSupplierLimit="); builder.append(searchBean.getShowOnlyAcquisitionsExcludedFromSupplierLimit()); builder.append("&showOnlyAcquisitionsWithAdditionalCosts="); builder.append(searchBean.getShowOnlyAcquisitionsWithAdditionalCosts()); builder.append("&showOnlyWithUnreadComments="); builder.append(searchBean.getShowOnlyWithUnreadComments()); builder.append("&acquisitionProcessStateType="); if (searchBean.getAcquisitionProcessStateType() != null) { builder.append(searchBean.getAcquisitionProcessStateType().name()); } builder.append("&showPriorityOnly="); builder.append(searchBean.getShowPriorityOnly()); builder.append("&refundProcessStateType="); if (searchBean.getRefundProcessStateType() != null) { builder.append(searchBean.getRefundProcessStateType().name()); } builder.append("&searchProcessValue="); if (searchBean.getSearchProcess() != null) { builder.append(searchBean.getSearchProcess().name()); } builder.append("&cpvReference="); if (searchBean.getCpvReference() != null) { builder.append(searchBean.getCpvReference().getCode()); } return builder.toString(); } private SearchPaymentProcess materializeBeanFromRequest(HttpServletRequest request) { SearchPaymentProcess bean = new SearchPaymentProcess(); bean.setProcessId(request.getParameter("processId")); bean.setRequestDocumentId(request.getParameter("requestDocumentId")); bean.setProposalId(request.getParameter("proposalId")); bean.setRefundeeName(request.getParameter("refundeeName")); bean.setPayingUnit((Unit) getDomainObject(request, "payingUnit")); bean.setRequestingPerson((Person) getDomainObject(request, "requestingPerson")); bean.setTaker((Person) getDomainObject(request, "taker")); bean.setAccountManager((Person) getDomainObject(request, "accountManager")); bean.setRequestingUnit((Unit) getDomainObject(request, "requestingUnit")); bean.setSavedSearch((SavedSearch) getDomainObject(request, "savedSearch")); bean.setSupplier((Supplier) getDomainObject(request, "supplier")); bean.setAccountingUnit((AccountingUnit) getDomainObject(request, "accountingUnit")); bean.setPaymentProcessYear((PaymentProcessYear) getDomainObject(request, "year")); bean.setHasAvailableAndAccessibleActivityForUser(Boolean.valueOf(request .getParameter("hasAvailableAndAccessibleActivityForUser"))); bean.setResponsibleUnitSetOnly(Boolean.valueOf(request.getParameter("responsibleUnitSetOnly"))); bean.setShowOnlyAcquisitionsExcludedFromSupplierLimit(Boolean.valueOf(request .getParameter("showOnlyAcquisitionsExcludedFromSupplierLimit"))); bean.setShowOnlyAcquisitionsWithAdditionalCosts(Boolean.valueOf(request .getParameter("showOnlyAcquisitionsWithAdditionalCosts"))); bean.setShowOnlyWithUnreadComments(Boolean.valueOf(request.getParameter("showOnlyWithUnreadComments"))); bean.setShowPriorityOnly(Boolean.valueOf(request.getParameter("showPriorityOnly"))); String searchValue = request.getParameter("searchProcessValue"); if (!StringUtils.isEmpty(searchValue)) { bean.setSearchProcess(SearchProcessValues.valueOf(searchValue)); } String type = request.getParameter("acquisitionProcessStateType"); if (!StringUtils.isEmpty(type)) { bean.setAcquisitionProcessStateType(AcquisitionProcessStateType.valueOf(type)); } type = request.getParameter("refundProcessStateType"); if (!StringUtils.isEmpty(type)) { bean.setRefundProcessStateType(RefundProcessStateType.valueOf(type)); } String cpvReference = request.getParameter("cpvReference"); if (!StringUtils.isEmpty(cpvReference)) { bean.setCpvReference(CPVReference.getCPVCode(cpvReference)); } return bean; } protected Comparator<PaymentProcess> getComparator(HttpServletRequest request) { String sortParameter = request.getParameter("sortBy"); Comparator<PaymentProcess> comparator = null; if (StringUtils.isEmpty(sortParameter)) { comparator = DEFAULT_COMPARATOR; } else { String[] split = sortParameter.split("="); if (split[0].equals(DEFAULT_SORT)) { comparator = DEFAULT_COMPARATOR; } else if (split[0].equals(STATE_SORT)) { comparator = STATE_SORT_COMPARATOR; } else { comparator = new NullResilientBeanComparator(split[0]); } if (split.length == 2 && split[1].indexOf("desc") > -1) { comparator = new ReverseComparator(comparator); } } return comparator; } public static class NullResilientBeanComparator extends BeanComparator { public NullResilientBeanComparator(String property) { super(property); } @Override public int compare(Object o1, Object o2) { if (o1 == null && o2 != null) { return 1; } if (o2 == null && o1 != null) { return -1; } if (o1 == null && o2 == null) { return 0; } return super.compare(o1, o2); } } }