/* * 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.ld.document; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.module.ld.businessobject.ExpenseTransferSourceAccountingLine; import org.kuali.kfs.module.ld.businessobject.ExpenseTransferTargetAccountingLine; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.AmountTotaling; import org.kuali.kfs.sys.document.Correctable; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.kim.api.identity.PersonService; import org.kuali.rice.krad.document.Copyable; /** * Labor Base class for Expense Transfer Documents */ public abstract class LaborExpenseTransferDocumentBase extends LaborLedgerPostingDocumentBase implements AmountTotaling, Copyable, Correctable, LaborExpenseTransferDocument { protected static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(LaborExpenseTransferDocumentBase.class); protected String emplid; protected Person user; /** * Constructor */ public LaborExpenseTransferDocumentBase() { super(); } /** * Determine whether target accouting lines have the same amounts as source accounting lines for each object code * * @return true if target accouting lines have the same amounts as source accounting lines for each object code; otherwise, * false */ public Map<String, KualiDecimal> getUnbalancedObjectCodes() { Map<String, KualiDecimal> amountsFromSourceLine = summerizeByObjectCode(getSourceAccountingLines()); Map<String, KualiDecimal> amountsFromTargetLine = summerizeByObjectCode(getTargetAccountingLines()); Map<String, KualiDecimal> unbalancedAmounts = new HashMap<String, KualiDecimal>(); for (String objectCode : amountsFromSourceLine.keySet()) { KualiDecimal sourceAmount = amountsFromSourceLine.get(objectCode); if (!amountsFromTargetLine.containsKey(objectCode)) { unbalancedAmounts.put(objectCode, sourceAmount.negated()); } else { KualiDecimal targetAmount = amountsFromTargetLine.get(objectCode); KualiDecimal amountDifference = targetAmount.subtract(sourceAmount); if (amountDifference.isNonZero()) { unbalancedAmounts.put(objectCode, amountDifference); } } } for (String objectCode : amountsFromTargetLine.keySet()) { if (!amountsFromSourceLine.containsKey(objectCode)) { KualiDecimal targetAmount = amountsFromTargetLine.get(objectCode); unbalancedAmounts.put(objectCode, targetAmount); } } return unbalancedAmounts; } /** * summerize the amounts of accounting lines by object codes * * @param accountingLines the given accounting line list * @return the summerized amounts by object codes */ protected Map<String, KualiDecimal> summerizeByObjectCode(List accountingLines) { Map<String, KualiDecimal> amountByObjectCode = new HashMap<String, KualiDecimal>(); for (Object accountingLine : accountingLines) { AccountingLine line = (AccountingLine) accountingLine; String objectCode = line.getFinancialObjectCode(); KualiDecimal amount = line.getAmount(); if (amountByObjectCode.containsKey(objectCode)) { amount = amount.add(amountByObjectCode.get(objectCode)); } amountByObjectCode.put(objectCode, amount); } return amountByObjectCode; } /** * Gets the emplid * * @return Returns the emplid. * @see org.kuali.kfs.module.ld.document.LaborExpenseTransferDocument#getEmplid() */ public String getEmplid() { return emplid; } /** * Sets the emplid * * @see org.kuali.kfs.module.ld.document.LaborExpenseTransferDocument#setEmplid(String) * @param emplid */ public void setEmplid(String emplid) { this.emplid = emplid; } /** * Gets the user attribute. * @return Returns the user. */ public Person getUser() { if(user == null || !StringUtils.equals(user.getEmployeeId(), emplid)) { this.user = SpringContext.getBean(PersonService.class).getPersonByEmployeeId(emplid); } return user; } /** * Sets the user attribute value. * @param user The user to set. */ public void setUser(Person user) { this.user = user; } /** * Overrides the base implementation to return "From". * * @see org.kuali.rice.krad.document.AccountingDocument#getSourceAccountingLinesSectionTitle() */ public String getSourceAccountingLinesSectionTitle() { return KFSConstants.FROM; } /** * Overrides the base implementation to return "To". * * @see org.kuali.rice.krad.document.AccountingDocument#getTargetAccountingLinesSectionTitle() */ public String getTargetAccountingLinesSectionTitle() { return KFSConstants.TO; } /** * @return Returns the ExpenseTransferSourceAccountingLine * @see org.kuali.kfs.sys.document.AccountingDocumentBase#getSourceAccountingLineClass() */ public Class getSourceAccountingLineClass() { return ExpenseTransferSourceAccountingLine.class; } /** * @return Returns the ExpenseTransferTargetAccountingLine * @see org.kuali.kfs.sys.document.AccountingDocumentBase#getTargetAccountingLineClass() */ public Class getTargetAccountingLineClass() { return ExpenseTransferTargetAccountingLine.class; } }