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.endow.document.validation.impl; 017 018 import java.sql.Date; 019 import java.util.ArrayList; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.kuali.kfs.coa.businessobject.Account; 025 import org.kuali.kfs.coa.businessobject.Chart; 026 import org.kuali.kfs.coa.businessobject.ObjectCode; 027 import org.kuali.kfs.coa.businessobject.ProjectCode; 028 import org.kuali.kfs.coa.businessobject.SubAccount; 029 import org.kuali.kfs.coa.businessobject.SubObjectCode; 030 import org.kuali.kfs.module.endow.EndowConstants; 031 import org.kuali.kfs.module.endow.EndowKeyConstants; 032 import org.kuali.kfs.module.endow.EndowPropertyConstants; 033 import org.kuali.kfs.module.endow.businessobject.EndowmentRecurringCashTransfer; 034 import org.kuali.kfs.module.endow.businessobject.EndowmentRecurringCashTransferGLTarget; 035 import org.kuali.kfs.module.endow.businessobject.EndowmentRecurringCashTransferKEMIDTarget; 036 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionCode; 037 import org.kuali.kfs.module.endow.businessobject.KEMID; 038 import org.kuali.kfs.module.endow.businessobject.KemidGeneralLedgerAccount; 039 import org.kuali.kfs.module.endow.document.service.EndowmentTransactionDocumentService; 040 import org.kuali.kfs.module.endow.document.service.impl.FrequencyCodeServiceImpl; 041 import org.kuali.kfs.sys.KFSKeyConstants; 042 import org.kuali.kfs.sys.KFSPropertyConstants; 043 import org.kuali.kfs.sys.context.SpringContext; 044 import org.kuali.kfs.sys.service.UniversityDateService; 045 import org.kuali.rice.kns.bo.PersistableBusinessObject; 046 import org.kuali.rice.kns.document.MaintenanceDocument; 047 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 048 import org.kuali.rice.kns.service.BusinessObjectService; 049 import org.kuali.rice.kns.service.DataDictionaryService; 050 import org.kuali.rice.kns.util.GlobalVariables; 051 import org.kuali.rice.kns.util.KualiDecimal; 052 import org.kuali.rice.kns.util.ObjectUtils; 053 import org.kuali.rice.kns.util.RiceKeyConstants; 054 055 public class EndowmentRecurringCashTransferTransactionRule extends MaintenanceDocumentRuleBase { 056 057 @Override 058 public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) { 059 boolean isValid = true; 060 isValid &= super.processCustomAddCollectionLineBusinessRules(document, collectionName, line); 061 062 EndowmentRecurringCashTransfer endowmentRecurringCashTransfer = (EndowmentRecurringCashTransfer) document.getNewMaintainableObject().getBusinessObject(); 063 boolean success = true; 064 065 // apply rules 066 if (collectionName.equals(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_KEMID_TARGET)){ 067 EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget = (EndowmentRecurringCashTransferKEMIDTarget) document.getNewMaintainableObject().getNewCollectionLine(collectionName); 068 // check rules 069 success &= validateKEMIDTarget(endowmentRecurringCashTransferKEMIDTarget); 070 // check transaction type 071 success &= checkTransactionType(endowmentRecurringCashTransfer.getTransactionType(), collectionName, endowmentRecurringCashTransfer); 072 073 // all rules are passed, then set sequenceNumber and add to collection 074 if (success){ 075 endowmentRecurringCashTransferKEMIDTarget.setTargetSequenceNumber(endowmentRecurringCashTransfer.incrementTargetKemidNextSeqNumber().toString()); 076 isValid = true; 077 } else isValid = false; 078 } else { 079 EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget = (EndowmentRecurringCashTransferGLTarget) document.getNewMaintainableObject().getNewCollectionLine(collectionName); 080 // check rules 081 success &= validateGlTarget(endowmentRecurringCashTransferGLTarget); 082 // check transaction type 083 success &= checkTransactionType(endowmentRecurringCashTransfer.getTransactionType(), collectionName, endowmentRecurringCashTransfer); 084 // all rules are passed, then set sequenceNumber and add to collection 085 if (success){ 086 endowmentRecurringCashTransferGLTarget.setTargetSequenceNumber(endowmentRecurringCashTransfer.incrementTargetGlNextSeqNumber().toString()); 087 isValid = true; 088 } else isValid = false; 089 } 090 return isValid; 091 } 092 093 @Override 094 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { 095 EndowmentRecurringCashTransfer endowmentRecurringCashTransfer = (EndowmentRecurringCashTransfer) document.getNewMaintainableObject().getBusinessObject(); 096 boolean success = true; 097 success &= super.processCustomRouteDocumentBusinessRules(document); 098 099 // source rules 100 success &= checkTargetExistence(endowmentRecurringCashTransfer); 101 102 if (ObjectUtils.isNotNull(endowmentRecurringCashTransfer.getTransactionType())){ 103 success &= checkTransactionType(endowmentRecurringCashTransfer); 104 } 105 106 // check eTran code 107 String kemid = endowmentRecurringCashTransfer.getSourceKemid(); 108 String etranCode = endowmentRecurringCashTransfer.getSourceEtranCode(); 109 String ipIndicator = endowmentRecurringCashTransfer.getSourceIncomeOrPrincipal(); 110 // refresh Etran obj 111 endowmentRecurringCashTransfer.refreshReferenceObject(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_ETRAN_CODE_OBJ); 112 success &= checkSourceEtranType(endowmentRecurringCashTransfer.getEtranCodeObj()); 113 114 success &= checkEtranCodeWithChart(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_SOURCE_ETRAN_CODE, kemid, etranCode, ipIndicator); 115 116 success &= checkActiveSourceKemid(endowmentRecurringCashTransfer.getKemidObj()); 117 118 success &= checkFrequencyCodeReferenceExists(endowmentRecurringCashTransfer); 119 120 if (ObjectUtils.isNotNull(endowmentRecurringCashTransfer.getFrequencyCode())){ 121 setNextProcessDate(endowmentRecurringCashTransfer); 122 setLastProcessDate(endowmentRecurringCashTransfer); 123 } 124 125 checkSourceActiveAndSetTargetActive(endowmentRecurringCashTransfer); 126 127 // KEMIDTarget rules 128 int kemidIndex = 0; 129 for (EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget : endowmentRecurringCashTransfer.getKemidTarget()) { 130 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_KEMID_TARGET + "[" + kemidIndex + "]"; 131 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 132 133 success &= validateKEMIDTarget(endowmentRecurringCashTransferKEMIDTarget); 134 135 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 136 kemidIndex++; 137 } 138 139 success &= checkKemidAllPercent(endowmentRecurringCashTransfer.getKemidTarget()); 140 141 success &= checkKemidPercentForSameEtranCode(endowmentRecurringCashTransfer.getKemidTarget()); 142 143 // GLTarget rules 144 int glIndex = 0; 145 for (EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget : endowmentRecurringCashTransfer.getGlTarget()) { 146 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_GL_TARGET + "[" + glIndex + "]"; 147 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 148 149 success &= validateGlTarget(endowmentRecurringCashTransferGLTarget); 150 151 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 152 glIndex++; 153 } 154 155 success &= checkGlAllPercent(endowmentRecurringCashTransfer.getGlTarget()); 156 157 success &= checkGlPercentForSameEtranCode(endowmentRecurringCashTransfer.getGlTarget()); 158 159 if (GlobalVariables.getMessageMap().hasErrors()) { 160 return false; 161 } 162 163 return success; 164 } 165 166 protected boolean validateKEMIDTarget(EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget){ 167 boolean success = true; 168 169 success &= checkTargetKemidReferenceExists(endowmentRecurringCashTransferKEMIDTarget); 170 171 success &= checkGeneralLedgerAccount(endowmentRecurringCashTransferKEMIDTarget); 172 173 success &= checkKemidAmountPercentEtranCodeField(endowmentRecurringCashTransferKEMIDTarget); 174 175 String kemid = endowmentRecurringCashTransferKEMIDTarget.getTargetKemid(); 176 String etranCode = endowmentRecurringCashTransferKEMIDTarget.getTargetEtranCode(); 177 String ipIndicator = endowmentRecurringCashTransferKEMIDTarget.getTargetIncomeOrPrincipal(); 178 179 // refresh Etran obj 180 endowmentRecurringCashTransferKEMIDTarget.refreshReferenceObject(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_ETRAN_CODE_OBJ); 181 success &= checkTargetEtranType(endowmentRecurringCashTransferKEMIDTarget.getTargetEtranCodeObj()); 182 183 success &= checkEtranCodeWithChart(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_ETRAN_CODE, kemid, etranCode, ipIndicator); 184 185 return success; 186 } 187 188 protected boolean validateGlTarget(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget){ 189 boolean success = true; 190 191 success &= checkChart(endowmentRecurringCashTransferGLTarget); 192 193 success &= checkAccount(endowmentRecurringCashTransferGLTarget); 194 195 if(ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetSubAccountNumber())){ 196 success &= checkSubAccount(endowmentRecurringCashTransferGLTarget); 197 } 198 199 success &= checkObjectCode(endowmentRecurringCashTransferGLTarget); 200 201 if(ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetFinancialSubObjectCode())){ 202 success &= checkSubObjectCode(endowmentRecurringCashTransferGLTarget); 203 } 204 205 if(ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetProjectCode())){ 206 success &= checkProjectCode(endowmentRecurringCashTransferGLTarget); 207 } 208 209 success &= checkGlAmountPercentEtranCodeField(endowmentRecurringCashTransferGLTarget); 210 211 return success; 212 } 213 214 // EndowmentRecurringCashTransfer rules 215 protected boolean checkTargetExistence(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 216 // just checking existence will be enough 217 // because document type and related target object is already checked. 218 if (endowmentRecurringCashTransfer.getKemidTarget().size() < 1 && endowmentRecurringCashTransfer.getGlTarget().size() < 1) { 219 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_TARGETOBJECT_EXIST); 220 return false; 221 } 222 return true; 223 } 224 225 protected boolean checkTransactionType(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 226 if (endowmentRecurringCashTransfer.getTransactionType().equals(EndowConstants.ENDOWMENT_CASH_TRANSFER_TRANSACTION_TYPE)){ 227 if (endowmentRecurringCashTransfer.getGlTarget().size() > 0){ 228 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, KFSKeyConstants.ERROR_TRANSACTION_TYPE_INVALID); 229 return false; 230 } 231 } else if (endowmentRecurringCashTransfer.getKemidTarget().size() > 0){ 232 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, KFSKeyConstants.ERROR_TRANSACTION_TYPE_INVALID); 233 return false; 234 } 235 return true; 236 } 237 238 protected boolean checkFrequencyCodeReferenceExists(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 239 endowmentRecurringCashTransfer.refreshReferenceObject("frequencyCodeObj"); 240 if (ObjectUtils.isNull(endowmentRecurringCashTransfer.getFrequencyCodeObj())) { 241 String label = SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getBusinessObjectEntry(EndowmentRecurringCashTransfer.class.getName()).getAttributeDefinition(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_FREQUENCY_CODE).getLabel(); 242 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_FREQUENCY_CODE, RiceKeyConstants.ERROR_EXISTENCE, label); 243 return false; 244 } 245 return true; 246 } 247 248 249 protected boolean checkActiveSourceKemid(KEMID kemid){ 250 if (kemid.isClose()){ 251 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_SOURCE_KEMID, RiceKeyConstants.ERROR_CLOSED, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_SOURCE_KEMID); 252 return false; 253 } 254 return true; 255 } 256 257 protected void setNextProcessDate(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 258 259 if (ObjectUtils.isNull(endowmentRecurringCashTransfer.getNextProcessDate())) { 260 FrequencyCodeServiceImpl frequencyCodeServiceImpl = (FrequencyCodeServiceImpl) SpringContext.getBean(FrequencyCodeServiceImpl.class); 261 Date processDate = frequencyCodeServiceImpl.calculateProcessDate(endowmentRecurringCashTransfer.getFrequencyCode()); 262 endowmentRecurringCashTransfer.setNextProcessDate(processDate); 263 } 264 } 265 266 protected void setLastProcessDate(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 267 268 if (ObjectUtils.isNull(endowmentRecurringCashTransfer.getLastProcessDate())) { 269 FrequencyCodeServiceImpl frequencyCodeServiceImpl = (FrequencyCodeServiceImpl) SpringContext.getBean(FrequencyCodeServiceImpl.class); 270 Date processDate = frequencyCodeServiceImpl.calculateProcessDate(endowmentRecurringCashTransfer.getFrequencyCode()); 271 endowmentRecurringCashTransfer.setLastProcessDate(processDate); 272 } 273 } 274 275 protected void checkSourceActiveAndSetTargetActive(EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 276 if (!endowmentRecurringCashTransfer.isActive()) { 277 for (EndowmentRecurringCashTransferKEMIDTarget kemidTarget : endowmentRecurringCashTransfer.getKemidTarget()) { 278 kemidTarget.setActive(false); 279 } 280 281 for (EndowmentRecurringCashTransferGLTarget glTarget : endowmentRecurringCashTransfer.getGlTarget()) { 282 glTarget.setActive(false); 283 } 284 } 285 } 286 287 // EndowmentRecurringCashTransferKEMIDTarget rules 288 protected boolean checkTargetKemidReferenceExists(EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget) { 289 // TODO: need to constants? 290 endowmentRecurringCashTransferKEMIDTarget.refreshReferenceObject("targetKemidObj"); 291 if (ObjectUtils.isNull(endowmentRecurringCashTransferKEMIDTarget.getTargetKemidObj())) { 292 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_KEMID, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_KEMID); 293 return false; 294 } else { 295 if (endowmentRecurringCashTransferKEMIDTarget.getTargetKemidObj().isClose()){ 296 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_KEMID, RiceKeyConstants.ERROR_CLOSED, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_KEMID); 297 } 298 } 299 return true; 300 } 301 302 protected boolean checkGeneralLedgerAccount(EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget) { 303 Map objectKeys = new HashMap(); 304 objectKeys.put(EndowPropertyConstants.KEMID, endowmentRecurringCashTransferKEMIDTarget.getTargetKemid()); 305 objectKeys.put(EndowPropertyConstants.KEMID_GL_ACCOUNT_IP_INDICATOR_CD, endowmentRecurringCashTransferKEMIDTarget.getTargetIncomeOrPrincipal()); 306 KemidGeneralLedgerAccount kemidGeneralLedgerAccount = (KemidGeneralLedgerAccount) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(KemidGeneralLedgerAccount.class, objectKeys); 307 if (ObjectUtils.isNull(kemidGeneralLedgerAccount)) { 308 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_INCOME_OR_PRINCIPAL_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.KEMID_GL_ACCOUNT_IP_INDICATOR_CD); 309 return false; 310 } 311 return true; 312 } 313 314 protected boolean checkKemidAmountPercentEtranCodeField(EndowmentRecurringCashTransferKEMIDTarget endowmentRecurringCashTransferKEMIDTarget) { 315 if (ObjectUtils.isNotNull(endowmentRecurringCashTransferKEMIDTarget.getTargetAmount())) { 316 if (ObjectUtils.isNotNull(endowmentRecurringCashTransferKEMIDTarget.getTargetPercent()) || ObjectUtils.isNotNull(endowmentRecurringCashTransferKEMIDTarget.getTargetUseEtranCode())) { 317 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_AMOUNT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_AMOUNT_SPECIFIED_PERCENT_OR_ETRAN); 318 return false; 319 } 320 } 321 return true; 322 } 323 324 protected boolean checkSourceEtranType(EndowmentTransactionCode eTranCodeObject){ 325 if (!checkEtranType(eTranCodeObject)){ 326 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_SOURCE_ETRAN_CODE, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_ETRAN_CODE_INVALID_TYPE); 327 return false; 328 } 329 return true; 330 } 331 332 protected boolean checkTargetEtranType(EndowmentTransactionCode eTranCodeObject){ 333 if (!checkEtranType(eTranCodeObject)){ 334 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_ETRAN_CODE, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_ETRAN_CODE_INVALID_TYPE); 335 return false; 336 } 337 return true; 338 } 339 340 protected boolean checkEtranType(EndowmentTransactionCode eTranCodeObject) { 341 String eTranTypeCode = eTranCodeObject.getEndowmentTransactionTypeCode(); 342 if (!eTranTypeCode.equals(EndowConstants.EndowmentTransactionTypeCodes.INCOME_TYPE_CODE) && !eTranTypeCode.equals(EndowConstants.EndowmentTransactionTypeCodes.EXPENSE_TYPE_CODE)){ 343 return false; 344 } 345 return true; 346 } 347 348 protected boolean checkEtranCodeWithChart(String property, String kemid, String etranCode, String ipIndicator) { 349 EndowmentTransactionDocumentService endowmentTransactionDocumentService = SpringContext.getBean(EndowmentTransactionDocumentService.class); 350 if (!endowmentTransactionDocumentService.matchChartBetweenKEMIDAndETranCode(kemid, etranCode, ipIndicator)){ 351 if (EndowConstants.IncomePrincipalIndicator.PRINCIPAL.equalsIgnoreCase(ipIndicator)) 352 GlobalVariables.getMessageMap().putError(property, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_TRANSACTION_LINE_CHART_CODE_DOES_NOT_MATCH_FOR_PRINCIPAL); 353 else 354 GlobalVariables.getMessageMap().putError(property, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_TRANSACTION_LINE_CHART_CODE_DOES_NOT_MATCH_FOR_INCOME); 355 return false; 356 } 357 return true; 358 } 359 360 protected boolean checkKemidAllPercent(List<EndowmentRecurringCashTransferKEMIDTarget> kemidTargetList) { 361 KualiDecimal totalTarget = KualiDecimal.ZERO; 362 for (EndowmentRecurringCashTransferKEMIDTarget kemidTarget : kemidTargetList) { 363 if (ObjectUtils.isNotNull(kemidTarget.getTargetPercent())) { 364 totalTarget = totalTarget.add(kemidTarget.getTargetPercent()); 365 } 366 } 367 if (totalTarget.isGreaterThan(new KualiDecimal(100))) { 368 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_KEMID_TARGET + "[" + 0 + "]"; 369 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 370 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PERCENT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_TOTAL_PERCENT_CANNOT_EXCEED); 371 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 372 return false; 373 } 374 return true; 375 } 376 377 protected boolean checkKemidPercentForSameEtranCode(List<EndowmentRecurringCashTransferKEMIDTarget> kemidTargetList) { 378 List<String> etranCodeList = new ArrayList(); 379 380 for (EndowmentRecurringCashTransferKEMIDTarget kemidTarget : kemidTargetList) { 381 if (ObjectUtils.isNotNull(kemidTarget.getTargetUseEtranCode())) { 382 etranCodeList.add(kemidTarget.getTargetUseEtranCode()); 383 } 384 } 385 386 if (etranCodeList.size() > 0) { 387 for (String etranCode : etranCodeList) { 388 KualiDecimal totalTarget = KualiDecimal.ZERO; 389 390 for (EndowmentRecurringCashTransferKEMIDTarget kemidTarget : kemidTargetList) { 391 if (kemidTarget.getTargetUseEtranCode().equals(etranCode) && ObjectUtils.isNotNull(kemidTarget.getTargetPercent())) { 392 totalTarget = totalTarget.add(kemidTarget.getTargetPercent()); 393 } 394 } 395 if (totalTarget.isGreaterThan(new KualiDecimal(100))) { 396 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_KEMID_TARGET + "[" + 0 + "]"; 397 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 398 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PERCENT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_TOTAL_PERCENT_CANNOT_EXCEED_SPECIFIED_ETRAN); 399 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 400 return false; 401 } 402 } 403 } 404 return true; 405 } 406 407 // EndowmentRecurringCashTransferGLTarget rules 408 protected boolean checkChart(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 409 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.CHART); 410 Chart chart = endowmentRecurringCashTransferGLTarget.getChart(); 411 if (ObjectUtils.isNull(chart) || !chart.isActive()) { 412 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_COA_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_COA_CODE); 413 return false; 414 } 415 return true; 416 } 417 418 protected boolean checkAccount(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 419 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.ACCOUNT); 420 Account account = endowmentRecurringCashTransferGLTarget.getAccount(); 421 if (ObjectUtils.isNull(account) || account.isClosed()) { 422 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_ACCOUNT_NUMBER, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_ACCOUNT_NUMBER); 423 return false; 424 } 425 return true; 426 } 427 428 protected boolean checkSubAccount(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 429 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.SUB_ACCOUNT); 430 SubAccount subAccount = endowmentRecurringCashTransferGLTarget.getSubAccount(); 431 if (ObjectUtils.isNull(subAccount) || !subAccount.isActive()) { 432 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_ACCOUNT_NUMBER, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_ACCOUNT_NUMBER); 433 return false; 434 } 435 436 Map objectKeys = new HashMap(); 437 objectKeys.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, endowmentRecurringCashTransferGLTarget.getTargetChartOfAccountsCode()); 438 objectKeys.put(KFSPropertyConstants.ACCOUNT_NUMBER, endowmentRecurringCashTransferGLTarget.getTargetAccountsNumber()); 439 objectKeys.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, endowmentRecurringCashTransferGLTarget.getTargetSubAccountNumber()); 440 subAccount = (SubAccount) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(SubAccount.class, objectKeys); 441 if (ObjectUtils.isNull(subAccount)) { 442 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_ACCOUNT_NUMBER, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_ACCOUNT_NUMBER); 443 return false; 444 } 445 return true; 446 } 447 448 protected boolean checkObjectCode(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 449 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.OBJECT_CODE); 450 ObjectCode objectCode = endowmentRecurringCashTransferGLTarget.getObjectCode(); 451 if (ObjectUtils.isNull(objectCode) || !objectCode.isActive()) { 452 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_OBJECT_CODE); 453 return false; 454 } 455 456 Map objectKeys = new HashMap(); 457 objectKeys.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear()); 458 objectKeys.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, endowmentRecurringCashTransferGLTarget.getTargetChartOfAccountsCode()); 459 objectKeys.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, endowmentRecurringCashTransferGLTarget.getTargetFinancialObjectCode()); 460 objectCode = (ObjectCode) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(ObjectCode.class, objectKeys); 461 if (ObjectUtils.isNull(objectCode)) { 462 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_OBJECT_CODE); 463 return false; 464 } 465 return true; 466 } 467 468 protected boolean checkSubObjectCode(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 469 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.SUB_OBJECT_CODE); 470 SubObjectCode subObjectCode = endowmentRecurringCashTransferGLTarget.getSubObjectCode(); 471 if (ObjectUtils.isNull(subObjectCode) || !subObjectCode.isActive()) { 472 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_OBJECT_CODE); 473 return false; 474 } 475 476 Map objectKeys = new HashMap(); 477 objectKeys.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear()); 478 objectKeys.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, endowmentRecurringCashTransferGLTarget.getTargetChartOfAccountsCode()); 479 objectKeys.put(KFSPropertyConstants.ACCOUNT_NUMBER, endowmentRecurringCashTransferGLTarget.getTargetAccountsNumber()); 480 objectKeys.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, endowmentRecurringCashTransferGLTarget.getTargetFinancialObjectCode()); 481 objectKeys.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, endowmentRecurringCashTransferGLTarget.getTargetFinancialSubObjectCode()); 482 subObjectCode = (SubObjectCode) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(SubObjectCode.class, objectKeys); 483 if (ObjectUtils.isNull(subObjectCode)) { 484 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_SUB_OBJECT_CODE); 485 return false; 486 } 487 return true; 488 } 489 490 protected boolean checkProjectCode(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 491 endowmentRecurringCashTransferGLTarget.refreshReferenceObject(KFSPropertyConstants.PROJECT_CODE); 492 ProjectCode projectCode = endowmentRecurringCashTransferGLTarget.getProjectCode(); 493 if (ObjectUtils.isNull(projectCode) || !projectCode.isActive()) { 494 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PROJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PROJECT_CODE); 495 return false; 496 } 497 return true; 498 } 499 500 protected boolean checkGlAmountPercentEtranCodeField(EndowmentRecurringCashTransferGLTarget endowmentRecurringCashTransferGLTarget) { 501 if (ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetFdocLineAmount())) { 502 if (ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetPercent()) || ObjectUtils.isNotNull(endowmentRecurringCashTransferGLTarget.getTargetUseEtranCode())) { 503 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_FDOC_LINE_AMOUNT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_AMOUNT_SPECIFIED_PERCENT_OR_ETRAN); 504 return false; 505 } 506 } 507 return true; 508 } 509 510 protected boolean checkGlAllPercent(List<EndowmentRecurringCashTransferGLTarget> glTargetList) { 511 KualiDecimal totalTarget = KualiDecimal.ZERO; 512 for (EndowmentRecurringCashTransferGLTarget glTarget : glTargetList) { 513 if (ObjectUtils.isNotNull(glTarget.getTargetPercent())) { 514 totalTarget = totalTarget.add(glTarget.getTargetPercent()); 515 } 516 } 517 518 if (totalTarget.isGreaterThan(new KualiDecimal(100))) { 519 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_GL_TARGET + "[" + 0 + "]"; 520 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 521 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PERCENT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_TOTAL_PERCENT_CANNOT_EXCEED); 522 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 523 return false; 524 } 525 return true; 526 } 527 528 protected boolean checkGlPercentForSameEtranCode(List<EndowmentRecurringCashTransferGLTarget> glTargetList) { 529 List<String> etranCodeList = new ArrayList(); 530 531 for (EndowmentRecurringCashTransferGLTarget glTarget : glTargetList) { 532 if (ObjectUtils.isNotNull(glTarget.getTargetUseEtranCode())) { 533 etranCodeList.add(glTarget.getTargetUseEtranCode()); 534 } 535 } 536 if (etranCodeList.size() > 0) { 537 for (String etranCode : etranCodeList) { 538 KualiDecimal totalTarget = KualiDecimal.ZERO; 539 540 for (EndowmentRecurringCashTransferGLTarget glTarget : glTargetList) { 541 if (glTarget.getTargetUseEtranCode().equals(etranCode) && ObjectUtils.isNotNull(glTarget.getTargetPercent())){ 542 totalTarget = totalTarget.add(glTarget.getTargetPercent()); 543 } 544 } 545 546 if (totalTarget.isGreaterThan(new KualiDecimal(100))) { 547 String errorPath = MAINTAINABLE_ERROR_PREFIX + EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_GL_TARGET + "[" + 0 + "]"; 548 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 549 GlobalVariables.getMessageMap().putError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TARGET_PERCENT, EndowKeyConstants.EndowmentRecurringCashTransfer.ERROR_DOCUMENT_TOTAL_PERCENT_CANNOT_EXCEED_SPECIFIED_ETRAN); 550 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 551 return false; 552 } 553 } 554 } 555 return true; 556 } 557 558 protected boolean checkTransactionType(String transactionType, String collectionName, EndowmentRecurringCashTransfer endowmentRecurringCashTransfer) { 559 if (ObjectUtils.isNull(endowmentRecurringCashTransfer.getTransactionType())){ 560 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, KFSKeyConstants.ERROR_REQUIRED, EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE); 561 return false; 562 } 563 564 if (transactionType.equals(EndowConstants.ENDOWMENT_CASH_TRANSFER_TRANSACTION_TYPE)){ 565 if (!collectionName.equals(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_KEMID_TARGET)){ 566 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, KFSKeyConstants.ERROR_TRANSACTION_TYPE_INVALID); 567 return false; 568 } 569 } else { 570 if (!collectionName.equals(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_GL_TARGET)){ 571 putFieldError(EndowPropertyConstants.ENDOWMENT_RECURRING_CASH_TRANSF_TRANSACTION_TYPE, KFSKeyConstants.ERROR_TRANSACTION_TYPE_INVALID); 572 return false; 573 } 574 } 575 return true; 576 } 577 }