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.pdp.businessobject.lookup;
017
018 import java.util.ArrayList;
019 import java.util.List;
020 import java.util.Map;
021 import java.util.Properties;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.kuali.kfs.pdp.PdpConstants;
025 import org.kuali.kfs.pdp.PdpKeyConstants;
026 import org.kuali.kfs.pdp.PdpParameterConstants;
027 import org.kuali.kfs.pdp.PdpPropertyConstants;
028 import org.kuali.kfs.pdp.businessobject.Batch;
029 import org.kuali.kfs.pdp.businessobject.PaymentDetail;
030 import org.kuali.kfs.pdp.service.BatchMaintenanceService;
031 import org.kuali.kfs.pdp.service.PdpAuthorizationService;
032 import org.kuali.kfs.sys.KFSConstants;
033 import org.kuali.rice.kim.bo.Person;
034 import org.kuali.rice.kns.bo.BusinessObject;
035 import org.kuali.rice.kns.dao.LookupDao;
036 import org.kuali.rice.kns.exception.ValidationException;
037 import org.kuali.rice.kns.lookup.HtmlData;
038 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
039 import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
040 import org.kuali.rice.kns.service.KualiConfigurationService;
041 import org.kuali.rice.kns.util.GlobalVariables;
042 import org.kuali.rice.kns.util.KNSConstants;
043 import org.kuali.rice.kns.util.UrlFactory;
044 import org.kuali.rice.kns.web.format.BooleanFormatter;
045
046 /**
047 * This class allows custom handling of Batches within the lookup framework.
048 */
049 public class BatchLookupableHelperService extends KualiLookupableHelperServiceImpl {
050 private BatchMaintenanceService batchMaintenanceService;
051 private KualiConfigurationService configurationService;
052 private LookupDao lookupDao;
053 private PdpAuthorizationService pdpAuthorizationService;
054
055 /**
056 * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResults(java.util.Map)
057 */
058 @Override
059 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
060 Map parameters = super.getParameters();
061 String errorList;
062
063 if (parameters.containsKey(PdpParameterConstants.ACTION_SUCCESSFUL_PARAM)) {
064 String[] actionSuccessRequestParm = (String[]) parameters.get(PdpParameterConstants.ACTION_SUCCESSFUL_PARAM);
065 Boolean actionSuccess = (Boolean) (new BooleanFormatter()).convertFromPresentationFormat(actionSuccessRequestParm[0]);
066
067 if (actionSuccess != null) {
068
069 if (!actionSuccess) {
070
071 // if the action performed on batch was not successful we get the error message list and add them to
072 // GlobalVariables errorMap
073 if (parameters.containsKey(PdpParameterConstants.ERROR_KEY_LIST_PARAM)) {
074 String[] errorListParam = (String[]) parameters.get(PdpParameterConstants.ERROR_KEY_LIST_PARAM);
075 errorList = errorListParam[0];
076 if (StringUtils.isNotEmpty(errorList)) {
077 String[] errorMsgs = StringUtils.split(errorList, PdpParameterConstants.ERROR_KEY_LIST_SEPARATOR);
078 for (String error : errorMsgs) {
079 if (StringUtils.isNotEmpty(error)) {
080 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, error);
081 }
082 }
083 }
084 }
085 }
086 else {
087 if (parameters.containsKey(PdpParameterConstants.MESSAGE_PARAM)) {
088 String[] messageRequestParm = (String[]) parameters.get(PdpParameterConstants.MESSAGE_PARAM);
089 String message = messageRequestParm[0];
090 GlobalVariables.getMessageList().add(message);
091 }
092 }
093 }
094 }
095
096 List results = super.getSearchResults(fieldValues);
097 return results;
098 }
099
100 /**
101 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getInquiryUrl(org.kuali.rice.kns.bo.BusinessObject,
102 * java.lang.String)
103 */
104 @Override
105 public HtmlData getInquiryUrl(BusinessObject bo, String propertyName) {
106 AnchorHtmlData inquiryUrl = (AnchorHtmlData) super.getInquiryUrl(bo, propertyName);
107 Batch batch = (Batch) bo;
108 if (propertyName.equalsIgnoreCase(PdpPropertyConstants.BatchConstants.BATCH_ID)) {
109 Properties params = new Properties();
110 params.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.SEARCH_METHOD);
111 params.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, PaymentDetail.class.getName());
112 params.put(KNSConstants.DOC_FORM_KEY, "88888888");
113 params.put(KFSConstants.HIDE_LOOKUP_RETURN_LINK, "true");
114 params.put(KFSConstants.BACK_LOCATION, configurationService.getPropertyString(KNSConstants.APPLICATION_URL_KEY) + "/" + KFSConstants.MAPPING_PORTAL + ".do");
115 params.put(PdpPropertyConstants.PaymentDetail.PAYMENT_GROUP_BATCH_ID, UrlFactory.encode(String.valueOf(batch.getId())));
116 String url = UrlFactory.parameterizeUrl(KNSConstants.LOOKUP_ACTION, params);
117 inquiryUrl.setHref(url);
118 }
119 return inquiryUrl;
120 }
121
122 /**
123 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#getCustomActionUrls(org.kuali.rice.kns.bo.BusinessObject,
124 * java.util.List)
125 */
126 @Override
127 public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) {
128
129 if (businessObject instanceof Batch) {
130 Person person = GlobalVariables.getUserSession().getPerson();
131 Batch batch = (Batch) businessObject;
132 Integer batchId = batch.getId().intValue();
133 List<HtmlData> anchorHtmlDataList = new ArrayList<HtmlData>();
134 String linkText = KFSConstants.EMPTY_STRING;
135 String url = KFSConstants.EMPTY_STRING;
136 String basePath = configurationService.getPropertyString(KFSConstants.APPLICATION_URL_KEY) + "/" + PdpConstants.Actions.BATCH_SEARCH_DETAIL_ACTION;
137
138 if ( pdpAuthorizationService.hasCancelPaymentPermission(person.getPrincipalId()) && batchMaintenanceService.doBatchPaymentsHaveOpenOrHeldStatus(batchId)) {
139
140 Properties params = new Properties();
141 params.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, PdpConstants.ActionMethods.CONFIRM_CANCEL_ACTION);
142 params.put(PdpParameterConstants.BatchConstants.BATCH_ID_PARAM, UrlFactory.encode(String.valueOf(batchId)));
143 url = UrlFactory.parameterizeUrl(basePath, params);
144
145 linkText = configurationService.getPropertyString(PdpKeyConstants.BatchConstants.LinkText.CANCEL_BATCH);
146
147 AnchorHtmlData anchorHtmlData = new AnchorHtmlData(url, PdpConstants.ActionMethods.CONFIRM_CANCEL_ACTION, linkText);
148 anchorHtmlDataList.add(anchorHtmlData);
149 }
150
151 if ( pdpAuthorizationService.hasHoldPaymentPermission(person.getPrincipalId())) {
152
153 if (batchMaintenanceService.doBatchPaymentsHaveHeldStatus(batchId)) {
154
155 Properties params = new Properties();
156 params.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, PdpConstants.ActionMethods.CONFIRM_REMOVE_HOLD_ACTION);
157 params.put(PdpParameterConstants.BatchConstants.BATCH_ID_PARAM, UrlFactory.encode(String.valueOf(batchId)));
158 url = UrlFactory.parameterizeUrl(basePath, params);
159
160 linkText = configurationService.getPropertyString(PdpKeyConstants.BatchConstants.LinkText.REMOVE_BATCH_HOLD);
161
162 AnchorHtmlData anchorHtmlData = new AnchorHtmlData(url, PdpConstants.ActionMethods.CONFIRM_REMOVE_HOLD_ACTION, linkText);
163 anchorHtmlDataList.add(anchorHtmlData);
164 }
165 else if (batchMaintenanceService.doBatchPaymentsHaveOpenStatus(batchId)) {
166
167 Properties params = new Properties();
168 params.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, PdpConstants.ActionMethods.CONFIRM_HOLD_ACTION);
169 params.put(PdpParameterConstants.BatchConstants.BATCH_ID_PARAM, UrlFactory.encode(String.valueOf(batchId)));
170 url = UrlFactory.parameterizeUrl(basePath, params);
171
172 linkText = configurationService.getPropertyString(PdpKeyConstants.BatchConstants.LinkText.HOLD_BATCH);
173 AnchorHtmlData anchorHtmlData = new AnchorHtmlData(url, PdpConstants.ActionMethods.CONFIRM_HOLD_ACTION, linkText);
174 anchorHtmlDataList.add(anchorHtmlData);
175 }
176 }
177
178 if (anchorHtmlDataList.isEmpty()) {
179 AnchorHtmlData anchorHtmlData = new AnchorHtmlData(url, " ", " ");
180 anchorHtmlDataList.add(anchorHtmlData);
181 }
182
183 return anchorHtmlDataList;
184 }
185 return super.getEmptyActionUrls();
186 }
187
188 /**
189 * @see org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl#validateSearchParameters(java.util.Map)
190 */
191 @Override
192 public void validateSearchParameters(Map fieldValues) {
193 // call super method to check validation against DD
194 super.validateSearchParameters(fieldValues);
195
196 // get field values
197 String batchIdValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.BATCH_ID);
198 String paymentCountValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.PAYMENT_COUNT);
199 String paymentTotalAmountValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.PAYMENT_TOTAL_AMOUNT);
200 String fileCreationTimeValueLower = (String) fieldValues.get(KNSConstants.LOOKUP_RANGE_LOWER_BOUND_PROPERTY_PREFIX + PdpPropertyConstants.BatchConstants.FILE_CREATION_TIME);
201 String fileCreationTimeValueUpper = (String) fieldValues.get(KNSConstants.LOOKUP_DEFAULT_RANGE_SEARCH_UPPER_BOUND_LABEL + PdpPropertyConstants.BatchConstants.FILE_CREATION_TIME);
202 String chartCodeValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.CHART_CODE);
203 String orgCodeValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.ORG_CODE);
204 String subUnitCodeValue = (String) fieldValues.get(PdpPropertyConstants.BatchConstants.SUB_UNIT_CODE);
205
206 // check if there is any search criteria entered
207 if (StringUtils.isBlank(batchIdValue) && StringUtils.isBlank(chartCodeValue) && StringUtils.isBlank(orgCodeValue) && StringUtils.isBlank(subUnitCodeValue) && StringUtils.isBlank(paymentCountValue) && StringUtils.isBlank(paymentTotalAmountValue) && StringUtils.isBlank(fileCreationTimeValueLower) && StringUtils.isBlank(fileCreationTimeValueUpper)) {
208 GlobalVariables.getMessageMap().putError(KFSConstants.DOCUMENT_HEADER_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_BATCH_CRITERIA_NONE_ENTERED);
209 }
210 else if (StringUtils.isBlank(batchIdValue) && StringUtils.isBlank(paymentCountValue) && StringUtils.isBlank(paymentTotalAmountValue)) {
211 // If batchId, paymentCount, and paymentTotalAmount are empty then at least creation date is required
212 if (StringUtils.isBlank(fileCreationTimeValueLower) && StringUtils.isBlank(fileCreationTimeValueUpper) ) {
213 GlobalVariables.getMessageMap().putError(PdpPropertyConstants.BatchConstants.FILE_CREATION_TIME, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_BATCH_CRITERIA_NO_DATE);
214 }
215 else if (StringUtils.isBlank(fileCreationTimeValueLower) || StringUtils.isBlank(fileCreationTimeValueUpper)) {
216 // If we have one (but not both) dates the user must enter either the chartCode, orgCode, or subUnitCode
217 if (StringUtils.isBlank(chartCodeValue) && StringUtils.isBlank(orgCodeValue) && StringUtils.isBlank(subUnitCodeValue)) {
218 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_BATCH_CRITERIA_SOURCE_MISSING);
219 }
220 }
221 }
222
223 if (!GlobalVariables.getMessageMap().isEmpty()) {
224 throw new ValidationException("errors in search criteria");
225 }
226 }
227
228 /**
229 * This method gets the kualiConfigurationService.
230 *
231 * @return the configurationService
232 */
233 public KualiConfigurationService getConfigurationService() {
234 return configurationService;
235 }
236
237 /**
238 * This method sets the configurationService.
239 *
240 * @param configurationService KualiConfigurationService
241 */
242 public void setConfigurationService(KualiConfigurationService configurationService) {
243 this.configurationService = configurationService;
244 }
245
246 /**
247 * This method gets the batchMaintenanceService.
248 *
249 * @return the batchMaintenanceService
250 */
251 public BatchMaintenanceService getBatchMaintenanceService() {
252 return batchMaintenanceService;
253 }
254
255 /**
256 * This method sets the batchMaintenanceService.
257 *
258 * @param batchMaintenanceService BatchMaintenanceService
259 */
260 public void setBatchMaintenanceService(BatchMaintenanceService batchMaintenanceService) {
261 this.batchMaintenanceService = batchMaintenanceService;
262 }
263
264 /**
265 * This method gets the lookupDao.
266 *
267 * @return the lookupDao
268 */
269 public LookupDao getLookupDao() {
270 return lookupDao;
271 }
272
273 /**
274 * This method sets lookupDao.
275 *
276 * @param lookupDao LookupDao
277 */
278 public void setLookupDao(LookupDao lookupDao) {
279 this.lookupDao = lookupDao;
280 }
281
282 /**
283 * This method sets the pdpAuthorizationService.
284 * @param pdpAuthorizationService The pdpAuthorizationService to be set.
285 */
286 public void setPdpAuthorizationService(PdpAuthorizationService pdpAuthorizationService) {
287 this.pdpAuthorizationService = pdpAuthorizationService;
288 }
289
290 }