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 */ 016package org.kuali.ole.select.service; 017 018import org.apache.commons.lang.StringUtils; 019import org.joda.time.DateTime; 020import org.kuali.common.util.PropertyUtils; 021import org.kuali.ole.module.purap.PurapConstants; 022import org.kuali.ole.select.OleSelectConstant; 023import org.kuali.ole.select.bo.OLEInvoiceSearchDocument; 024import org.kuali.ole.select.businessobject.DocInfoBean; 025import org.kuali.ole.select.document.OleInvoiceDocument; 026import org.kuali.ole.select.lookup.DocData; 027import org.kuali.ole.select.service.impl.BibInfoWrapperServiceImpl; 028import org.kuali.ole.sys.context.SpringContext; 029import org.kuali.rice.core.api.util.RiceKeyConstants; 030import org.kuali.rice.kew.api.document.Document; 031import org.kuali.rice.kew.api.document.attribute.DocumentAttribute; 032import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria; 033import org.kuali.rice.kew.api.document.search.DocumentSearchResult; 034import org.kuali.rice.kew.api.document.search.DocumentSearchResults; 035import org.kuali.rice.kew.api.exception.WorkflowException; 036import org.kuali.rice.kew.exception.WorkflowServiceError; 037import org.kuali.rice.kew.exception.WorkflowServiceErrorException; 038import org.kuali.rice.kew.service.KEWServiceLocator; 039import org.kuali.rice.kim.api.identity.Person; 040import org.kuali.rice.kim.api.identity.PersonService; 041import org.kuali.rice.krad.bo.DocumentHeader; 042import org.kuali.rice.krad.datadictionary.DocumentEntry; 043import org.kuali.rice.krad.service.DataDictionaryService; 044import org.kuali.rice.krad.service.DocumentHeaderService; 045import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 046import org.kuali.rice.krad.util.GlobalVariables; 047 048import java.lang.reflect.Method; 049import java.text.DateFormat; 050import java.text.SimpleDateFormat; 051import java.util.*; 052 053public class OLEInvoiceSearchService { 054 055 public static final Map<String, String> INVOICE_FIELDS = getInvoiceNames(); 056 public static final List<String> INVOICE_FIELD_RESULT =getResultNames(); 057 public static List<String> INVOICE_SEARCH_CRITERIA_LIST=new ArrayList<String>(); 058 public List<OLEInvoiceSearchDocument> searchResults(Map<String, String> searchCriteria) throws Exception { 059 List<OLEInvoiceSearchDocument> resultRows = new ArrayList<OLEInvoiceSearchDocument>(); 060 Map<String, List<String>> searchCriterias = new HashMap<String, List<String>>(); 061 INVOICE_SEARCH_CRITERIA_LIST=buildSearchCriteriaList(searchCriteria); 062 try { 063 searchCriterias.putAll(getSearchCriteria(searchCriteria)); 064 resultRows.addAll(populateCriteriaAndSearch(PurapConstants.PurapDocTypeCodes.INVOICE_DOCUMENT.toUpperCase(), searchCriterias)); 065 } catch (Exception ex) { 066 throw new RuntimeException(ex); 067 } 068 return resultRows; 069 } 070 071 public Map<String, List<String>> getSearchCriteria(Map<String, String> itemFields) throws Exception { 072 Map<String, List<String>> searchCriteriaMap = new HashMap<String, List<String>>(); 073 for (Map.Entry<String, String> entry : itemFields.entrySet()) { 074 List<String> list = new ArrayList<String>(); 075 if (entry.getKey().equalsIgnoreCase(OleSelectConstant.InvoiceSearch.PURAP_ID)) { 076 StringTokenizer stringTokenizer = new StringTokenizer(entry.getValue(), ","); 077 while (stringTokenizer.hasMoreElements()) { 078 list.add(stringTokenizer.nextElement().toString()); 079 } 080 searchCriteriaMap.put(entry.getKey().toString(), list); 081 } else { 082 searchCriteriaMap.put(entry.getKey().toString(), new ArrayList<String>(Arrays.asList(entry.getValue().toString()))); 083 } 084 085 086 } 087 return searchCriteriaMap; 088 } 089 090 public List<OLEInvoiceSearchDocument> populateCriteriaAndSearch(String docTypeFullName, Map<String, List<String>> fixedParameters) 091 throws WorkflowException, Exception { 092 DocumentSearchCriteria.Builder docSearchCriteria = DocumentSearchCriteria.Builder.create(); 093 DateTime dateTime = new DateTime(new Date()); 094 docSearchCriteria.setDateCreatedTo((dateTime)); 095 096 docSearchCriteria.setDocumentTypeName(docTypeFullName); 097 098 List<OLEInvoiceSearchDocument> resultRows = new ArrayList<OLEInvoiceSearchDocument>(); 099 resultRows = performDocumentSearch(docSearchCriteria.build(), fixedParameters); 100 101 return resultRows; 102 } 103 104 public List<OLEInvoiceSearchDocument> performDocumentSearch(DocumentSearchCriteria docSearchCriteria, Map<String, List<String>> fixedParameters) { 105 /* List<String> strings=new ArrayList<String>(); 106 strings.add("1"); 107 fixedParameters.put(OleSelectConstant.InvoiceSearch.INV_NUMBER,strings);*/ 108 DocumentSearchCriteria docSearchCriteriaDTO = addDocumentAttributesToCriteria(DocumentSearchCriteria.Builder.create(docSearchCriteria), fixedParameters); 109 List result = new ArrayList(); 110 List<OLEInvoiceSearchDocument> finalResult = new ArrayList<OLEInvoiceSearchDocument>(); 111 DocumentSearchResults components = null; 112 try { 113 components = KEWServiceLocator.getDocumentSearchService().lookupDocuments(GlobalVariables.getUserSession().getPrincipalId(), 114 docSearchCriteriaDTO); 115 116 List<DocumentSearchResult> docSearchResults = components.getSearchResults(); 117 if (!fixedParameters.containsKey("displayType")) { 118 finalResult = getFinalDocumentTypeResult(docSearchResults); 119 } 120 } catch (WorkflowServiceErrorException wsee) { 121 for (WorkflowServiceError workflowServiceError : (List<WorkflowServiceError>) wsee.getServiceErrors()) { 122 if (workflowServiceError.getMessageMap() != null && workflowServiceError.getMessageMap().hasErrors()) { 123 GlobalVariables.getMessageMap().merge(workflowServiceError.getMessageMap()); 124 } else { 125 GlobalVariables.getMessageMap().putError(workflowServiceError.getMessage(), RiceKeyConstants.ERROR_CUSTOM, 126 workflowServiceError.getMessage()); 127 } 128 } 129 ; 130 } 131 return finalResult; 132 } 133 134 private DocumentSearchCriteria addDocumentAttributesToCriteria(DocumentSearchCriteria.Builder criteria, Map<String, List<String>> propertyFields) { 135 Map<String, List<String>> attributes = new HashMap<String, List<String>>(); 136 if (criteria != null) { 137 if (!propertyFields.isEmpty()) { 138 for (String propertyField : propertyFields.keySet()) { 139 if (propertyFields.get(propertyField) != null) { 140 attributes.put(propertyField, propertyFields.get(propertyField)); 141 } 142 } 143 } 144 } 145 criteria.setDocumentAttributeValues(attributes); 146 return criteria.build(); 147 } 148 149 private List<OLEInvoiceSearchDocument> getFinalDocumentTypeResult(List<DocumentSearchResult> componentResults) { 150 List<OLEInvoiceSearchDocument> docResult = new ArrayList<OLEInvoiceSearchDocument>(); 151 OLEInvoiceSearchDocument oleInvoiceDocument; 152 if (!componentResults.isEmpty()) { 153 for (DocumentSearchResult searchResult : componentResults) { 154 if (!searchResult.getDocument().getApplicationDocumentStatus().equalsIgnoreCase("exception")) { 155 oleInvoiceDocument = convertToOleInvoiceDocument(searchResult); 156 oleInvoiceDocument.setDocumentNumber(searchResult.getDocument().getDocumentId()); 157 oleInvoiceDocument.setDocumentStatus(searchResult.getDocument().getApplicationDocumentStatus()); 158 Person principalPerson = SpringContext.getBean(PersonService.class).getPerson(GlobalVariables.getUserSession().getPerson().getPrincipalId()); 159 DocumentHeader documentHeader = SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(searchResult.getDocument().getDocumentId()); 160 try { 161 if (documentHeader != null) { 162 documentHeader.setWorkflowDocument(KRADServiceLocatorWeb.getWorkflowDocumentService().loadWorkflowDocument(searchResult.getDocument().getDocumentId(), 163 principalPerson)); 164 if (documentHeader.getWorkflowDocument() != null) { 165 oleInvoiceDocument.setWorkFlowDocumentStatus(documentHeader.getWorkflowDocument().getDocument().getStatus().getLabel()); 166 } 167 } 168 169 } 170 catch (WorkflowException e) { 171 throw new RuntimeException(e); 172 } 173 174 175 if (oleInvoiceDocument != null) { 176 docResult.add(oleInvoiceDocument); 177 } 178 } 179 } 180 } 181 return docResult; 182 183 } 184 public List<String> buildSearchCriteriaList(Map<String, String> searchCriteria){ 185 List<String> buildSearchCriteriaList=new ArrayList<String>(); 186 for(Map.Entry<String,String> entry:searchCriteria.entrySet()){ 187 if(StringUtils.isNotEmpty(entry.getValue())){ 188 buildSearchCriteriaList.add(entry.getKey()); 189 } 190 } 191 return buildSearchCriteriaList; 192 } 193 194 public OLEInvoiceSearchDocument convertToOleInvoiceDocument(DocumentSearchResult documentSearchResult) { 195 OLEInvoiceSearchDocument invoiceDocument = new OLEInvoiceSearchDocument(); 196 Document document = documentSearchResult.getDocument(); 197 List<DocumentAttribute> documentAttributes = documentSearchResult.getDocumentAttributes(); 198 for (DocumentAttribute docAttribute : documentAttributes) { 199 String name = docAttribute.getName(); 200 201 if (name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_DATE)) { 202 if (docAttribute.getValue() != null) { 203 DateFormat sourceFormat = new SimpleDateFormat("MM/dd/yyyy"); 204 String stringDateObj = (String) docAttribute.getValue().toString(); 205 Method getMethod; 206 try { 207 java.util.Date date = sourceFormat.parse(stringDateObj); 208 invoiceDocument.setInvoiceDate(date); 209 } catch (Exception ex) { 210 ex.printStackTrace(); 211 } 212 } 213 } 214 if (name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_PAY_DATE)) { 215 if (docAttribute.getValue() != null) { 216 DateFormat sourceFormat = new SimpleDateFormat("MM/dd/yyyy"); 217 String stringDateObj = (String) docAttribute.getValue().toString(); 218 Method getMethod; 219 try { 220 java.util.Date date = sourceFormat.parse(stringDateObj); 221 invoiceDocument.setInvoicePayDate(date); 222 } catch (Exception ex) { 223 ex.printStackTrace(); 224 } 225 } 226 227 } 228 if (name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_SUB_TYP_ID)) { 229 if (docAttribute.getValue() != null) { 230 String stringDateObj = (String) docAttribute.getValue().toString(); 231 invoiceDocument.setInvoiceSubTypeId(Integer.parseInt(stringDateObj)); 232 } 233 } 234 if (name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.PURAP_ID)) { 235 if (invoiceDocument.getPurapDocumentIdentifier() != null && (!invoiceDocument.getPurapDocumentIdentifier().equalsIgnoreCase(""))) { 236 Set<String> hashSet = new HashSet<String>(); 237 String purarIdList = ""; 238 StringTokenizer stringTokenizer = new StringTokenizer(invoiceDocument.getPurapDocumentIdentifier(), ","); 239 while (stringTokenizer.hasMoreElements()) { 240 hashSet.add(stringTokenizer.nextElement().toString()); 241 } 242 hashSet.add(((String) docAttribute.getValue().toString()).toString()); 243 for (String s : hashSet) { 244 if (purarIdList.equalsIgnoreCase("")) { 245 purarIdList = s; 246 } else { 247 purarIdList = s + "," + purarIdList; 248 } 249 } 250 invoiceDocument.setPurapDocumentIdentifier(purarIdList); 251 } else { 252 invoiceDocument.setPurapDocumentIdentifier(((String) docAttribute.getValue().toString()).toString()); 253 } 254 255 } 256 if (name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_TYP_ID)) { 257 invoiceDocument.setInvoiceTypeId(((String) docAttribute.getValue().toString())); 258 } 259 if(name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_VND_NM)){ 260 invoiceDocument.setVendorName((String)docAttribute.getValue().toString()); 261 } 262 if(name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_VND_NUM)){ 263 invoiceDocument.setVendorNumber((String)docAttribute.getValue().toString()); 264 } 265 if(name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_NUMBER)){ 266 invoiceDocument.setInvoiceNumber((String)docAttribute.getValue().toString()); 267 invoiceDocument.setInvoiceNbr((String)docAttribute.getValue().toString()); 268 } 269 270 if( name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_DOC_NUM) 271 || name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_TYP) 272 || name.equalsIgnoreCase(OleSelectConstant.InvoiceSearch.INV_SUB_TYP)) { 273 Method getMethod; 274 try { 275 getMethod = getSetMethod(OLEInvoiceSearchDocument.class, name, new Class[]{String.class}); 276 getMethod.invoke(invoiceDocument, docAttribute.getValue().toString()); 277 } catch (Exception ex) { 278 ex.printStackTrace(); 279 } 280 } 281 282 } 283 return invoiceDocument; 284 } 285 private Method getSetMethod(Class targetClass, String attr, Class[] objectAttributes) throws Exception { 286 Method method = targetClass.getMethod("set" + StringUtils.capitalize(attr), objectAttributes); 287 return method; 288 } 289 290 public static final List<String> getResultNames() { 291 List<String> resultFields = new ArrayList<String>(); 292 resultFields.add(OleSelectConstant.InvoiceSearch.PURAP_ID); 293 resultFields.add(OleSelectConstant.InvoiceSearch.INV_DATE); 294 resultFields.add(OleSelectConstant.InvoiceSearch.INV_PAY_DATE); 295 resultFields.add(OleSelectConstant.InvoiceSearch.INV_NUMBER); 296 resultFields.add(OleSelectConstant.InvoiceSearch.INV_DOC_NUM); 297 /*resultFields.add(OleSelectConstant.InvoiceSearch.INV_TYP);*/ 298 resultFields.add(OleSelectConstant.InvoiceSearch.INV_TYP_ID); 299 resultFields.add(OleSelectConstant.InvoiceSearch.INV_SUB_TYP_ID); 300 resultFields.add(OleSelectConstant.InvoiceSearch.INV_VND_NM); 301 resultFields.add(OleSelectConstant.InvoiceSearch.INV_VND_NUM); 302 303 return Collections.unmodifiableList(resultFields); 304 } 305 306 public static final Map<String, String> getInvoiceNames() { 307 Map<String, String> invoiceFields = new HashMap<String, String>(); 308 invoiceFields.put(OleSelectConstant.InvoiceSearch.PURAP_ID,OleSelectConstant.InvoiceSearch.PURAP_ID); 309 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_DATE, OleSelectConstant.InvoiceSearch.INV_DATE); 310 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_PAY_DATE,OleSelectConstant.InvoiceSearch.INV_PAY_DATE); 311 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_SUB_TYP_ID, OleSelectConstant.InvoiceSearch.INV_SUB_TYP_ID); 312 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_NUMBER,OleSelectConstant.InvoiceSearch.INV_NUMBER); 313 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_DOC_NUM,OleSelectConstant.InvoiceSearch.INV_DOC_NUM); 314 /*invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_TYP,OleSelectConstant.InvoiceSearch.INV_TYP);*/ 315 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_TYP_ID,OleSelectConstant.InvoiceSearch.INV_TYP_ID); 316 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_VND_NM,OleSelectConstant.InvoiceSearch.INV_VND_NM); 317 invoiceFields.put(OleSelectConstant.InvoiceSearch.INV_VND_NUM,OleSelectConstant.InvoiceSearch.INV_VND_NUM); 318 319 return Collections.unmodifiableMap(invoiceFields); 320 } 321 322 323}