/* * 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.module.purap.businessobject; import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.EqualsBuilder; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.SourceAccountingLine; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.krad.util.ObjectUtils; /** * Purap Accounting Line Base Business Object. */ public abstract class PurApAccountingLineBase extends SourceAccountingLine implements PurApAccountingLine, Comparable { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurApAccountingLineBase.class); protected Integer accountIdentifier; private Integer itemIdentifier; private BigDecimal accountLinePercent; private String postingPeriodCode; //stored in DB only for PREQ and CM Account History private KualiDecimal alternateAmountForGLEntryCreation; // not stored in DB; needed for disencumbrances and such public Integer purApSequenceNumber; private PurApItem purapItem; /** * Default constructor */ public PurApAccountingLineBase() { super(); this.setSequenceNumber(0); setAmount(null); } @Override public Integer getAccountIdentifier() { return accountIdentifier; } @Override public void setAccountIdentifier(Integer requisitionAccountIdentifier) { this.accountIdentifier = requisitionAccountIdentifier; } @Override public Integer getItemIdentifier() { return itemIdentifier; } @Override public void setItemIdentifier(Integer requisitionItemIdentifier) { this.itemIdentifier = requisitionItemIdentifier; } @Override public BigDecimal getAccountLinePercent() { if (accountLinePercent != null) { accountLinePercent = accountLinePercent.setScale(2, BigDecimal.ROUND_HALF_UP); return accountLinePercent; } else { return BigDecimal.ZERO.setScale(2, 2); } } @Override public void setAccountLinePercent(BigDecimal accountLinePercent) { this.accountLinePercent = accountLinePercent; } /** * @see org.kuali.kfs.module.purap.businessobject.PurApAccountingLine#isEmpty() */ @Override public boolean isEmpty() { return !(StringUtils.isNotEmpty(getAccountNumber()) || StringUtils.isNotEmpty(getChartOfAccountsCode()) || StringUtils.isNotEmpty(getFinancialObjectCode()) || StringUtils.isNotEmpty(getFinancialSubObjectCode()) || StringUtils.isNotEmpty(getOrganizationReferenceId()) || StringUtils.isNotEmpty(getProjectCode()) || StringUtils.isNotEmpty(getSubAccountNumber()) || ObjectUtils.isNotNull(getAccountLinePercent())); } /** * @see org.kuali.kfs.module.purap.businessobject.PurApAccountingLine#createBlankAmountsCopy() */ @Override public PurApAccountingLine createBlankAmountsCopy() { PurApAccountingLine newAccount = (PurApAccountingLine) ObjectUtils.deepCopy(this); // newAccount.setAccountLinePercent(BigDecimal.ZERO); // newAccount.setAmount(KualiDecimal.ZERO); newAccount.setSequenceNumber(0); newAccount.setAccountLinePercent(null); newAccount.setAmount(null); return newAccount; } /** * @see org.kuali.kfs.module.purap.businessobject.PurApAccountingLine#accountStringsAreEqual(org.kuali.kfs.sys.businessobject.SourceAccountingLine) */ @Override public boolean accountStringsAreEqual(SourceAccountingLine accountingLine) { if (accountingLine == null) { return false; } return new EqualsBuilder().append(getChartOfAccountsCode(), accountingLine.getChartOfAccountsCode()).append(getAccountNumber(), accountingLine.getAccountNumber()).append(getSubAccountNumber(), accountingLine.getSubAccountNumber()).append(getFinancialObjectCode(), accountingLine.getFinancialObjectCode()).append(getFinancialSubObjectCode(), accountingLine.getFinancialSubObjectCode()).append(getProjectCode(), accountingLine.getProjectCode()).append(getOrganizationReferenceId(), accountingLine.getOrganizationReferenceId()) .isEquals(); } @Override public boolean accountStringsAreEqual(PurApAccountingLine accountingLine) { return accountStringsAreEqual((SourceAccountingLine) accountingLine); } /** * @see org.kuali.kfs.module.purap.businessobject.PurApAccountingLine#generateSourceAccountingLine() */ @Override public SourceAccountingLine generateSourceAccountingLine() { // the fields here should probably match method 'accountStringsAreEqual' above SourceAccountingLine sourceLine = new SourceAccountingLine(); sourceLine.setChartOfAccountsCode(getChartOfAccountsCode()); sourceLine.setAccountNumber(getAccountNumber()); sourceLine.setSubAccountNumber(getSubAccountNumber()); sourceLine.setFinancialObjectCode(getFinancialObjectCode()); sourceLine.setFinancialSubObjectCode(getFinancialSubObjectCode()); sourceLine.setProjectCode(getProjectCode()); sourceLine.setOrganizationReferenceId(getOrganizationReferenceId()); sourceLine.setAmount(getAmount()); sourceLine.setSequenceNumber(getSequenceNumber()); return sourceLine; } /** * @see org.kuali.kfs.sys.businessobject.AccountingLineBase#toStringMapper() */ @Override protected LinkedHashMap toStringMapper_RICE20_REFACTORME() { LinkedHashMap m = new LinkedHashMap(); m.put("chart", getChartOfAccountsCode()); m.put("account", getAccountNumber()); m.put("objectCode", getFinancialObjectCode()); m.put("subAccount", getSubAccountNumber()); m.put("subObjectCode", getFinancialSubObjectCode()); m.put("projectCode", getProjectCode()); m.put("orgRefId", getOrganizationReferenceId()); return m; } @Override public int compareTo(Object arg0) { if (arg0 instanceof PurApAccountingLine) { PurApAccountingLine account = (PurApAccountingLine) arg0; return this.getString().compareTo(account.getString()); } return -1; } @Override public String getString() { return getChartOfAccountsCode() + "~" + getAccountNumber() + "~" + getSubAccountNumber() + "~" + getFinancialObjectCode() + "~" + getFinancialSubObjectCode() + "~" + getProjectCode() + "~" + getOrganizationReferenceId(); } @Override public KualiDecimal getAlternateAmountForGLEntryCreation() { return alternateAmountForGLEntryCreation; } @Override public void setAlternateAmountForGLEntryCreation(KualiDecimal alternateAmount) { this.alternateAmountForGLEntryCreation = alternateAmount; } /** * @see org.kuali.kfs.sys.businessobject.AccountingLineBase#getSequenceNumber() */ @Override public Integer getSequenceNumber() { return this.getAccountIdentifier(); } /** * @see org.kuali.kfs.sys.businessobject.AccountingLineBase#copyFrom(org.kuali.kfs.sys.businessobject.AccountingLine) */ @Override public void copyFrom(AccountingLine other) { super.copyFrom(other); if (other instanceof PurApAccountingLine) { PurApAccountingLine purapOther = (PurApAccountingLine)other; // Need to fix accountIdentifier and sequenceNumber since they are crossed in the getter in purap // i.e. getSequenceNumber() actually returns accountIdentifier, while getPurApSequenceNumber() returns the original sequenceNumber. // Without this fix, this.sequenceNumber will be set as other.AccountIdentifier, while this.accountIdentifier will remain unpopulated or it was; // this is not what we want; and if this method were used during comparison, such as being called by isLike(), then error will occur. setAccountIdentifier(purapOther.getAccountIdentifier()); setSequenceNumber(purapOther.getPurApSequenceNumber()); setAccountLinePercent(purapOther.getAccountLinePercent()); setAmount(purapOther.getAmount()); setAlternateAmountForGLEntryCreation(purapOther.getAlternateAmountForGLEntryCreation()); } } @Override public void refreshNonUpdateableReferences() { //hold onto item reference if there without itemId PurApItem item = null; PurApItem tempItem = getPurapItem(); if(tempItem != null && tempItem.getItemIdentifier() != null) { item = tempItem; } super.refreshNonUpdateableReferences(); if(ObjectUtils.isNotNull(item)) { this.setPurapItem(item); } } @Override public <T extends PurApItem> T getPurapItem() { return (T) purapItem; } /** * Sets the requisitionItem attribute. * @deprecated * @param item */ @Override public void setPurapItem(PurApItem item) { purapItem = item; } @Override public String getPostingPeriodCode() { return postingPeriodCode; } @Override public void setPostingPeriodCode(String postingPeriodCode) { this.postingPeriodCode = postingPeriodCode; } /** * Overridden to use purap doc identifier, rather than document number * @see org.kuali.kfs.sys.businessobject.AccountingLineBase#getValuesMap() */ @Override public Map getValuesMap() { Map valuesMap = super.getValuesMap(); // remove document number valuesMap.remove(KFSPropertyConstants.DOCUMENT_NUMBER); return valuesMap; } /** * Gets the purApSequenceNumber attribute. * * @return Returns the purApSequenceNumber */ @Override public Integer getPurApSequenceNumber() { return super.getSequenceNumber(); } }