/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.tem.document.web.struts; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanComparator; 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.kuali.kfs.module.tem.TemConstants; import org.kuali.kfs.module.tem.TemKeyConstants; import org.kuali.kfs.module.tem.batch.service.ExpenseImportByTripService; import org.kuali.kfs.module.tem.businessobject.AgencyCorrectionChangeGroup; import org.kuali.kfs.module.tem.businessobject.AgencyEntryFull; import org.kuali.kfs.module.tem.document.TemCorrectionProcessDocument; import org.kuali.kfs.module.tem.document.service.TemCorrectionDocumentService; import org.kuali.kfs.module.tem.service.AgencyEntryGroupService; import org.kuali.kfs.module.tem.service.AgencyEntryService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.Message; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase; import org.kuali.rice.kns.web.struts.action.KualiTableRenderAction; import org.kuali.rice.kns.web.struts.form.KualiTableRenderFormMetadata; import org.kuali.rice.kns.web.ui.Column; import org.kuali.rice.krad.comparator.NumericValueComparator; import org.kuali.rice.krad.comparator.TemporalValueComparator; import org.kuali.rice.krad.util.ErrorMessage; import org.kuali.rice.krad.util.GlobalVariables; public class TemCorrectionAction extends KualiDocumentActionBase implements KualiTableRenderAction { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TemCorrectionAction.class); public static final int DEFAULT_RECORD_COUNT_FUNCTIONALITY_LIMIT = 1000; public static final int DEFAULT_RECORDS_PER_PAGE = 10; protected static AgencyEntryGroupService agencyEntryGroupService; protected static AgencyEntryService agencyEntryService; protected static DateTimeService dateTimeService; protected static ConfigurationService ConfigurationService; protected static ExpenseImportByTripService expenseImportByTripService; public static final String SYSTEM_AND_EDIT_METHOD_ERROR_KEY = "systemAndEditMethod"; private static final int MAX_ROWS = 25; @Override public ActionForward switchToPage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TemCorrectionForm correctionForm = (TemCorrectionForm) form; int maxRowsPerPage = MAX_ROWS; KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); agencyEntrySearchResultTableMetadata.jumpToPage(agencyEntrySearchResultTableMetadata.getSwitchToPageNumber(), correctionForm.getDisplayEntries().size(), maxRowsPerPage); agencyEntrySearchResultTableMetadata.setColumnToSortIndex(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()); return mapping.findForward(KFSConstants.MAPPING_BASIC); } @Override public ActionForward sort(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { TemCorrectionForm correctionForm = (TemCorrectionForm) form; int maxRowsPerPage = MAX_ROWS; KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); List<Column> columns = SpringContext.getBean(TemCorrectionDocumentService.class).getTableRenderColumnMetadata(correctionForm.getDocument().getDocumentNumber()); String propertyToSortName = columns.get(agencyEntrySearchResultTableMetadata.getColumnToSortIndex()).getPropertyName(); Comparator valueComparator = columns.get(agencyEntrySearchResultTableMetadata.getColumnToSortIndex()).getValueComparator(); boolean sortDescending = false; if (agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex() == agencyEntrySearchResultTableMetadata.getColumnToSortIndex()) { // clicked sort on the same column that was previously sorted, so we will reverse the sort order sortDescending = !agencyEntrySearchResultTableMetadata.isSortDescending(); agencyEntrySearchResultTableMetadata.setSortDescending(sortDescending); } agencyEntrySearchResultTableMetadata.setSortDescending(sortDescending); // sort the list now so that it will be rendered correctly sortList(correctionForm.getDisplayEntries(), propertyToSortName, valueComparator, sortDescending); // sorting, so go back to the first page agencyEntrySearchResultTableMetadata.jumpToFirstPage(correctionForm.getDisplayEntries().size(), maxRowsPerPage); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Called when selecting the system and method. If this button is pressed, the document should be reset as if it is the first * time it was pressed. */ public ActionForward selectSystemEditMethod(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("selectSystemEditMethod() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); if (checkMainDropdown(correctionForm)) { // Clear out any entries that were already loaded document.setCorrectionInputFileName(null); document.setCorrectionOutputFileName(null); document.setCorrectionTripTotalAmount(null); document.setCorrectionRowCount(null); document.getCorrectionChangeGroup().clear(); correctionForm.setDataLoadedFlag(false); correctionForm.setDeleteFileFlag(false); correctionForm.setEditableFlag(false); correctionForm.setManualEditFlag(false); correctionForm.setShowOutputFlag(false); correctionForm.setAllEntries(new ArrayList<AgencyEntryFull>()); correctionForm.setRestrictedFunctionalityMode(false); correctionForm.setProcessInBatch(true); String newestAgencyMatchingErrorFileName = agencyEntryGroupService.getNewestAgencyMatchingErrorFileName(); if (newestAgencyMatchingErrorFileName != null) { document.setCorrectionInputFileName(newestAgencyMatchingErrorFileName); } } else { correctionForm.setEditMethod(""); } correctionForm.setPreviousEditMethod(correctionForm.getEditMethod()); correctionForm.setPreviousInputGroupId(null); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Validate that choose system and edit method are selected */ protected boolean checkMainDropdown(TemCorrectionForm errorCorrectionForm) { LOG.debug("checkMainDropdown() started"); boolean ret = true; if (StringUtils.isEmpty(errorCorrectionForm.getEditMethod())) { GlobalVariables.getMessageMap().putError(SYSTEM_AND_EDIT_METHOD_ERROR_KEY, TemKeyConstants.ERROR_TMCP_EDITMETHODFIELD_REQUIRED); ret = false; } if (ret && TemCorrectionDocumentService.CORRECTION_TYPE_REMOVE_GROUP_FROM_PROCESSING.equals(errorCorrectionForm.getEditMethod()) && !TemCorrectionDocumentService.SYSTEM_DATABASE.equals(errorCorrectionForm.getChooseSystem())) { GlobalVariables.getMessageMap().putError(SYSTEM_AND_EDIT_METHOD_ERROR_KEY, TemKeyConstants.ERROR_TMCP_REMOVE_GROUP_REQUIRES_DATABASE); ret = false; } return ret; } /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#execute(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("execute() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; // Init our services once if (agencyEntryGroupService == null) { TemCorrectionAction.agencyEntryGroupService = SpringContext.getBean(AgencyEntryGroupService.class); TemCorrectionAction.agencyEntryService = SpringContext.getBean(AgencyEntryService.class); TemCorrectionAction.dateTimeService = SpringContext.getBean(DateTimeService.class); TemCorrectionAction.ConfigurationService = SpringContext.getBean(ConfigurationService.class); TemCorrectionAction.expenseImportByTripService = SpringContext.getBean(ExpenseImportByTripService.class); } TemCorrectionForm rForm = (TemCorrectionForm) form; LOG.debug("execute() methodToCall: " + rForm.getMethodToCall()); Collection<AgencyEntryFull> persistedAgencyEntries = null; if (!(KFSConstants.DOC_HANDLER_METHOD.equals(rForm.getMethodToCall()) || KFSConstants.RELOAD_METHOD_TO_CALL.equals(rForm.getMethodToCall()))) { restoreSystemAndEditMethod(rForm); if (!rForm.isRestrictedFunctionalityMode()) { loadAllEntries(correctionForm.getInputGroupId(), rForm); rForm.setDisplayEntries(new ArrayList<AgencyEntryFull>(rForm.getAllEntries())); if (!KFSConstants.TableRenderConstants.SORT_METHOD.equals(rForm.getMethodToCall())) { // if sorting, we'll let the action take care of the sorting KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = rForm.getAgencyEntrySearchResultTableMetadata(); if (agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex() != -1) { List<Column> columns = SpringContext.getBean(TemCorrectionDocumentService.class).getTableRenderColumnMetadata(rForm.getDocument().getDocumentNumber()); String propertyToSortName = columns.get(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()).getPropertyName(); Comparator valueComparator = columns.get(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()).getValueComparator(); sortList(rForm.getDisplayEntries(), propertyToSortName, valueComparator, agencyEntrySearchResultTableMetadata.isSortDescending()); } if (rForm.getAllEntries() != null) { int maxRowsPerPage = 25; agencyEntrySearchResultTableMetadata.jumpToPage(agencyEntrySearchResultTableMetadata.getViewedPageNumber(), rForm.getDisplayEntries().size(), maxRowsPerPage); agencyEntrySearchResultTableMetadata.setColumnToSortIndex(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()); } } } } ActionForward af = super.execute(mapping, form, request, response); return af; } /** * Edit a row in the group */ public ActionForward editManualEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("editManualEdit() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); int entryId = Integer.parseInt(getImageContext(request, "entryId")); // Find it and put it in the editing spot correctionForm.setEntryForManualEdit(correctionForm.getAllEntries().get(entryId - 1)); correctionForm.setShowSummaryOutputFlag(true); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Add a new row to the group */ public ActionForward addManualEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("addManualEdit() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); if (validAgencyEntry(correctionForm.getEntryForManualEdit())) { // new entryId is always 0, so give it a unique Id, SequenceAccessorService is used. int newEntryId = correctionForm.getAllEntries().size() + 1; correctionForm.getEntryForManualEdit().setEntryId(new Integer(newEntryId)); correctionForm.getAllEntries().add(correctionForm.getEntryForManualEdit()); // Clear out the additional row correctionForm.clearEntryForManualEdit(); } // Calculate the debit/credit/row count updateDocumentSummary(document, correctionForm.getAllEntries(), correctionForm.isRestrictedFunctionalityMode()); correctionForm.setShowSummaryOutputFlag(true); // we've modified the list of all entries, so repersist it correctionForm.setDisplayEntries(new ArrayList<AgencyEntryFull>(correctionForm.getAllEntries())); // list has changed, we'll need to repage and resort applyPagingAndSortingFromPreviousPageView(correctionForm); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Delete a row from the group */ public ActionForward deleteManualEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("deleteManualEdit() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); int entryId = Integer.parseInt(getImageContext(request, "entryId")); // Find it and remove it for (Iterator iter = correctionForm.getAllEntries().iterator(); iter.hasNext();) { AgencyEntryFull element = (AgencyEntryFull) iter.next(); if (element.getEntryId() == entryId) { iter.remove(); break; } } // Calculate the debit/credit/row count updateDocumentSummary(document, correctionForm.getAllEntries(), correctionForm.isRestrictedFunctionalityMode()); correctionForm.setShowSummaryOutputFlag(true); // we've modified the list of all entries, so repersist it correctionForm.setDisplayEntries(new ArrayList<AgencyEntryFull>(correctionForm.getAllEntries())); // list has changed, we'll need to repage and resort applyPagingAndSortingFromPreviousPageView(correctionForm); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Save a changed row in the group */ public ActionForward saveManualEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("saveManualEdit() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); if (validAgencyEntry(correctionForm.getEntryForManualEdit())) { int entryId = correctionForm.getEntryForManualEdit().getEntryId(); // Find it and replace it with the one from the edit spot for (Iterator<AgencyEntryFull> iter = correctionForm.getAllEntries().iterator(); iter.hasNext();) { AgencyEntryFull element = iter.next(); if (element.getEntryId() == entryId) { iter.remove(); } } correctionForm.getAllEntries().add(correctionForm.getEntryForManualEdit()); // we've modified the list of all entries, so repersist it correctionForm.setDisplayEntries(new ArrayList<AgencyEntryFull>(correctionForm.getAllEntries())); // Clear out the additional row correctionForm.clearEntryForManualEdit(); } // Calculate the debit/credit/row count updateDocumentSummary(document, correctionForm.getAllEntries(), correctionForm.isRestrictedFunctionalityMode()); // list has changed, we'll need to repage and resort applyPagingAndSortingFromPreviousPageView(correctionForm); return mapping.findForward(KFSConstants.MAPPING_BASIC); } private boolean validAgencyEntry(AgencyEntryFull entryForManualEdit) { List<ErrorMessage> errors = expenseImportByTripService.validateMandatoryFieldsPresent(entryForManualEdit); for(ErrorMessage error: errors) { GlobalVariables.getMessageMap().putError("searchResults", error.toString()); } return errors.isEmpty(); } /** * Called when Load Group button is pressed */ public ActionForward loadGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("loadGroup() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; String batchDirectory = SpringContext.getBean(TemCorrectionDocumentService.class).getBatchFileDirectoryName(); if (checkAgencyEntryGroupSelection(correctionForm)) { TemCorrectionProcessDocument doc = (TemCorrectionProcessDocument) correctionForm.getDocument(); doc.setCorrectionInputFileName(correctionForm.getInputGroupId()); int inputGroupSize = agencyEntryService.getGroupCount(correctionForm.getInputGroupId()); int recordCountFunctionalityLimit = DEFAULT_RECORD_COUNT_FUNCTIONALITY_LIMIT; correctionForm.setPersistedOriginEntriesMissing(false); correctionForm.setRestrictedFunctionalityMode(false); loadAllEntries(correctionForm.getInputGroupId(), correctionForm); if (correctionForm.getAllEntries().size() > 0) { if (TemCorrectionDocumentService.CORRECTION_TYPE_MANUAL.equals(correctionForm.getEditMethod())) { correctionForm.setManualEditFlag(true); correctionForm.setEditableFlag(false); correctionForm.setDeleteFileFlag(false); } correctionForm.setDataLoadedFlag(true); } else { GlobalVariables.getMessageMap().putError("documentsInSystem", TemKeyConstants.ERROR_TMCP_NO_RECORDS); } TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); if (document.getCorrectionChangeGroup().isEmpty()) { document.addCorrectionChangeGroup(new AgencyCorrectionChangeGroup()); } correctionForm.setPreviousInputGroupId(correctionForm.getInputGroupId()); } correctionForm.setShowOutputFlag(false); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * This method checks that an origin entry group has been selected; and this method is intended to be used for selecting an * origin entry group when using the database method If a group has not been loaded, then an error will be added to the screen * * @param correctionForm * @return */ protected boolean checkAgencyEntryGroupSelection(TemCorrectionForm correctionForm) { LOG.debug("checkOriginEntryGroupSelection() started"); if (correctionForm.getInputGroupId() == null) { GlobalVariables.getMessageMap().putError("documentLoadError", TemKeyConstants.ERROR_TMCP_AGENCYGROUP_REQUIRED_FOR_ROUTING); return false; } return true; } /** * This method updates the summary information contained within each document depending on the document status, editing method, * whether only the rows matching criteria are shown, and whether the output is being shown If the form is in restricted * functionality mode (and the override param is not set to true), then the summaries will be cleared out * * @param document the document * @param entries the entries to summarize * @param clearOutSummary whether to set the doc summary to 0s */ protected void updateDocumentSummary(TemCorrectionProcessDocument document, List<AgencyEntryFull> entries, boolean clearOutSummary) { if (clearOutSummary) { document.setCorrectionTripTotalAmount(null); document.setCorrectionRowCount(null); } else { // update the summary section document.setCorrectionRowCount(entries.size()); KualiDecimal tripTotal = KualiDecimal.ZERO; for(AgencyEntryFull agency: entries) { if(null != agency.getTripExpenseAmount()) { tripTotal = tripTotal.add(agency.getTripExpenseAmount()); } } document.setCorrectionTripTotalAmount(tripTotal); } } /** * Show all entries for Manual edit with groupId and persist these entries to the DB The restricted functionality mode flag MUST * BE SET PRIOR TO CALLING this method. * * @param groupId * @param correctionForm * @throws Exception */ protected void loadAllEntries(String fileNameWithPath, TemCorrectionForm correctionForm) { LOG.debug("loadAllEntries() started"); TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); if (!correctionForm.isRestrictedFunctionalityMode()) { List<AgencyEntryFull> searchResults = new ArrayList(); Map loadErrorMap = agencyEntryService.getEntriesByGroupIdWithPath(fileNameWithPath, searchResults); correctionForm.setAllEntries(searchResults); int maxRowsPerPage = MAX_ROWS; KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); agencyEntrySearchResultTableMetadata.jumpToFirstPage(correctionForm.getAllEntries().size(), maxRowsPerPage); // put errors on GlobalVariables if (loadErrorMap != null && loadErrorMap.size() > 0) { Iterator iter = loadErrorMap.keySet().iterator(); while (iter.hasNext()) { Integer lineNumber = (Integer) iter.next(); List<Message> messageList = (List<Message>) loadErrorMap.get(lineNumber); for (Message errorMmessage : messageList) { GlobalVariables.getMessageMap().putError("fileUpload", KFSKeyConstants.ERROR_INVALID_FORMAT_ORIGIN_ENTRY_FROM_TEXT_FILE, new String[] { lineNumber.toString(), errorMmessage.toString() }); } } } else { try { loadAllEntries(searchResults, correctionForm); } catch (Exception e) { throw new RuntimeException(e); } } } } protected void loadAllEntries(List<AgencyEntryFull> searchResults, TemCorrectionForm correctionForm) throws Exception { TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); correctionForm.setAllEntries(searchResults); correctionForm.setDisplayEntries(new ArrayList<AgencyEntryFull>(searchResults)); updateDocumentSummary(document, correctionForm.getAllEntries(), correctionForm.isRestrictedFunctionalityMode()); int maxRowsPerPage = 25; KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); agencyEntrySearchResultTableMetadata.jumpToFirstPage(correctionForm.getDisplayEntries().size(), maxRowsPerPage); agencyEntrySearchResultTableMetadata.setColumnToSortIndex(-1); } public ActionForward manualEdit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LOG.debug("manualEdit() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); correctionForm.clearEntryForManualEdit(); correctionForm.setEditableFlag(true); correctionForm.setManualEditFlag(false); int maxRowsPerPage = 25; KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); agencyEntrySearchResultTableMetadata.jumpToFirstPage(correctionForm.getAllEntries().size(), maxRowsPerPage); agencyEntrySearchResultTableMetadata.setColumnToSortIndex(-1); return mapping.findForward(KFSConstants.MAPPING_BASIC); } protected void applyPagingAndSortingFromPreviousPageView(TemCorrectionForm correctionForm) { KualiTableRenderFormMetadata agencyEntrySearchResultTableMetadata = correctionForm.getAgencyEntrySearchResultTableMetadata(); if (agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex() != -1) { List<Column> columns = SpringContext.getBean(TemCorrectionDocumentService.class).getTableRenderColumnMetadata(correctionForm.getDocument().getDocumentNumber()); String propertyToSortName = columns.get(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()).getPropertyName(); Comparator valueComparator = columns.get(agencyEntrySearchResultTableMetadata.getPreviouslySortedColumnIndex()).getValueComparator(); sortList(correctionForm.getDisplayEntries(), propertyToSortName, valueComparator, agencyEntrySearchResultTableMetadata.isSortDescending()); } int maxRowsPerPage = 25; agencyEntrySearchResultTableMetadata.jumpToPage(agencyEntrySearchResultTableMetadata.getViewedPageNumber(), correctionForm.getDisplayEntries().size(), maxRowsPerPage); } protected void sortList(List<AgencyEntryFull> list, String propertyToSortName, Comparator valueComparator, boolean sortDescending) { if (list != null) { if (valueComparator instanceof NumericValueComparator || valueComparator instanceof TemporalValueComparator) { // hack alert: NumericValueComparator can only compare strings, so we use the KualiDecimal and Date's built in // mechanism compare values using // the comparable comparator valueComparator = new Comparator() { @Override public int compare(Object obj1, Object obj2) { if (obj1 == null) { return -1; } if (obj2 == null) { return 1; } return ((Comparable) obj1).compareTo(obj2); } }; } if (sortDescending) { valueComparator = new ReverseComparator(valueComparator); } Collections.sort(list, new BeanComparator(propertyToSortName, valueComparator)); } } /** * This method restores the system and edit method to the selected values when the last call to the selectSystemAndMethod action * was made * * @param correctionForm * @return if the system and edit method were changed while not in read only mode and the selectSystemEditMethod method was not * being called if true, this is ususally not a good condition */ protected boolean restoreSystemAndEditMethod(TemCorrectionForm correctionForm) { boolean readOnly = correctionForm.getEditingMode().get(TemConstants.TravelEditMode.FULL_ENTRY) != null; if (!"selectSystemEditMethod".equals(correctionForm.getMethodToCall()) && !readOnly) { if (!StringUtils.equals(correctionForm.getPreviousEditMethod(), correctionForm.getEditMethod()) || !StringUtils.equals(correctionForm.getPreviousChooseSystem(), correctionForm.getChooseSystem())) { correctionForm.setChooseSystem(correctionForm.getPreviousChooseSystem()); correctionForm.setEditMethod(correctionForm.getPreviousEditMethod()); return true; } } return false; } /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#route(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("blanketApprove() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; if (prepareForRoute(correctionForm)) { if (correctionForm.isDataLoadedFlag() && !correctionForm.isRestrictedFunctionalityMode()) { int maxRowsPerPage = MAX_ROWS; // display the entire list after routing correctionForm.getDisplayEntries().clear(); correctionForm.getDisplayEntries().addAll(correctionForm.getAllEntries()); correctionForm.getAgencyEntrySearchResultTableMetadata().jumpToFirstPage(correctionForm.getDisplayEntries().size(), maxRowsPerPage); } return super.blanketApprove(mapping, form, request, response); } else { return mapping.findForward(KFSConstants.MAPPING_BASIC); } } /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#blanketApprove(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward blanketApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LOG.debug("blanketApprove() started"); TemCorrectionForm correctionForm = (TemCorrectionForm) form; if (prepareForRoute(correctionForm)) { if (correctionForm.isDataLoadedFlag() && !correctionForm.isRestrictedFunctionalityMode()) { int maxRowsPerPage = MAX_ROWS; // display the entire list after routing correctionForm.getDisplayEntries().clear(); correctionForm.getDisplayEntries().addAll(correctionForm.getAllEntries()); correctionForm.getAgencyEntrySearchResultTableMetadata().jumpToFirstPage(correctionForm.getDisplayEntries().size(), maxRowsPerPage); } return super.blanketApprove(mapping, form, request, response); } else { return mapping.findForward(KFSConstants.MAPPING_BASIC); } } protected boolean prepareForRoute(TemCorrectionForm correctionForm) { TemCorrectionProcessDocument document = correctionForm.getCorrectionDocument(); // Is there a description? if (StringUtils.isEmpty(document.getDocumentHeader().getDocumentDescription())) { GlobalVariables.getMessageMap().putError("document.documentHeader.documentDescription", KFSKeyConstants.ERROR_DOCUMENT_NO_DESCRIPTION); return false; } // Did they pick the edit method and system? if (!checkMainDropdown(correctionForm)) { return false; } document.setCorrectionInputFileName(correctionForm.getInputGroupId()); if (!checkAgencyEntryGroupSelectionBeforeRouting(document)) { return false; } if (!validGroupsItemsForDocumentSave(correctionForm)) { return false; } // Populate document document.setCorrectionTypeCode(correctionForm.getEditMethod()); document.setCorrectionInputFileName(correctionForm.getInputGroupId()); // we'll populate the output group id when the doc has a route level change document.setCorrectionOutputFileName(null); SpringContext.getBean(TemCorrectionDocumentService.class).persistAgencyEntryGroupsForDocumentSave(document, correctionForm); return true; } protected boolean validChangeGroups(TemCorrectionForm correctionForm) { // TODO Auto-generated method stub return false; } protected boolean validGroupsItemsForDocumentSave(TemCorrectionForm correctionForm) { // TODO Auto-generated method stub return false; } /** * This method checks that an origin entry group has been selected or uploaded, depending on the system of the document If a * group has not been loaded, then an error will be added to the screen * * @param document * @return */ protected boolean checkAgencyEntryGroupSelectionBeforeRouting(TemCorrectionProcessDocument document) { if (document.getCorrectionInputFileName() == null) { GlobalVariables.getMessageMap().putError(SYSTEM_AND_EDIT_METHOD_ERROR_KEY, TemKeyConstants.ERROR_TMCP_AGENCYGROUP_REQUIRED_FOR_ROUTING); return false; } return true; } }