/*
* 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 org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.A21IndirectCostRecoveryAccount;
import org.kuali.kfs.coa.businessobject.A21SubAccount;
import org.kuali.kfs.coa.businessobject.Account;
import org.kuali.kfs.coa.businessobject.IndirectCostRecoveryAccount;
import org.kuali.kfs.coa.businessobject.SubAccount;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.kns.document.authorization.MaintenanceDocumentRestrictions;
import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* PreRules checks for the {@link SubAccount} that needs to occur while still in the Struts processing. This includes defaults, confirmations,
* etc.
*/
public class SubAccountPreRules extends MaintenancePreRulesBase {
protected SubAccount newSubAccount;
// protected SubAccount copyAccount;
public SubAccountPreRules() {
}
/**
* This checks to see if a continuation account is necessary and then copies the ICR data from the Account
* associated with this SubAccount (if necessary)
* @see org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase#doCustomPreRules(org.kuali.rice.kns.document.MaintenanceDocument)
*/
protected boolean doCustomPreRules(MaintenanceDocument document) {
setupConvenienceObjects(document);
checkForContinuationAccounts(document.getNewMaintainableObject().getMaintenanceAction()); // run this first to avoid side
// effects
LOG.debug("done with continuation account, proceeeding with remaining pre rules");
copyICRFromAccount(document);
return true;
}
/**
*
* This looks for the SubAccount's account number and then sets the values to the continuation account value if it exists
* @param maintenanceAction
*/
protected void checkForContinuationAccounts(String maintenanceAction) {
LOG.debug("entering checkForContinuationAccounts()");
/*
* KULCOA-734 - The check for continuation account for main Account Number on sub-account has been modified to only occur
* for a New and Copy Action. This cannot happen on an Edit as the primary key will change.
*/
if (KFSConstants.MAINTENANCE_NEW_ACTION.equals(maintenanceAction) || KFSConstants.MAINTENANCE_COPY_ACTION.equals(maintenanceAction)) {
if (StringUtils.isNotBlank(newSubAccount.getAccountNumber())) {
Account account = checkForContinuationAccount("Account Number", newSubAccount.getChartOfAccountsCode(), newSubAccount.getAccountNumber(), "");
if (ObjectUtils.isNotNull(account)) { // override old user inputs
newSubAccount.setAccountNumber(account.getAccountNumber());
newSubAccount.setChartOfAccountsCode(account.getChartOfAccountsCode());
}
}
}
}
/**
* This method sets the convenience objects like newSubAccount, so you have short and easy handles to the new and
* old objects contained in the maintenance document. It also calls the BusinessObjectBase.refresh(), which will attempt to load
* all sub-objects from the DB by their primary keys, if available.
* @param document
*/
protected void setupConvenienceObjects(MaintenanceDocument document) {
// setup newAccount convenience objects, make sure all possible sub-objects are populated
newSubAccount = (SubAccount) document.getNewMaintainableObject().getBusinessObject();
// copyAccount = (SubAccount) ObjectUtils.deepCopy(newAccount);
// copyAccount.refresh();
}
/**
*
* This copies the Indirect Cost Rate (ICR) from the account if the SubAccount is a specific type - determined
* as "EX" from {@link SubAccountRule#CG_A21_TYPE_ICR}
* <p>
* If it is "EX" it will then copy over the ICR information from the Account specified for this SubAccount
* @param document
*/
protected void copyICRFromAccount(MaintenanceDocument document) {
Person user = GlobalVariables.getUserSession().getPerson();
// get a new instance of MaintenanceDocumentAuthorizations for this context
MaintenanceDocumentRestrictions auths = SpringContext.getBean(BusinessObjectAuthorizationService.class).getMaintenanceDocumentRestrictions(document, user);
// don't need to copy if the user does not have the authority to edit the fields
if (!auths.getFieldRestriction("a21SubAccount.financialIcrSeriesIdentifier").isReadOnly()) {
// only need to do this of the account sub type is EX
A21SubAccount a21SubAccount = newSubAccount.getA21SubAccount();
Account account = newSubAccount.getAccount();
if (KFSConstants.SubAccountType.EXPENSE.equals(a21SubAccount.getSubAccountTypeCode())) {
if (ObjectUtils.isNull(account) || StringUtils.isBlank(account.getAccountNumber())) {
account = getAccountService().getByPrimaryId(newSubAccount.getChartOfAccountsCode(), newSubAccount.getAccountNumber());
if (ObjectUtils.isNotNull(account)) {
if (a21SubAccount.getA21ActiveIndirectCostRecoveryAccounts().isEmpty()) {
for (IndirectCostRecoveryAccount icrAccount : account.getActiveIndirectCostRecoveryAccounts()){
a21SubAccount.getA21IndirectCostRecoveryAccounts().add(A21IndirectCostRecoveryAccount.copyICRAccount(icrAccount));
}
}
if (StringUtils.isBlank(a21SubAccount.getFinancialIcrSeriesIdentifier())) {
a21SubAccount.setFinancialIcrSeriesIdentifier(account.getFinancialIcrSeriesIdentifier());
a21SubAccount.setOffCampusCode(account.isAccountOffCampusIndicator());
}
if (StringUtils.isBlank(a21SubAccount.getIndirectCostRecoveryTypeCode())) {
a21SubAccount.setIndirectCostRecoveryTypeCode(account.getAcctIndirectCostRcvyTypeCd());
}
}
}
}
}
}
}