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