001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.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/ecl2.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.kfs.gl.businessobject.lookup;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.Iterator;
021 import java.util.List;
022 import java.util.Map;
023
024 import org.apache.commons.lang.StringUtils;
025 import org.kuali.kfs.gl.OJBUtility;
026 import org.kuali.kfs.gl.batch.service.EncumbranceCalculator;
027 import org.kuali.kfs.gl.businessobject.Encumbrance;
028 import org.kuali.kfs.gl.businessobject.inquiry.EncumbranceInquirableImpl;
029 import org.kuali.kfs.gl.service.EncumbranceService;
030 import org.kuali.kfs.sys.KFSConstants;
031 import org.kuali.kfs.sys.KFSKeyConstants;
032 import org.kuali.kfs.sys.KFSPropertyConstants;
033 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
034 import org.kuali.rice.kns.bo.BusinessObject;
035 import org.kuali.rice.kns.exception.ValidationException;
036 import org.kuali.rice.kns.lookup.HtmlData;
037 import org.kuali.rice.kns.util.GlobalVariables;
038
039 /**
040 * An extension of KualiLookupableImpl to support encumbrance lookups
041 */
042 public class EncumbranceLookupableHelperServiceImpl extends AbstractGeneralLedgerLookupableHelperServiceImpl {
043
044 private EncumbranceCalculator postEncumbrance;
045 private EncumbranceService encumbranceService;
046
047 /**
048 * Returns the url for any drill down links within the lookup
049 * @param bo the business object with a property being drilled down on
050 * @param propertyName the name of the property being drilled down on
051 * @return a String with the URL of the property
052 * @see org.kuali.rice.kns.lookup.Lookupable#getInquiryUrl(org.kuali.rice.kns.bo.BusinessObject, java.lang.String)
053 */
054 @Override
055 public HtmlData getInquiryUrl(BusinessObject businessObject, String propertyName) {
056 return (new EncumbranceInquirableImpl()).getInquiryUrl(businessObject, propertyName);
057 }
058
059 /**
060 * Validates the fiscal year searched for in the inquiry
061 * @param fieldValues the values of the query
062 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#validateSearchParameters(java.util.Map)
063 */
064 @Override
065 public void validateSearchParameters(Map fieldValues) {
066 super.validateSearchParameters(fieldValues);
067
068 String valueFiscalYear = (String) fieldValues.get(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
069 if (!StringUtils.isEmpty(valueFiscalYear)) {
070 try {
071 int year = Integer.parseInt(valueFiscalYear);
072 }
073 catch (NumberFormatException e) {
074 GlobalVariables.getMessageMap().putError(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, KFSKeyConstants.ERROR_CUSTOM, new String[] { KFSKeyConstants.PendingEntryLookupableImpl.FISCAL_YEAR_FOUR_DIGIT });
075 throw new ValidationException("errors in search criteria");
076 }
077 }
078
079 if (!allRequiredsForAccountSearch(fieldValues) && !allRequiredsForDocumentSearch(fieldValues)) {
080 GlobalVariables.getMessageMap().putError("universityFiscalYear", KFSKeyConstants.ERROR_GL_LOOKUP_ENCUMBRANCE_NON_MATCHING_REQUIRED_FIELDS, new String[] {});
081 throw new ValidationException("errors in search criteria");
082 }
083 }
084
085 /**
086 * Determines if all the required values for an account based search are present - fiscal year, chart, account number, and fiscal period code
087 * @param fieldValues field values to check
088 * @return true if all the account-based required search fields are present; false otherwise
089 */
090 protected boolean allRequiredsForAccountSearch(Map fieldValues) {
091 final String fiscalYearAsString = (String)fieldValues.get("universityFiscalYear");
092 final String chartOfAccountsCode = (String)fieldValues.get("chartOfAccountsCode");
093 final String accountNumber = (String)fieldValues.get("accountNumber");
094 return !StringUtils.isBlank(fiscalYearAsString) && !StringUtils.isBlank(chartOfAccountsCode) && !StringUtils.isBlank(accountNumber);
095 }
096
097 /**
098 * Determines if all the required values for an document based search are present - fiscal year and document number
099 * @param fieldValues field values to check
100 * @return true if all the document-based required search fields are present; false otherwise
101 */
102 protected boolean allRequiredsForDocumentSearch(Map fieldValues) {
103 final String fiscalYearAsString = (String)fieldValues.get("universityFiscalYear");
104 final String documentNumber = (String)fieldValues.get("documentNumber");
105 return !StringUtils.isBlank(fiscalYearAsString) && !StringUtils.isBlank(documentNumber);
106 }
107
108 /**
109 * Generates the list of search results for this inquiry
110 * @param fieldValues the field values of the query to carry out
111 * @return List the search results returned by the lookup
112 * @see org.kuali.rice.kns.lookup.Lookupable#getSearchResults(java.util.Map)
113 */
114 @Override
115 public List getSearchResults(Map fieldValues) {
116 setBackLocation((String) fieldValues.get(KFSConstants.BACK_LOCATION));
117 setDocFormKey((String) fieldValues.get(KFSConstants.DOC_FORM_KEY));
118
119 // get the pending entry option. This method must be prior to the get search results
120 String pendingEntryOption = this.getSelectedPendingEntryOption(fieldValues);
121
122 // get the search result collection
123 Iterator encumbranceIterator = encumbranceService.findOpenEncumbrance(fieldValues);
124 Collection searchResultsCollection = this.buildEncumbranceCollection(encumbranceIterator);
125
126 // update search results according to the selected pending entry option
127 updateByPendingLedgerEntry(searchResultsCollection, fieldValues, pendingEntryOption, false, false);
128
129 // get the actual size of all qualified search results
130 Integer recordCount = encumbranceService.getOpenEncumbranceRecordCount(fieldValues);
131 Long actualSize = OJBUtility.getResultActualSize(searchResultsCollection, recordCount, fieldValues, new Encumbrance());
132
133 return this.buildSearchResultList(searchResultsCollection, actualSize);
134 }
135
136 /**
137 * Updates pending entries before their results are included in the lookup results
138 *
139 * @param entryCollection a collection of balance entries
140 * @param fieldValues the map containing the search fields and values
141 * @param isApproved flag whether the approved entries or all entries will be processed
142 * @param isConsolidated flag whether the results are consolidated or not
143 * @param isCostShareExcluded flag whether the user selects to see the results with cost share subaccount
144 * @see org.kuali.module.gl.web.lookupable.AbstractGLLookupableImpl#updateEntryCollection(java.util.Collection, java.util.Map,
145 * boolean, boolean, boolean)
146 */
147 @Override
148 protected void updateEntryCollection(Collection entryCollection, Map fieldValues, boolean isApproved, boolean isConsolidated, boolean isCostShareInclusive) {
149
150 // convert the field names of balance object into corresponding ones of pending entry object
151 Map pendingEntryFieldValues = BusinessObjectFieldConverter.convertToTransactionFieldValues(fieldValues);
152
153 // go through the pending entries to update the encumbrance collection
154 Iterator pendingEntryIterator = getGeneralLedgerPendingEntryService().findPendingLedgerEntriesForEncumbrance(pendingEntryFieldValues, isApproved);
155 while (pendingEntryIterator.hasNext()) {
156 GeneralLedgerPendingEntry pendingEntry = (GeneralLedgerPendingEntry) pendingEntryIterator.next();
157 Encumbrance encumbrance = postEncumbrance.findEncumbrance(entryCollection, pendingEntry);
158 postEncumbrance.updateEncumbrance(pendingEntry, encumbrance);
159 }
160 }
161
162 /**
163 * go through the given iterator to get encumbrances and put them into a collection
164 * @param iterator an iterator of encumbrances
165 * @return a collection of those encumbrances
166 */
167 private Collection buildEncumbranceCollection(Iterator iterator) {
168 Collection encumbranceCollection = new ArrayList();
169
170 while (iterator.hasNext()) {
171 Encumbrance encumrbance = (Encumbrance) iterator.next();
172 encumbranceCollection.add(encumrbance);
173 }
174 return encumbranceCollection;
175 }
176
177 /**
178 * Sets the postEncumbrance attribute value.
179 *
180 * @param postEncumbrance The postEncumbrance to set.
181 */
182 public void setPostEncumbrance(EncumbranceCalculator postEncumbrance) {
183 this.postEncumbrance = postEncumbrance;
184 }
185
186 /**
187 * Sets the encumbranceService attribute value.
188 *
189 * @param encumbranceService The encumbranceService to set.
190 */
191 public void setEncumbranceService(EncumbranceService encumbranceService) {
192 this.encumbranceService = encumbranceService;
193 }
194 }