001package org.kuali.asr.service;
002
003import org.apache.log4j.Logger;
004import org.jfree.util.Log;
005import org.kuali.asr.ASRConstants;
006import org.kuali.asr.bo.*;
007import org.kuali.asr.bo.ASRItem;
008import org.kuali.asr.service.impl.OLEASRPlaceRequestHelperServiceImpl;
009import org.kuali.ole.OLEConstants;
010import org.kuali.ole.deliver.batch.OleNoticeBo;
011import org.kuali.ole.deliver.bo.*;
012import org.kuali.ole.deliver.service.OleDeliverRequestDocumentHelperServiceImpl;
013import org.kuali.ole.docstore.common.client.DocstoreClientLocator;
014import org.kuali.ole.docstore.common.document.content.instance.Item;
015import org.kuali.ole.docstore.common.document.content.instance.ItemStatus;
016import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
017import org.kuali.ole.docstore.common.search.*;
018import org.kuali.ole.docstore.model.bo.WorkItemDocument;
019import org.kuali.ole.docstore.model.enums.DocType;
020import org.kuali.ole.sys.context.SpringContext;
021import org.kuali.rice.core.api.config.property.ConfigContext;
022import org.kuali.rice.coreservice.impl.parameter.ParameterBo;
023import org.kuali.rice.krad.service.BusinessObjectService;
024import org.kuali.rice.krad.service.KRADServiceLocator;
025
026import java.text.SimpleDateFormat;
027import java.util.*;
028
029/**
030 * Created with IntelliJ IDEA.
031 * User: sheiksalahudeenm
032 * Date: 1/8/14
033 * Time: 1:13 PM
034 * To change this template use File | Settings | File Templates.
035 */
036
037public class ASRHelperServiceImpl {
038    private static final Logger LOG = Logger.getLogger(ASRHelperServiceImpl.class);
039    private BusinessObjectService businessObjectService=getBusinessObjectService();
040    private DocstoreClientLocator docstoreClientLocator=getDocstoreClientLocator();
041    private OLEASRPlaceRequestHelperServiceImpl oleasrPlaceRequestHelperService=new OLEASRPlaceRequestHelperServiceImpl();
042    private OleDeliverRequestDocumentHelperServiceImpl oleDeliverRequestDocumentHelperService = getOleDeliverRequestDocumentHelperService();
043
044    public DocstoreClientLocator getDocstoreClientLocator() {
045        if (null == docstoreClientLocator) {
046            return (DocstoreClientLocator) SpringContext.getService("docstoreClientLocator");
047        }
048        return docstoreClientLocator;
049    }
050
051    public BusinessObjectService getBusinessObjectService(){
052        if(businessObjectService == null){
053            businessObjectService = KRADServiceLocator.getBusinessObjectService();
054        }
055        return businessObjectService;
056    }
057
058    public OleDeliverRequestDocumentHelperServiceImpl getOleDeliverRequestDocumentHelperService() {
059        if(oleDeliverRequestDocumentHelperService==null){
060            oleDeliverRequestDocumentHelperService = new OleDeliverRequestDocumentHelperServiceImpl();
061        }
062        return oleDeliverRequestDocumentHelperService;
063    }
064    //  private OLEASRPlaceRequestHelperServiceImpl oleasrPlaceReqestHelperService=new OLEASRPlaceRequestHelperServiceImpl();
065
066
067    public boolean isAuthorized(String principalId) {
068        /*PermissionService service = KimApiServiceLocator.getPermissionService();
069        return service.hasPermission(principalId, "OLE-PTRN", "Mapping Circulation Desk");*/
070        return oleasrPlaceRequestHelperService.processOperator(principalId);
071    }
072
073    public boolean validatePatron(String patronId){
074        Map<String, String> patronMap = new HashMap<String, String>();
075        patronMap.put("olePatronId", patronId);
076        OleNoticeBo oleNoticeBo = new OleNoticeBo();
077        List<OlePatronDocument> olePatronDocumentList = (List<OlePatronDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OlePatronDocument.class, patronMap);
078        return (olePatronDocumentList!=null && olePatronDocumentList.size()>0);
079    }
080
081    public boolean validatePickupLocation(String pickupLocation){
082        Map<String,String> circulationDeskMap = new HashMap<String,String>();
083        circulationDeskMap.put("circulationDeskCode",pickupLocation);
084        circulationDeskMap.put("asrPickupLocation","true");
085        List<OleCirculationDesk> oleCirculationDeskList = (List<OleCirculationDesk>)KRADServiceLocator.getBusinessObjectService().findMatching(OleCirculationDesk.class,circulationDeskMap);
086        return (oleCirculationDeskList!=null && oleCirculationDeskList.size()>0);
087    }
088
089    public SearchParams buildSearchParams(Map<String, String> queryParams) {
090        SearchParams searchParams = new SearchParams();
091        List<SearchCondition> searchConditionList = new ArrayList<SearchCondition>();
092        List<SearchCondition>  searchConditions = new ArrayList<>();
093        if (null != queryParams) {
094            for (Iterator<String> keys = queryParams.keySet().iterator(); keys.hasNext(); ) {
095                String key = keys.next();
096                String value = queryParams.get(key);
097                if(org.apache.commons.lang.StringUtils.isNotEmpty(value)) {
098                    //searchConditions.add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField("item", key, value), "AND"));
099                    searchParams.getSearchConditions().add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField("item", key, value), "AND"));
100                }
101            }
102        }
103        return searchParams;
104    }
105
106    public ASRResponseBo generateResponse(String code, String message, int statusCode){
107        ASRResponseBo asrResponseBo=new ASRResponseBo();
108        asrResponseBo.setCode(code);
109        asrResponseBo.setMessage(message);
110        asrResponseBo.setStatusCode(statusCode);
111        return asrResponseBo;
112    }
113
114    public ASRItems generateASRItems(List<WorkItemDocument> workItemDocumentList){
115        ASRItems asrItems=new ASRItems();
116        List<ASRItem> asrItemList=new ArrayList<>();
117        ASRItem asrItem=null;
118        for(WorkItemDocument workItemDocument:workItemDocumentList){
119            asrItem=new ASRItem();
120            asrItem.setAuthor(workItemDocument.getItemStatus());
121            asrItem.setCallNumber(workItemDocument.getCallNumber());
122            asrItem.setItemBarcode(workItemDocument.getBarcode());
123            asrItem.setTitle(workItemDocument.getBibTitle());
124            asrItemList.add(asrItem);
125        }
126        asrItems.setAsrItems(asrItemList);
127        return asrItems;
128    }
129
130
131
132
133    public boolean updateItemStatus(Item oleItem, String itemStatus) throws Exception {
134        LOG.debug("Inside the updateItemStatus method");
135        if(oleItem==null){
136            return false;
137        }
138        try {
139            String itemUuid = oleItem.getItemIdentifier();
140            String itemXmlContent = buildItemContentWithItemStatus(oleItem, itemStatus);
141            LOG.info("itemXmlContent" + itemXmlContent);
142            String itemRecordUpdateResponse =  "";
143                //    getDocstoreHelperService().updateInstanceRecord(itemUuid, OLEConstants.ITEM_DOC_TYPE, itemXmlContent);
144            LOG.info(itemRecordUpdateResponse);
145            return true;
146
147        } catch (Exception e) {
148            LOG.error(OLEConstants.ITM_STS_TO_DOC_FAIL + e, e);
149            return false;
150
151        }
152    }
153
154    public String buildItemContentWithItemStatus(Item oleItem, String itemStatus) throws Exception {
155        LOG.debug("Inside the buildItemContentWithItemStatus method");
156        ItemStatus itemStatus1 = new ItemStatus();
157        itemStatus1.setCodeValue(itemStatus);
158        itemStatus1.setFullValue(itemStatus);
159        oleItem.setItemStatus(itemStatus1);
160        oleItem.setItemStatusEffectiveDate(String.valueOf(new SimpleDateFormat(OLEConstants.DAT_FORMAT_EFFECTIVE).format(new Date())));
161        String itemContent = new ItemOlemlRecordProcessor().toXML(oleItem);
162        return itemContent;
163    }
164
165
166
167
168    public Object cancelRequest(String operatorId,String requestId){
169        if(!isAuthorized(operatorId)){
170            return generateResponse(ASRConstants.OPERATOR_NOT_FOUND_CODE, ConfigContext.getCurrentContextConfig().getProperty(ASRConstants.OPERATOR_NOT_FOUND),ASRConstants.OPERATOR_NOT_FOUND_STATUS);
171        }
172        Map<String,String> requestMap = new HashMap<String,String>();
173        requestMap.put("requestId",requestId);
174        List<OleDeliverRequestBo> oleDeliverRequestBoList = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
175        if(oleDeliverRequestBoList!=null && oleDeliverRequestBoList.size()>0){
176            OleDeliverRequestBo oleDeliverRequestBo = oleDeliverRequestBoList.get(0);
177            oleDeliverRequestBo.setOperatorCreateId(operatorId);
178            if(!true){
179                return generateResponse(ASRConstants.REQUEST_NOT_FOUND_CODE,ConfigContext.getCurrentContextConfig().getProperty(ASRConstants.REQUEST_NOT_FOUND),ASRConstants.REQUEST_NOT_FOUND_STATUS);
180            }
181          //  oleasrPlaceReqestHelperService.cancelDocument(oleDeliverRequestBo);
182            return generateResponse(ASRConstants.REQUEST_CANCELED_CODE,ConfigContext.getCurrentContextConfig().getProperty(ASRConstants.REQUEST_CANCELED),ASRConstants.REQUEST_CANCELED_STATUS);
183        }  else{
184            return generateResponse(ASRConstants.REQUEST_NOT_FOUND_CODE,ConfigContext.getCurrentContextConfig().getProperty(ASRConstants.REQUEST_NOT_FOUND),ASRConstants.REQUEST_NOT_FOUND_STATUS);
185        }
186    }
187
188    public String getParameter(String name) {
189        String parameter = "";
190        try {
191            Map<String, String> criteriaMap = new HashMap<String, String>();
192            criteriaMap.put("namespaceCode", OLEConstants.DLVR_NMSPC);
193            criteriaMap.put("componentCode", OLEConstants.DLVR_CMPNT);
194            criteriaMap.put("name", name);
195            List<ParameterBo> parametersList = (List<ParameterBo>) businessObjectService.findMatching(ParameterBo.class, criteriaMap);
196            for (ParameterBo parameterBo : parametersList) {
197                parameter = parameterBo.getValue();
198            }
199        } catch (Exception e) {
200            LOG.error(e, e);
201        }
202        return parameter;
203    }
204
205
206
207
208   public ASRItems getNewASRItems(){
209      ASRItems asrItems = new ASRItems();
210       List<ASRItem> asrItemList = new ArrayList<ASRItem>();
211       List<org.kuali.ole.deliver.bo.ASRItem> asrItemsList = (List<org.kuali.ole.deliver.bo.ASRItem>)businessObjectService.findAll(org.kuali.ole.deliver.bo.ASRItem.class);
212      ASRItem asrItem;
213       if(asrItemsList.size()>0){
214           for(org.kuali.ole.deliver.bo.ASRItem asrItemBo : asrItemsList){
215              asrItem = new ASRItem();
216               asrItem.setItemBarcode(asrItemBo.getItemBarcode());
217               asrItem.setTitle(asrItemBo.getTitle());
218               asrItem.setAuthor(asrItemBo.getAuthor());
219               asrItem.setCallNumber(asrItemBo.getCallNumber());
220               asrItemList.add(asrItem);
221           }
222       }
223       asrItems.setAsrItems(asrItemList);
224       if(asrItemList!=null && asrItemList.size()>0){
225           businessObjectService.delete(asrItemsList);
226       }
227       return asrItems;
228   }
229
230
231   public Map<String, String> getItemFieldValue(String searchField, String searchFieldValue, List<String> resultFields) {
232       Map<String, String> resultMap = new HashMap<>();
233       Map<String,String> searchParamsMap = new HashMap<String,String>();
234       searchParamsMap.put(searchField,searchFieldValue);
235       SearchParams searchParams = buildSearchParams(searchParamsMap);
236       for(String resultField :resultFields) {
237             searchParams.getSearchResultFields().add(searchParams.buildSearchResultField("item", resultField));
238       }
239       try {
240
241       SearchResponse searchResponse = getDocstoreClientLocator().getDocstoreClient().search(searchParams);
242       for(SearchResult searchResult : searchResponse.getSearchResults()){
243           for(SearchResultField searchResultField : searchResult.getSearchResultFields()) {
244               if(searchResultField.getDocType().equalsIgnoreCase(DocType.ITEM.getCode())) {
245                   for(String resultField : resultFields) {
246                       if(searchResultField.getFieldName().equalsIgnoreCase(resultField)) {
247                           resultMap.put(resultField, searchResultField.getFieldValue());
248                       }
249                   }
250               }
251           }
252       }
253       }catch(Exception e){
254           Log.error(e,e);
255       }
256       return resultMap;
257   }
258
259    public Map<String, String> getHoldingFieldValue(String searchField, String searchFieldValue, List<String> resultFields) {
260        Map<String, String> resultMap = new HashMap<>();
261        Map<String,String> searchParamsMap = new HashMap<String,String>();
262        searchParamsMap.put(searchField,searchFieldValue);
263        SearchParams searchParams = buildSearchParamsForHoldings(searchParamsMap);
264        for(String resultField :resultFields) {
265            searchParams.getSearchResultFields().add(searchParams.buildSearchResultField("holdings", resultField));
266        }
267        try {
268
269            SearchResponse searchResponse = getDocstoreClientLocator().getDocstoreClient().search(searchParams);
270            for(SearchResult searchResult : searchResponse.getSearchResults()){
271                for(SearchResultField searchResultField : searchResult.getSearchResultFields()) {
272                    if(searchResultField.getDocType().equalsIgnoreCase(DocType.HOLDINGS.getCode())) {
273                        for(String resultField : resultFields) {
274                            if(searchResultField.getFieldName().equalsIgnoreCase(resultField)) {
275                                resultMap.put(resultField, searchResultField.getFieldValue());
276                            }
277                        }
278                    }
279                }
280            }
281        }catch(Exception e){
282            Log.error(e,e);
283        }
284        return resultMap;
285    }
286
287
288    public org.kuali.ole.docstore.common.document.Item getItem(String itemUUID){
289        org.kuali.ole.docstore.common.document.Item item = null;
290        try {
291            item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemUUID);
292        } catch (Exception e) {
293            e.printStackTrace();
294        }
295        return item;
296    }
297
298    public org.kuali.ole.docstore.common.document.Item getItemUsingBarcode(String barcode){
299        org.kuali.ole.docstore.common.document.Item item = null;
300        List<String> searchList = new ArrayList<String>();
301        searchList.add("id");
302        Map<String,String> resultMap =  getItemFieldValue("ItemBarcode_display", barcode, searchList);
303        String itemUUID = resultMap.get("id");
304        if(itemUUID!=null){
305            item = getItem(itemUUID);
306        }
307        return item;
308    }
309
310    public boolean isAnASRItem(String itemLocation) {
311        boolean asrItem = false;
312        String[] libraryArray = getParameter("ASR_LOCATIONS").split("[';']");
313        for (String library : libraryArray) {
314            if (itemLocation != null) {
315                for (String location : itemLocation.split("['/']")) {
316                    if (location.equals(library)) {
317                        asrItem = true;
318                        break;
319                    }
320                }
321            }
322        }
323        return asrItem;
324
325    }
326
327
328    public List<ASRTypeRequest> getASRRequest(String searchParameter,String value){
329        Map<String,String> requestMap = new HashMap<String,String>();
330        requestMap.put(searchParameter,value);
331        List<ASRTypeRequest> asrTypeRequests = (List<ASRTypeRequest>)businessObjectService.findMatching(ASRTypeRequest.class,requestMap);
332        if(asrTypeRequests.size()>0){
333            return asrTypeRequests;
334        }
335        return null;
336    }
337
338    public boolean updateRequestStatus(ASRTypeRequest asrTypeRequest,String holdId,String requestStatus){
339        boolean updated = false;
340        Map<String,String> parameterMap = new HashMap<>();
341        parameterMap.put("requestId",holdId);
342        List<OleDeliverRequestBo> oleDeliverRequestBoList = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,parameterMap);
343        if(oleDeliverRequestBoList!=null && oleDeliverRequestBoList.size()>0){
344            OleDeliverRequestBo oleDeliverRequestBo = oleDeliverRequestBoList.get(0);
345            oleDeliverRequestBo.setRequestStatus(requestStatus);
346            businessObjectService.save(oleDeliverRequestBo);
347            List<ASRTypeRequest> asrTypeRequests;
348            if(asrTypeRequest == null){
349                asrTypeRequests = getASRRequest("requestId", holdId);
350                if(asrTypeRequests!=null && asrTypeRequests.size()>0){
351                    asrTypeRequest = asrTypeRequests.get(0);
352
353                } else{
354                    return false;
355                }
356            }
357            asrTypeRequest.setRequestStatus(requestStatus);
358            ASRTypeRequest asrTypeRequest1=businessObjectService.save(asrTypeRequest);
359            if(asrTypeRequest1!=null){
360                updated = true;
361            }
362        }
363       return updated;
364    }
365
366    public boolean updateItemStatus(String itemBarcode,String status){
367        boolean updated = false;
368        Item items = null;
369        org.kuali.ole.docstore.common.document.Item item = getItemUsingBarcode(itemBarcode);
370        if(item!=null){
371        String itemContent = item.getContent();
372         if(itemContent!=null){
373        ItemOlemlRecordProcessor itemOlemlRecordProcessor = new ItemOlemlRecordProcessor();
374             items=itemOlemlRecordProcessor.fromXML(itemContent);
375        if(items!=null && items.getItemStatus()!=null){
376            ItemStatus itemStatus = new ItemStatus();
377            itemStatus.setCodeValue(status);
378            items.setItemStatus(itemStatus);
379            item.setContent(itemOlemlRecordProcessor.toXML(items));
380            try{
381           getDocstoreClientLocator().getDocstoreClient().updateItem(item);
382                updated=true;
383            } catch(Exception e){
384                Log.error(e,e);
385            }
386        }
387         }
388        }
389
390      return updated;
391    }
392
393    public boolean updateItemStatusForInTransit(String itemBarcode,String status){
394        boolean updated = false;
395        Item items = null;
396        org.kuali.ole.docstore.common.document.Item item = getItemUsingBarcode(itemBarcode);
397        if(item!=null){
398            String itemContent = item.getContent();
399            if(itemContent!=null){
400                ItemOlemlRecordProcessor itemOlemlRecordProcessor = new ItemOlemlRecordProcessor();
401                items=itemOlemlRecordProcessor.fromXML(itemContent);
402                if(items!=null && items.getItemStatus()!=null && items.getItemStatus().getCodeValue().equals(ASRConstants.IN_TRANSIT)){
403                    ItemStatus itemStatus = new ItemStatus();
404                    itemStatus.setCodeValue(status);
405                    items.setItemStatus(itemStatus);
406                    item.setContent(itemOlemlRecordProcessor.toXML(items));
407                    try{
408                        getDocstoreClientLocator().getDocstoreClient().updateItem(item);
409                        updated=true;
410                    } catch(Exception e){
411                        Log.error(e,e);
412                    }
413                }
414            }
415        }
416
417        return updated;
418    }
419
420    public ASRRequests getASRRequest(List<ASRTypeRequest> asrRequestTypeList){
421        ASRRequests asrRequests=new ASRRequests();
422        List<ASRRequest> asrRequestList=new ArrayList<>();
423        ASRRequest asrRequest=null;
424        for(ASRTypeRequest asrTypeRequest:asrRequestTypeList){
425            asrRequest=new ASRRequest();
426            asrRequest.setHoldId(asrTypeRequest.getRequestId());
427            asrRequest.setItemBarcode(asrTypeRequest.getItemId());
428            asrRequestList.add(asrRequest);
429        }
430        asrRequests.setAsrRequests(asrRequestList);
431
432        return asrRequests;
433    }
434
435
436    public ASRRequests getASRTypeRequest(String status){
437        ASRRequests asrRequests = new ASRRequests();
438        Map<String,String> requestMap = new HashMap<String,String>();
439            requestMap.put("requestStatus",status);
440         List<ASRTypeRequest> requestsList = (List<ASRTypeRequest>)businessObjectService.findMatching(ASRTypeRequest.class,requestMap);
441        if(requestsList.size()>0){
442                     asrRequests = getASRRequest(requestsList);
443        }
444        return asrRequests;
445
446    }
447
448
449    public void deleteASRRequest(String itemBarcode){
450        OleDeliverRequestDocumentHelperServiceImpl oleDeliverRequestDocumentHelperService = new OleDeliverRequestDocumentHelperServiceImpl();
451        Map<String,String> requestMap = new HashMap<String,String>();
452        requestMap.put("itemId",itemBarcode);
453        List<OleDeliverRequestBo> oleDeliverRequestBos = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
454        if(oleDeliverRequestBos.size()>0){
455            for(OleDeliverRequestBo oleDeliverRequestBo : oleDeliverRequestBos){
456                oleDeliverRequestDocumentHelperService.cancelDocument(oleDeliverRequestBo);
457            }
458        }
459        List<ASRTypeRequest> asrTypeRequests = (List<ASRTypeRequest>)businessObjectService.findMatching(ASRTypeRequest.class,requestMap);
460        businessObjectService.delete(asrTypeRequests);
461
462    }
463
464
465  public ASRRequestDetailBo generateASRDetailBo(OleDeliverRequestBo oleDeliverRequestBo){
466      ASRRequestDetailBo asrRequestDetailBo = new ASRRequestDetailBo();
467      String[] availableDates;
468      asrRequestDetailBo.setRequestId(oleDeliverRequestBo.getRequestId());
469      asrRequestDetailBo.setAvailable(false);
470      Map<String, String> loanMap = new HashMap<String, String>();
471      loanMap.put(OLEConstants.OleDeliverRequest.ITEM_ID, oleDeliverRequestBo.getItemId());
472      List<OleLoanDocument> oleLoanDocumentList = (List<OleLoanDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OleLoanDocument.class, loanMap);
473      if (oleLoanDocumentList.size() > 0) {
474          if (oleLoanDocumentList.get(0).getLoanDueDate() != null) {
475              availableDates = oleLoanDocumentList.get(0).getLoanDueDate().toString().split(" ");
476              if(availableDates!=null && availableDates.length>0){
477                  asrRequestDetailBo.setDateAvailable(availableDates[0]);
478              } else{
479                  asrRequestDetailBo.setDateAvailable(oleLoanDocumentList.get(0).getLoanDueDate().toString());
480              }
481              if(oleDeliverRequestBo.getPickUpLocationId()!=null){
482                  Map<String, String> deskMap = new HashMap<>();
483                  deskMap.put(OLEConstants.CIRCULATION_DESK_ID, oleDeliverRequestBo.getPickUpLocationId());
484                  List<OleCirculationDesk> oleCirculationDeskList = (List<OleCirculationDesk>) KRADServiceLocator.getBusinessObjectService().findMatching(OleCirculationDesk.class, deskMap);
485                  if(oleCirculationDeskList.size()>0){
486
487                      asrRequestDetailBo.setDateAvailableExpires(oleDeliverRequestDocumentHelperService.addDate(new java.sql.Date(oleLoanDocumentList.get(0).getLoanDueDate().getTime()), Integer.parseInt(oleCirculationDeskList.get(0).getOnHoldDays())).toString());
488                  }
489              }
490          }  else{
491              asrRequestDetailBo.setDateAvailable(OLEConstants.INDEFINITE);
492              asrRequestDetailBo.setDateAvailableExpires(OLEConstants.INDEFINITE);
493          }
494      }
495      asrRequestDetailBo.setDateExpires(oleDeliverRequestBo.getRequestExpiryDate().toString());
496      if(oleDeliverRequestBo.getRecallDueDate()!=null)
497          asrRequestDetailBo.setDateRecalled(oleDeliverRequestBo.getRecallDueDate().toString());
498      asrRequestDetailBo.setPatronId(oleDeliverRequestBo.getBorrowerBarcode());
499      asrRequestDetailBo.setPickupLocation(oleDeliverRequestBo.getPickUpLocationCode());
500      //asrRequestDetailBo.setRecallStatus();
501      if(oleDeliverRequestBo.getBorrowerQueuePosition()!=null)
502          asrRequestDetailBo.setPriority(oleDeliverRequestBo.getBorrowerQueuePosition().toString());
503      asrRequestDetailBo.setRequestType(oleDeliverRequestBo.getRequestTypeCode());
504      asrRequestDetailBo.setRequestStatus(oleDeliverRequestBo.getRequestStatus());
505      return asrRequestDetailBo;
506  }
507
508
509   public ASRRequestDetailsBo generateASRequestDetailsBo(List<OleDeliverRequestBo> oleDeliverRequestBos){
510       ASRRequestDetailsBo asrRequestDetailsBo = new ASRRequestDetailsBo();
511       List<ASRRequestDetailBo> asrRequestDetailBoList;
512       if(oleDeliverRequestBos.size()>0){
513             asrRequestDetailBoList = new ArrayList<ASRRequestDetailBo>();
514        for(OleDeliverRequestBo oleDeliverRequestBo : oleDeliverRequestBos){
515            asrRequestDetailBoList.add(generateASRDetailBo(oleDeliverRequestBo));
516        }
517        asrRequestDetailsBo.setAsrRequestDetailBos(asrRequestDetailBoList);
518           return asrRequestDetailsBo;
519       }
520       return null;
521   }
522
523    public ASRRequestDetailsBo getRequests(String itemBarcode){
524        List<OleDeliverRequestBo> oleDeliverRequestBos =null;
525        Map<String,String> requestMap = new HashMap<String,String>();
526        requestMap.put("itemId",itemBarcode);
527        List<ASRTypeRequest> asrTypeRequests =  (List<ASRTypeRequest>)businessObjectService.findMatching(ASRTypeRequest.class,requestMap);
528        if(asrTypeRequests.size()>0){
529            oleDeliverRequestBos = new ArrayList<OleDeliverRequestBo>();
530               for(ASRTypeRequest asrTypeRequest : asrTypeRequests){
531                   requestMap.put("itemId",asrTypeRequest.getItemId());
532                      List<OleDeliverRequestBo> oleDeliverRequestBos1 = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
533                         if(oleDeliverRequestBos1.size()>0){
534                                   oleDeliverRequestBos.addAll(oleDeliverRequestBos1);
535                             break;
536                         }
537               }
538        }
539        if(oleDeliverRequestBos!=null && oleDeliverRequestBos.size()>0){
540            ASRRequestDetailsBo asrRequestDetailsBo = generateASRequestDetailsBo(oleDeliverRequestBos);
541            if(asrRequestDetailsBo !=null){
542                return asrRequestDetailsBo;
543            }
544        }
545        return null;
546    }
547
548    public OleDeliverRequestBo getPrioritizedRequest(String itemBarcode){
549        OleDeliverRequestBo oleDeliverRequestBo = null;
550        Map<String,String> requestMap = new HashMap<String,String>();
551        requestMap.put("itemId",itemBarcode);
552        requestMap.put("borrowerQueuePosition","1");
553        List<OleDeliverRequestBo> oleDeliverRequestBos = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
554        if(oleDeliverRequestBos.size()>0){
555               oleDeliverRequestBo = oleDeliverRequestBos.get(0);
556        }
557        return oleDeliverRequestBo;
558    }
559
560
561    public boolean validateLocation(String operatorId,String itemLocation){
562        boolean valid=false;
563        Map<String,String> circulationDeskDetailMap = new HashMap<String,String>();
564        Map<String,String> circulationLocationMap = new HashMap<String,String>();
565        circulationDeskDetailMap.put("operatorId",operatorId);
566        circulationDeskDetailMap.put("defaultLocation","true");
567        List<OleCirculationDeskDetail> oleCirculationDeskDetails = (List<OleCirculationDeskDetail>)businessObjectService.findMatching(OleCirculationDeskDetail.class,circulationDeskDetailMap);
568        if(oleCirculationDeskDetails.size()>0){
569            circulationLocationMap.put("circulationDeskId",oleCirculationDeskDetails.get(0).getCirculationDeskId());
570        List<OleCirculationDeskLocation> oleCirculationDeskLocations = (List<OleCirculationDeskLocation>)businessObjectService.findMatching(OleCirculationDeskLocation.class,circulationLocationMap);
571        if(oleCirculationDeskLocations.size()>0){
572                   for(OleCirculationDeskLocation oleCirculationDeskLocation : oleCirculationDeskLocations){
573                       //for(String location:oleCirculationDeskLocation.getLocation().getFullLocationPath().split("['/']")){
574                       if(oleCirculationDeskLocation.getCirculationPickUpDeskLocation()==null || (oleCirculationDeskLocation.getCirculationPickUpDeskLocation()!=null && oleCirculationDeskLocation.getCirculationPickUpDeskLocation().trim().isEmpty())){
575                           if(oleCirculationDeskLocation.getLocation().getFullLocationPath().equals(itemLocation)){
576                               valid = true;
577                               break;
578                           }
579                       }
580                       //}
581                       /*if(oleCirculationDeskLocation.getLocation().getFullLocationPath().contains(itemLocation)){
582                            valid = true;
583                       }*/
584                   }
585        }
586      }
587       return valid;
588    }
589
590
591
592    public boolean validPatron(String patronId){
593        boolean valid=false;
594        Map<String,String> patronMap = new HashMap<String,String>();
595        patronMap.put("olePatronId",patronId);
596        List<OlePatronDocument> olePatronDocuments = (List<OlePatronDocument>)businessObjectService.findMatching(OlePatronDocument.class,patronMap);
597        if(olePatronDocuments!=null && olePatronDocuments.size()>0){
598            valid=true;
599        }
600        return valid;
601    }
602
603
604
605   public boolean saveASRRequest(ASRRequestBo asrRequestBo){
606       boolean saved = false;
607       ASRTypeRequest asrTypeRequest = new ASRTypeRequest();
608       asrTypeRequest.setItemId(asrRequestBo.getItemBarcode());
609       asrTypeRequest.setPatronId(asrRequestBo.getPatronBarcode());
610       asrTypeRequest.setPickUpLocation(asrRequestBo.getPickupLocation());
611       asrTypeRequest.setPatronName(asrRequestBo.getPatronName());
612       ASRTypeRequest asrTypeRequest1 = businessObjectService.save(asrTypeRequest);
613       if(asrTypeRequest1!=null){
614           saved =true;
615       }
616       return saved;
617   }
618
619
620    public boolean saveASRItem(ASRItem asrItem){
621        boolean saved = false;
622        org.kuali.ole.deliver.bo.ASRItem asrItems = new org.kuali.ole.deliver.bo.ASRItem();
623        asrItems.setItemBarcode(asrItem.getItemBarcode());
624        asrItems.setCallNumber(asrItem.getCallNumber());
625        asrItems.setAuthor(asrItem.getAuthor());
626        asrItems.setTitle(asrItem.getTitle());
627
628        org.kuali.ole.deliver.bo.ASRItem asrItem1 =   businessObjectService.save(asrItems);
629        if(asrItem1!=null){
630            saved = true;
631        }
632        return saved;
633    }
634
635    public List<OleDeliverRequestBo> getDeliverRequest(Map<String,String> requestMap){
636        List<OleDeliverRequestBo> oleDeliverRequestBos = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
637        if(oleDeliverRequestBos.size()>0){
638            return oleDeliverRequestBos;
639        }
640        return null;
641    }
642
643
644 public void deleteASRTypeRequest(String requestId){
645    Map<String,String> asrTypeMap = new HashMap<String,String>();
646    asrTypeMap.put("requestId",requestId);
647    businessObjectService.deleteMatching(ASRTypeRequest.class,asrTypeMap);
648 }
649
650    public boolean isCirculationDesksLocation(String itemLocation,String circulationDeskId){
651        boolean valid=false;
652        Map<String,String> circulationLocationMap = new HashMap<String,String>();
653        circulationLocationMap.put("circulationDeskId",circulationDeskId);
654        List<OleCirculationDeskLocation> oleCirculationDeskLocations = (List<OleCirculationDeskLocation>)businessObjectService.findMatching(OleCirculationDeskLocation.class,circulationLocationMap);
655        if(oleCirculationDeskLocations.size()>0){
656            for(OleCirculationDeskLocation oleCirculationDeskLocation : oleCirculationDeskLocations){
657                //for(String location:oleCirculationDeskLocation.getLocation().getFullLocationPath().split("['/']")){
658              if(oleCirculationDeskLocation.getCirculationPickUpDeskLocation()==null || (oleCirculationDeskLocation.getCirculationPickUpDeskLocation()!=null && oleCirculationDeskLocation.getCirculationPickUpDeskLocation().trim().isEmpty())){
659                if(oleCirculationDeskLocation.getLocation().getFullLocationPath().equals(itemLocation)){
660                    valid = true;
661                    break;
662                }
663              }
664                //}
665                       /*if(oleCirculationDeskLocation.getLocation().getFullLocationPath().contains(itemLocation)){
666                            valid = true;
667                       }*/
668            }
669        }
670        return valid;
671    }
672
673    public String getLocation(String itemBarcode){
674        List<String> resultList = new ArrayList<String>();
675        resultList.add(ASRConstants.LOCATION_LEVEL_DISPLAY);
676        resultList.add("holdingsIdentifier");
677        Map<String,String> resultMap = getItemFieldValue(ASRConstants.ITEM_BARCODE_DISPLAY,itemBarcode,resultList);
678        String location = resultMap.get(ASRConstants.LOCATION_LEVEL_DISPLAY);
679        if(location == null){
680            String holdingsId = resultMap.get("holdingsIdentifier");
681            resultList.clear();
682            resultList.add(ASRConstants.LOCATION_LEVEL_DISPLAY);
683            Map<String,String> resultMap1 = getHoldingFieldValue("id",holdingsId, resultList);
684            location = resultMap1.get(ASRConstants.LOCATION_LEVEL_DISPLAY);
685        }
686        return location;
687
688    }
689
690    public SearchParams buildSearchParamsForHoldings(Map<String, String> queryParams) {
691        SearchParams searchParams = new SearchParams();
692        List<SearchCondition> searchConditionList = new ArrayList<SearchCondition>();
693        List<SearchCondition>  searchConditions = new ArrayList<>();
694        if (null != queryParams) {
695            for (Iterator<String> keys = queryParams.keySet().iterator(); keys.hasNext(); ) {
696                String key = keys.next();
697                String value = queryParams.get(key);
698                if(org.apache.commons.lang.StringUtils.isNotEmpty(value)) {
699                    //searchConditions.add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField("item", key, value), "AND"));
700                    searchParams.getSearchConditions().add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField("holdings", key, value), "AND"));
701                }
702            }
703        }
704        return searchParams;
705    }
706
707    public ASRRequests getASRRequestBasedOnLocation(ASRRequests asrRequests,String location){
708        List<ASRRequest> requestList = new ArrayList<ASRRequest>();
709        if(asrRequests.getAsrRequests()!=null){
710            for(ASRRequest asrRequest:asrRequests.getAsrRequests()){
711                String itemBarcode = asrRequest.getItemBarcode();
712                String itemLocation = getLocation(itemBarcode);
713                if(isLocationMatch(itemLocation,location)){
714                    requestList.add(asrRequest);
715                }
716            }
717        }
718        requestList = processASRRequestInformation(requestList);
719        asrRequests.setAsrRequests(requestList);
720        return asrRequests;
721
722
723    }
724
725    public boolean isLocationMatch(String itemLocation,String asrLocation) {
726        boolean asrItem = false;
727        if(itemLocation!=null){
728            String[] libraryArray = itemLocation.split("['/']");
729            for (String library : libraryArray) {
730                if (asrLocation.equals(library)) {
731                    asrItem = true;
732                }
733            }
734        }
735
736
737        return asrItem;
738
739    }
740
741    public boolean deleteAllASRItems(ASRItems asrItems){
742        boolean isAllDeleted = false;
743        List<org.kuali.ole.deliver.bo.ASRItem> deleteList = new ArrayList<>();
744        List<org.kuali.ole.deliver.bo.ASRItem> asrItemList = new ArrayList<>();
745        asrItemList=(List<org.kuali.ole.deliver.bo.ASRItem>)getBusinessObjectService().findAll(org.kuali.ole.deliver.bo.ASRItem.class);
746        for(ASRItem asrItem:asrItems.getAsrItems()){
747            for(org.kuali.ole.deliver.bo.ASRItem dlvrASRItem:asrItemList){
748                if(dlvrASRItem.getItemBarcode() !=null && dlvrASRItem.getItemBarcode().equals(asrItem.getItemBarcode())){
749                    deleteList.add(dlvrASRItem);
750                    break;
751                }
752            }
753        }
754        getBusinessObjectService().delete(deleteList);
755        isAllDeleted=true;
756        return isAllDeleted;
757    }
758
759
760    public List<ASRRequest> processASRRequestInformation(List<ASRRequest> asrRequests){
761      if(asrRequests!=null && asrRequests.size()>0){
762             for(ASRRequest asrRequest : asrRequests){
763                 Map<String,String> requestMap = new HashMap<String,String>();
764                 requestMap.put("requestId",asrRequest.getHoldId());
765                 List<OleDeliverRequestBo> deliverRequestBos = (List<OleDeliverRequestBo>)businessObjectService.findMatching(OleDeliverRequestBo.class,requestMap);
766                 if(deliverRequestBos.size()>0){
767                     OleDeliverRequestBo oleDeliverRequestBo = deliverRequestBos.get(0);
768                     oleDeliverRequestBo.setRequestCreator(OLEConstants.OleDeliverRequest.REQUESTER_PATRON);
769                     asrRequest.setPickupLocation(oleDeliverRequestBo.getPickUpLocationCode());
770                     asrRequest.setRequestDate(oleDeliverRequestBo.getCreateDate().toString());
771                     asrRequest.setPatronBarcode(oleDeliverRequestBo.getBorrowerBarcode());
772                     oleDeliverRequestBo = oleDeliverRequestDocumentHelperService.processItem(oleDeliverRequestBo);
773                     oleDeliverRequestBo = oleDeliverRequestDocumentHelperService.processPatron(oleDeliverRequestBo);
774                     asrRequest.setAuthor(oleDeliverRequestBo.getAuthor());
775                     asrRequest.setTitle(oleDeliverRequestBo.getTitle());
776                     asrRequest.setCallNumber(oleDeliverRequestBo.getCallNumber());
777                     asrRequest.setPatronName(oleDeliverRequestBo.getBorrowerName());
778                     asrRequest.setRequestStatus(oleDeliverRequestBo.getRequestStatus());
779                 }
780             }
781      }
782        return asrRequests;
783    }
784
785
786}