/* * 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.coa.document.validation.impl; import java.math.BigDecimal; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.businessobject.Account; import org.kuali.kfs.coa.businessobject.Chart; import org.kuali.kfs.coa.businessobject.IndirectCostRecoveryRate; import org.kuali.kfs.coa.businessobject.IndirectCostRecoveryRateDetail; import org.kuali.kfs.coa.businessobject.ObjectCode; import org.kuali.kfs.coa.businessobject.SubAccount; import org.kuali.kfs.coa.businessobject.SubObjectCode; import org.kuali.kfs.gl.GeneralLedgerConstants; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.SystemOptions; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.util.RiceKeyConstants; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.KRADConstants; public class IndirectCostRecoveryRateRule extends MaintenanceDocumentRuleBase { protected static final String MAINTAINABLE_DETAIL_ERROR_PATH = KRADConstants.MAINTENANCE_NEW_MAINTAINABLE + "indirectCostRecoveryRateDetails"; protected static final String MAINTAINABLE_DETAIL_ADDLINE_ERROR_PATH = "add.indirectCostRecoveryRateDetails"; protected IndirectCostRecoveryRate indirectCostRecoveryRate; protected IndirectCostRecoveryRateDetail indirectCostRecoveryRateDetail; protected List<IndirectCostRecoveryRateDetail> indirectCostRecoveryRateDetails; public void setupConvenienceObjects() { indirectCostRecoveryRate = (IndirectCostRecoveryRate) super.getNewBo(); indirectCostRecoveryRateDetails = indirectCostRecoveryRate.getIndirectCostRecoveryRateDetails(); } @Override protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { boolean success = true; BigDecimal awardIndrCostRcvyRatePctCredits = new BigDecimal(0); BigDecimal awardIndrCostRcvyRatePctDebits = new BigDecimal(0); if (!processYear()) { success = false; } else { for(int i = 0;i<indirectCostRecoveryRateDetails.size();i++) { if(indirectCostRecoveryRateDetails.get(i).isActive()) { GlobalVariables.getMessageMap().addToErrorPath(MAINTAINABLE_DETAIL_ERROR_PATH + "[" + i + "]"); success &= processCollectionLine(indirectCostRecoveryRateDetails.get(i)); GlobalVariables.getMessageMap().removeFromErrorPath(MAINTAINABLE_DETAIL_ERROR_PATH + "[" + i + "]"); if(indirectCostRecoveryRateDetails.get(i).isActive()) { if(KFSConstants.GL_CREDIT_CODE.equals(indirectCostRecoveryRateDetails.get(i).getTransactionDebitIndicator())) { awardIndrCostRcvyRatePctCredits = awardIndrCostRcvyRatePctCredits.add(indirectCostRecoveryRateDetails.get(i).getAwardIndrCostRcvyRatePct()); } if(KFSConstants.GL_DEBIT_CODE.equals(indirectCostRecoveryRateDetails.get(i).getTransactionDebitIndicator())) { awardIndrCostRcvyRatePctDebits = awardIndrCostRcvyRatePctDebits.add(indirectCostRecoveryRateDetails.get(i).getAwardIndrCostRcvyRatePct()); } } } } } success &= checkCreditsAndDebits(awardIndrCostRcvyRatePctCredits, awardIndrCostRcvyRatePctDebits); return success; } public boolean checkCreditsAndDebits(BigDecimal credits, BigDecimal debits) { boolean success = true; // global errors, in KeyConstants or KFSconstants or something, use one for the top of the page (mark doc once) // include the key word active (informing that only active records are considered) if(!(credits.compareTo(debits) == 0)) { GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.GLOBAL_ERRORS, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_RATE_PERCENTS_NOT_EQUAL, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.AWARD_INDR_COST_RCVY_RATE_PCT)); success = false; } return success; } @Override public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) { boolean success = true; IndirectCostRecoveryRateDetail item = (IndirectCostRecoveryRateDetail) line; success &= processCollectionLine(item); return success; } public boolean processCollectionLine(IndirectCostRecoveryRateDetail item) { boolean success = true; success &= validateWildcards(item); if(success) { success &= checkExistence(item) && checkRateFormat(item); } return success; } public boolean checkExistence(IndirectCostRecoveryRateDetail item) { boolean success = processYear() && processChart(item) && processAccount(item) && processSubAccount(item) && processObjectCode(item) && processSubObjectCode(item); return success; } public boolean processYear() { boolean success = true; Map pkMap = new HashMap(); Integer year = indirectCostRecoveryRate.getUniversityFiscalYear(); pkMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, year); if(!checkExistenceFromTable(SystemOptions.class, pkMap)) { GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE + KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, RiceKeyConstants.ERROR_EXISTENCE, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRate.class, KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR)); success = false; } return success; } protected boolean processChart(IndirectCostRecoveryRateDetail item) { boolean success = true; Map pkMap = new HashMap(); String chart = item.getChartOfAccountsCode(); if(StringUtils.isNotBlank(chart)) { if(!propertyIsWildcard(chart)) { pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chart); if(!checkExistenceFromTable(Chart.class, pkMap)) { logErrorUtility(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, RiceKeyConstants.ERROR_EXISTENCE); success = false; } } } return success; } protected boolean processAccount(IndirectCostRecoveryRateDetail item) { boolean success = true; Map pkMap = new HashMap(); String chart = item.getChartOfAccountsCode(); String acct = item.getAccountNumber(); if(StringUtils.isNotBlank(acct)) { if(!propertyIsWildcard(chart)) { pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chart); } if(!propertyIsWildcard(acct)) { pkMap.put(KFSPropertyConstants.ACCOUNT_NUMBER, acct); if(!checkExistenceFromTable(Account.class, pkMap)) { logErrorUtility(KFSPropertyConstants.ACCOUNT_NUMBER, RiceKeyConstants.ERROR_EXISTENCE); success = false; } } } return success; } protected boolean processSubAccount(IndirectCostRecoveryRateDetail item) { boolean success = true; Map pkMap = new HashMap(); String chart = item.getChartOfAccountsCode(); String acct = item.getAccountNumber(); String subAcct = item.getSubAccountNumber(); if(StringUtils.isNotBlank(subAcct) && !StringUtils.containsOnly(subAcct, "-")) { // if doesn't contain only dashes if(!propertyIsWildcard(chart)) { pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chart); } if(!propertyIsWildcard(acct)) { pkMap.put(KFSPropertyConstants.ACCOUNT_NUMBER, acct); } if(!propertyIsWildcard(subAcct) && StringUtils.isNotBlank(subAcct) && !StringUtils.containsOnly(subAcct, "-")) { pkMap.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, subAcct); if(!checkExistenceFromTable(SubAccount.class, pkMap)) { logErrorUtility(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, RiceKeyConstants.ERROR_EXISTENCE); success = false; } } } return success; } protected boolean processObjectCode(IndirectCostRecoveryRateDetail item) { boolean success = true; Map pkMap = new HashMap(); Integer year = indirectCostRecoveryRate.getUniversityFiscalYear(); String chart = item.getChartOfAccountsCode(); String objCd = item.getFinancialObjectCode(); pkMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, year); if(StringUtils.isNotBlank(objCd)) { if(!propertyIsWildcard(chart)) { pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chart); } if(!propertyIsWildcard(objCd)) { pkMap.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objCd); if(!checkExistenceFromTable(ObjectCode.class, pkMap)) { logErrorUtility(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE); success = false; } } } return success; } protected boolean processSubObjectCode(IndirectCostRecoveryRateDetail item) { // chart being a wildcard implies account number being a wildcard, redundant checking? boolean success = true; Map pkMap = new HashMap(); Integer year = indirectCostRecoveryRate.getUniversityFiscalYear(); String chart = item.getChartOfAccountsCode(); String acct = item.getAccountNumber(); String objCd = item.getFinancialObjectCode(); String subObjCd = item.getFinancialSubObjectCode(); if(StringUtils.isNotBlank(subObjCd) && !propertyIsWildcard(subObjCd) && !StringUtils.containsOnly(subObjCd, "-")) { pkMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, year); if(!propertyIsWildcard(chart)) { pkMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chart); } if(!propertyIsWildcard(acct)) { pkMap.put(KFSPropertyConstants.ACCOUNT_NUMBER, acct); } if(!propertyIsWildcard(objCd)) { pkMap.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objCd); } pkMap.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, subObjCd); if(!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(subObjCd) && !checkExistenceFromTable(SubObjectCode.class, pkMap)) { logErrorUtility(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, RiceKeyConstants.ERROR_EXISTENCE); success = false; } } return success; } public boolean checkExistenceFromTable(Class clazz, Map fieldValues) { return getBoService().countMatching(clazz, fieldValues) != 0; } public boolean validateWildcards(IndirectCostRecoveryRateDetail item) { boolean success = false; if(!itemUsesWildcard(item) || (itemUsesWildcard(item) && itemPassesWildcardRules(item))) { success = true; } return success; } public boolean itemPassesWildcardRules(IndirectCostRecoveryRateDetail item) { boolean success = false; String[] wildcards = {GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY, GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT}; success = !itemUsesWildcard(item) || checkWildcardRules(item); return success; } public boolean itemUsesWildcard(IndirectCostRecoveryRateDetail item) { boolean success = false; String chart = item.getChartOfAccountsCode(); String acct = item.getAccountNumber(); String subAcct = item.getSubAccountNumber(); String objCd = item.getFinancialObjectCode(); String subObjCd = item.getFinancialSubObjectCode(); String[] fields = {chart,acct,subAcct,objCd,subObjCd}; for(int i=0;i<fields.length;i++) { success |= propertyIsWildcard(fields[i]); } return success; } public boolean propertyIsWildcard(String property) { return GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(property) || GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(property); } protected boolean checkAccountNumberWildcardRules(IndirectCostRecoveryRateDetail item) { String accountNumber = item.getAccountNumber(); boolean success = true; if (!accountNumber.equals(item.getChartOfAccountsCode())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE) ); success = false; } String subAccountNumber = item.getSubAccountNumber(); // If # is entered on account, then # "must" be entered for chart and sub account "must" be dashes. if (GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(accountNumber)) { if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(item.getChartOfAccountsCode()) && !StringUtils.containsOnly(subAccountNumber, KFSConstants.DASH)) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.SUB_ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_FIELD_MUST_BE_DASHES, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER), GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER)); success = false; } } if (GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(accountNumber)) { if (!(StringUtils.equals(GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY, subAccountNumber) || !StringUtils.containsOnly(subAccountNumber, KFSConstants.DASH))) { GlobalVariables.getMessageMap().putError(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_ACCOUNT_USE_EXPENDITURE_ENTRY_WILDCARD_RESTRICTION_ON_SUB_ACCOUNT); success = false; } } return success; } protected boolean checkAccountNumberNotWildcardRules(IndirectCostRecoveryRateDetail item) { boolean success = true; if (propertyIsWildcard(item.getSubAccountNumber())) { if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(item.getSubAccountNumber())) { GlobalVariables.getMessageMap().putError(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_CANNOT_BE_WILDCARD, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER)); success = false; } } return success; } protected boolean checkObjectCodeWildcardRules(IndirectCostRecoveryRateDetail item) { String financialObjectCode = item.getFinancialObjectCode(); boolean success = true; if (propertyIsWildcard(financialObjectCode)) { if (GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(financialObjectCode)) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.FINANCIAL_OBJECT_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARD_NOT_VALID, GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE), GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY ); success = false; } else { if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getChartOfAccountsCode())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE) ); success = false; } } } return success; } protected boolean checkSubObjectWildcardRules(IndirectCostRecoveryRateDetail item) { String financialSubObjectCode = item.getFinancialSubObjectCode(); boolean success = true; if (propertyIsWildcard(financialSubObjectCode)) { if (GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(financialSubObjectCode)) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARD_NOT_VALID, GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE), GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY ); success = false; } else { if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getChartOfAccountsCode())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE) ); success = false; } if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getAccountNumber())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER) ); success = false; } if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getFinancialObjectCode())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.FINANCIAL_OBJECT_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE) ); success = false; } } } return success; } protected boolean checkSubAccountWildcardRules(IndirectCostRecoveryRateDetail item) { boolean success = true; String subAccountNumber = item.getSubAccountNumber(); if (GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT.equals(subAccountNumber)) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.SUB_ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARD_NOT_VALID, GeneralLedgerConstants.PosterService.SYMBOL_USE_ICR_FROM_ACCOUNT, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER), GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY ); success = false; } else { if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getChartOfAccountsCode())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE) ); success = false; } if (!GeneralLedgerConstants.PosterService.SYMBOL_USE_EXPENDITURE_ENTRY.equals(item.getAccountNumber())) { GlobalVariables.getMessageMap().putError( KFSPropertyConstants.ACCOUNT_NUMBER, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_WILDCARDS_MUST_MATCH, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.SUB_ACCOUNT_NUMBER), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER) ); success = false; } } return success; } /* ** If @ is entered on chart, then @ "must" be entered for account and the sub account "must" be either @ or dashes. ** If @ is entered on account, then @ "must" be entered for chart and "may" be entered for sub account. ** If @ is entered on sub account, then @ "must" be entered for chart and account. ** If @ is entered on object code, then @ "must" be entered for chart and "may" be entered for account, sub account and sub object. * (This rule is the murkiest as enter @ in account, sub account, and sub object kicks of some of the other rules in this section). ** If @ is entered on sub object code, then @ "must" be entered for chart, account, and object code and "may" be entered for sub account. ** If # is entered on chart, then # "must" be entered for account and sub account "must" be dashes. ** If # is entered on account, then # "must" be entered for chart and sub account "must" be dashes. ** # can not be entered on the sub account. ** # can not be entered on the object code. ** # can not be entered on the sub object code. * */ public boolean checkWildcardRules(IndirectCostRecoveryRateDetail item) { boolean success = checkAtMostOneWildcardUsed(item); if (success) { if (propertyIsWildcard(item.getFinancialObjectCode())) { success &= checkObjectCodeWildcardRules(item); // verified } else { } if (propertyIsWildcard(item.getAccountNumber())) { success &= checkAccountNumberWildcardRules(item); // verified } else { success &= checkAccountNumberNotWildcardRules(item); } if (propertyIsWildcard(item.getFinancialSubObjectCode())) { success &= checkSubObjectWildcardRules(item); // verified } if (propertyIsWildcard(item.getSubAccountNumber())) { success &= checkSubAccountWildcardRules(item); // verified } if (!(propertyIsWildcard(item.getFinancialObjectCode()) || propertyIsWildcard(item.getAccountNumber()))) { // chart code can't be the only wildcard on the item if (success && propertyIsWildcard(item.getChartOfAccountsCode())) { success = false; GlobalVariables.getMessageMap().putError(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_CHART_CODE_NOT_ONLY_WILDCARD, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.ACCOUNT_NUMBER), SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE)); } } } return success; } protected boolean checkAtMostOneWildcardUsed(IndirectCostRecoveryRateDetail item) { String chart = item.getChartOfAccountsCode(); String acct = item.getAccountNumber(); String subAcct = item.getSubAccountNumber(); String objCd = item.getFinancialObjectCode(); String subObjCd = item.getFinancialSubObjectCode(); boolean success = true; String errorPropertyName = null; Set<String> wildcards = new HashSet<String>(); if (propertyIsWildcard(chart)) { wildcards.add(chart); errorPropertyName = KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE; } if (success && propertyIsWildcard(acct)) { wildcards.add(acct); if (wildcards.size() > 1) { success = false; errorPropertyName = KFSPropertyConstants.ACCOUNT_NUMBER; } } if (success && propertyIsWildcard(subAcct)) { wildcards.add(subAcct); if (wildcards.size() > 1) { success = false; errorPropertyName = KFSPropertyConstants.SUB_ACCOUNT_NUMBER; } } if (success && propertyIsWildcard(objCd)) { wildcards.add(objCd); if (wildcards.size() > 1) { success = false; errorPropertyName = KFSPropertyConstants.FINANCIAL_OBJECT_CODE; } } if (success && propertyIsWildcard(subObjCd)) { wildcards.add(subObjCd); if (wildcards.size() > 1) { success = false; errorPropertyName = KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE; } } if (!success) { GlobalVariables.getMessageMap().putError( errorPropertyName, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_MULTIPLE_WILDCARDS_ON_ITEM); } return success; } public boolean checkRateFormat(IndirectCostRecoveryRateDetail item) { boolean success = true; BigDecimal zero = new BigDecimal(0.00); if(!(item.getAwardIndrCostRcvyRatePct() == null)) { if(item.getAwardIndrCostRcvyRatePct().scale() > 3) { logErrorUtility(KFSPropertyConstants.AWARD_INDR_COST_RCVY_RATE_PCT, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_RATE_PERCENT_INVALID_FORMAT_SCALE); success = false; } if(item.getAwardIndrCostRcvyRatePct().compareTo(zero) < 0) { logErrorUtility(KFSPropertyConstants.AWARD_INDR_COST_RCVY_RATE_PCT, KFSKeyConstants.IndirectCostRecovery.ERROR_DOCUMENT_ICR_RATE_PERCENT_INVALID_FORMAT_ZERO); success = false; } } else { } return success; } public void logErrorUtility(String propertyName, String errorKey) { GlobalVariables.getMessageMap().putError(propertyName, errorKey, SpringContext.getBean(DataDictionaryService.class).getAttributeLabel(IndirectCostRecoveryRateDetail.class, propertyName)); } }