View Javadoc
1   package org.kuali.ole.ncip.service.impl;
2   
3   import org.apache.commons.collections.CollectionUtils;
4   import org.apache.log4j.Logger;
5   import org.kuali.ole.OLEConstants;
6   import org.kuali.ole.bo.*;
7   import org.kuali.ole.deliver.bo.*;
8   import org.kuali.ole.deliver.service.OleDeliverRequestDocumentHelperServiceImpl;
9   import org.kuali.ole.deliver.util.DroolsResponse;
10  import org.kuali.ole.deliver.util.ItemInfoUtil;
11  import org.kuali.ole.deliver.util.NoticeInfo;
12  import org.kuali.ole.deliver.util.OleItemRecordForCirc;
13  import org.kuali.ole.docstore.common.document.Bib;
14  import org.kuali.ole.docstore.common.document.content.instance.Item;
15  import org.kuali.ole.docstore.common.document.content.instance.OleHoldings;
16  import org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.ItemRecord;
17  import org.kuali.ole.ncip.service.LookupUserService;
18  import org.kuali.ole.ncip.util.OLENCIPUtil;
19  import org.kuali.ole.utility.OleStopWatch;
20  import org.kuali.rice.kim.impl.identity.address.EntityAddressBo;
21  import org.kuali.rice.kim.impl.identity.email.EntityEmailBo;
22  import org.kuali.rice.kim.impl.identity.entity.EntityBo;
23  import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
24  import org.kuali.rice.kim.impl.identity.phone.EntityPhoneBo;
25  import org.kuali.rice.krad.service.KRADServiceLocator;
26  
27  import java.sql.Timestamp;
28  import java.text.SimpleDateFormat;
29  import java.util.*;
30  
31  /**
32   * Created by chenchulakshmig on 9/22/15.
33   */
34  public abstract class LookupUserServiceImpl extends LookupUserServiceUtil implements LookupUserService {
35  
36      private static final Logger LOG = Logger.getLogger(LookupUserServiceImpl.class);
37  
38      protected String responseFormatType;
39      protected String response;
40      private OLELookupUser oleLookupUser;
41      private OlePatronDocument olePatronDocument;
42  
43      public OLELookupUser getOleLookupUser() {
44          return oleLookupUser;
45      }
46  
47      public void setOleLookupUser(OLELookupUser oleLookupUser) {
48          this.oleLookupUser = oleLookupUser;
49      }
50  
51      public OlePatronDocument getOlePatronDocument() {
52          return olePatronDocument;
53      }
54  
55      public void setOlePatronDocument(OlePatronDocument olePatronDocument) {
56          this.olePatronDocument = olePatronDocument;
57      }
58  
59      /**
60       * used for NCIP, VuFind, SIP2(3M)
61       *
62       * @param lookupUserParameters
63       * @return
64       */
65      public String lookupUser(Map lookupUserParameters) {
66          setResponseFormatType(lookupUserParameters);
67          setOleLookupUser(new OLELookupUser());
68          setOlePatronDocument(null);
69  
70          boolean isValid = validate(lookupUserParameters);
71          if (!isValid) {
72              return prepareResponse();
73          }
74          preProcess(lookupUserParameters);
75          process();
76  
77          return prepareResponse();
78      }
79  
80      private void setResponseFormatType(Map lookupUserParameters) {
81          responseFormatType = (String) lookupUserParameters.get("responseFormatType");
82          if (responseFormatType == null) {
83              responseFormatType = "xml";
84          }
85          responseFormatType = responseFormatType.toUpperCase();
86      }
87  
88      private boolean validate(Map lookupUserParameters) {
89          String operatorId = getOperatorId((String) lookupUserParameters.get("operatorId"));
90          String patronBarcode = (String) lookupUserParameters.get("patronBarcode");
91  
92          OleCirculationDesk oleCirculationDesk = getCircDeskLocationResolver().getCircDeskForOpertorId(operatorId);
93          if (null == oleCirculationDesk) {
94              processErrorResponseForOperator();
95              return false;
96          }
97          try {
98              OlePatronDocument patronDocument = getOlePatronRecordUtil().getPatronRecordByBarcode(patronBarcode);
99              setOlePatronDocument(patronDocument);
100             getOleLookupUser().setPatronId(getOlePatronDocument().getBarcode());
101         } catch (Exception e) {
102             LOG.error("Exception " + e);
103         }
104         if (null == getOlePatronDocument()) {
105             processErrorResponseForPatron();
106             return false;
107         }
108         return true;
109     }
110 
111     private void process() {
112         if (userAddressInformationDesired()) {
113             processUserAddressInformation();
114         }
115         if (userPrivilegeDesired()) {
116             processUserPriv();
117         }
118         if (nameInformationDesired()) {
119             processNameInformation();
120         }
121         validatePatron();
122         if (loanedItemsDesired()) {
123             processLoanedItems();
124         }
125         if (requestedItemsDesired()) {
126             processRequestedItems();
127         }
128         if (userFiscalAccountDesired()) {
129             processFines();
130         }
131         processSuccessResponseForLookupUser();
132     }
133 
134     private void processUserAddressInformation() {
135         OlePatronEmailBo olePatronEmailBo = getDefaultEmailBo(getOlePatronDocument().getOlePatronId());
136         if (olePatronEmailBo != null) {
137             getOleLookupUser().setPatronEmail(olePatronEmailBo);
138         }
139         OlePatronAddressBo olePatronAddressBo = getDefaultAddressBo(getOlePatronDocument().getOlePatronId());
140         if (olePatronAddressBo != null) {
141             getOleLookupUser().setPatronAddress(olePatronAddressBo);
142         }
143         OlePatronPhoneBo olePatronPhoneBo = getDefaultPhoneBo(getOlePatronDocument().getOlePatronId());
144         if (olePatronPhoneBo != null) {
145             getOleLookupUser().setPatronPhone(olePatronPhoneBo);
146         }
147     }
148 
149     private OlePatronEmailBo getDefaultEmailBo(String entityId) {
150         LOG.info("Inside getDefaultEmailBo : Entity Id : " + entityId);
151         EntityBo entityBo = getEntity(entityId);
152         OlePatronEmailBo olePatronEmailBo = null;
153         if (entityBo != null) {
154             if (entityBo.getEntityTypeContactInfos() != null && entityBo.getEntityTypeContactInfos().size() > 0)
155                 if (entityBo.getEntityTypeContactInfos().get(0).getEmailAddresses() != null && entityBo.getEntityTypeContactInfos().get(0).getEmailAddresses().size() > 0) {
156                     for (EntityEmailBo entityEmailBo : entityBo.getEntityTypeContactInfos().get(0).getEmailAddresses()) {
157                         if (entityEmailBo.getDefaultValue()) {
158                             olePatronEmailBo = new OlePatronEmailBo();
159                             olePatronEmailBo.setEmailTypeCode(entityEmailBo.getEmailTypeCode());
160                             olePatronEmailBo.setEmailAddress(entityEmailBo.getEmailAddress());
161                             return olePatronEmailBo;
162                         }
163                     }
164                 }
165         }
166         return null;
167     }
168 
169     private OlePatronAddressBo getDefaultAddressBo(String entityId) {
170         LOG.info("Inside getDefaultAddressBo : Entity Id : " + entityId);
171         EntityBo entityBo = getEntity(entityId);
172         EntityAddressBo entityAddressBo = null;
173         OlePatronAddressBo olePatronAddressBo = null;
174         if (entityBo != null) {
175             if (entityBo.getEntityTypeContactInfos() != null && entityBo.getEntityTypeContactInfos().size() > 0)
176                 if (entityBo.getEntityTypeContactInfos().get(0).getDefaultAddress() != null) {
177                     entityAddressBo = entityBo.getEntityTypeContactInfos().get(0).getDefaultAddress();
178                     olePatronAddressBo = new OlePatronAddressBo();
179                     olePatronAddressBo.setAddressTypeCode(entityAddressBo.getAddressTypeCode());
180                     olePatronAddressBo.setCity(entityAddressBo.getCity());
181                     olePatronAddressBo.setCountryCode(entityAddressBo.getCountryCode());
182                     olePatronAddressBo.setLine1(entityAddressBo.getLine1());
183                     olePatronAddressBo.setLine2(entityAddressBo.getLine2());
184                     olePatronAddressBo.setLine3(entityAddressBo.getLine3());
185                     olePatronAddressBo.setPostalCode(entityAddressBo.getPostalCode());
186                     olePatronAddressBo.setStateProvinceCode(entityAddressBo.getStateProvinceCode());
187                     return olePatronAddressBo;
188                 }
189         }
190         return null;
191     }
192 
193     private void processUserPriv() {
194         List<OLEUserPrivilege> userPrivilegeList = getPatronPrivileges();
195         if (CollectionUtils.isNotEmpty(userPrivilegeList)) {
196             getOleLookupUser().setOleUserPrivileges(userPrivilegeList);
197         }
198     }
199 
200     private void processNameInformation() {
201         OlePatronNameBo olePatronNameBo = getEntityNameBo(getOlePatronDocument().getOlePatronId());
202         if (olePatronNameBo != null) {
203             getOleLookupUser().setPatronName(olePatronNameBo);
204         }
205     }
206 
207     private OlePatronNameBo getEntityNameBo(String entityId) {
208         LOG.info("Inside getEntityNameBo : Entity Id : " + entityId);
209         EntityBo entityBo = getEntity(entityId);
210         EntityNameBo entityNameBo = null;
211         OlePatronNameBo olePatronNameBo = null;
212         if (entityBo != null) {
213             if (entityBo.getNames() != null && entityBo.getNames().size() > 0) {
214                 entityNameBo = entityBo.getNames().get(0);
215                 olePatronNameBo = new OlePatronNameBo();
216                 olePatronNameBo.setFirstName(entityNameBo.getFirstName());
217                 olePatronNameBo.setMiddleName(entityNameBo.getMiddleName());
218                 olePatronNameBo.setLastName(entityNameBo.getLastName());
219                 return olePatronNameBo;
220             }
221         }
222         return null;
223     }
224 
225     private void processLoanedItems() {
226         OLECheckedOutItems oleCheckedOutItems = getCheckedOutItems();
227         getOleLookupUser().setOleCheckedOutItems(oleCheckedOutItems);
228     }
229 
230     private void processRequestedItems() {
231         List<OleDeliverRequestBo> oleDeliverRequestBoList = getOlePatronDocument().getOleDeliverRequestBos();
232         OLEHolds oleHolds = getHoldsList(oleDeliverRequestBoList);
233         getOleLookupUser().setOleHolds(oleHolds);
234     }
235 
236     private void processFines() {
237         OLEItemFines oleItemFines = getFines(getOlePatronDocument().getOlePatronId());
238         getOleLookupUser().setOleItemFines(oleItemFines);
239     }
240 
241     private OlePatronPhoneBo getDefaultPhoneBo(String entityId) {
242         LOG.info("Inside getDefaultPhoneBo : Entity Id : " + entityId);
243         EntityBo entityBo = getEntity(entityId);
244         EntityPhoneBo entityPhoneBo = null;
245         OlePatronPhoneBo olePatronPhoneBo = null;
246         if (entityBo != null) {
247             if (entityBo.getEntityTypeContactInfos().get(0) != null && entityBo.getEntityTypeContactInfos().size() > 0) {
248                 if (entityBo.getEntityTypeContactInfos().get(0).getDefaultPhoneNumber() != null) {
249                     entityPhoneBo = entityBo.getEntityTypeContactInfos().get(0).getDefaultPhoneNumber();
250                     olePatronPhoneBo = new OlePatronPhoneBo();
251                     olePatronPhoneBo.setPhoneTypeCode(entityPhoneBo.getPhoneTypeCode());
252                     olePatronPhoneBo.setPhoneNumber(entityPhoneBo.getPhoneNumber());
253                     return olePatronPhoneBo;
254                 }
255             }
256         }
257         return null;
258     }
259 
260     private List<OLEUserPrivilege> getPatronPrivileges() {
261         List<OLEUserPrivilege> userPrivilegeList = new ArrayList<>();
262         try {
263         OLEUserPrivilege courtesyNoticePriv = getPrivilege(String.valueOf(getOlePatronDocument().isCourtesyNotice()), OLEConstants.COURTESY_NOTICE, OLEConstants.COURTESY_DESCRIPTION);
264         userPrivilegeList.add(courtesyNoticePriv);
265 
266         OLEUserPrivilege deliveryPriv = getPrivilege(String.valueOf(getOlePatronDocument().isDeliveryPrivilege()), OLEConstants.DELIVERY, OLEConstants.DELIVERY_DESCRIPTION);
267         userPrivilegeList.add(deliveryPriv);
268 
269         OLEUserPrivilege pagingPriv = getPrivilege(String.valueOf(getOlePatronDocument().isPagingPrivilege()), OLEConstants.PAGING, OLEConstants.PAGING_DESCRIPTION);
270         userPrivilegeList.add(pagingPriv);
271 
272         OLEUserPrivilege profilePriv = getPrivilege(getOlePatronDocument().getBorrowerTypeName(), OLEConstants.PROFILE, OLEConstants.PROFILE_DESCRIPTION);
273         userPrivilegeList.add(profilePriv);
274 
275         OLEUserPrivilege statusPriv = getStatusPrivilege();
276         if (statusPriv != null) {
277             userPrivilegeList.add(statusPriv);
278         }
279         } catch (Exception e) {
280             LOG.error("Exception while getting user privilages " + e);
281         }
282         return userPrivilegeList;
283     }
284 
285     protected OLEUserPrivilege getPrivilege(String userPrivilegeStatus, String userPrivilegeType, String userPrivilegeDescription) {
286         OLEUserPrivilege oleUserPrivilege = new OLEUserPrivilege();
287         oleUserPrivilege.setUserPrivilegeType(userPrivilegeType);
288         oleUserPrivilege.setUserPrivilegeDescription(userPrivilegeDescription);
289         oleUserPrivilege.setUserPrivilegeStatus(userPrivilegeStatus);
290         return oleUserPrivilege;
291     }
292 
293     private EntityBo getEntity(String entityId) {
294         LOG.info("Inside getEntity : Entity Id : " + entityId);
295         Map<String, String> entityMap = new HashMap<>();
296         entityMap.put(OLEConstants.ID, entityId);
297         List<EntityBo> entityBoList = (List<EntityBo>) getBusinessObjectService().findMatching(EntityBo.class, entityMap);
298         if (entityBoList.size() > 0)
299             return entityBoList.get(0);
300         return null;
301     }
302 
303     private OLECheckedOutItems getCheckedOutItems() {
304         OleStopWatch oleStopWatch = new OleStopWatch();
305         oleStopWatch.start();
306         List<OLECheckedOutItem> oleCheckedOutItemList = new ArrayList<>();
307         List<OleLoanDocument> oleLoanDocumentList = new ArrayList<>();
308         try {
309             oleLoanDocumentList = getOleLoanDocumentsFromSolrBuilder().getPatronLoanedItemBySolr(getOlePatronDocument().getOlePatronId(), null);
310         } catch (Exception e) {
311             LOG.error("Exception while getting loaned items " + e);
312         }
313         if (CollectionUtils.isNotEmpty(oleLoanDocumentList)) {
314             SimpleDateFormat fmt = new SimpleDateFormat(OLEConstants.OleDeliverRequest.DATE_FORMAT);
315             boolean renewInfoNeeded = isRenewalInfoNeeded();
316             for (OleLoanDocument oleLoanDocument : oleLoanDocumentList) {
317                 OLECheckedOutItem oleCheckedOutItem = new OLECheckedOutItem();
318                 oleCheckedOutItem.setCopyNumber(oleLoanDocument.getItemCopyNumber());
319                 oleCheckedOutItem.setVolumeNumber(oleLoanDocument.getEnumeration());
320                 oleCheckedOutItem.setAcquiredFine("");
321                 oleCheckedOutItem.setDateRecalled("");
322                 oleCheckedOutItem.setTitle(oleLoanDocument.getTitle());
323                 oleCheckedOutItem.setAuthor(oleLoanDocument.getAuthor());
324                 oleCheckedOutItem.setCallNumber(oleLoanDocument.getItemCallNumber());
325                 oleCheckedOutItem.setCatalogueId(oleLoanDocument.getBibUuid());
326                 if (oleLoanDocument.getLoanDueDate() != null) {
327                     oleCheckedOutItem.setDueDate(oleLoanDocument.getLoanDueDate().toString());
328                     if ((fmt.format(oleLoanDocument.getLoanDueDate())).compareTo(fmt.format(new Date(System.currentTimeMillis()))) > 0) {
329                         oleCheckedOutItem.setOverDue(false);
330                     } else {
331                         oleCheckedOutItem.setOverDue(true);
332                     }
333                 } else {
334                     oleCheckedOutItem.setDueDate((new Timestamp(new Date(2025, 1, 1).getTime()).toString()));
335                 }
336                 if (oleLoanDocument.getRenewalLoanDueDate() != null) {
337                     oleCheckedOutItem.setDateRenewed(oleLoanDocument.getRenewalLoanDueDate().toString());
338                 } else {
339                     oleCheckedOutItem.setDateRenewed("");
340                 }
341                 oleCheckedOutItem.setItemType(oleLoanDocument.getItemType());
342                 if (null != oleLoanDocument.getCreateDate()) {
343                     oleCheckedOutItem.setLoanDate(new Timestamp(oleLoanDocument.getCreateDate().getTime()).toString());
344                 }
345                 oleCheckedOutItem.setItemId(oleLoanDocument.getItemId());
346                 if (oleLoanDocument.getNoOfOverdueNoticesSentForBorrower() != null) {
347                     oleCheckedOutItem.setNumberOfOverdueSent(oleLoanDocument.getNoOfOverdueNoticesSentForBorrower());
348                 } else {
349                     oleCheckedOutItem.setNumberOfOverdueSent("1");
350                 }
351 
352                 if (renewInfoNeeded) {
353                     oleCheckedOutItem.setNumberOfRenewals(oleLoanDocument.getNumberOfRenewals());
354                 }
355                 oleCheckedOutItemList.add(oleCheckedOutItem);
356             }
357         }
358         if (CollectionUtils.isNotEmpty(oleCheckedOutItemList)) {
359             OLECheckedOutItems oleCheckedOutItems = new OLECheckedOutItems();
360             oleCheckedOutItems.setCheckedOutItems(oleCheckedOutItemList);
361             return oleCheckedOutItems;
362         }
363         oleStopWatch.end();
364         LOG.info("Time taken to get  " + oleCheckedOutItemList.size() + " checked out items : " + oleStopWatch.getTotalTime());
365         return null;
366     }
367 
368     private OLEHolds getHoldsList(List<OleDeliverRequestBo> oleDeliverRequestBoList) {
369         OleStopWatch oleStopWatch = new OleStopWatch();
370         oleStopWatch.start();
371         List<OLEHold> oleHoldList = new ArrayList<>();
372         try {
373         if (CollectionUtils.isNotEmpty(oleDeliverRequestBoList)) {
374             Map<String, OleCirculationDesk> oleCirculationDeskMap = getOleCirculationService().getAvailableCirculationDesks();
375             for (OleDeliverRequestBo oleDeliverRequestBo : oleDeliverRequestBoList) {
376                 OLEHold oleHold = new OLEHold();
377                 oleHold.setItemId(oleDeliverRequestBo.getItemId());
378                 Map<String, Object> detailMap = new OleDeliverRequestDocumentHelperServiceImpl().retrieveBIbItemHoldingData(oleDeliverRequestBo.getItemUuid());
379                 Bib bib = (Bib) detailMap.get(OLEConstants.BIB);
380                 Item item = (Item) detailMap.get(OLEConstants.ITEM);
381                 OleHoldings oleHoldings = (OleHoldings) detailMap.get(OLEConstants.HOLDING);
382                 oleHold.setCatalogueId(bib.getId());
383                 oleHold.setRequestId(oleDeliverRequestBo.getRequestId());
384                 if (item.getItemStatus() != null) {
385                     oleHold.setAvailableStatus(item.getItemStatus().getCodeValue());
386                 }
387                 String copyNumber = "";
388                 if (item.getCopyNumber() != null && !item.getCopyNumber().isEmpty()) {
389                     copyNumber = item.getCopyNumber();
390                 } else {
391                     copyNumber = oleHoldings.getCopyNumber() != null ? oleHoldings.getCopyNumber() : "";
392                 }
393                 oleHold.setCopyNumber(copyNumber);
394                 oleHold.setTitle(bib.getTitle());
395                 oleHold.setAuthor(bib.getAuthor());
396                 oleHold.setVolumeNumber(item.getEnumeration() != null ? item.getEnumeration() : "");
397                 try {
398                     oleHold.setCallNumber(getOleLoanDocumentsFromSolrBuilder().getItemCallNumber(item.getCallNumber(), oleHoldings.getCallNumber()));
399                 } catch (Exception e) {
400                     LOG.error("Exception while getting call number " + e);
401                 }
402                 if (item.getItemType() != null)
403                     oleHold.setItemType(item.getItemType().getCodeValue());
404                 if (oleDeliverRequestBo.getRequestTypeId() != null && !oleDeliverRequestBo.getRequestTypeId().isEmpty()) {
405                     if (oleDeliverRequestBo.getRequestTypeId().equals("1") || oleDeliverRequestBo.getRequestTypeId().equals("2")) {
406                         oleHold.setRecallStatus(OLEConstants.YES);
407                     } else {
408                         oleHold.setRecallStatus(OLEConstants.NO);
409                     }
410                 }
411                 if (oleDeliverRequestBo.getRequestExpiryDate() != null) {
412                     oleHold.setExpiryDate(oleDeliverRequestBo.getRequestExpiryDate().toString());
413                 }
414                 if (oleDeliverRequestBo.getCreateDate() != null) {
415                     oleHold.setCreateDate(oleDeliverRequestBo.getCreateDate().toString());
416                 }
417                 if (oleDeliverRequestBo.getBorrowerQueuePosition() != null) {
418                     oleHold.setPriority(oleDeliverRequestBo.getBorrowerQueuePosition().toString());
419                 }
420                     if (oleDeliverRequestBo.getPickUpLocationId() != null) {
421                 oleHold.setPickupLocation(oleCirculationDeskMap.get(oleDeliverRequestBo.getPickUpLocationId()).getCirculationDeskCode());
422                     }
423                 if (oleDeliverRequestBo.getRecallDueDate() != null) {
424                     oleHold.setDateRecalled(oleDeliverRequestBo.getRecallDueDate().toString());
425                 }
426                 if (oleDeliverRequestBo.getRecallDueDate() != null) {
427                     oleHold.setDateRecalled(oleDeliverRequestBo.getRecallDueDate().toString());
428                 }
429                 oleHold.setRequestType(oleDeliverRequestBo.getRequestTypeCode());
430                 Map<String, String> loanMap = new HashMap<>();
431                 loanMap.put(OLEConstants.OleDeliverRequest.ITEM_ID, oleDeliverRequestBo.getItemId());
432                 List<OleLoanDocument> oleLoanDocumentList = (List<OleLoanDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OleLoanDocument.class, loanMap);
433                 if (CollectionUtils.isNotEmpty(oleLoanDocumentList)) {
434                     OleLoanDocument oleLoanDocument = oleLoanDocumentList.get(0);
435                     if (oleLoanDocument.getLoanDueDate() != null) {
436                         String[] availableDates = oleLoanDocument.getLoanDueDate().toString().split(" ");
437                         if (availableDates != null && availableDates.length > 0) {
438                             oleHold.setAvailableDate(availableDates[0]);
439                         } else {
440                             oleHold.setAvailableDate(oleLoanDocument.getLoanDueDate().toString());
441                         }
442                         if (oleDeliverRequestBo.getPickUpLocationId() != null) {
443                             if (oleCirculationDeskMap.size() > 0 && oleCirculationDeskMap.get(oleDeliverRequestBo.getPickUpLocationId()) != null) {
444                                 oleHold.setDateAvailableExpires(addDate(new java.sql.Date(oleLoanDocument.getLoanDueDate().getTime()), Integer.parseInt(oleCirculationDeskMap.get(oleDeliverRequestBo.getPickUpLocationId()).getOnHoldDays())).toString());
445                             }
446                         }
447                     } else {
448                         oleHold.setAvailableDate(OLEConstants.INDEFINITE);
449                         oleHold.setDateAvailableExpires(OLEConstants.INDEFINITE);
450                     }
451                 }
452                 if (oleDeliverRequestBo.getRequestTypeId().equals("2") || oleDeliverRequestBo.getRequestTypeId().equals("4") || oleDeliverRequestBo.getRequestTypeId().equals("6")) {
453                     oleHold.setReserve(true);
454                 } else {
455                     oleHold.setReserve(false);
456                 }
457                 oleHoldList.add(oleHold);
458             }
459             if (CollectionUtils.isNotEmpty(oleHoldList)) {
460                 OLEHolds oleHolds = new OLEHolds();
461                 oleHolds.setOleHoldList(oleHoldList);
462                 return oleHolds;
463             }
464         }
465         } catch (Exception e) {
466             LOG.error("Exception while processing requested records" + e);
467         }
468         oleStopWatch.end();
469         LOG.info("For " + oleHoldList.size() + " hold items, time taken : " + oleStopWatch.getTotalTime());
470         return null;
471     }
472 
473     private java.sql.Date addDate(java.sql.Date in, int daysToAdd) {
474         if (in == null) {
475             return null;
476         }
477         GregorianCalendar cal = new GregorianCalendar();
478         cal.setTime(in);
479         cal.add(Calendar.DAY_OF_MONTH, daysToAdd);
480         return new java.sql.Date(cal.getTime().getTime());
481     }
482 
483     private OLEItemFines getFines(String olePatronId) {
484         List<OLEItemFine> oleItemFineList = new ArrayList<>();
485         OLEItemFines oleItemFines = new OLEItemFines();
486         try {
487         Map map = new HashMap();
488         map.put(OLEConstants.PATRON_ID, olePatronId);
489         List<PatronBillPayment> patronBillPaymentList = (List<PatronBillPayment>) getBusinessObjectService().findMatching(PatronBillPayment.class, map);
490         if (CollectionUtils.isNotEmpty(patronBillPaymentList)) {
491             for (PatronBillPayment olePatronBillPayment : patronBillPaymentList) {
492                 List<FeeType> feeTypeList = olePatronBillPayment.getFeeType();
493                 for (FeeType feeType : feeTypeList) {
494                     OLEItemFine oleItemFine = new OLEItemFine();
495                     if (feeType.getItemBarcode() != null) {
496                         OleItemSearch oleItemSearch = new OLENCIPUtil().getOleItemSearch(feeType.getItemBarcode());
497                         oleItemFine.setItemId(feeType.getItemBarcode());
498                         oleItemFine.setCatalogueId(oleItemSearch.getBibUUID());
499                         oleItemFine.setTitle(oleItemSearch.getTitle());
500                         oleItemFine.setAuthor(oleItemSearch.getAuthor());
501                     }
502                     oleItemFine.setPatronBillId(olePatronBillPayment.getBillNumber());
503                     oleItemFine.setAmount((feeType.getFeeAmount() != null ? feeType.getFeeAmount().bigDecimalValue() : OLEConstants.BIGDECIMAL_DEF_VALUE));
504                     oleItemFine.setBalance((feeType.getBalFeeAmount() != null ? feeType.getBalFeeAmount().bigDecimalValue() : OLEConstants.BIGDECIMAL_DEF_VALUE));
505                     oleItemFine.setBillDate(feeType.getBillDate().toString());
506                     int noOfPayment = feeType.getItemLevelBillPaymentList().size();
507                     oleItemFine.setNoOfPayments(new Integer(noOfPayment).toString());
508                     if (feeType.getOleFeeType() != null) {
509                         oleItemFine.setReason(feeType.getOleFeeType().getFeeTypeName());
510                         oleItemFine.setFeeType(feeType.getOleFeeType().getFeeTypeCode());
511                     } else {
512                         oleItemFine.setReason(feeType.getFeeType());
513                         oleItemFine.setFeeType(feeType.getFeeType());
514                     }
515                     oleItemFine.setDateCharged(feeType.getBillDate().toString());
516                     oleItemFineList.add(oleItemFine);
517                 }
518             }
519             oleItemFines.setOleItemFineList(oleItemFineList);
520             processSuccessResponseForItemFine(oleItemFines);
521         } else {
522             processInfoForItemFine(oleItemFines);
523             }
524         } catch (Exception e) {
525             LOG.error("Exception while proceesing fines" + e);
526         }
527         return oleItemFines;
528     }
529 
530     protected abstract String prepareResponse();
531 
532     protected abstract String getOperatorId(String operatorId);
533 
534     protected abstract void validatePatron();
535 
536     protected abstract boolean isRenewalInfoNeeded();
537 
538     protected abstract OLEUserPrivilege getStatusPrivilege();
539 
540     protected abstract void processErrorResponseForOperator();
541 
542     protected abstract void processErrorResponseForPatron();
543 
544     protected abstract void processSuccessResponseForLookupUser();
545 
546     protected abstract void processSuccessResponseForItemFine(OLEItemFines oleItemFines);
547 
548     protected abstract void processInfoForItemFine(OLEItemFines oleItemFines);
549 
550     protected abstract boolean nameInformationDesired();
551 
552     protected abstract boolean userAddressInformationDesired();
553 
554     protected abstract boolean userPrivilegeDesired();
555 
556     protected abstract boolean loanedItemsDesired();
557 
558     protected abstract boolean requestedItemsDesired();
559 
560     protected abstract boolean userFiscalAccountDesired();
561 
562     protected abstract void preProcess(Map lookupUserParameters);
563 
564 }