/*
* 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.tem.service.impl;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.kuali.kfs.coa.businessobject.ObjectCode;
import org.kuali.kfs.module.tem.businessobject.AccountingDistribution;
import org.kuali.kfs.module.tem.businessobject.TemExpense;
import org.kuali.kfs.module.tem.document.TravelAuthorizationDocument;
import org.kuali.kfs.module.tem.document.TravelDocument;
import org.kuali.kfs.module.tem.service.TemExpenseService;
import org.kuali.kfs.module.tem.util.ExpenseUtils;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
import org.kuali.rice.krad.util.ObjectUtils;
public class ActualExpenseServiceImpl extends ExpenseServiceBase implements TemExpenseService {
public static Logger LOG = Logger.getLogger(ActualExpenseServiceImpl.class);
/**
* @see org.kuali.kfs.module.tem.service.impl.ExpenseServiceBase#calculateDistributionTotals(org.kuali.kfs.module.tem.document.TravelDocument, java.util.Map, java.util.List)
*/
@Override
public void calculateDistributionTotals(TravelDocument document, Map<String, AccountingDistribution> distributionMap, List<? extends TemExpense> expenses){
//calculate the distribution map for all actual expenses
for (TemExpense expense : expenses) {
if (expense.getExpenseDetails() != null && expense.getExpenseDetails().size() > 0){
//calculate using detail as it might have different details' object code
calculateDistributionTotals(document, distributionMap, expense.getExpenseDetails());
}
else {
if (!ObjectUtils.isNull(expense.getExpenseTypeObjectCode()) && !expense.getExpenseTypeObjectCode().getExpenseType().isPrepaidExpense() && !expense.getNonReimbursable()) {
boolean skipDistribution = false;
String financialObjectCode = null;
if (document.isTravelAuthorizationDoc()) {
//check trip generate encumbrance
if (((TravelAuthorizationDocument)document).isTripGenerateEncumbrance()) {
financialObjectCode = document.getTripType().getEncumbranceObjCode();
}else{
//non encumbrance actual expense in TA are informational only - no need to distribute
skipDistribution = true;
}
}else {
financialObjectCode = !ObjectUtils.isNull(expense.getExpenseTypeObjectCode()) ? expense.getExpenseTypeObjectCode().getFinancialObjectCode() : null;
}
final ObjectCode objCode = getObjectCodeService().getByPrimaryIdForCurrentYear(ExpenseUtils.getDefaultChartCode(document), financialObjectCode);
if (objCode != null && !skipDistribution) {
AccountingDistribution distribution = null;
String key = objCode.getCode() + "-" + document.getDefaultCardTypeCode();
if (distributionMap.containsKey(key)){
distributionMap.get(key).setSubTotal(distributionMap.get(key).getSubTotal().add(expense.getConvertedAmount()));
distributionMap.get(key).setRemainingAmount(distributionMap.get(key).getRemainingAmount().add(expense.getConvertedAmount()));
}
else{
distribution = new AccountingDistribution();
distribution.setObjectCode(objCode.getCode());
distribution.setObjectCodeName(objCode.getName());
distribution.setCardType(document.getDefaultCardTypeCode());
distribution.setRemainingAmount(expense.getConvertedAmount());
distribution.setSubTotal(expense.getConvertedAmount());
distributionMap.put(key, distribution);
LOG.debug("Subtotal distribution " + distribution.getSubTotal());
}
}
}
}
}
}
/**
* @see org.kuali.kfs.module.tem.service.TemExpenseService#getExpenseDetails(org.kuali.kfs.module.tem.document.TravelDocument)
*/
@Override
public List<? extends TemExpense> getExpenseDetails(TravelDocument document) {
return document.getActualExpenses();
}
/**
* @see org.kuali.kfs.module.tem.service.impl.ExpenseServiceBase#processExpense(org.kuali.kfs.module.tem.document.TravelDocument)
*/
@Override
public void processExpense(TravelDocument travelDocument, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
//do nothing
}
/**
* @see org.kuali.kfs.module.tem.service.impl.ExpenseServiceBase#updateExpense(org.kuali.kfs.module.tem.document.TravelDocument)
*/
@Override
public void updateExpense(TravelDocument travelDocument) {
//do nothing
}
}