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.coa.document.validation.impl;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.coa.businessobject.A21SubAccount;
020 import org.kuali.kfs.coa.businessobject.Account;
021 import org.kuali.kfs.coa.businessobject.SubAccount;
022 import org.kuali.kfs.sys.KFSConstants;
023 import org.kuali.kfs.sys.context.SpringContext;
024 import org.kuali.rice.kim.bo.Person;
025 import org.kuali.rice.kns.document.MaintenanceDocument;
026 import org.kuali.rice.kns.document.authorization.MaintenanceDocumentRestrictions;
027 import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
028 import org.kuali.rice.kns.util.GlobalVariables;
029 import org.kuali.rice.kns.util.ObjectUtils;
030
031 /**
032 * PreRules checks for the {@link SubAccount} that needs to occur while still in the Struts processing. This includes defaults, confirmations,
033 * etc.
034 */
035 public class SubAccountPreRules extends MaintenancePreRulesBase {
036
037 protected SubAccount newSubAccount;
038
039 // protected SubAccount copyAccount;
040
041 public SubAccountPreRules() {
042
043 }
044
045 /**
046 * This checks to see if a continuation account is necessary and then copies the ICR data from the Account
047 * associated with this SubAccount (if necessary)
048 * @see org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase#doCustomPreRules(org.kuali.rice.kns.document.MaintenanceDocument)
049 */
050 protected boolean doCustomPreRules(MaintenanceDocument document) {
051 setupConvenienceObjects(document);
052 checkForContinuationAccounts(document.getNewMaintainableObject().getMaintenanceAction()); // run this first to avoid side
053 // effects
054
055 LOG.debug("done with continuation account, proceeeding with remaining pre rules");
056
057 copyICRFromAccount(document);
058
059 return true;
060 }
061
062 /**
063 *
064 * This looks for the SubAccount's account number and then sets the values to the continuation account value if it exists
065 * @param maintenanceAction
066 */
067 protected void checkForContinuationAccounts(String maintenanceAction) {
068 LOG.debug("entering checkForContinuationAccounts()");
069
070 /*
071 * KULCOA-734 - The check for continuation account for main Account Number on sub-account has been modified to only occur
072 * for a New and Copy Action. This cannot happen on an Edit as the primary key will change.
073 */
074 if (KFSConstants.MAINTENANCE_NEW_ACTION.equals(maintenanceAction) || KFSConstants.MAINTENANCE_COPY_ACTION.equals(maintenanceAction)) {
075
076 if (StringUtils.isNotBlank(newSubAccount.getAccountNumber())) {
077 Account account = checkForContinuationAccount("Account Number", newSubAccount.getChartOfAccountsCode(), newSubAccount.getAccountNumber(), "");
078 if (ObjectUtils.isNotNull(account)) { // override old user inputs
079 newSubAccount.setAccountNumber(account.getAccountNumber());
080 newSubAccount.setChartOfAccountsCode(account.getChartOfAccountsCode());
081 }
082 }
083 }
084 }
085
086 /**
087 * This method sets the convenience objects like newSubAccount, so you have short and easy handles to the new and
088 * old objects contained in the maintenance document. It also calls the BusinessObjectBase.refresh(), which will attempt to load
089 * all sub-objects from the DB by their primary keys, if available.
090 * @param document
091 */
092 protected void setupConvenienceObjects(MaintenanceDocument document) {
093
094 // setup newAccount convenience objects, make sure all possible sub-objects are populated
095 newSubAccount = (SubAccount) document.getNewMaintainableObject().getBusinessObject();
096 // copyAccount = (SubAccount) ObjectUtils.deepCopy(newAccount);
097 // copyAccount.refresh();
098 }
099
100 /**
101 *
102 * This copies the Indirect Cost Rate (ICR) from the account if the SubAccount is a specific type - determined
103 * as "EX" from {@link SubAccountRule#CG_A21_TYPE_ICR}
104 * <p>
105 * If it is "EX" it will then copy over the ICR information from the Account specified for this SubAccount
106 * @param document
107 */
108 protected void copyICRFromAccount(MaintenanceDocument document) {
109 Person user = GlobalVariables.getUserSession().getPerson();
110
111 // get a new instance of MaintenanceDocumentAuthorizations for this context
112 MaintenanceDocumentRestrictions auths = SpringContext.getBean(BusinessObjectAuthorizationService.class).getMaintenanceDocumentRestrictions(document, user);
113
114 // don't need to copy if the user does not have the authority to edit the fields
115 if (!auths.getFieldRestriction("a21SubAccount.financialIcrSeriesIdentifier").isReadOnly()) {
116 // only need to do this of the account sub type is EX
117 A21SubAccount a21SubAccount = newSubAccount.getA21SubAccount();
118 Account account = newSubAccount.getAccount();
119 if (KFSConstants.SubAccountType.EXPENSE.equals(a21SubAccount.getSubAccountTypeCode())) {
120 if (ObjectUtils.isNull(account) || StringUtils.isBlank(account.getAccountNumber())) {
121 account = getAccountService().getByPrimaryId(newSubAccount.getChartOfAccountsCode(), newSubAccount.getAccountNumber());
122 if (ObjectUtils.isNotNull(account)) {
123 if (StringUtils.isBlank(a21SubAccount.getIndirectCostRecoveryAcctNbr())) {
124 a21SubAccount.setIndirectCostRecoveryAcctNbr(account.getIndirectCostRecoveryAcctNbr());
125 a21SubAccount.setIndirectCostRcvyFinCoaCode(account.getIndirectCostRcvyFinCoaCode());
126 }
127 if (StringUtils.isBlank(a21SubAccount.getFinancialIcrSeriesIdentifier())) {
128 a21SubAccount.setFinancialIcrSeriesIdentifier(account.getFinancialIcrSeriesIdentifier());
129 a21SubAccount.setOffCampusCode(account.isAccountOffCampusIndicator());
130 }
131 if (StringUtils.isBlank(a21SubAccount.getIndirectCostRecoveryTypeCode())) {
132 a21SubAccount.setIndirectCostRecoveryTypeCode(account.getAcctIndirectCostRcvyTypeCd());
133 }
134 }
135 }
136 }
137 }
138 }
139 }