/*
* 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.service.impl;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.gl.Constant;
import org.kuali.kfs.module.ld.businessobject.AccountStatusCurrentFunds;
import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry;
import org.kuali.kfs.module.ld.businessobject.LedgerBalance;
import org.kuali.kfs.module.ld.businessobject.LedgerEntry;
import org.kuali.kfs.module.ld.service.LaborInquiryOptionsService;
import org.kuali.kfs.module.ld.service.LaborLedgerBalanceService;
import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService;
import org.kuali.kfs.sys.KFSConstants.ParameterValues;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.ObjectUtil;
import org.kuali.rice.kns.web.ui.Field;
import org.kuali.rice.kns.web.ui.Row;
/**
* The LaborInquiryOptionsService class is a service that will generate Pending Ledger and Consilidation options for balance
* inquiries.
*/
public class LaborInquiryOptionsServiceImpl implements LaborInquiryOptionsService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborInquiryOptionsServiceImpl.class);
private LaborLedgerPendingEntryService laborLedgerPendingEntryService;
private LaborLedgerBalanceService laborLedgerBalanceService;
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationFieldName()
*/
@Override
public String getConsolidationFieldName() {
return Constant.CONSOLIDATION_OPTION;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationField(java.util.Collection)
*/
@Override
public Field getConsolidationField(Collection<Row> rows) {
for (Row row : rows) {
for (Field field : (row.getFields())) {
if (field.getPropertyName().equals(getConsolidationFieldName())) {
return field;
}
}
}
return null;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getSelectedPendingEntryOption(java.util.Map)
*/
@Override
public String getSelectedPendingEntryOption(Map fieldValues) {
// truncate the non-property filed
String pendingEntryOption = (String) fieldValues.get(Constant.PENDING_ENTRY_OPTION);
fieldValues.remove(Constant.PENDING_ENTRY_OPTION);
return pendingEntryOption;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#isCgBeginningBalanceOnlyExcluded(java.util.Map)
*/
@Override
public boolean isCgBeginningBalanceOnlyExcluded(Map fieldValues) {
// truncate the non-property filed
String cgBeginningBalanceExcludeOption = (String) fieldValues.get(Constant.EXCLUDE_CG_BEGINNING_BALANCE_ONLY_OPTION);
fieldValues.remove(Constant.EXCLUDE_CG_BEGINNING_BALANCE_ONLY_OPTION);
return ParameterValues.YES.equalsIgnoreCase(cgBeginningBalanceExcludeOption);
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationOption(java.util.Map)
*/
@Override
public String getConsolidationOption(Map fieldValues) {
String consolidationOption = (String) fieldValues.get(getConsolidationFieldName());
// truncate the non-property filed
fieldValues.remove(getConsolidationFieldName());
return consolidationOption;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#isConsolidationSelected(java.util.Map, java.util.Collection)
*
* KRAD Conversion: Lookupable performs checking for a particular attribute and return true or false.
* This method is called from BaseFundsLookupableHelperServiceImpl.java, CurrentFundsLookupableHelperServiceImpl.java,
* LedgerBalanceLookupableHelperServiceImpl.java in ld module
*/
@Override
public boolean isConsolidationSelected(Map fieldValues, Collection<Row> rows) {
boolean isConsolidationSelected = isConsolidationSelected(fieldValues);
if (!isConsolidationSelected) {
Field consolidationField = getConsolidationField(rows);
consolidationField.setPropertyValue(Constant.DETAIL);
}
return isConsolidationSelected;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#isConsolidationSelected(java.util.Map)
*/
@Override
public boolean isConsolidationSelected(Map fieldValues) {
String consolidationOption = getConsolidationOption(fieldValues);
// detail option would be used
if (Constant.DETAIL.equals(consolidationOption)) {
return false;
}
// if the subAccountNumber is specified, detail option could be used
// if the subObjectCode is specified, detail option could be used
// if the objectTypeCode is specified, detail option could be used
if (isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.SUB_ACCOUNT_NUMBER) || isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.SUB_OBJECT_CODE) || isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.OBJECT_TYPE_CODE)) {
return false;
}
return true;
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateLedgerBalanceByPendingLedgerEntry(java.util.Collection,
* java.util.Map, java.lang.String, boolean)
*/
@Override
public void updateLedgerBalanceByPendingLedgerEntry(Collection<LedgerBalance> balanceCollection, Map fieldValues, String pendingEntryOption, boolean isConsolidated) {
// determine if search results need to be updated by pending ledger entries
if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(balanceCollection, fieldValues, false, isConsolidated, LedgerBalance.class);
}
else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(balanceCollection, fieldValues, true, isConsolidated, LedgerBalance.class);
}
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateCurrentFundsByPendingLedgerEntry(java.util.Collection,
* java.util.Map, java.lang.String, boolean)
*/
@Override
public void updateCurrentFundsByPendingLedgerEntry(Collection<AccountStatusCurrentFunds> balanceCollection, Map fieldValues, String pendingEntryOption, boolean isConsolidated) {
// determine if search results need to be updated by pending ledger entries
if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(balanceCollection, fieldValues, false, isConsolidated, AccountStatusCurrentFunds.class);
}
else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(balanceCollection, fieldValues, true, isConsolidated, AccountStatusCurrentFunds.class);
}
}
/**
* @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateByPendingLedgerEntry(java.util.Collection,
* java.util.Map, java.lang.String, boolean)
*/
@Override
public void updateLedgerEntryByPendingLedgerEntry(Collection<LedgerEntry> entryCollection, Map fieldValues, String pendingEntryOption) {
// determine if search results need to be updated by pending ledger entries
if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(entryCollection, fieldValues, false, false, LedgerEntry.class);
}
else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) {
updateCollection(entryCollection, fieldValues, true, false, LedgerEntry.class);
}
}
/**
* update a given collection entry with the pending entry obtained from the given field values and isApproved
*
* @param entryCollection the given entry collection
* @param fieldValues the given field values
* @param isApproved indicate if the resulting pending entry has been approved
* @param isConsolidated indicate if the collection entries have been consolidated
*/
protected void updateCollection(Collection entryCollection, Map fieldValues, boolean isApproved, boolean isConsolidated, Class clazz) {
// go through the pending entries to update the balance collection
Iterator<LaborLedgerPendingEntry> pendingEntryIterator = laborLedgerPendingEntryService.findPendingLedgerEntriesForLedgerBalance(fieldValues, isApproved);
while (pendingEntryIterator.hasNext()) {
LaborLedgerPendingEntry pendingEntry = pendingEntryIterator.next();
// if consolidated, change the following fields into the default values for consolidation
if (isConsolidated) {
pendingEntry.setSubAccountNumber(Constant.CONSOLIDATED_SUB_ACCOUNT_NUMBER);
pendingEntry.setFinancialSubObjectCode(Constant.CONSOLIDATED_SUB_OBJECT_CODE);
pendingEntry.setFinancialObjectTypeCode(Constant.CONSOLIDATED_OBJECT_TYPE_CODE);
}
if (LedgerBalance.class.isAssignableFrom(clazz)) {
try {
LedgerBalance ledgerBalance = laborLedgerBalanceService.findLedgerBalance(entryCollection, pendingEntry);
if (ledgerBalance == null) {
Object newLedgerBalance = clazz.newInstance();
ObjectUtil.buildObject(newLedgerBalance, pendingEntry);
ledgerBalance = (LedgerBalance) newLedgerBalance;
entryCollection.add(ledgerBalance);
}
laborLedgerBalanceService.updateLedgerBalance(ledgerBalance, pendingEntry);
ledgerBalance.getDummyBusinessObject().setConsolidationOption(isConsolidated ? Constant.CONSOLIDATION : Constant.DETAIL);
ledgerBalance.getDummyBusinessObject().setPendingEntryOption(isApproved ? Constant.APPROVED_PENDING_ENTRY : Constant.ALL_PENDING_ENTRY);
}
catch (Exception e) {
LOG.error("cannot create a new object of type: " + clazz.getName() + "/n" + e);
}
}
else if (LedgerEntry.class.isAssignableFrom(clazz)) {
LedgerEntry ledgerEntry = new LedgerEntry();
ObjectUtil.buildObject(ledgerEntry, pendingEntry);
ledgerEntry.getDummyBusinessObject().setConsolidationOption(isConsolidated ? Constant.CONSOLIDATION : Constant.DETAIL);
ledgerEntry.getDummyBusinessObject().setPendingEntryOption(isApproved ? Constant.APPROVED_PENDING_ENTRY : Constant.ALL_PENDING_ENTRY);
entryCollection.add(ledgerEntry);
}
else {
LOG.warn("The class, " + clazz.getName() + ", is unregistered with the method.");
return;
}
}
}
/**
* Determines if any of the fields that require a detail view are used
*
* @param fieldValues
* @param fieldName
*/
protected boolean isDetailDefaultFieldUsed(Map fieldValues, String fieldName) {
return StringUtils.isNotBlank((String) fieldValues.get(fieldName));
}
/**
* Sets the laborLedgerBalanceService attribute value.
*
* @param laborLedgerBalanceService The laborLedgerBalanceService to set.
*/
public void setLaborLedgerBalanceService(LaborLedgerBalanceService laborLedgerBalanceService) {
this.laborLedgerBalanceService = laborLedgerBalanceService;
}
/**
* Sets the laborLedgerPendingEntryService attribute value.
*
* @param laborLedgerPendingEntryService The laborLedgerPendingEntryService to set.
*/
public void setLaborLedgerPendingEntryService(LaborLedgerPendingEntryService laborLedgerPendingEntryService) {
this.laborLedgerPendingEntryService = laborLedgerPendingEntryService;
}
}