/*
* 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.gl.businessobject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.OrganizationReversionCategory;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
/**
* This class represents a unit of work for the organization reversion
*/
public class OrgReversionUnitOfWork extends PersistableBusinessObjectBase {
public String chartOfAccountsCode = "";
public String accountNumber = "";
public String subAccountNumber = "";
public Map<String, OrgReversionUnitOfWorkCategoryAmount> amounts;
private KualiDecimal totalReversion;
private KualiDecimal totalCarryForward;
private KualiDecimal totalAvailable;
private KualiDecimal totalCash;
public OrgReversionUnitOfWork() {
amounts = new HashMap<String, OrgReversionUnitOfWorkCategoryAmount>();
}
public OrgReversionUnitOfWork(String chart, String acct, String subAcct) {
this();
chartOfAccountsCode = chart;
accountNumber = acct;
subAccountNumber = subAcct;
}
/**
* Returns true if COA code and account number are not blank.
*
* @return true if COA code and account number are not blank.
*/
public boolean isInitialized() {
return !StringUtils.isBlank(chartOfAccountsCode) && !StringUtils.isBlank(accountNumber);
}
public void setFields(String chart, String acct, String subAcct) {
chartOfAccountsCode = chart;
accountNumber = acct;
subAccountNumber = subAcct;
cascadeCategoryAmountKeys();
clearAmounts();
}
/**
* Set category amounts
* @param cats list of organization reversion categories
*/
public void setCategories(List<OrganizationReversionCategory> cats) {
for (OrganizationReversionCategory element : cats) {
OrgReversionUnitOfWorkCategoryAmount ca = new OrgReversionUnitOfWorkCategoryAmount(element.getOrganizationReversionCategoryCode());
amounts.put(element.getOrganizationReversionCategoryCode(), ca);
}
}
/**
* This method adds to the actual amount for a specific category code
* @param categoryCode category code
* @param amount amount
*/
public void addActualAmount(String categoryCode, KualiDecimal amount) {
OrgReversionUnitOfWorkCategoryAmount ca = amounts.get(categoryCode);
ca.setActual(ca.getActual().add(amount));
}
/**
* This method adds to the budget amount for a specific category code
* @param categoryCode category code
* @param amount amount
*/
public void addBudgetAmount(String categoryCode, KualiDecimal amount) {
OrgReversionUnitOfWorkCategoryAmount ca = amounts.get(categoryCode);
ca.setBudget(ca.getBudget().add(amount));
}
/**
* This method adds to the encumbrance amount for a specific category code
* @param categoryCode category code
* @param amount amount
*/
public void addEncumbranceAmount(String categoryCode, KualiDecimal amount) {
OrgReversionUnitOfWorkCategoryAmount ca = amounts.get(categoryCode);
ca.setEncumbrance(ca.getEncumbrance().add(amount));
}
/**
* This method adds to the carry forward amount for a specific category code
* @param categoryCode category code
* @param amount amount
*/
public void addCarryForwardAmount(String categoryCode, KualiDecimal amount) {
OrgReversionUnitOfWorkCategoryAmount ca = amounts.get(categoryCode);
ca.setCarryForward(ca.getCarryForward().add(amount));
}
/**
* This method clears all amounts for this unit of work
*/
public void clearAmounts() {
totalAvailable = KualiDecimal.ZERO;
totalCarryForward = KualiDecimal.ZERO;
totalCash = KualiDecimal.ZERO;
totalReversion = KualiDecimal.ZERO;
for (Iterator<OrgReversionUnitOfWorkCategoryAmount> iter = amounts.values().iterator(); iter.hasNext();) {
OrgReversionUnitOfWorkCategoryAmount element = iter.next();
element.setActual(KualiDecimal.ZERO);
element.setBudget(KualiDecimal.ZERO);
element.setEncumbrance(KualiDecimal.ZERO);
}
}
/**
* This method updates the category amount keys for the current unit of work
*/
public void cascadeCategoryAmountKeys() {
for (String category : amounts.keySet()) {
OrgReversionUnitOfWorkCategoryAmount catAmt = amounts.get(category);
catAmt.setChartOfAccountsCode(this.chartOfAccountsCode);
catAmt.setAccountNumber(this.accountNumber);
catAmt.setSubAccountNumber(this.subAccountNumber);
}
}
/**
* This method returns true if this unit of work's chart of accounts code, account number, and sub account number match the passed in parameter values
* @param chart
* @param acct
* @param subAcct
* @return true if this unit of work's chart of accounts code, account number, and sub account number match the passed in parameter values
*/
public boolean isSame(String chart, String acct, String subAcct) {
return (chartOfAccountsCode.equals(chart) && accountNumber.equals(acct) && subAccountNumber.equals(subAcct));
}
/**
* Return true of this unit of work has the same chart of accounts code, account number, and sub account number as the passed in balance
* @param balance
* @return
*/
public boolean wouldHold(Balance balance) {
return StringUtils.equals(chartOfAccountsCode, balance.getChartOfAccountsCode()) && StringUtils.equals(accountNumber, balance.getAccountNumber()) && StringUtils.equals(subAccountNumber, balance.getSubAccountNumber());
}
public KualiDecimal getTotalAccountAvailable() {
KualiDecimal amount = KualiDecimal.ZERO;
for (Iterator<OrgReversionUnitOfWorkCategoryAmount> iter = amounts.values().iterator(); iter.hasNext();) {
OrgReversionUnitOfWorkCategoryAmount element = iter.next();
amount = amount.add(element.getAvailable());
}
return amount;
}
public KualiDecimal getTotalCarryForward() {
return totalCarryForward;
}
public void setTotalCarryForward(KualiDecimal totalCarryForward) {
this.totalCarryForward = totalCarryForward;
}
public KualiDecimal getTotalReversion() {
return totalReversion;
}
public void addTotalCarryForward(KualiDecimal amount) {
totalCarryForward = totalCarryForward.add(amount);
}
public void setTotalReversion(KualiDecimal totalReversion) {
this.totalReversion = totalReversion;
}
public void addTotalReversion(KualiDecimal amount) {
totalReversion = totalReversion.add(amount);
}
public KualiDecimal getTotalAvailable() {
return totalAvailable;
}
public void addTotalAvailable(KualiDecimal amount) {
totalAvailable = totalAvailable.add(amount);
}
public void setTotalAvailable(KualiDecimal totalAvailable) {
this.totalAvailable = totalAvailable;
}
public void addTotalCash(KualiDecimal amount) {
totalCash = totalCash.add(amount);
}
public KualiDecimal getTotalCash() {
return totalCash;
}
public void setTotalCash(KualiDecimal totalCash) {
this.totalCash = totalCash;
}
public Map<String, OrgReversionUnitOfWorkCategoryAmount> getCategoryAmounts() {
return amounts;
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
public LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap pkMap = new LinkedHashMap();
pkMap.put("chartOfAccountsCode", this.chartOfAccountsCode);
pkMap.put("accountNbr", this.accountNumber);
pkMap.put("subAccountNbr", this.subAccountNumber);
return pkMap;
}
/**
* Gets the accountNumber attribute.
*
* @return Returns the accountNumber.
*/
public String getAccountNumber() {
return accountNumber;
}
/**
* Sets the accountNumber attribute value.
*
* @param accountNumber The accountNumber to set.
*/
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
/**
* Gets the chartOfAccountsCode attribute.
*
* @return Returns the chartOfAccountsCode.
*/
public String getChartOfAccountsCode() {
return chartOfAccountsCode;
}
/**
* Sets the chartOfAccountsCode attribute value.
*
* @param chartOfAccountsCode The chartOfAccountsCode to set.
*/
public void setChartOfAccountsCode(String chartOfAccountsCode) {
this.chartOfAccountsCode = chartOfAccountsCode;
}
/**
* Gets the subAccountNumber attribute.
*
* @return Returns the subAccountNumber.
*/
public String getSubAccountNumber() {
return subAccountNumber;
}
/**
* Sets the subAccountNumber attribute value.
*
* @param subAccountNumber The subAccountNumber to set.
*/
public void setSubAccountNumber(String subAccountNumber) {
this.subAccountNumber = subAccountNumber;
}
}