001: /*
002: * Copyright 2007 The Kuali Foundation.
003: *
004: * Licensed under the Educational Community License, Version 1.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/ecl1.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.module.labor.document;
017:
018: import java.util.HashMap;
019: import java.util.List;
020: import java.util.Map;
021:
022: import org.kuali.core.document.AmountTotaling;
023: import org.kuali.core.document.Copyable;
024: import org.kuali.core.document.Correctable;
025: import org.kuali.core.util.KualiDecimal;
026: import org.kuali.kfs.KFSConstants;
027: import org.kuali.kfs.bo.AccountingLine;
028: import org.kuali.module.labor.bo.ExpenseTransferSourceAccountingLine;
029: import org.kuali.module.labor.bo.ExpenseTransferTargetAccountingLine;
030:
031: /**
032: * Labor Base class for Expense Transfer Documents
033: */
034: public abstract class LaborExpenseTransferDocumentBase extends
035: LaborLedgerPostingDocumentBase implements AmountTotaling,
036: Copyable, Correctable, LaborExpenseTransferDocument {
037: private static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory
038: .getLog(LaborExpenseTransferDocumentBase.class);
039: private String emplid;
040:
041: /**
042: * Constructor
043: */
044:
045: public LaborExpenseTransferDocumentBase() {
046: super ();
047: }
048:
049: /**
050: * Determine whether target accouting lines have the same amounts as source accounting lines for each object code
051: *
052: * @return true if target accouting lines have the same amounts as source accounting lines for each object code; otherwise,
053: * false
054: */
055: public Map<String, KualiDecimal> getUnbalancedObjectCodes() {
056: Map<String, KualiDecimal> amountsFromSourceLine = summerizeByObjectCode(getSourceAccountingLines());
057: Map<String, KualiDecimal> amountsFromTargetLine = summerizeByObjectCode(getTargetAccountingLines());
058:
059: Map<String, KualiDecimal> unbalancedAmounts = new HashMap<String, KualiDecimal>();
060: for (String objectCode : amountsFromSourceLine.keySet()) {
061: KualiDecimal sourceAmount = amountsFromSourceLine
062: .get(objectCode);
063:
064: if (!amountsFromTargetLine.containsKey(objectCode)) {
065: unbalancedAmounts.put(objectCode, sourceAmount
066: .negated());
067: } else {
068: KualiDecimal targetAmount = amountsFromTargetLine
069: .get(objectCode);
070: KualiDecimal amountDifference = targetAmount
071: .subtract(sourceAmount);
072: if (amountDifference.isNonZero()) {
073: unbalancedAmounts.put(objectCode, amountDifference);
074: }
075: }
076: }
077:
078: for (String objectCode : amountsFromTargetLine.keySet()) {
079: if (!amountsFromSourceLine.containsKey(objectCode)) {
080: KualiDecimal targetAmount = amountsFromTargetLine
081: .get(objectCode);
082: unbalancedAmounts.put(objectCode, targetAmount);
083: }
084: }
085:
086: return unbalancedAmounts;
087: }
088:
089: /**
090: * summerize the amounts of accounting lines by object codes
091: *
092: * @param accountingLines the given accounting line list
093: * @return the summerized amounts by object codes
094: */
095: private Map<String, KualiDecimal> summerizeByObjectCode(
096: List accountingLines) {
097: Map<String, KualiDecimal> amountByObjectCode = new HashMap<String, KualiDecimal>();
098:
099: for (Object accountingLine : accountingLines) {
100: AccountingLine line = (AccountingLine) accountingLine;
101: String objectCode = line.getFinancialObjectCode();
102: KualiDecimal amount = line.getAmount();
103:
104: if (amountByObjectCode.containsKey(objectCode)) {
105: amount = amount.add(amountByObjectCode.get(objectCode));
106: }
107: amountByObjectCode.put(objectCode, amount);
108: }
109:
110: return amountByObjectCode;
111: }
112:
113: /**
114: * Gets the emplid
115: *
116: * @return Returns the emplid.
117: * @see org.kuali.module.labor.document.LaborExpenseTransferDocument#getEmplid()
118: */
119: public String getEmplid() {
120: return emplid;
121: }
122:
123: /**
124: * Sets the emplid
125: *
126: * @see org.kuali.module.labor.document.LaborExpenseTransferDocument#setEmplid(String)
127: * @param emplid
128: */
129: public void setEmplid(String emplid) {
130: this .emplid = emplid;
131: }
132:
133: /**
134: * Overrides the base implementation to return "From".
135: *
136: * @see org.kuali.core.document.AccountingDocument#getSourceAccountingLinesSectionTitle()
137: */
138: public String getSourceAccountingLinesSectionTitle() {
139: return KFSConstants.FROM;
140: }
141:
142: /**
143: * Overrides the base implementation to return "To".
144: *
145: * @see org.kuali.core.document.AccountingDocument#getTargetAccountingLinesSectionTitle()
146: */
147: public String getTargetAccountingLinesSectionTitle() {
148: return KFSConstants.TO;
149: }
150:
151: /**
152: * @return Returns the ExpenseTransferSourceAccountingLine
153: * @see org.kuali.kfs.document.AccountingDocumentBase#getSourceAccountingLineClass()
154: */
155: public Class getSourceAccountingLineClass() {
156: return ExpenseTransferSourceAccountingLine.class;
157: }
158:
159: /**
160: * @return Returns the ExpenseTransferTargetAccountingLine
161: * @see org.kuali.kfs.document.AccountingDocumentBase#getTargetAccountingLineClass()
162: */
163: public Class getTargetAccountingLineClass() {
164: return ExpenseTransferTargetAccountingLine.class;
165: }
166: }
|