/* * 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.gl.document.web.struts; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.struts.upload.FormFile; import org.kuali.kfs.gl.businessobject.OriginEntryFull; import org.kuali.kfs.gl.document.GeneralLedgerCorrectionProcessDocument; import org.kuali.kfs.gl.document.service.CorrectionDocumentService; import org.kuali.kfs.gl.document.web.CorrectionDocumentEntryMetadata; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; import org.kuali.rice.kns.web.struts.form.KualiTableRenderFormMetadata; import org.kuali.rice.kns.web.ui.Column; /** * This class represents the action form for the Correction Document */ public class CorrectionForm extends KualiDocumentFormBase implements CorrectionDocumentEntryMetadata { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CorrectionForm.class); protected String docTitle; protected String htmlFormAction; protected String documentType; protected String chooseSystem; /** * Used to store the previously selected system, in case the user changed the selection when it's not appropriate, so that it * can be restored */ protected String previousChooseSystem; protected String editMethod; /** * Used to store the previously selected edit method, in case the user changed the selection when it's not appropriate, so that * it can be restored */ protected String previousEditMethod; /** * This is the input group ID selected when the last page was rendered */ protected String previousInputGroupId; /** * This is the input group ID of the document when it was retrieved from the DB */ protected String inputGroupIdFromLastDocumentLoad; /** * True only when the selected input group ID does not correspond to an input group in the system. True means that querying the * {@link org.kuali.kfs.gl.service.OriginEntryGroupService} for the group id last saved in the doc would turn up no results. */ protected boolean inputGroupIdFromLastDocumentLoadIsMissing = false; /** * Whether the origin entries we should be displaying on the form are not currently persisted by the * {@link CorrectionDocumentService}. */ protected boolean persistedOriginEntriesMissing = false; protected String outputGroupId; protected String inputFileName; protected FormFile sourceFile; protected boolean processInBatch = true; protected boolean matchCriteriaOnly = false; protected boolean dataLoadedFlag = false; protected boolean editableFlag = false; protected boolean manualEditFlag = false; protected boolean deleteFileFlag = false; protected boolean showOutputFlag = false; protected boolean showSummaryOutputFlag = false; protected boolean restrictedFunctionalityMode = false; protected List<OriginEntryFull> allEntries; protected List<OriginEntryFull> displayEntries; protected String entryUniversityFiscalYear; protected String entryFinancialDocumentReversalDate; protected String entryTransactionDate; protected String entryTransactionLedgerEntrySequenceNumber; protected String entryTransactionLedgerEntryAmount; /** * Used to identify the search results on the form */ protected String glcpSearchResultsSequenceNumber; protected OriginEntryFull entryForManualEdit; protected List<GroupHolder> groups; protected transient KualiTableRenderFormMetadata originEntrySearchResultTableMetadata; public CorrectionForm() { super(); // These are for the blank rows that are used to add criteria/changes groups = new ArrayList<GroupHolder>(); entryForManualEdit = new OriginEntryFull(); entryForManualEdit.setEntryId(0); setDocType(); } @Override protected String getDefaultDocumentTypeName() { return "GLCP"; } /** * @see org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase#populate(javax.servlet.http.HttpServletRequest) */ @Override public void populate(HttpServletRequest request) { super.populate(request); // Sync up the groups syncGroups(); originEntrySearchResultTableMetadata = new KualiTableRenderFormMetadata(); if (KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD.equals(getMethodToCall())) { // look for the page number to switch to originEntrySearchResultTableMetadata.setSwitchToPageNumber(-1); // the param we're looking for looks like: methodToCall.switchToPage.1.x , where 1 is the page nbr String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SWITCH_TO_PAGE_METHOD + "."; for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) { String parameterName = (String) i.nextElement(); if (parameterName.startsWith(paramPrefix)) { String switchToPageNumberStr = StringUtils.substringBetween(parameterName, paramPrefix, "."); originEntrySearchResultTableMetadata.setSwitchToPageNumber(Integer.parseInt(switchToPageNumberStr)); } } if (originEntrySearchResultTableMetadata.getSwitchToPageNumber() == -1) { throw new RuntimeException("Couldn't find page number"); } } if (KFSConstants.TableRenderConstants.SORT_METHOD.equals(getMethodToCall())) { originEntrySearchResultTableMetadata.setColumnToSortIndex(-1); // the param we're looking for looks like: methodToCall.sort.1.x , where 1 is the column to sort on String paramPrefix = KFSConstants.DISPATCH_REQUEST_PARAMETER + "." + KFSConstants.TableRenderConstants.SORT_METHOD + "."; for (Enumeration i = request.getParameterNames(); i.hasMoreElements();) { String parameterName = (String) i.nextElement(); if (parameterName.startsWith(paramPrefix) && parameterName.endsWith(".x")) { String columnToSortStr = StringUtils.substringBetween(parameterName, paramPrefix, "."); originEntrySearchResultTableMetadata.setColumnToSortIndex(Integer.parseInt(columnToSortStr)); } } if (originEntrySearchResultTableMetadata.getColumnToSortIndex() == -1) { throw new RuntimeException("Couldn't find column to sort"); } } // since the processInBatch option defaults to true, there's no built in POJO way to detect whether it's been unchecked // this code takes care of that if (StringUtils.isNotBlank(request.getParameter("processInBatch" + KFSConstants.CHECKBOX_PRESENT_ON_FORM_ANNOTATION)) && StringUtils.isBlank(request.getParameter("processInBatch"))) { setProcessInBatch(false); } if (StringUtils.isNotBlank(request.getParameter("matchCriteriaOnly" + KFSConstants.CHECKBOX_PRESENT_ON_FORM_ANNOTATION)) && StringUtils.isBlank(request.getParameter("matchCriteriaOnly"))) { setMatchCriteriaOnly(false); } } /** * This method synchronizes number of group holders added with the group count * */ public void syncGroups() { int groupCount = getCorrectionDocument().getCorrectionChangeGroup().size(); getGroupsItem(groupCount); } /** * Return group sizes * * @return */ public int getGroupsSize() { return groups.size(); } /** * Returns group item with given ID * * @param i index of group * @return */ public GroupHolder getGroupsItem(int i) { while (i >= groups.size()) { groups.add(new GroupHolder()); } return groups.get(i); } /** * Clears correction document form */ public void clearForm() { chooseSystem = ""; editMethod = ""; inputFileName = ""; outputGroupId = null; processInBatch = true; matchCriteriaOnly = false; dataLoadedFlag = false; editableFlag = false; manualEditFlag = false; deleteFileFlag = false; showOutputFlag = false; allEntries = new ArrayList<OriginEntryFull>(); displayEntries = new ArrayList<OriginEntryFull>(); restrictedFunctionalityMode = false; setDocument(null); instantiateDocument(); // These are for the blank rows that are used to add criteria/changes groups = new ArrayList<GroupHolder>(); inputGroupIdFromLastDocumentLoad = null; inputGroupIdFromLastDocumentLoadIsMissing = false; persistedOriginEntriesMissing = false; // Sync up the groups syncGroups(); entryForManualEdit = new OriginEntryFull(); entryForManualEdit.setEntryId(0); } /** * Update origin entry for manual edit with correction document attributes (i.e. university fiscal year, entry transaction ledger * sequence number, entry transaction ledger entry amount, entry transaction date, entry financial document reversal date) */ public void updateEntryForManualEdit() { entryForManualEdit.setFieldValue("universityFiscalYear", getEntryUniversityFiscalYear()); entryForManualEdit.setFieldValue("transactionLedgerEntrySequenceNumber", getEntryTransactionLedgerEntrySequenceNumber()); entryForManualEdit.setFieldValue("transactionLedgerEntryAmount", getEntryTransactionLedgerEntryAmount()); entryForManualEdit.setFieldValue("transactionDate", getEntryTransactionDate()); entryForManualEdit.setFieldValue("financialDocumentReversalDate", getEntryFinancialDocumentReversalDate()); } /** * Clears origin entry for manual edit * */ public void clearEntryForManualEdit() { OriginEntryFull oe = new OriginEntryFull(); oe.setEntryId(0); oe.setSubAccountNumber(""); oe.setFinancialSubObjectCode(""); oe.setProjectCode(""); setEntryFinancialDocumentReversalDate(""); setEntryTransactionDate(""); setEntryTransactionLedgerEntryAmount(""); setEntryTransactionLedgerEntrySequenceNumber(""); setEntryUniversityFiscalYear(""); setEntryForManualEdit(oe); } /** * Return size of list of all OriginEntryInformation objects * @return size of entries size */ public Integer getAllEntriesSize() { return (allEntries == null) ? null : allEntries.size(); } public GeneralLedgerCorrectionProcessDocument getCorrectionDocument() { return (GeneralLedgerCorrectionProcessDocument) getDocument(); } public String getEntryFinancialDocumentReversalDate() { return entryFinancialDocumentReversalDate; } public List<OriginEntryFull> getDisplayEntries() { return displayEntries; } public void setDisplayEntries(List<OriginEntryFull> displayEntries) { this.displayEntries = displayEntries; } public void setEntryFinancialDocumentReversalDate(String entryFinancialDocumentReversalDate) { this.entryFinancialDocumentReversalDate = entryFinancialDocumentReversalDate; } public String getEntryTransactionDate() { return entryTransactionDate; } public void setEntryTransactionDate(String entryTransactionDate) { this.entryTransactionDate = entryTransactionDate; } public String getEntryTransactionLedgerEntryAmount() { return entryTransactionLedgerEntryAmount; } public void setEntryTransactionLedgerEntryAmount(String entryTransactionLedgerEntryAmount) { this.entryTransactionLedgerEntryAmount = entryTransactionLedgerEntryAmount; } public String getEntryTransactionLedgerEntrySequenceNumber() { return entryTransactionLedgerEntrySequenceNumber; } public void setEntryTransactionLedgerEntrySequenceNumber(String entryTransactionLedgerEntrySequenceNumber) { this.entryTransactionLedgerEntrySequenceNumber = entryTransactionLedgerEntrySequenceNumber; } public String getEntryUniversityFiscalYear() { return entryUniversityFiscalYear; } public void setEntryUniversityFiscalYear(String entryUniversityFiscalYear) { this.entryUniversityFiscalYear = entryUniversityFiscalYear; } public boolean getShowOutputFlag() { return showOutputFlag; } public void setShowOutputFlag(boolean showOutputFlag) { this.showOutputFlag = showOutputFlag; } public String getInputFileName() { return inputFileName; } public void setInputFileName(String inputFileName) { this.inputFileName = inputFileName; } public String getOutputGroupId() { return outputGroupId; } public void setOutputGroupId(String outputGroupId) { this.outputGroupId = outputGroupId; } public String getChooseSystem() { return chooseSystem; } public void setChooseSystem(String chooseSystem) { this.chooseSystem = chooseSystem; } public String getEditMethod() { return editMethod; } public void setEditMethod(String editMethod) { this.editMethod = editMethod; } public String getInputGroupId() { return ((GeneralLedgerCorrectionProcessDocument) getDocument()).getCorrectionInputFileName(); } public boolean getProcessInBatch() { return processInBatch; } public void setProcessInBatch(boolean processInBatch) { this.processInBatch = processInBatch; } public List<OriginEntryFull> getAllEntries() { return allEntries; } public void setAllEntries(List<OriginEntryFull> allEntriesForManualEdit) { this.allEntries = allEntriesForManualEdit; } public OriginEntryFull getEntryForManualEdit() { return entryForManualEdit; } public void setEntryForManualEdit(OriginEntryFull entryForManualEdit) { this.entryForManualEdit = entryForManualEdit; } public FormFile getSourceFile() { return sourceFile; } public void setSourceFile(FormFile sourceFile) { this.sourceFile = sourceFile; } public boolean getMatchCriteriaOnly() { return matchCriteriaOnly; } public void setMatchCriteriaOnly(boolean matchCriteriaOnly) { this.matchCriteriaOnly = matchCriteriaOnly; } public boolean getDataLoadedFlag() { return dataLoadedFlag; } public void setDataLoadedFlag(boolean dataLoadedFlag) { this.dataLoadedFlag = dataLoadedFlag; } public boolean getDeleteFileFlag() { return deleteFileFlag; } public void setDeleteFileFlag(boolean deleteFileFlag) { this.deleteFileFlag = deleteFileFlag; } public boolean getEditableFlag() { return editableFlag; } public void setEditableFlag(boolean editableFlag) { this.editableFlag = editableFlag; } public boolean getManualEditFlag() { return manualEditFlag; } public void setManualEditFlag(boolean manualEditFlag) { this.manualEditFlag = manualEditFlag; } public boolean getShowSummaryOutputFlag() { return showSummaryOutputFlag; } public void setShowSummaryOutputFlag(boolean showSummaryOutputFlag) { this.showSummaryOutputFlag = showSummaryOutputFlag; } /** * Gets the originEntrySearchResultTableMetadata attribute. * * @return Returns the originEntrySearchResultTableMetadata. */ public KualiTableRenderFormMetadata getOriginEntrySearchResultTableMetadata() { return originEntrySearchResultTableMetadata; } /** * Returns list of Column objects for table render column meta data * * @return list of column objects */ public List<Column> getTableRenderColumnMetadata() { return SpringContext.getBean(CorrectionDocumentService.class).getTableRenderColumnMetadata(getDocument().getDocumentNumber()); } /** * Gets the restrictedFunctionalityMode attribute. * * @return Returns the restrictedFunctionalityMode. */ public boolean isRestrictedFunctionalityMode() { return restrictedFunctionalityMode; } /** * Sets the restrictedFunctionalityMode attribute value. * * @param restrictedFunctionalityMode The restrictedFunctionalityMode to set. */ public void setRestrictedFunctionalityMode(boolean restrictedFunctionalityMode) { this.restrictedFunctionalityMode = restrictedFunctionalityMode; } /** * Gets the glcpSearchResuiltsSequenceNumber attribute. * * @return Returns the glcpSearchResuiltsSequenceNumber. */ public String getGlcpSearchResultsSequenceNumber() { return glcpSearchResultsSequenceNumber; } /** * Sets the glcpSearchResuiltsSequenceNumber attribute value. * * @param glcpSearchResuiltsSequenceNumber The glcpSearchResuiltsSequenceNumber to set. */ public void setGlcpSearchResultsSequenceNumber(String glcpSearchResuiltsSequenceNumber) { this.glcpSearchResultsSequenceNumber = glcpSearchResuiltsSequenceNumber; } /** * Gets the previousChooseSystem attribute. * * @return Returns the previousChooseSystem. */ public String getPreviousChooseSystem() { return previousChooseSystem; } /** * Sets the previousChooseSystem attribute value. * * @param previousChooseSystem The previousChooseSystem to set. */ public void setPreviousChooseSystem(String previousChooseSystem) { this.previousChooseSystem = previousChooseSystem; } /** * Gets the previousEditMethod attribute. * * @return Returns the previousEditMethod. */ public String getPreviousEditMethod() { return previousEditMethod; } /** * Sets the previousEditMethod attribute value. * * @param previousEditMethod The previousEditMethod to set. */ public void setPreviousEditMethod(String previousEditMethod) { this.previousEditMethod = previousEditMethod; } /** * Gets the previousInputGroupId attribute. * * @return Returns the previousInputGroupId. */ public String getPreviousInputGroupId() { return previousInputGroupId; } /** * Sets the previousInputGroupId attribute value. * * @param previousInputGroupId The previousInputGroupId to set. */ public void setPreviousInputGroupId(String previousInputGroupId) { this.previousInputGroupId = previousInputGroupId; } /** * Gets the input group ID of the document when it was persisted in the DB * * @return the input group ID of the document when it was persisted in the DB */ public String getInputGroupIdFromLastDocumentLoad() { return inputGroupIdFromLastDocumentLoad; } /** * Sets the input group ID of the document when it was persisted in the DB * * @param inputGroupIdFromLastDocumentLoad the input group ID of the document when it was persisted in the DB */ public void setInputGroupIdFromLastDocumentLoad(String inputGroupIdFromLastDocumentLoad) { this.inputGroupIdFromLastDocumentLoad = inputGroupIdFromLastDocumentLoad; } /** * Gets whether the selected input group ID does not correspond to an input group in the system. * * @return Returns the inputGroupIdFromLastDocumentLoadIsMissing. */ public boolean isInputGroupIdFromLastDocumentLoadIsMissing() { return inputGroupIdFromLastDocumentLoadIsMissing; } /** * Sets whether the selected input group ID does not correspond to an input group in the system * * @param inputGroupIdFromLastDocumentLoadIsMissing The inputGroupIdFromLastDocumentLoadIsMissing to set. */ public void setInputGroupIdFromLastDocumentLoadIsMissing(boolean inputGroupIdFromLastDocumentLoadIsMissing) { this.inputGroupIdFromLastDocumentLoadIsMissing = inputGroupIdFromLastDocumentLoadIsMissing; } /** * Gets whether the origin entries we should be displaying on the form are not currently persisted by the * {@link CorrectionDocumentService}. * * @return Returns the persistedOriginEntriesMissing. */ public boolean isPersistedOriginEntriesMissing() { return persistedOriginEntriesMissing; } /** * Sets whether the origin entries we should be displaying on the form are not currently persisted by the * {@link CorrectionDocumentService}. * * @param persistedOriginEntriesMissing The persistedOriginEntriesMissing to set. */ public void setPersistedOriginEntriesMissing(boolean persistedOriginEntriesMissing) { this.persistedOriginEntriesMissing = persistedOriginEntriesMissing; } public String getDocTitle() { return docTitle; } public void setDocTitle(String docTitle) { this.docTitle = docTitle; } public String getDocumentType() { return documentType; } public void setDocumentType(String documentType) { this.documentType = documentType; } public String getHtmlFormAction() { return htmlFormAction; } public void setHtmlFormAction(String htmlFormAction) { this.htmlFormAction = htmlFormAction; } /** * Set document type = "GLCP", document title = "General Ledger Correction Process", html form action = "generalLedgerCorrect" */ public void setDocType() { setDocumentType("GLCP"); //setDocTitle("General Ledger Correction Process"); setDocTitle("GeneralLedgerCorrectionProcessDocument"); setHtmlFormAction("generalLedgerCorrection"); } /** * Adds the origin entry max file size to the list of max file sizes. * * @see org.kuali.rice.kns.web.struts.form.pojo.PojoFormBase#customInitMaxUploadSizes() */ @Override protected void customInitMaxUploadSizes() { super.customInitMaxUploadSizes(); addMaxUploadSize(SpringContext.getBean(ParameterService.class).getParameterValueAsString(GeneralLedgerCorrectionProcessDocument.class, KFSConstants.ORIGIN_ENTRY_IMPORT_MAX_FILE_SIZE_PARM_NM)); } }