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.bc.document.service.impl; 017 018 import org.apache.log4j.Logger; 019 import org.kuali.kfs.coa.businessobject.Account; 020 import org.kuali.kfs.coa.businessobject.Chart; 021 import org.kuali.kfs.coa.businessobject.ObjectCode; 022 import org.kuali.kfs.coa.businessobject.SubAccount; 023 import org.kuali.kfs.coa.businessobject.SubObjectCode; 024 import org.kuali.kfs.integration.ld.LaborLedgerObject; 025 import org.kuali.kfs.integration.ld.LaborModuleService; 026 import org.kuali.kfs.module.bc.BCConstants; 027 import org.kuali.kfs.module.bc.BCKeyConstants; 028 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent; 029 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; 030 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; 031 import org.kuali.kfs.module.bc.document.BudgetConstructionDocument; 032 import org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService; 033 import org.kuali.kfs.module.bc.document.service.BudgetDocumentService; 034 import org.kuali.kfs.sys.KFSConstants; 035 import org.kuali.kfs.sys.KFSKeyConstants; 036 import org.kuali.kfs.sys.KFSPropertyConstants; 037 import org.kuali.kfs.sys.MessageBuilder; 038 import org.kuali.rice.kns.service.DictionaryValidationService; 039 import org.kuali.rice.kns.util.MessageMap; 040 import org.kuali.rice.kns.util.ObjectUtils; 041 042 /** 043 * implementing the validation methods defined in BudgetConstructionRuleHelperService 044 */ 045 public class BudgetConstructionRuleHelperServiceImpl implements BudgetConstructionRuleHelperService { 046 private static final Logger LOG = Logger.getLogger(BudgetConstructionRuleHelperServiceImpl.class); 047 048 private DictionaryValidationService dictionaryValidationService; 049 private LaborModuleService laborModuleService; 050 private BudgetDocumentService budgetDocumentService; 051 052 /** 053 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasDetailPositionRequiredObjectCode(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 054 * org.kuali.core.util.ErrorMap) 055 */ 056 public boolean hasDetailPositionRequiredObjectCode(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 057 String objectCode = appointmentFunding.getFinancialObjectCode(); 058 ObjectCode financialObject = appointmentFunding.getFinancialObject(); 059 060 return this.isDetailPositionRequiredObjectCode(financialObject, objectCode, errorMap, KFSPropertyConstants.FINANCIAL_OBJECT); 061 } 062 063 /** 064 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidAccount(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 065 * org.kuali.core.util.ErrorMap) 066 */ 067 public boolean hasValidAccount(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 068 String accountNumber = appointmentFunding.getAccountNumber(); 069 Account account = appointmentFunding.getAccount(); 070 return this.isValidAccount(account, accountNumber, errorMap, KFSPropertyConstants.ACCOUNT_NAME); 071 } 072 073 /** 074 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidChart(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 075 * org.kuali.core.util.ErrorMap) 076 */ 077 public boolean hasValidChart(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 078 String chartOfAccountsCode = appointmentFunding.getChartOfAccountsCode(); 079 Chart chart = appointmentFunding.getChartOfAccounts(); 080 081 return this.isValidChart(chart, chartOfAccountsCode, errorMap, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 082 } 083 084 /** 085 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidIncumbent(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 086 * org.kuali.core.util.ErrorMap) 087 */ 088 public boolean hasValidIncumbent(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 089 String emplid = appointmentFunding.getEmplid(); 090 091 // VACANT emplid value is valid, don't do lookup in this case 092 if (BCConstants.VACANT_EMPLID.equalsIgnoreCase(emplid)) { 093 return true; 094 } 095 096 BudgetConstructionIntendedIncumbent intendedIncumbent = appointmentFunding.getBudgetConstructionIntendedIncumbent(); 097 098 return this.isValidIncumbent(intendedIncumbent, emplid, errorMap, KFSPropertyConstants.EMPLID); 099 } 100 101 /** 102 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidObjectCode(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 103 * org.kuali.core.util.ErrorMap) 104 */ 105 public boolean hasValidObjectCode(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 106 String objectCode = appointmentFunding.getFinancialObjectCode(); 107 ObjectCode financialObject = appointmentFunding.getFinancialObject(); 108 109 return this.isValidObjectCode(financialObject, objectCode, errorMap, KFSPropertyConstants.FINANCIAL_OBJECT); 110 } 111 112 /** 113 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidPosition(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 114 * org.kuali.core.util.ErrorMap) 115 */ 116 public boolean hasValidPosition(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 117 String positionNumber = appointmentFunding.getPositionNumber(); 118 BudgetConstructionPosition position = appointmentFunding.getBudgetConstructionPosition(); 119 120 return this.isValidPosition(position, positionNumber, errorMap, KFSPropertyConstants.POSITION_NUMBER); 121 } 122 123 /** 124 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidSubAccount(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 125 * org.kuali.core.util.ErrorMap) 126 */ 127 public boolean hasValidSubAccount(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 128 String subAccountNumber = appointmentFunding.getSubAccountNumber(); 129 130 // ok when dashes, no lookup 131 if (KFSConstants.getDashSubAccountNumber().equals(subAccountNumber)) { 132 return true; 133 } 134 135 SubAccount subAccount = appointmentFunding.getSubAccount(); 136 137 return this.isValidSubAccount(subAccount, subAccountNumber, errorMap, KFSPropertyConstants.SUB_ACCOUNT_NAME); 138 } 139 140 /** 141 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#hasValidSubObjectCode(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 142 * org.kuali.core.util.ErrorMap) 143 */ 144 public boolean hasValidSubObjectCode(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 145 String subObjectCode = appointmentFunding.getFinancialSubObjectCode(); 146 147 // ok when dashes, no lookup 148 if (KFSConstants.getDashFinancialSubObjectCode().equals(subObjectCode)) { 149 return true; 150 } 151 152 SubObjectCode subObject = appointmentFunding.getFinancialSubObject(); 153 154 return this.isValidSubObjectCode(subObject, subObjectCode, errorMap, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE); 155 } 156 157 /** 158 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isAssociatedWithValidDocument(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 159 * org.kuali.core.util.ErrorMap, java.lang.String) 160 */ 161 public boolean isAssociatedWithValidDocument(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap, String errorPropertyName) { 162 BudgetConstructionDocument budgetConstructionDocument = budgetDocumentService.getBudgetConstructionDocument(appointmentFunding); 163 164 if (ObjectUtils.isNull(budgetConstructionDocument)) { 165 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE); 166 return false; 167 } 168 169 return this.isBudgetableDocument(budgetConstructionDocument, errorMap, errorPropertyName); 170 } 171 172 /** 173 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isBudgetableDocument(org.kuali.kfs.module.bc.document.BudgetConstructionDocument, 174 * org.kuali.core.util.ErrorMap, java.lang.String) 175 */ 176 public boolean isBudgetableDocument(BudgetConstructionDocument budgetConstructionDocument, MessageMap errorMap, String errorPropertyName) { 177 boolean isBudgetAllowed = budgetDocumentService.isBudgetableDocument(budgetConstructionDocument); 178 179 if (!isBudgetAllowed) { 180 errorMap.putError(errorPropertyName, BCKeyConstants.ERROR_BUDGET_DOCUMENT_NOT_BUDGETABLE, budgetConstructionDocument.getAccountNumber() + ";" + budgetConstructionDocument.getSubAccountNumber()); 181 } 182 183 return isBudgetAllowed; 184 } 185 186 /** 187 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#isDetailPositionRequiredObjectCode(org.kuali.kfs.coa.businessobject.ObjectCode, 188 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 189 */ 190 public boolean isDetailPositionRequiredObjectCode(ObjectCode financialObject, String currentValue, MessageMap errorMap, String errorPropertyName) { 191 if (ObjectUtils.isNull(financialObject)) { 192 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(ObjectCode.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE, currentValue); 193 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 194 return false; 195 } 196 197 LaborLedgerObject laborObject = laborModuleService.retrieveLaborLedgerObject(financialObject); 198 if (laborObject == null || !laborObject.isDetailPositionRequiredIndicator()) { 199 errorMap.putError(errorPropertyName, BCKeyConstants.ERROR_DETAIL_POSITION_NOT_REQUIRED, currentValue); 200 return false; 201 } 202 return true; 203 } 204 205 /** 206 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService#isFieldFormatValid(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding, 207 * org.kuali.core.util.ErrorMap) 208 */ 209 public boolean isFieldFormatValid(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) { 210 return dictionaryValidationService.isBusinessObjectValid(appointmentFunding); 211 } 212 213 /** 214 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidAccount(org.kuali.kfs.coa.businessobject.Account, 215 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 216 */ 217 public boolean isValidAccount(Account account, String currentValue, MessageMap errorMap, String errorPropertyName) { 218 if (ObjectUtils.isNull(account)) { 219 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(Account.class, KFSPropertyConstants.ACCOUNT_NAME, currentValue); 220 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 221 return false; 222 } 223 224 if (!account.isActive()) { 225 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(Account.class, KFSPropertyConstants.ACCOUNT_NAME, currentValue); 226 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 227 return false; 228 } 229 return true; 230 } 231 232 /** 233 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidChart(org.kuali.kfs.coa.businessobject.Chart, 234 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 235 */ 236 public boolean isValidChart(Chart chart, String currentValue, MessageMap errorMap, String errorPropertyName) { 237 if (ObjectUtils.isNull(chart)) { 238 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(Chart.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, currentValue); 239 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 240 return false; 241 } 242 243 if (!chart.isActive()) { 244 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(Chart.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, currentValue); 245 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 246 return false; 247 } 248 249 return true; 250 } 251 252 /** 253 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidIncumbent(org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent, 254 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 255 */ 256 public boolean isValidIncumbent(BudgetConstructionIntendedIncumbent intendedIncumbent, String currentValue, MessageMap errorMap, String errorPropertyName) { 257 // if (BCConstants.VACANT_EMPLID.equalsIgnoreCase(currentValue)) { 258 // return true; 259 // } 260 261 if (ObjectUtils.isNull(intendedIncumbent)) { 262 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(BudgetConstructionIntendedIncumbent.class, KFSPropertyConstants.EMPLID, currentValue); 263 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 264 return false; 265 } 266 267 return true; 268 } 269 270 /** 271 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidObjectCode(org.kuali.kfs.coa.businessobject.ObjectCode, 272 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 273 */ 274 public boolean isValidObjectCode(ObjectCode objectCode, String currentValue, MessageMap errorMap, String errorPropertyName) { 275 if (ObjectUtils.isNull(objectCode)) { 276 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(ObjectCode.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE, currentValue); 277 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 278 return false; 279 } 280 281 if (!objectCode.isActive()) { 282 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(ObjectCode.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE, currentValue); 283 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 284 return false; 285 } 286 287 return true; 288 } 289 290 /** 291 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidPosition(org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition, 292 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 293 */ 294 public boolean isValidPosition(BudgetConstructionPosition position, String currentValue, MessageMap errorMap, String errorPropertyName) { 295 if (ObjectUtils.isNull(position)) { 296 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(BudgetConstructionPosition.class, KFSPropertyConstants.POSITION_NUMBER, currentValue); 297 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 298 return false; 299 } 300 301 if (!position.isEffective()) { 302 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(BudgetConstructionPosition.class, KFSPropertyConstants.POSITION_NUMBER, currentValue); 303 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 304 return false; 305 } 306 307 if (!position.isBudgetedPosition()) { 308 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(BudgetConstructionPosition.class, KFSPropertyConstants.POSITION_NUMBER, currentValue); 309 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 310 return false; 311 } 312 313 return true; 314 } 315 316 /** 317 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidSubAccount(org.kuali.kfs.coa.businessobject.SubAccount, 318 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 319 */ 320 public boolean isValidSubAccount(SubAccount subAccount, String currentValue, MessageMap errorMap, String errorPropertyName) { 321 // if (KFSConstants.getDashSubAccountNumber().equals(currentValue)) { 322 // return true; 323 // } 324 325 if (ObjectUtils.isNull(subAccount)) { 326 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(SubAccount.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER, currentValue); 327 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 328 return false; 329 } 330 331 if (!subAccount.isActive()) { 332 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(SubAccount.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER, currentValue); 333 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_DOCUMENT_SUB_ACCOUNT_INACTIVE, errorMessage); 334 return false; 335 } 336 337 return true; 338 } 339 340 /** 341 * @see org.kuali.kfs.module.bc.document.service.impl.BudgetConstructionRuleHelperService#isValidSubObjectCode(org.kuali.kfs.coa.businessobject.SubObjCd, 342 * java.lang.String, org.kuali.core.util.ErrorMap, java.lang.String) 343 */ 344 public boolean isValidSubObjectCode(SubObjectCode subObjectCode, String currentValue, MessageMap errorMap, String errorPropertyName) { 345 // if (KFSConstants.getDashFinancialSubObjectCode().equals(currentValue)) { 346 // return true; 347 // } 348 349 if (ObjectUtils.isNull(subObjectCode)) { 350 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(SubObjectCode.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, currentValue); 351 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, errorMessage); 352 return false; 353 } 354 355 if (!subObjectCode.isActive()) { 356 String errorMessage = MessageBuilder.buildErrorMessageWithDataDictionary(SubObjectCode.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, currentValue); 357 errorMap.putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, errorMessage); 358 return false; 359 } 360 return true; 361 } 362 363 /** 364 * Sets the budgetDocumentService attribute value. 365 * 366 * @param budgetDocumentService The budgetDocumentService to set. 367 */ 368 public void setBudgetDocumentService(BudgetDocumentService budgetDocumentService) { 369 this.budgetDocumentService = budgetDocumentService; 370 } 371 372 /** 373 * Sets the dictionaryValidationService attribute value. 374 * 375 * @param dictionaryValidationService The dictionaryValidationService to set. 376 */ 377 public void setDictionaryValidationService(DictionaryValidationService dictionaryValidationService) { 378 this.dictionaryValidationService = dictionaryValidationService; 379 } 380 381 /** 382 * Sets the laborModuleService attribute value. 383 * 384 * @param laborModuleService The laborModuleService to set. 385 */ 386 public void setLaborModuleService(LaborModuleService laborModuleService) { 387 this.laborModuleService = laborModuleService; 388 } 389 }