/*
* 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;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.A21SubAccount;
import org.kuali.kfs.coa.businessobject.Account;
import org.kuali.kfs.coa.businessobject.SubAccount;
import org.kuali.kfs.coa.service.A21SubAccountService;
import org.kuali.kfs.coa.service.AccountService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.FinancialSystemMaintainable;
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.krad.bo.PersistableBusinessObject;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* This class...
*/
public class SubAccountMaintainableImpl extends FinancialSystemMaintainable {
private static final Logger LOG = Logger.getLogger(SubAccountMaintainableImpl.class);
// account fields that are PKs of nested reference accounts but don't exist in the Sub-Account BO as FKs.
public static final String[] COA_CODE_NAMES = {
KFSPropertyConstants.A21_SUB_ACCOUNT + "." + KFSPropertyConstants.COST_SHARE_SOURCE_CHART_OF_ACCOUNTS_CODE,
};
public static final String[] ACCOUNT_NUMBER_NAMES = {
KFSPropertyConstants.A21_SUB_ACCOUNT + "." + KFSPropertyConstants.COST_SHARE_SOURCE_ACCOUNT_NUMBER,
};
/**
* @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#refresh(java.lang.String, java.util.Map,
* org.kuali.rice.kns.document.MaintenanceDocument)
*/
@Override
public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document) {
super.refresh(refreshCaller, fieldValues, document);
Person person = GlobalVariables.getUserSession().getPerson();
MaintenanceDocumentRestrictions restrictions = getBusinessObjectAuthorizationService().getMaintenanceDocumentRestrictions(document, person);
boolean canEdit = !restrictions.isHiddenSectionId(KFSConstants.SUB_ACCOUNT_EDIT_CG_ICR_SECTION_ID) && !restrictions.isReadOnlySectionId(KFSConstants.SUB_ACCOUNT_EDIT_CG_ICR_SECTION_ID);
// after account lookup, refresh the CG ICR account fields
if (refreshCaller != null && (refreshCaller.toUpperCase().endsWith(KFSConstants.LOOKUPABLE_SUFFIX.toUpperCase())) && fieldValues.containsKey("document.newMaintainableObject.accountNumber") && canEdit) {
SubAccount subAccount = (SubAccount) this.getBusinessObject();
this.populateCGIcrFields(subAccount);
}
}
// populate the CG ICR fields if any
private void populateCGIcrFields(SubAccount subAccount) {
A21SubAccount a21SubAccount = subAccount.getA21SubAccount();
String chartOfAccountsCode = subAccount.getChartOfAccountsCode();
String accountNumber = subAccount.getAccountNumber();
//populate ICR fields if subAccount COA or Acct does not match a21SubAccount COA/Acct
if (ObjectUtils.isNotNull(a21SubAccount) && (!StringUtils.equals(chartOfAccountsCode, a21SubAccount.getChartOfAccountsCode()) || !StringUtils.equals(accountNumber, a21SubAccount.getAccountNumber()))) {
A21SubAccountService a21SubAccountService = SpringContext.getBean(A21SubAccountService.class);
a21SubAccountService.populateCgIcrAccount(a21SubAccount, chartOfAccountsCode, accountNumber);
}
}
/**
* @see org.kuali.kfs.sys.document.FinancialSystemMaintainable#populateChartOfAccountsCodeFields()
*
* Special treatment is needed to populate chart code fields from account number fields
* in nested reference accounts a21SubAccount.costShareAccount
* when accounts can't cross charts.
*/
@Override
protected void populateChartOfAccountsCodeFields() {
super.populateChartOfAccountsCodeFields();
PersistableBusinessObject bo = getBusinessObject();
AccountService acctService = SpringContext.getBean(AccountService.class);
for (int i=0; i<COA_CODE_NAMES.length; i++) {
String coaCodeName = COA_CODE_NAMES[i];
String acctNumName = ACCOUNT_NUMBER_NAMES[i];
String accountNumber = (String)ObjectUtils.getPropertyValue(bo, acctNumName);
String coaCode = null;
Account account = acctService.getUniqueAccountForAccountNumber(accountNumber);
if (ObjectUtils.isNotNull(account)) {
coaCode = account.getChartOfAccountsCode();
}
try {
ObjectUtils.setObjectProperty(bo, coaCodeName, coaCode);
}
catch (Exception e) {
LOG.error("Error in setting property value for " + coaCodeName);
}
}
}
}