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.fp.document.validation.impl; 017 018 import java.util.ArrayList; 019 import java.util.Iterator; 020 import java.util.List; 021 022 import org.kuali.kfs.coa.businessobject.SubFundGroup; 023 import org.kuali.kfs.fp.businessobject.BudgetAdjustmentAccountingLine; 024 import org.kuali.kfs.fp.document.BudgetAdjustmentDocument; 025 import org.kuali.kfs.sys.KFSConstants; 026 import org.kuali.kfs.sys.KFSKeyConstants; 027 import org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService; 028 import org.kuali.kfs.sys.document.validation.GenericValidation; 029 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; 030 import org.kuali.rice.kns.util.GlobalVariables; 031 import org.kuali.rice.kns.util.MessageMap; 032 033 /** 034 * Validation for Budget Adjustment document that checks that the fund groups are correctly adjusted. 035 */ 036 public class BudgetAdjustmentFundGroupAdjustmentRestrictionValidation extends GenericValidation { 037 private BudgetAdjustmentDocument accountingDocumentForValidation; 038 AccountingLineRuleHelperService accountingLineRuleHelperService; 039 040 /** 041 * Retrieves the fund group and sub fund group for each accounting line. Then verifies that the codes associated with the 042 * 'Budget Adjustment Restriction Code' field are met. 043 * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent) 044 */ 045 public boolean validate(AttributedDocumentEvent event) { 046 MessageMap errors = GlobalVariables.getMessageMap(); 047 048 boolean isAdjustmentAllowed = true; 049 050 List accountingLines = new ArrayList(); 051 accountingLines.addAll(getAccountingDocumentForValidation().getSourceAccountingLines()); 052 accountingLines.addAll(getAccountingDocumentForValidation().getTargetAccountingLines()); 053 054 // fund group is global restriction 055 boolean restrictedToSubFund = false; 056 boolean restrictedToChart = false; 057 boolean restrictedToOrg = false; 058 boolean restrictedToAccount = false; 059 060 // fields to help with error messages 061 String accountRestrictingSubFund = ""; 062 String accountRestrictingChart = ""; 063 String accountRestrictingOrg = ""; 064 String accountRestrictingAccount = ""; 065 066 // first find the restriction level required by the fund or sub funds used on document 067 String restrictionLevel = ""; 068 for (Iterator iter = accountingLines.iterator(); iter.hasNext();) { 069 BudgetAdjustmentAccountingLine line = (BudgetAdjustmentAccountingLine) iter.next(); 070 SubFundGroup subFund = line.getAccount().getSubFundGroup(); 071 if (!KFSConstants.BudgetAdjustmentDocumentConstants.ADJUSTMENT_RESTRICTION_LEVEL_NONE.equals(subFund.getFundGroupBudgetAdjustmentRestrictionLevelCode())) { 072 restrictionLevel = subFund.getFundGroupBudgetAdjustmentRestrictionLevelCode(); 073 restrictedToSubFund = true; 074 accountRestrictingSubFund = line.getAccountNumber(); 075 } 076 else { 077 restrictionLevel = subFund.getFundGroup().getFundGroupBudgetAdjustmentRestrictionLevelCode(); 078 } 079 080 if (KFSConstants.BudgetAdjustmentDocumentConstants.ADJUSTMENT_RESTRICTION_LEVEL_CHART.equals(restrictionLevel)) { 081 restrictedToChart = true; 082 accountRestrictingChart = line.getAccountNumber(); 083 } 084 else if (KFSConstants.BudgetAdjustmentDocumentConstants.ADJUSTMENT_RESTRICTION_LEVEL_ORGANIZATION.equals(restrictionLevel)) { 085 restrictedToOrg = true; 086 accountRestrictingOrg = line.getAccountNumber(); 087 } 088 else if (KFSConstants.BudgetAdjustmentDocumentConstants.ADJUSTMENT_RESTRICTION_LEVEL_ACCOUNT.equals(restrictionLevel)) { 089 restrictedToAccount = true; 090 accountRestrictingAccount = line.getAccountNumber(); 091 } 092 093 // if we have a sub fund restriction, this overrides anything coming later 094 if (restrictedToSubFund) { 095 break; 096 } 097 } 098 099 String fundLabel = accountingLineRuleHelperService.getFundGroupCodeLabel(); 100 String subFundLabel = accountingLineRuleHelperService.getSubFundGroupCodeLabel(); 101 String chartLabel = accountingLineRuleHelperService.getChartLabel(); 102 String orgLabel = accountingLineRuleHelperService.getOrganizationCodeLabel(); 103 String acctLabel = accountingLineRuleHelperService.getAccountLabel(); 104 105 /* 106 * now iterate through the accounting lines again and check each record against the previous to verify the restrictions are 107 * met 108 */ 109 BudgetAdjustmentAccountingLine previousLine = null; 110 for (Iterator iter = accountingLines.iterator(); iter.hasNext();) { 111 BudgetAdjustmentAccountingLine line = (BudgetAdjustmentAccountingLine) iter.next(); 112 113 if (previousLine != null) { 114 String currentFundGroup = line.getAccount().getSubFundGroup().getFundGroupCode(); 115 String previousFundGroup = previousLine.getAccount().getSubFundGroup().getFundGroupCode(); 116 117 if (!currentFundGroup.equals(previousFundGroup)) { 118 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_MIXED_FUND_GROUPS); 119 isAdjustmentAllowed = false; 120 break; 121 } 122 123 if (restrictedToSubFund) { 124 if (!line.getAccount().getSubFundGroupCode().equals(previousLine.getAccount().getSubFundGroupCode())) { 125 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingSubFund, subFundLabel }); 126 isAdjustmentAllowed = false; 127 break; 128 } 129 } 130 131 if (restrictedToChart) { 132 if (!line.getChartOfAccountsCode().equals(previousLine.getChartOfAccountsCode())) { 133 if (restrictedToSubFund) { 134 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingChart, subFundLabel + " and " + chartLabel }); 135 } 136 else { 137 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingChart, fundLabel + " and " + chartLabel }); 138 } 139 isAdjustmentAllowed = false; 140 break; 141 } 142 } 143 144 if (restrictedToOrg) { 145 if (!line.getAccount().getOrganizationCode().equals(previousLine.getAccount().getOrganizationCode())) { 146 if (restrictedToSubFund) { 147 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingOrg, subFundLabel + " and " + orgLabel }); 148 } 149 else { 150 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingOrg, fundLabel + " and " + orgLabel }); 151 } 152 isAdjustmentAllowed = false; 153 break; 154 } 155 } 156 157 if (restrictedToAccount) { 158 if (!line.getAccountNumber().equals(previousLine.getAccountNumber())) { 159 errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_BA_RESTRICTION_LEVELS, new String[] { accountRestrictingAccount, acctLabel }); 160 isAdjustmentAllowed = false; 161 break; 162 } 163 } 164 } 165 166 previousLine = line; 167 } 168 169 return isAdjustmentAllowed; 170 } 171 172 /** 173 * Gets the accountingDocumentForValidation attribute. 174 * @return Returns the accountingDocumentForValidation. 175 */ 176 public BudgetAdjustmentDocument getAccountingDocumentForValidation() { 177 return accountingDocumentForValidation; 178 } 179 180 /** 181 * Sets the accountingDocumentForValidation attribute value. 182 * @param accountingDocumentForValidation The accountingDocumentForValidation to set. 183 */ 184 public void setAccountingDocumentForValidation(BudgetAdjustmentDocument accountingDocumentForValidation) { 185 this.accountingDocumentForValidation = accountingDocumentForValidation; 186 } 187 188 /** 189 * Gets the accountingLineRuleHelperService attribute. 190 * @return Returns the accountingLineRuleHelperService. 191 */ 192 public AccountingLineRuleHelperService getAccountingLineRuleHelperService() { 193 return accountingLineRuleHelperService; 194 } 195 196 /** 197 * Sets the accountingLineRuleHelperService attribute value. 198 * @param accountingLineRuleHelperService The accountingLineRuleHelperService to set. 199 */ 200 public void setAccountingLineRuleHelperService(AccountingLineRuleHelperService accountingLineRuleHelperService) { 201 this.accountingLineRuleHelperService = accountingLineRuleHelperService; 202 } 203 }