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.module.cam.document.web.struts; 017 018 import java.io.FileNotFoundException; 019 import java.io.IOException; 020 import java.util.Collection; 021 import java.util.HashMap; 022 import java.util.HashSet; 023 import java.util.List; 024 import java.util.Map; 025 import java.util.Set; 026 027 import javax.servlet.http.HttpServletRequest; 028 import javax.servlet.http.HttpServletResponse; 029 030 import org.apache.commons.lang.ArrayUtils; 031 import org.apache.commons.lang.StringUtils; 032 import org.apache.struts.action.ActionForm; 033 import org.apache.struts.action.ActionForward; 034 import org.apache.struts.action.ActionMapping; 035 import org.kuali.kfs.coa.service.AccountService; 036 import org.kuali.kfs.module.cam.CamsConstants; 037 import org.kuali.kfs.module.cam.CamsKeyConstants; 038 import org.kuali.kfs.module.cam.CamsPropertyConstants; 039 import org.kuali.kfs.module.cam.businessobject.Asset; 040 import org.kuali.kfs.module.cam.businessobject.AssetGlobal; 041 import org.kuali.kfs.module.cam.businessobject.AssetPaymentAssetDetail; 042 import org.kuali.kfs.module.cam.businessobject.AssetPaymentDetail; 043 import org.kuali.kfs.module.cam.document.AssetPaymentDocument; 044 import org.kuali.kfs.module.cam.document.service.AssetPaymentService; 045 import org.kuali.kfs.module.cam.document.validation.event.AssetPaymentAddAssetEvent; 046 import org.kuali.kfs.module.cam.document.validation.event.AssetPaymentManuallyAddAccountingLineEvent; 047 import org.kuali.kfs.module.cam.document.validation.event.AssetPaymentPrepareRouteEvent; 048 import org.kuali.kfs.sys.KFSConstants; 049 import org.kuali.kfs.sys.KFSKeyConstants; 050 import org.kuali.kfs.sys.KFSPropertyConstants; 051 import org.kuali.kfs.sys.businessobject.SourceAccountingLine; 052 import org.kuali.kfs.sys.context.SpringContext; 053 import org.kuali.kfs.sys.document.validation.event.AddAccountingLineEvent; 054 import org.kuali.kfs.sys.service.SegmentedLookupResultsService; 055 import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase; 056 import org.kuali.rice.kew.exception.WorkflowException; 057 import org.kuali.rice.kew.util.KEWConstants; 058 import org.kuali.rice.kns.bo.PersistableBusinessObject; 059 import org.kuali.rice.kns.exception.ValidationException; 060 import org.kuali.rice.kns.question.ConfirmationQuestion; 061 import org.kuali.rice.kns.service.DataDictionaryService; 062 import org.kuali.rice.kns.service.KualiConfigurationService; 063 import org.kuali.rice.kns.service.KualiRuleService; 064 import org.kuali.rice.kns.service.ParameterService; 065 import org.kuali.rice.kns.service.PersistenceService; 066 import org.kuali.rice.kns.util.GlobalVariables; 067 import org.kuali.rice.kns.util.KNSConstants; 068 import org.kuali.rice.kns.util.ObjectUtils; 069 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; 070 071 public class AssetPaymentAction extends KualiAccountingDocumentActionBase { 072 protected static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AssetPaymentAction.class); 073 074 075 @Override 076 public ActionForward docHandler(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 077 ActionForward actionForward = super.docHandler(mapping, form, request, response); 078 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 079 String command = assetPaymentForm.getCommand(); 080 081 // If a asset was selected from the asset payment lookup page then insert asset into the document. 082 if (KEWConstants.INITIATE_COMMAND.equals(command) && ((assetPaymentForm.getCapitalAssetNumber() != null) && !assetPaymentForm.getCapitalAssetNumber().trim().equals(""))) { 083 List<AssetPaymentAssetDetail> assetPaymentAssetDetails = assetPaymentForm.getAssetPaymentDocument().getAssetPaymentAssetDetail(); 084 085 AssetPaymentAssetDetail assetPaymentAssetDetail = new AssetPaymentAssetDetail(); 086 assetPaymentAssetDetail.setDocumentNumber(assetPaymentForm.getAssetPaymentDocument().getDocumentNumber()); 087 assetPaymentAssetDetail.setCapitalAssetNumber(new Long(assetPaymentForm.getCapitalAssetNumber())); 088 assetPaymentAssetDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDocument.ASSET); 089 assetPaymentAssetDetail.setPreviousTotalCostAmount(assetPaymentAssetDetail.getAsset().getTotalCostAmount()); 090 091 assetPaymentAssetDetails.add(assetPaymentAssetDetail); 092 assetPaymentForm.getAssetPaymentDocument().setAssetPaymentAssetDetail(assetPaymentAssetDetails); 093 assetPaymentForm.setCapitalAssetNumber(""); 094 } 095 return actionForward; 096 } 097 098 /** 099 * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#refresh(org.apache.struts.action.ActionMapping, 100 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 101 */ 102 @Override 103 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 104 super.refresh(mapping, form, request, response); 105 106 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 107 108 Collection<PersistableBusinessObject> rawValues = null; 109 Map<String, Set<String>> segmentedSelection = new HashMap<String, Set<String>>(); 110 111 // If multiple asset lookup was used to select the assets, then.... 112 if (StringUtils.equals(KFSConstants.MULTIPLE_VALUE, assetPaymentForm.getRefreshCaller())) { 113 String lookupResultsSequenceNumber = assetPaymentForm.getLookupResultsSequenceNumber(); 114 115 if (StringUtils.isNotBlank(lookupResultsSequenceNumber)) { 116 // actually returning from a multiple value lookup 117 Set<String> selectedIds = SpringContext.getBean(SegmentedLookupResultsService.class).retrieveSetOfSelectedObjectIds(lookupResultsSequenceNumber, GlobalVariables.getUserSession().getPerson().getPrincipalId()); 118 for (String selectedId : selectedIds) { 119 String selectedObjId = StringUtils.substringBefore(selectedId, "."); 120 String selectedMonthData = StringUtils.substringAfter(selectedId, "."); 121 122 if (!segmentedSelection.containsKey(selectedObjId)) { 123 segmentedSelection.put(selectedObjId, new HashSet<String>()); 124 } 125 segmentedSelection.get(selectedObjId).add(selectedMonthData); 126 } 127 // Retrieving selected data from table. 128 LOG.debug("Asking segmentation service for object ids " + segmentedSelection.keySet()); 129 rawValues = SpringContext.getBean(SegmentedLookupResultsService.class).retrieveSelectedResultBOs(lookupResultsSequenceNumber, segmentedSelection.keySet(), Asset.class, GlobalVariables.getUserSession().getPerson().getPrincipalId()); 130 } 131 132 List<AssetPaymentAssetDetail> assetPaymentAssetDetails = assetPaymentForm.getAssetPaymentDocument().getAssetPaymentAssetDetail(); 133 if (rawValues != null) { 134 for (PersistableBusinessObject bo : rawValues) { 135 Asset asset = (Asset) bo; 136 137 boolean addIt = true; 138 for (AssetPaymentAssetDetail detail : assetPaymentAssetDetails) { 139 if (detail.getCapitalAssetNumber().compareTo(asset.getCapitalAssetNumber()) == 0) { 140 addIt = false; 141 break; 142 } 143 } 144 145 // If it doesn't already exist in the list add it. 146 if (addIt) { 147 AssetPaymentAssetDetail assetPaymentAssetDetail = new AssetPaymentAssetDetail(); 148 assetPaymentAssetDetail.setDocumentNumber(assetPaymentForm.getAssetPaymentDocument().getDocumentNumber()); 149 assetPaymentAssetDetail.setCapitalAssetNumber(asset.getCapitalAssetNumber()); 150 assetPaymentAssetDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDocument.ASSET); 151 assetPaymentAssetDetail.setPreviousTotalCostAmount(assetPaymentAssetDetail.getAsset().getTotalCostAmount()); 152 153 assetPaymentAssetDetails.add(assetPaymentAssetDetail); 154 } 155 } 156 assetPaymentForm.getAssetPaymentDocument().setAssetPaymentAssetDetail(assetPaymentAssetDetails); 157 } 158 } 159 return mapping.findForward(KFSConstants.MAPPING_BASIC); 160 } 161 162 /** 163 * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#uploadAccountingLines(boolean, 164 * org.apache.struts.action.ActionForm) 165 */ 166 @Override 167 protected void uploadAccountingLines(boolean isSource, ActionForm form) throws FileNotFoundException, IOException { 168 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 169 super.uploadAccountingLines(isSource, assetPaymentForm); 170 List<AssetPaymentDetail> assetPaymentDetails = assetPaymentForm.getAssetPaymentDocument().getSourceAccountingLines(); 171 for (AssetPaymentDetail assetPaymentDetail : assetPaymentDetails) { 172 getAssetPaymentService().extractPostedDatePeriod(assetPaymentDetail); 173 } 174 } 175 176 177 /** 178 * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#insertSourceLine(org.apache.struts.action.ActionMapping, 179 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 180 */ 181 @Override 182 public ActionForward insertSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 183 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 184 SourceAccountingLine line = assetPaymentForm.getNewSourceLine(); 185 186 // populate chartOfAccountsCode from account number if accounts cant cross chart and Javascript is turned off 187 //SpringContext.getBean(AccountService.class).populateAccountingLineChartIfNeeded(line); 188 189 boolean rulePassed = true; 190 // Check any business rules. We separate general accounting line validation into AssetPaymentManuallyAddAccountingLineEvent, 191 // and trigger it from this action, also document save. 192 rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AssetPaymentManuallyAddAccountingLineEvent(KFSConstants.NEW_SOURCE_ACCT_LINE_PROPERTY_NAME, assetPaymentForm.getDocument(), line)); 193 if (rulePassed) { 194 rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddAccountingLineEvent(KFSConstants.NEW_SOURCE_ACCT_LINE_PROPERTY_NAME, assetPaymentForm.getDocument(), line)); 195 } 196 if (rulePassed) { 197 // add accountingLine 198 SpringContext.getBean(PersistenceService.class).refreshAllNonUpdatingReferences(line); 199 insertAccountingLine(true, assetPaymentForm, line); 200 201 // clear the used new source line 202 assetPaymentForm.setNewSourceLine(new AssetPaymentDetail()); 203 } 204 205 return mapping.findForward(KFSConstants.MAPPING_BASIC); 206 } 207 208 209 /** 210 * Inserts a new asset into the document 211 * 212 * @param mapping 213 * @param form 214 * @param request 215 * @param response 216 * @return ActionForward 217 * @throws Exception 218 */ 219 public ActionForward insertAssetPaymentAssetDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 220 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 221 AssetPaymentDocument assetPaymentDocument = assetPaymentForm.getAssetPaymentDocument(); 222 223 List<AssetPaymentAssetDetail> assetPaymentDetails = assetPaymentForm.getAssetPaymentDocument().getAssetPaymentAssetDetail(); 224 225 AssetPaymentAssetDetail newAssetPaymentAssetDetail = new AssetPaymentAssetDetail(); 226 String sCapitalAssetNumber = assetPaymentForm.getCapitalAssetNumber(); 227 228 String errorPath = CamsPropertyConstants.Asset.CAPITAL_ASSET_NUMBER; 229 230 // Validating the asset code is numeric 231 Long capitalAssetNumber = null; 232 try { 233 capitalAssetNumber = Long.parseLong(sCapitalAssetNumber); 234 } 235 catch (NumberFormatException e) { 236 // Validating the asset number field is not empty 237 if (ObjectUtils.isNull(sCapitalAssetNumber) || StringUtils.isBlank(sCapitalAssetNumber)) { 238 String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(AssetPaymentAssetDetail.class.getName()).getAttributeDefinition(CamsPropertyConstants.Asset.CAPITAL_ASSET_NUMBER).getLabel(); 239 GlobalVariables.getMessageMap().putError(errorPath, KFSKeyConstants.ERROR_REQUIRED, label); 240 } 241 else { 242 // it is not empty but has an invalid value. 243 GlobalVariables.getMessageMap().putError(errorPath, CamsKeyConstants.AssetLocationGlobal.ERROR_INVALID_CAPITAL_ASSET_NUMBER, sCapitalAssetNumber); 244 } 245 return mapping.findForward(KFSConstants.MAPPING_BASIC); 246 } 247 248 boolean rulePassed = true; 249 250 newAssetPaymentAssetDetail.setDocumentNumber(assetPaymentDocument.getDocumentNumber()); 251 newAssetPaymentAssetDetail.setCapitalAssetNumber(capitalAssetNumber); 252 newAssetPaymentAssetDetail.refreshReferenceObject(CamsPropertyConstants.AssetPaymentDocument.ASSET); 253 // Validating the new asset 254 rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AssetPaymentAddAssetEvent(errorPath, assetPaymentForm.getDocument(), newAssetPaymentAssetDetail)); 255 if (rulePassed) { 256 // Storing the current asset cost. 257 newAssetPaymentAssetDetail.setPreviousTotalCostAmount(newAssetPaymentAssetDetail.getAsset().getTotalCostAmount()); 258 259 assetPaymentForm.getAssetPaymentDocument().addAssetPaymentAssetDetail(newAssetPaymentAssetDetail); 260 assetPaymentForm.setCapitalAssetNumber(""); 261 } 262 return mapping.findForward(KFSConstants.MAPPING_BASIC); 263 } 264 265 /** 266 * Deletes an asset from the document 267 * 268 * @param mapping 269 * @param form 270 * @param request 271 * @param response 272 * @return ActionForward 273 * @throws Exception 274 */ 275 public ActionForward deleteAssetPaymentAssetDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 276 AssetPaymentForm assetPaymentForm = (AssetPaymentForm) form; 277 278 int deleteIndex = getLineToDelete(request); 279 280 // Getting the asset number that is going to be deleted from document 281 Long capitalAssetNumber = assetPaymentForm.getAssetPaymentDocument().getAssetPaymentAssetDetail().get(deleteIndex).getCapitalAssetNumber(); 282 283 // Deleting the asset from document 284 assetPaymentForm.getAssetPaymentDocument().getAssetPaymentAssetDetail().remove(deleteIndex); 285 286 return mapping.findForward(KFSConstants.MAPPING_BASIC); 287 } 288 289 @Override 290 public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 291 AssetPaymentDocument assetPaymentDocument = ((AssetPaymentForm) form).getAssetPaymentDocument(); 292 String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME; 293 // run all validation first 294 boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AssetPaymentPrepareRouteEvent(errorPath, assetPaymentDocument)); 295 if (rulePassed) { 296 // this super method call could trigger the warning message of object sub type code from payment lines not matching the 297 // one from assets. 298 return super.route(mapping, form, request, response); 299 } 300 else { 301 return mapping.findForward(KFSConstants.MAPPING_BASIC); 302 } 303 } 304 305 @Override 306 public ActionForward blanketApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 307 AssetPaymentDocument assetPaymentDocument = ((AssetPaymentForm) form).getAssetPaymentDocument(); 308 String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME; 309 // run all validation first 310 boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AssetPaymentPrepareRouteEvent(errorPath, assetPaymentDocument)); 311 if (rulePassed) { 312 return super.blanketApprove(mapping, form, request, response); 313 } 314 else { 315 return mapping.findForward(KFSConstants.MAPPING_BASIC); 316 } 317 } 318 319 protected AssetPaymentService getAssetPaymentService() { 320 return SpringContext.getBean(AssetPaymentService.class); 321 } 322 323 }