/*
* 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.gl.businessobject.lookup;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.gl.Constant;
import org.kuali.kfs.gl.businessobject.inquiry.EntryInquirableImpl;
import org.kuali.kfs.gl.businessobject.inquiry.InquirableFinancialDocument;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
import org.kuali.kfs.sys.businessobject.UniversityDate;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.GeneralLedgerPendingEntryService;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl;
import org.kuali.rice.kns.lookup.HtmlData;
import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.exception.ValidationException;
import org.kuali.rice.krad.lookup.CollectionIncomplete;
import org.kuali.rice.krad.util.BeanPropertyComparator;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
/**
* An extension of KualiLookupableImpl to support balance lookups
*/
public class PendingEntryLookupableHelperServiceImpl extends AbstractGeneralLedgerLookupableHelperServiceImpl {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PendingEntryLookupableHelperServiceImpl.class);
private GeneralLedgerPendingEntryService generalLedgerPendingEntryService;
private ParameterService parameterService;
private final static String UNIVERSITY_FISCAL_YEAR = "universityFiscalYear";
private final static String UNIVERSITY_FISCAL_PERIOD_CODE = "universityFiscalPeriodCode";
/**
* Returns the url for any drill down links within the lookup (defers to its superclass unless it needs
* to get the url of the document that created this result pending entry)
* @param bo the business object with a property being drilled down on
* @param propertyName the name of the property being drilled down on
* @return a String with the URL of the property
* @see org.kuali.rice.kns.lookup.Lookupable#getInquiryUrl(org.kuali.rice.krad.bo.BusinessObject, java.lang.String)
*/
@Override
public HtmlData getInquiryUrl(BusinessObject businessObject, String propertyName) {
if (KFSPropertyConstants.DOCUMENT_NUMBER.equals(propertyName) && businessObject instanceof GeneralLedgerPendingEntry) {
GeneralLedgerPendingEntry pendingEntry = (GeneralLedgerPendingEntry) businessObject;
return new AnchorHtmlData(new InquirableFinancialDocument().getInquirableDocumentUrl(pendingEntry), KRADConstants.EMPTY_STRING, "view pending entry "+pendingEntry.toString());
}
return (new EntryInquirableImpl()).getInquiryUrl(businessObject, propertyName);
//return super.getInquiryUrl(businessObject, propertyName);
}
/**
* Validates the fiscal year searched for in the inquiry
* @param fieldValues the values of the query
* @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#validateSearchParameters(java.util.Map)
*/
@Override
public void validateSearchParameters(Map fieldValues) {
super.validateSearchParameters(fieldValues);
String valueFiscalYear = (String) fieldValues.get(UNIVERSITY_FISCAL_YEAR);
if (!StringUtils.isEmpty(valueFiscalYear)) {
try {
int year = Integer.parseInt(valueFiscalYear);
}
catch (NumberFormatException e) {
GlobalVariables.getMessageMap().putError(UNIVERSITY_FISCAL_YEAR, KFSKeyConstants.ERROR_CUSTOM, new String[] { KFSKeyConstants.PendingEntryLookupableImpl.FISCAL_YEAR_FOUR_DIGIT });
throw new ValidationException("errors in search criteria");
}
}
if (!allRequiredsForAccountSearch(fieldValues) && !allRequiredsForDocumentSearch(fieldValues)) {
GlobalVariables.getMessageMap().putError("universityFiscalYear", KFSKeyConstants.ERROR_GL_LOOKUP_PENDING_ENTRY_NON_MATCHING_REQUIRED_FIELDS, new String[] {});
throw new ValidationException("errors in search criteria");
}
}
/**
* Determines if all the required values for an account based search are present - fiscal year, chart, account number, and fiscal period code
* @param fieldValues field values to check
* @return true if all the account-based required search fields are present; false otherwise
*/
protected boolean allRequiredsForAccountSearch(Map fieldValues) {
final String fiscalYearAsString = (String)fieldValues.get("universityFiscalYear");
final String chartOfAccountsCode = (String)fieldValues.get("chartOfAccountsCode");
final String accountNumber = (String)fieldValues.get("accountNumber");
final String fiscalPeriodCode = (String)fieldValues.get("universityFiscalPeriodCode");
return !StringUtils.isBlank(fiscalYearAsString) && !StringUtils.isBlank(chartOfAccountsCode) && !StringUtils.isBlank(accountNumber) && !StringUtils.isBlank(fiscalPeriodCode);
}
/**
* Determines if all the required values for an document based search are present - fiscal year and document number
* @param fieldValues field values to check
* @return true if all the document-based required search fields are present; false otherwise
*/
protected boolean allRequiredsForDocumentSearch(Map fieldValues) {
final String fiscalYearAsString = (String)fieldValues.get("universityFiscalYear");
final String documentNumber = (String)fieldValues.get("documentNumber");
return !StringUtils.isBlank(fiscalYearAsString) && !StringUtils.isBlank(documentNumber);
}
/**
* Generates the list of search results for this inquiry
* @param fieldValues the field values of the query to carry out
* @return List the search results returned by the lookup
* @see org.kuali.rice.kns.lookup.Lookupable#getSearchResults(java.util.Map)
*/
@Override
public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
setBackLocation((String) fieldValues.get(KFSConstants.BACK_LOCATION));
setDocFormKey((String) fieldValues.get(KFSConstants.DOC_FORM_KEY));
boolean isApproved = fieldValues.containsKey(Constant.PENDING_ENTRY_OPTION) && Constant.APPROVED_PENDING_ENTRY.equals(fieldValues.get(Constant.PENDING_ENTRY_OPTION));
Collection searchResultsCollection = generalLedgerPendingEntryService.findPendingEntries(fieldValues, isApproved);
// sort list if default sort column given
List searchResults = (List) searchResultsCollection;
List defaultSortColumns = getDefaultSortColumns();
if (defaultSortColumns.size() > 0) {
Collections.sort(searchResults, new BeanPropertyComparator(defaultSortColumns, true));
}
// get the result limit number from configuration
String limitConfig = parameterService.getParameterValueAsString(KfsParameterConstants.NERVOUS_SYSTEM_LOOKUP.class, KFSConstants.LOOKUP_RESULTS_LIMIT_URL_KEY);
Integer limit = null;
if (limitConfig != null) {
limit = Integer.valueOf(limitConfig);
}
Long collectionCount = new Long(searchResults.size());
Long actualCountIfTruncated = new Long(0);
// If more than limit number of records were returned, removed
if (limit != null) {
if (collectionCount >= limit.intValue()) {
actualCountIfTruncated = collectionCount;
for (int i = collectionCount.intValue() - 1; i >= limit; i--) {
searchResults.remove(i);
}
}
}
UniversityDate currentUniversityDate = SpringContext.getBean(UniversityDateService.class).getCurrentUniversityDate();
String currentFiscalPeriodCode = currentUniversityDate.getUniversityFiscalAccountingPeriod();
Integer currentFiscalYear = currentUniversityDate.getUniversityFiscalYear();
String fiscalPeriodFromForm = null;
if (fieldValues.containsKey(UNIVERSITY_FISCAL_PERIOD_CODE)) {
fiscalPeriodFromForm = (String) fieldValues.get(UNIVERSITY_FISCAL_PERIOD_CODE);
}
String fiscalYearFromForm = null;
if (fieldValues.containsKey(UNIVERSITY_FISCAL_YEAR)) {
fiscalYearFromForm = (String) fieldValues.get(UNIVERSITY_FISCAL_YEAR);
}
// Set null fy and ap to current values.
for (Iterator i = searchResults.iterator(); i.hasNext();) {
GeneralLedgerPendingEntry glpe = (GeneralLedgerPendingEntry) i.next();
if (currentFiscalPeriodCode.equals(fiscalPeriodFromForm) && null == glpe.getUniversityFiscalPeriodCode()) {
glpe.setUniversityFiscalPeriodCode(currentFiscalPeriodCode);
}
if (currentFiscalYear.toString().equals(fiscalYearFromForm) && null == glpe.getUniversityFiscalYear()) {
glpe.setUniversityFiscalYear(currentFiscalYear);
}
}
return new CollectionIncomplete(searchResults, actualCountIfTruncated);
}
/**
* This method builds the collection of search results without period codes and updates the results with current period code
*
* @param iterator the iterator of search results
* @param periodCode the current period code
* @return the collection of search results with updated period codes
*/
private Collection buildSearchResults(Iterator iterator, String periodCode) {
Collection collection = new ArrayList();
while (iterator.hasNext()) {
GeneralLedgerPendingEntry pendingEntry = (GeneralLedgerPendingEntry) iterator.next();
pendingEntry.setUniversityFiscalPeriodCode(periodCode);
collection.add(pendingEntry);
}
return new CollectionIncomplete(collection, new Long(collection.size()));
}
@Override
protected void updateEntryCollection(Collection entryCollection, Map fieldValues, boolean isApproved, boolean isConsolidated, boolean isCostShareInclusive) {
// TODO Auto-generated method stub
}
/**
* Sets the generalLedgerPendingEntryService attribute value.
*
* @param generalLedgerPendingEntryService The generalLedgerPendingEntryService to set.
*/
public void setGeneralLedgerPendingEntryService(GeneralLedgerPendingEntryService generalLedgerPendingEntryService) {
this.generalLedgerPendingEntryService = generalLedgerPendingEntryService;
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
}