001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.gl.web.struts; 017 018 import java.io.IOException; 019 import java.util.ArrayList; 020 import java.util.Collection; 021 import java.util.HashMap; 022 import java.util.Iterator; 023 import java.util.List; 024 import java.util.Map; 025 026 import javax.servlet.ServletException; 027 import javax.servlet.http.HttpServletRequest; 028 import javax.servlet.http.HttpServletResponse; 029 030 import org.apache.struts.action.ActionForm; 031 import org.apache.struts.action.ActionForward; 032 import org.apache.struts.action.ActionMapping; 033 import org.kuali.kfs.gl.ObjectHelper; 034 import org.kuali.kfs.gl.businessobject.AccountBalance; 035 import org.kuali.kfs.gl.businessobject.lookup.AccountBalanceByConsolidationLookupableHelperServiceImpl; 036 import org.kuali.kfs.sys.KFSConstants; 037 import org.kuali.kfs.sys.KFSKeyConstants; 038 import org.kuali.kfs.sys.KFSPropertyConstants; 039 import org.kuali.kfs.sys.context.SpringContext; 040 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry; 041 import org.kuali.rice.kns.lookup.CollectionIncomplete; 042 import org.kuali.rice.kns.lookup.Lookupable; 043 import org.kuali.rice.kns.service.KNSServiceLocator; 044 import org.kuali.rice.kns.service.KualiConfigurationService; 045 import org.kuali.rice.kns.util.GlobalVariables; 046 import org.kuali.rice.kns.util.KNSConstants; 047 import org.kuali.rice.kns.web.struts.action.KualiAction; 048 import org.kuali.rice.kns.web.struts.form.LookupForm; 049 import org.kuali.rice.kns.web.ui.Field; 050 import org.kuali.rice.kns.web.ui.ResultRow; 051 import org.kuali.rice.kns.web.ui.Row; 052 053 /** 054 * This class handles Actions for lookup flow 055 */ 056 057 public class BalanceInquiryAction extends KualiAction { 058 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BalanceInquiryAction.class); 059 060 private static final String TOTALS_TABLE_KEY = "totalsTable"; 061 062 private KualiConfigurationService kualiConfigurationService; 063 private String[] totalTitles; 064 065 public BalanceInquiryAction() { 066 super(); 067 kualiConfigurationService = SpringContext.getBean(KualiConfigurationService.class); 068 } 069 070 /** 071 * Sets up total titles 072 */ 073 private void setTotalTitles() { 074 totalTitles = new String[7]; 075 076 totalTitles[0] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.INCOME); 077 totalTitles[1] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.INCOME_FROM_TRANSFERS); 078 totalTitles[2] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.INCOME_TOTAL); 079 totalTitles[3] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.EXPENSE); 080 totalTitles[4] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.EXPENSE_FROM_TRANSFERS); 081 totalTitles[5] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.EXPENSE_TOTAL); 082 totalTitles[6] = kualiConfigurationService.getPropertyString(KFSKeyConstants.AccountBalanceService.TOTAL); 083 084 } 085 086 /** 087 * Returns an array of total titles 088 * 089 * @return array of total titles 090 */ 091 private String[] getTotalTitles() { 092 if (null == totalTitles) { 093 setTotalTitles(); 094 } 095 096 return totalTitles; 097 } 098 099 public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 100 return mapping.findForward(KFSConstants.MAPPING_BASIC); 101 } 102 103 /** 104 * Search - sets the values of the data entered on the form on the jsp into a map and then searches for the results. 105 * 106 * @param mapping 107 * @param form 108 * @param request 109 * @param response 110 * @return 111 * @throws Exception 112 */ 113 public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 114 BalanceInquiryForm lookupForm = (BalanceInquiryForm) form; 115 116 Lookupable lookupable = lookupForm.getLookupable(); 117 118 if (lookupable == null) { 119 LOG.error("Lookupable is null."); 120 throw new RuntimeException("Lookupable is null."); 121 } 122 123 Collection displayList = new ArrayList(); 124 List<ResultRow> resultTable = new ArrayList<ResultRow>(); 125 126 lookupable.validateSearchParameters(lookupForm.getFields()); 127 128 try { 129 displayList = lookupable.performLookup(lookupForm, resultTable, true); 130 131 Object[] resultTableAsArray = resultTable.toArray(); 132 133 CollectionIncomplete incompleteDisplayList = (CollectionIncomplete) displayList; 134 Long totalSize = ((CollectionIncomplete) displayList).getActualSizeIfTruncated(); 135 136 request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE, totalSize); 137 138 // TODO: use inheritance instead of this if statement 139 if (lookupable.getLookupableHelperService() instanceof AccountBalanceByConsolidationLookupableHelperServiceImpl) { 140 141 142 Collection totalsTable = new ArrayList(); 143 144 int listIndex = 0; 145 int arrayIndex = 0; 146 int listSize = incompleteDisplayList.size(); 147 148 for (; listIndex < listSize;) { 149 150 AccountBalance balance = (AccountBalance) incompleteDisplayList.get(listIndex); 151 152 boolean ok = ObjectHelper.isOneOf(balance.getTitle(), getTotalTitles()); 153 if (ok) { 154 155 if (totalSize > 7) { 156 totalsTable.add(resultTableAsArray[arrayIndex]); 157 } 158 resultTable.remove(resultTableAsArray[arrayIndex]); 159 160 incompleteDisplayList.remove(balance); 161 // account for the removal of the balance which resizes the list 162 listIndex--; 163 listSize--; 164 165 } 166 167 listIndex++; 168 arrayIndex++; 169 170 } 171 172 request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS, resultTable); 173 174 request.setAttribute(TOTALS_TABLE_KEY, totalsTable); 175 GlobalVariables.getUserSession().addObject(TOTALS_TABLE_KEY, totalsTable); 176 177 } 178 else { 179 180 request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS, resultTable); 181 182 } 183 184 if (request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY) != null) { 185 GlobalVariables.getUserSession().removeObject(request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY)); 186 } 187 188 request.setAttribute(KFSConstants.SEARCH_LIST_REQUEST_KEY, GlobalVariables.getUserSession().addObject(resultTable)); 189 190 } 191 catch (NumberFormatException e) { 192 GlobalVariables.getMessageMap().putError(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, KFSKeyConstants.ERROR_CUSTOM, new String[] { "Fiscal Year must be a four-digit number" }); 193 } 194 catch (Exception e) { 195 GlobalVariables.getMessageMap().putError(KFSConstants.DOCUMENT_ERRORS, KFSKeyConstants.ERROR_CUSTOM, new String[] { "Please report the server error." }); 196 LOG.error("Application Errors", e); 197 } 198 return mapping.findForward(KFSConstants.MAPPING_BASIC); 199 } 200 201 /** 202 * Refresh - is called when one quickFinder returns to the previous one. Sets all the values and performs the new search. 203 * 204 * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping, 205 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 206 */ 207 @Override 208 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 209 LookupForm lookupForm = (LookupForm) form; 210 Lookupable lookupable = lookupForm.getLookupable(); 211 if (lookupable == null) { 212 LOG.error("Lookupable is null."); 213 throw new RuntimeException("Lookupable is null."); 214 } 215 216 Map fieldValues = new HashMap(); 217 Map values = lookupForm.getFields(); 218 219 for (Iterator iter = lookupable.getRows().iterator(); iter.hasNext();) { 220 Row row = (Row) iter.next(); 221 222 for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) { 223 Field field = (Field) iterator.next(); 224 225 if (field.getPropertyName() != null && !field.getPropertyName().equals("")) { 226 if (request.getParameter(field.getPropertyName()) != null) { 227 field.setPropertyValue(request.getParameter(field.getPropertyName())); 228 } 229 else if (values.get(field.getPropertyName()) != null) { 230 field.setPropertyValue(values.get(field.getPropertyName())); 231 } 232 } 233 fieldValues.put(field.getPropertyName(), field.getPropertyValue()); 234 } 235 } 236 fieldValues.put(KFSConstants.DOC_FORM_KEY, lookupForm.getFormKey()); 237 fieldValues.put(KFSConstants.BACK_LOCATION, lookupForm.getBackLocation()); 238 239 if (lookupable.checkForAdditionalFields(fieldValues)) { 240 for (Iterator iter = lookupable.getRows().iterator(); iter.hasNext();) { 241 Row row = (Row) iter.next(); 242 for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) { 243 Field field = (Field) iterator.next(); 244 if (field.getPropertyName() != null && !field.getPropertyName().equals("")) { 245 if (request.getParameter(field.getPropertyName()) != null) { 246 field.setPropertyValue(request.getParameter(field.getPropertyName())); 247 fieldValues.put(field.getPropertyName(), request.getParameter(field.getPropertyName())); 248 } 249 else if (values.get(field.getPropertyName()) != null) { 250 field.setPropertyValue(values.get(field.getPropertyName())); 251 } 252 } 253 } 254 } 255 } 256 257 return mapping.findForward(KFSConstants.MAPPING_BASIC); 258 } 259 260 /** 261 * Returns as if return with no value was selected. 262 * 263 * @param mapping 264 * @param form 265 * @param request 266 * @param response 267 * @return 268 * @throws Exception 269 */ 270 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 271 LookupForm lookupForm = (LookupForm) form; 272 273 String backUrl = lookupForm.getBackLocation() + "?methodToCall=refresh&docFormKey=" + lookupForm.getFormKey(); 274 return new ActionForward(backUrl, true); 275 } 276 277 278 /** 279 * Clears the values of all the fields on the jsp. 280 * 281 * @param mapping 282 * @param form 283 * @param request 284 * @param response 285 * @return 286 * @throws IOException 287 * @throws ServletException 288 */ 289 public ActionForward clearValues(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 290 LookupForm lookupForm = (LookupForm) form; 291 Lookupable lookupable = lookupForm.getLookupable(); 292 if (lookupable == null) { 293 LOG.error("Lookupable is null."); 294 throw new RuntimeException("Lookupable is null."); 295 } 296 297 for (Iterator iter = lookupable.getRows().iterator(); iter.hasNext();) { 298 Row row = (Row) iter.next(); 299 for (Iterator iterator = row.getFields().iterator(); iterator.hasNext();) { 300 Field field = (Field) iterator.next(); 301 if (!field.getFieldType().equals(Field.RADIO)) { 302 field.setPropertyValue(field.getDefaultValue()); 303 } 304 } 305 } 306 307 return mapping.findForward(KFSConstants.MAPPING_BASIC); 308 } 309 310 /** 311 * View results from balance inquiry action 312 * 313 * @param mapping 314 * @param form 315 * @param request 316 * @param response 317 * @return 318 * @throws Exception 319 */ 320 public ActionForward viewResults(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 321 request.setAttribute(KFSConstants.SEARCH_LIST_REQUEST_KEY, request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY)); 322 request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS, GlobalVariables.getUserSession().retrieveObject(request.getParameter(KFSConstants.SEARCH_LIST_REQUEST_KEY))); 323 request.setAttribute(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE, request.getParameter(KFSConstants.REQUEST_SEARCH_RESULTS_SIZE)); 324 325 // TODO: use inheritance instead of this if statement 326 if (((BalanceInquiryForm) form).getLookupable().getLookupableHelperService() instanceof AccountBalanceByConsolidationLookupableHelperServiceImpl) { 327 Object totalsTable = GlobalVariables.getUserSession().retrieveObject(TOTALS_TABLE_KEY); 328 request.setAttribute(TOTALS_TABLE_KEY, totalsTable); 329 } 330 331 return mapping.findForward(KFSConstants.MAPPING_BASIC); 332 } 333 334 public void setKualiConfigurationService(KualiConfigurationService kcs) { 335 kualiConfigurationService = kcs; 336 } 337 338 @Override 339 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 340 request.setAttribute(KNSConstants.PARAM_MAINTENANCE_VIEW_MODE, KNSConstants.PARAM_MAINTENANCE_VIEW_MODE_LOOKUP); 341 BusinessObjectEntry boe = KNSServiceLocator.getDataDictionaryService().getDataDictionary().getBusinessObjectEntry(((LookupForm) form).getBusinessObjectClassName()); 342 int numCols = boe.getLookupDefinition().getNumOfColumns(); 343 if (numCols <= 0) 344 numCols = KNSConstants.DEFAULT_NUM_OF_COLUMNS; // by default, always show one column. 345 ((LookupForm) form).setNumColumns(numCols); 346 return super.execute(mapping, form, request, response); 347 } 348 }