View Javadoc
1   package org.kuali.ole.deliver.controller.checkin;
2   
3   import org.apache.commons.collections.CollectionUtils;
4   import org.apache.commons.lang3.StringUtils;
5   import org.apache.log4j.Logger;
6   import org.kuali.ole.DocumentUniqueIDPrefix;
7   import org.kuali.ole.OLEConstants;
8   import org.kuali.ole.deliver.OleLoanDocumentsFromSolrBuilder;
9   import org.kuali.ole.deliver.PatronBillGenerator;
10  import org.kuali.ole.deliver.bo.*;
11  import org.kuali.ole.deliver.calendar.service.impl.OleCalendarServiceImpl;
12  import org.kuali.ole.deliver.controller.checkout.CircUtilController;
13  import org.kuali.ole.deliver.drools.CheckedInItem;
14  import org.kuali.ole.deliver.drools.DroolsConstants;
15  import org.kuali.ole.deliver.drools.DroolsExchange;
16  import org.kuali.ole.deliver.form.CheckinForm;
17  import org.kuali.ole.deliver.form.OLEForm;
18  import org.kuali.ole.deliver.util.*;
19  import org.kuali.ole.deliver.util.printSlip.*;
20  import org.kuali.ole.docstore.common.document.content.instance.ItemClaimsReturnedRecord;
21  import org.kuali.ole.docstore.common.document.content.instance.MissingPieceItemRecord;
22  import org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.HoldingsRecord;
23  import org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.ItemRecord;
24  import org.kuali.ole.util.DocstoreUtil;
25  import org.kuali.rice.core.api.util.RiceConstants;
26  import org.kuali.rice.krad.util.GlobalVariables;
27  
28  import java.math.BigDecimal;
29  import java.sql.Timestamp;
30  import java.text.SimpleDateFormat;
31  import java.util.*;
32  
33  /**
34   * Created by pvsubrah on 7/22/15.
35   */
36  public abstract class CheckinBaseController extends CircUtilController {
37      private static final Logger LOG = Logger.getLogger(CheckinBaseController.class);
38  
39      protected abstract void setDataElements(OLEForm oleForm, ItemRecord itemRecord, OleLoanDocument loanDocument);
40  
41      public abstract CheckinForm getCheckinForm(OLEForm oleForm);
42  
43      public abstract String getItemBarcode(OLEForm oleForm);
44  
45      public abstract String getSelectedCirculationDesk(OLEForm oleForm);
46  
47      public abstract Date getCustomDueDateMap(OLEForm oleForm);
48  
49      public abstract String getCustomDueDateTime(OLEForm oleForm);
50  
51      public abstract void setCheckedInItem(CheckedInItem checkedInItem, OLEForm oleForm);
52  
53      public abstract CheckedInItem getCheckedInItem(OLEForm oleForm);
54  
55      public abstract void addCheckedInItemToCheckedInItemList(CheckedInItem checkedInItem, OLEForm oleForm);
56  
57      public abstract boolean isRecordNoteForDamagedItem(OLEForm oleForm);
58  
59      public abstract boolean isRecordNoteForClaimsReturn(OLEForm oleForm);
60  
61      public abstract boolean isRecordNoteForMissingPiece(OLEForm oleForm);
62  
63      public abstract String getMissingPieceMatchCheck(OLEForm oleForm);
64  
65      public abstract void setNoOfPieces(OLEForm oleForm, String numberOfPieces);
66  
67      public abstract OleLoanDocument getOleLoanDocument(OLEForm oleForm);
68  
69      public abstract DroolsExchange getDroolsExchange(OLEForm oleForm);
70  
71      public abstract String getOperatorId(OLEForm oleForm);
72  
73      private OnHoldCourtesyNoticeUtil onHoldCourtesyNoticeUtil;
74      private DamagedItemNoteHandler damagedItemNoteHandler;
75      private ClaimsReturnedNoteHandler claimsReturnedNoteHandler;
76  
77      private MissingPieceNoteHandler missingPieceNoteHandler;
78      private OleLoanDocumentsFromSolrBuilder oleLoanDocumentsFromSolrBuilder;
79  
80      public OnHoldCourtesyNoticeUtil getOnHoldCourtesyNoticeUtil() {
81          if (null == onHoldCourtesyNoticeUtil) {
82              onHoldCourtesyNoticeUtil = new OnHoldCourtesyNoticeUtil();
83          }
84          return onHoldCourtesyNoticeUtil;
85      }
86  
87      public void setOnHoldCourtesyNoticeUtil(OnHoldCourtesyNoticeUtil onHoldCourtesyNoticeUtil) {
88          this.onHoldCourtesyNoticeUtil = onHoldCourtesyNoticeUtil;
89      }
90  
91      public DamagedItemNoteHandler getDamagedItemNoteHandler() {
92          if (damagedItemNoteHandler == null) {
93              damagedItemNoteHandler = new DamagedItemNoteHandler();
94          }
95          return damagedItemNoteHandler;
96      }
97  
98      public void setDamagedItemNoteHandler(DamagedItemNoteHandler damagedItemNoteHandler) {
99          this.damagedItemNoteHandler = damagedItemNoteHandler;
100     }
101 
102     public ClaimsReturnedNoteHandler getClaimsReturnedNoteHandler() {
103         if (claimsReturnedNoteHandler == null) {
104             claimsReturnedNoteHandler = new ClaimsReturnedNoteHandler();
105         }
106         return claimsReturnedNoteHandler;
107     }
108 
109     public void setClaimsReturnedNoteHandler(ClaimsReturnedNoteHandler claimsReturnedNoteHandler) {
110         this.claimsReturnedNoteHandler = claimsReturnedNoteHandler;
111     }
112 
113     public MissingPieceNoteHandler getMissingPieceNoteHandler() {
114         if (missingPieceNoteHandler == null) {
115             missingPieceNoteHandler = new MissingPieceNoteHandler();
116         }
117         return missingPieceNoteHandler;
118     }
119 
120     public void setMissingPieceNoteHandler(MissingPieceNoteHandler missingPieceNoteHandler) {
121         this.missingPieceNoteHandler = missingPieceNoteHandler;
122     }
123 
124     public DroolsResponse checkin(OLEForm oleForm) {
125         String itemBarcode = getItemBarcode(oleForm);
126 
127         ItemRecord itemRecord = getItemRecordByBarcode(itemBarcode);
128 
129         DroolsResponse droolsResponse = null;
130         if (null != itemRecord) {
131             OleLoanDocument loanDocument = getLoanDocument(itemBarcode);
132             setDataElements(oleForm, itemRecord, loanDocument);
133             droolsResponse = preValidations(itemRecord, oleForm);
134             if (null != droolsResponse) {
135                 return droolsResponse;
136             }
137             droolsResponse = processCheckinAfterPreValidation(itemRecord, oleForm, loanDocument);
138 
139         } else {
140             droolsResponse = new DroolsResponse();
141             droolsResponse.getErrorMessage().setErrorMessage("Invalid item barcode!");
142             droolsResponse.getErrorMessage().setErrorCode(DroolsConstants.GENERAL_MESSAGE_FLAG);
143         }
144 
145         transferExchangeInfoFromDroolsResponseToCheckinForm(oleForm, droolsResponse);
146 
147         return droolsResponse;
148     }
149 
150     private void transferExchangeInfoFromDroolsResponseToCheckinForm(OLEForm oleForm, DroolsResponse droolsResponse) {
151         for (Iterator<String> iterator = droolsResponse.getDroolsExchange().getContext().keySet().iterator(); iterator.hasNext(); ) {
152             String key = iterator.next();
153             getDroolsExchange(oleForm).addToContext(key, droolsResponse.getDroolsExchange().getContext().get(key));
154         }
155     }
156 
157     public DroolsResponse preValidations(ItemRecord itemRecord, OLEForm oleForm) {
158         return preValidationForDamaged(itemRecord, oleForm);
159     }
160 
161     public DroolsResponse preValidationForDamaged(ItemRecord itemRecord, OLEForm oleForm) {
162         DroolsResponse droolsResponse;
163         droolsResponse = checkForDamagedItem(itemRecord);
164         if (droolsResponse != null) return droolsResponse;
165         return preValidationForClaimsReturned(itemRecord, oleForm);
166     }
167 
168     public DroolsResponse preValidationForClaimsReturned(ItemRecord itemRecord, OLEForm oleForm) {
169         DroolsResponse droolsResponse;
170         droolsResponse = checkForClaimsReturnedNote(itemRecord);
171         if (droolsResponse != null) return droolsResponse;
172         return preValidationForMissingPiece(itemRecord, oleForm);
173     }
174 
175     public DroolsResponse preValidationForMissingPiece(ItemRecord itemRecord, OLEForm oleForm) {
176         DroolsResponse droolsResponse;
177         droolsResponse = checkForMissingPieceNote(itemRecord);
178         setNoOfPieces(oleForm, itemRecord.getNumberOfPieces());
179         if (droolsResponse != null) return droolsResponse;
180         return preValidationForCheckinRequestExists(itemRecord, oleForm);
181     }
182 
183     public DroolsResponse preValidationForCheckinRequestExists(ItemRecord itemRecord, OLEForm oleForm) {
184         DroolsResponse droolsResponse;
185         droolsResponse = processIfCheckinRequestExist(itemRecord, oleForm);
186         if (droolsResponse != null) return droolsResponse;
187         OleLoanDocument oleLoanDocument = getOleLoanDocument(oleForm);
188         return processCheckinAfterPreValidation(itemRecord, oleForm, oleLoanDocument);
189     }
190 
191 
192     public DroolsResponse processCheckinAfterPreValidation(ItemRecord itemRecord, OLEForm oleForm, OleLoanDocument loanDocument) {
193         DroolsResponse droolsResponse;
194 
195         OleCirculationDesk oleCirculationDesk = getCircDeskLocationResolver().getOleCirculationDesk(getSelectedCirculationDesk(oleForm));
196         OleItemRecordForCirc oleItemRecordForCirc = ItemInfoUtil.getInstance().getOleItemRecordForCirc(itemRecord, oleCirculationDesk);
197         oleItemRecordForCirc.setOperatorCircLocation(oleCirculationDesk);
198         oleItemRecordForCirc.setCheckinLocation(oleCirculationDesk);
199 
200 
201         oleItemRecordForCirc.setItemRecord(itemRecord);
202         /*
203             oleItemSearch record is fetched to get all the bib/holdings/item information
204          */
205         OleItemSearch oleItemSearch = new DocstoreUtil().getOleItemSearchList(oleItemRecordForCirc.getItemUUID());
206 
207         boolean updateRecentlyReturnedTable = false;
208         droolsResponse = new DroolsResponse();
209         droolsResponse.setDroolsExchange(oleForm.getDroolsExchange());
210 
211         OlePatronDocument olePatronDocument = null;
212         if (null != loanDocument) {
213             olePatronDocument = loanDocument.getOlePatron();
214             ArrayList<Object> facts = new ArrayList<>();
215             facts.add(droolsResponse);
216             facts.add(oleItemRecordForCirc);
217             facts.add(oleCirculationDesk);
218 
219             fireRules(facts, null, "checkin-validation-for-loan");
220 
221             if (!ruleMatched(droolsResponse)) {
222                 droolsResponse.getErrorMessage().setErrorMessage("No checkin rule found!");
223                 droolsResponse.getErrorMessage().setErrorCode(DroolsConstants.GENERAL_MESSAGE_FLAG);
224                 return droolsResponse;
225             }
226 
227             facts.clear();
228 
229             facts.add(oleItemRecordForCirc);
230             ItemFineRate itemFineRate = new ItemFineRate();
231             facts.add(itemFineRate);
232             facts.add(olePatronDocument);
233             facts.add(loanDocument);
234 
235             fireRules(facts, null, "fine validation");
236 
237             try {
238                 updateLoanDocument(loanDocument, oleItemSearch, itemRecord);
239                 saveMissingPieceNote(oleForm);
240                 saveClaimsReturnedNote(oleForm);
241                 saveDamagedItemNote(oleForm);
242                 updateItemStatusAndCircCount(oleItemRecordForCirc);
243                 emailToPatronForOnHoldStatus();
244                 String billPayment = generateBillPayment(getSelectedCirculationDesk(oleForm), loanDocument, getCustomDueDateMap(oleForm), itemFineRate);
245                 if (StringUtils.isNotBlank(billPayment)) {
246                     getCheckedInItem(oleForm).setBillName(billPayment);
247 
248                 }
249             } catch (Exception e) {
250                 LOG.error(e.getStackTrace());
251             }
252 
253             if (null != oleItemRecordForCirc.getItemStatusToBeUpdatedTo() && oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.RECENTLY_RETURNED)) {
254                 updateRecentlyReturnedTable = true;
255             }
256 
257         } else {
258             ArrayList<Object> facts = new ArrayList<>();
259             facts.add(oleCirculationDesk);
260             facts.add(oleItemRecordForCirc);
261             facts.add(droolsResponse);
262 
263             fireRules(facts, null, "checkin-validation-for-no-loan");
264 
265             if (null != oleItemRecordForCirc.getItemStatusToBeUpdatedTo()) {
266                 updateItemStatusAndCircCount(oleItemRecordForCirc);
267                 if (oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.RECENTLY_RETURNED)) {
268                     updateRecentlyReturnedTable = true;
269                 }
270             } else {
271                 if (!ruleMatched(droolsResponse)) {
272                     droolsResponse.getErrorMessage().setErrorMessage("No checkin rule found!");
273                     droolsResponse.getErrorMessage().setErrorCode(DroolsConstants.GENERAL_MESSAGE_FLAG);
274                     return droolsResponse;
275                 }
276             }
277         }
278 
279         transferExchangeInfoFromDroolsResponseToCheckinForm(oleForm, droolsResponse);
280 
281         handleRecentlyReturnedRecord(oleItemRecordForCirc, updateRecentlyReturnedTable);
282 
283         updateCheckedInItemList(oleForm, itemRecord.getCheckInNote(), oleItemRecordForCirc, oleItemSearch, olePatronDocument);
284 
285 //        handleOnHoldRequestIfExists(oleItemRecordForCirc);
286 
287         handleIntransitStatus(oleItemRecordForCirc, oleForm);
288 
289         handleCheckinNote(oleForm, oleItemRecordForCirc);
290 
291         handleAutoCheckout(oleForm, oleItemRecordForCirc);
292 
293         return droolsResponse;
294     }
295 
296 
297     private DroolsResponse processIfCheckinRequestExist(ItemRecord itemRecord, OLEForm oleForm) {
298         OleDeliverRequestBo prioritizedRequest = ItemInfoUtil.getInstance().getPrioritizedRequest(itemRecord.getBarCode());
299         if (null != prioritizedRequest) {
300             DroolsResponse droolsResponse = new DroolsResponse();
301             droolsResponse.addErrorMessageCode(DroolsConstants.CHECKIN_REQUEST_EXITS_FOR_THIS_ITEM);
302             droolsResponse.addErrorMessage("Request already exist for this item. <br/><br/> Do you want to checkin this item?.");
303             return droolsResponse;
304         }
305         return null;
306     }
307 
308     private void saveMissingPieceNote(OLEForm oleForm) {
309         DroolsExchange droolsExchange = oleForm.getDroolsExchange();
310         ItemRecord itemRecord = (ItemRecord) droolsExchange.getContext().get("itemRecord");
311         OlePatronDocument olePatronDocument = (OlePatronDocument) droolsExchange.getContext().get("olePatronDocument");
312         if (StringUtils.isNotBlank(getMissingPieceMatchCheck(oleForm)) && getMissingPieceMatchCheck(oleForm).equalsIgnoreCase("mismatched")) {
313             Map<String, Object> missingPieceRecordInfo = new HashMap<>();
314             CheckinForm checkinForm = getCheckinForm(oleForm);
315             missingPieceRecordInfo.put("itemBarcode", checkinForm.getItemBarcode());
316             missingPieceRecordInfo.put("customDate", checkinForm.getCustomDueDateMap());
317             missingPieceRecordInfo.put("customTime", checkinForm.getCustomDueDateTime());
318             missingPieceRecordInfo.put("selectedCirculationDesk", checkinForm.getSelectedCirculationDesk());
319             missingPieceRecordInfo.put("missingPieceCount", checkinForm.getMissingPieceCount());
320             missingPieceRecordInfo.put("missingPieceNote", checkinForm.getMissingPieceNote());
321             getMissingPieceNoteHandler().updateMissingPieceRecord(itemRecord, missingPieceRecordInfo);
322             if (isRecordNoteForMissingPiece(oleForm)) {
323                 if (olePatronDocument != null) {
324                     getMissingPieceNoteHandler().savePatronNoteForMissingPiece(missingPieceRecordInfo, olePatronDocument, itemRecord);
325                 }
326             }
327         }
328     }
329 
330     private DroolsResponse checkForMissingPieceNote(ItemRecord itemRecord) {
331         int noOfPieces = StringUtils.isNotBlank(itemRecord.getNumberOfPieces()) ? Integer.parseInt(itemRecord.getNumberOfPieces()) : 0;
332         if (itemRecord.isMissingPieceFlag() && noOfPieces > 1) {
333             DroolsResponse droolsResponse = new DroolsResponse();
334             droolsResponse.addErrorMessageCode(DroolsConstants.ITEM_MISSING_PIECE);
335             droolsResponse.addErrorMessage(OLEConstants.VERIFY_PIECES + itemRecord.getNumberOfPieces() + OLEConstants.PIECES_RETURNED + OLEConstants.BREAK + "Total No of Pieces :      "
336                     + itemRecord.getNumberOfPieces() + OLEConstants.BREAK + "No of missing Pieces : " + (itemRecord.getMissingPiecesCount() != null ? itemRecord.getMissingPiecesCount() : "0"));
337             return droolsResponse;
338         }
339         return null;
340     }
341 
342     private void saveClaimsReturnedNote(OLEForm oleForm) {
343         DroolsExchange droolsExchange = oleForm.getDroolsExchange();
344         ItemRecord itemRecord = (ItemRecord) droolsExchange.getContext().get("itemRecord");
345         OlePatronDocument olePatronDocument = (OlePatronDocument) droolsExchange.getContext().get("olePatronDocument");
346         if (isRecordNoteForClaimsReturn(oleForm) && olePatronDocument != null) {
347             Map<String, Object> claimsRecordInfo = new HashMap<>();
348             CheckinForm checkinForm = getCheckinForm(oleForm);
349             claimsRecordInfo.put("itemBarcode", checkinForm.getItemBarcode());
350             claimsRecordInfo.put("customDate", checkinForm.getCustomDueDateMap());
351             claimsRecordInfo.put("customTime", checkinForm.getCustomDueDateTime());
352             claimsRecordInfo.put("selectedCirculationDesk", checkinForm.getSelectedCirculationDesk());
353             getClaimsReturnedNoteHandler().savePatronNoteForClaims(claimsRecordInfo, olePatronDocument);
354         }
355         itemRecord.setClaimsReturnedFlag(false);
356         itemRecord.setClaimsReturnedNote(null);
357         itemRecord.setClaimsReturnedFlagCreateDate(null);
358     }
359 
360     private DroolsResponse checkForClaimsReturnedNote(ItemRecord itemRecord) {
361         if (itemRecord.getClaimsReturnedFlag()) {
362             DroolsResponse droolsResponse = new DroolsResponse();
363             droolsResponse.addErrorMessageCode(DroolsConstants.ITEM_CLAIMS_RETURNED);
364             droolsResponse.addErrorMessage("Claims Returned item has been found!" + OLEConstants.BREAK + "Claims Returned Note: " + itemRecord.getClaimsReturnedNote());
365             return droolsResponse;
366         }
367         return null;
368     }
369 
370     private void saveDamagedItemNote(OLEForm oleForm) {
371         DroolsExchange droolsExchange = oleForm.getDroolsExchange();
372         OlePatronDocument olePatronDocument = (OlePatronDocument) droolsExchange.getContext().get("olePatronDocument");
373         if (isRecordNoteForDamagedItem(oleForm) && olePatronDocument != null) {
374             Map<String, Object> damagedRecordInfo = new HashMap<>();
375             CheckinForm checkinForm = getCheckinForm(oleForm);
376             damagedRecordInfo.put("itemBarcode", checkinForm.getItemBarcode());
377             damagedRecordInfo.put("customDate", checkinForm.getCustomDueDateMap());
378             damagedRecordInfo.put("customTime", checkinForm.getCustomDueDateTime());
379             damagedRecordInfo.put("selectedCirculationDesk", checkinForm.getSelectedCirculationDesk());
380             getDamagedItemNoteHandler().savePatronNoteForDamaged(damagedRecordInfo, olePatronDocument);
381         }
382     }
383 
384     private DroolsResponse checkForDamagedItem(ItemRecord itemRecord) {
385         if (itemRecord.isItemDamagedStatus()) {
386             DroolsResponse droolsResponse = new DroolsResponse();
387             droolsResponse.addErrorMessageCode(DroolsConstants.ITEM_DAMAGED);
388             droolsResponse.addErrorMessage("Item is Damaged. Do you want to continue?" + OLEConstants.BREAK + "Damaged Note: " + itemRecord.getDamagedItemNote());
389             return droolsResponse;
390         }
391         return null;
392     }
393 
394     private void handleIntransitStatus(OleItemRecordForCirc oleItemRecordForCirc, OLEForm oleForm) {
395         getDroolsExchange(oleForm).addToContext("oleItemRecordForCirc", oleItemRecordForCirc);
396         if(oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.ITEM_STATUS_IN_TRANSIT )|| oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.ITEM_STATUS_IN_TRANSIT_HOLD)) {
397             updateLoanInTransitRecordHistory(oleForm);
398         }
399     }
400 
401     public void updateLoanInTransitRecordHistory(OLEForm oleForm) {
402         OleItemRecordForCirc oleItemRecordForCirc = (OleItemRecordForCirc)getDroolsExchange(oleForm).getContext().get("oleItemRecordForCirc");
403         if (StringUtils.isNotBlank(oleItemRecordForCirc.getRouteToLocation())) {
404             ItemRecord itemRecord = null != oleItemRecordForCirc ? oleItemRecordForCirc.getItemRecord() : null;
405             OLELoanIntransitRecordHistory oleLoanIntransitRecordHistory = new OLELoanIntransitRecordHistory();
406             if(null != itemRecord) {
407                 oleLoanIntransitRecordHistory.setItemBarcode(itemRecord.getBarCode());
408                 oleLoanIntransitRecordHistory.setItemUUID(DocumentUniqueIDPrefix.getPrefixedId(itemRecord.getUniqueIdPrefix(),itemRecord.getItemId()));
409             }
410             oleLoanIntransitRecordHistory.setHomeCirculationDesk(null != oleItemRecordForCirc.getCheckinLocation() ? oleItemRecordForCirc.getCheckinLocation().getCirculationDeskCode() : getSelectedCirculationDesk(oleForm));
411             oleLoanIntransitRecordHistory.setRouteCirculationDesk(oleItemRecordForCirc.getRouteToLocation());
412             oleLoanIntransitRecordHistory.setOperator(getOperatorId(oleForm));
413             try {
414                 oleLoanIntransitRecordHistory.setReturnedDateTime(processDateAndTimeForAlterDueDate(getCustomDueDateMap(oleForm), getCustomDueDateTime(oleForm)));
415             } catch (Exception e) {
416                 e.printStackTrace();
417             }
418             getBusinessObjectService().save(oleLoanIntransitRecordHistory);
419         }
420     }
421 
422     private void handleAutoCheckout(OLEForm oleForm, OleItemRecordForCirc oleItemRecordForCirc) {
423         OleDeliverRequestBo oleDeliverRequestBo = oleItemRecordForCirc.getOleDeliverRequestBo();
424         if (null != oleDeliverRequestBo && (oleDeliverRequestBo.getOleDeliverRequestType().getRequestTypeCode().contains(OLEConstants.OleDeliverRequest.HOLD_DELIVERY) ||
425                 oleDeliverRequestBo.getOleDeliverRequestType().getRequestTypeCode().contains(OLEConstants.OleDeliverRequest.RECALL_DELIVERY))) {
426             getDroolsExchange(oleForm).addToContext("autoCheckout", true);
427             getDroolsExchange(oleForm).addToContext("requestBo", oleDeliverRequestBo);
428         }
429     }
430 
431     private void handleCheckinNote(OLEForm oleForm, OleItemRecordForCirc oleItemRecordForCirc) {
432         if (StringUtils.isNotBlank(oleItemRecordForCirc.getItemRecord().getCheckInNote())) {
433             getDroolsExchange(oleForm).addToContext("checkinNote", true);
434         }
435     }
436 
437     private void handleOnHoldRequestIfExists(OleItemRecordForCirc oleItemRecordForCirc) {
438         OleDeliverRequestBo oleDeliverRequestBo = oleItemRecordForCirc.getOleDeliverRequestBo();
439         if (null != oleItemRecordForCirc.getItemStatusToBeUpdatedTo() && oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equalsIgnoreCase(OLEConstants.ITEM_STATUS_ON_HOLD) &&
440                 null != oleDeliverRequestBo && oleDeliverRequestBo.getOleDeliverRequestType().getRequestTypeCode().equals("Hold/Hold Request")) {
441             getOnHoldCourtesyNoticeUtil().sendOnHoldNotice(oleItemRecordForCirc.getOleDeliverRequestBo());
442         }
443     }
444 
445     public ItemInfoUtil getItemInfoUtil() {
446         return ItemInfoUtil.getInstance();
447     }
448 
449     public OlePrintSlipUtil getOlePrintSlipUtil(OleItemRecordForCirc oleItemRecordForCirc) {
450         String itemStatusToBeUpdatedTo = oleItemRecordForCirc.getItemStatusToBeUpdatedTo();
451         OleCirculationDesk oleCirculationDesk = null != oleItemRecordForCirc ? oleItemRecordForCirc.getCheckinLocation() : null;
452 
453         if (itemStatusToBeUpdatedTo.equalsIgnoreCase(OLEConstants.ITEM_STATUS_IN_TRANSIT)) {
454             return new InTransitRegularPrintSlipUtil();
455         } else if (itemStatusToBeUpdatedTo.equalsIgnoreCase(OLEConstants.ITEM_STATUS_IN_TRANSIT_HOLD)) {
456             return new InTransitForHoldRegularPrintSlipUtil();
457         } else if (itemStatusToBeUpdatedTo.equalsIgnoreCase(OLEConstants.ITEM_STATUS_IN_TRANSIT_STAFF)) {
458             return new InTransitForStaffRegularPrintSlipUtil();
459         } else if (itemStatusToBeUpdatedTo.equalsIgnoreCase(OLEConstants.ITEM_STATUS_ON_HOLD)) {
460             if (oleCirculationDesk != null && oleCirculationDesk.getHoldFormat() != null && oleCirculationDesk.getHoldFormat().equals(OLEConstants.RECEIPT_PRINTER)) {
461                 return new OnHoldRecieptPrintSlipUtil();
462             } else {
463                 return new OnHoldRegularPrintSlipUtil();
464             }
465         } else if (itemStatusToBeUpdatedTo.equalsIgnoreCase(OLEConstants.ITEM_STATUS_IN_TRANSIT_LOAN)) {
466             return new InTransitForLoanRegularPrintSlipUtil();
467         }
468         return null;
469     }
470 
471     private void handleRecentlyReturnedRecord(OleItemRecordForCirc oleItemRecordForCirc, boolean updateRecentlyReturnedTable) {
472         if (updateRecentlyReturnedTable) {
473             createOrUpdateRecentlyReturnedRecord(oleItemRecordForCirc.getItemUUID(), oleItemRecordForCirc.getOperatorCircLocation().getCirculationDeskId());
474         }
475     }
476 
477     private void emailToPatronForOnHoldStatus() {
478 
479     }
480 
481     public boolean ruleMatched(DroolsResponse droolsResponse) {
482         if (droolsResponse.isRuleMatched()) {
483             return true;
484         }
485         return false;
486     }
487 
488     private void updateCheckedInItemList(OLEForm oleForm, String checkinNote, OleItemRecordForCirc oleItemRecordForCirc, OleItemSearch oleItemSearch, OlePatronDocument olePatronDocument) {
489         CheckedInItem checkedInItem = new CheckedInItem();
490         SimpleDateFormat dateFormat = new SimpleDateFormat(RiceConstants.SIMPLE_DATE_FORMAT_FOR_DATE + " " + RiceConstants.SIMPLE_DATE_FORMAT_FOR_TIME);
491         checkedInItem.setCheckinNote(checkinNote);
492         checkedInItem.setTitle(oleItemSearch.getTitle());
493         checkedInItem.setItemId(oleItemSearch.getItemBarCode());
494         checkedInItem.setAuthor(oleItemSearch.getAuthor());
495         checkedInItem.setBibUuid(oleItemSearch.getBibUUID());
496         checkedInItem.setInstanceUuid(oleItemSearch.getInstanceUUID());
497         checkedInItem.setItemUuid(oleItemSearch.getItemUUID());
498         String location = null != oleItemSearch.getShelvingLocation() ? oleItemSearch.getShelvingLocation().split("/")[oleItemSearch.getShelvingLocation().split("/").length - 1] : oleItemSearch.getShelvingLocation();
499         try {
500             checkedInItem.setLocation(getOleLoanDocumentsFromSolrBuilder().getLocationFullName(location));
501         } catch (Exception e) {
502             e.printStackTrace();
503         }
504         checkedInItem.setLocationCode(oleItemSearch.getShelvingLocation());
505         checkedInItem.setCallNumber(oleItemSearch.getCallNumber());
506         checkedInItem.setCopyNumber(oleItemSearch.getCopyNumber());
507         checkedInItem.setEnumeration(oleItemSearch.getEnumeration());
508         checkedInItem.setChronology(oleItemSearch.getChronology());
509         try {
510             checkedInItem.setCheckInDate(dateFormat.format(processDateAndTimeForAlterDueDate(getCustomDueDateMap(oleForm),getCustomDueDateTime(oleForm))));
511         } catch (Exception e) {
512             e.printStackTrace();
513         }
514         checkedInItem.setItemStatus(oleItemRecordForCirc.getItemStatusToBeUpdatedTo());
515         checkedInItem.setPatronId((olePatronDocument != null) ? olePatronDocument.getOlePatronId() : "");
516         checkedInItem.setPatronBarcode((olePatronDocument != null) ? olePatronDocument.getBarcode() : "");
517         checkedInItem.setBorrowerType((olePatronDocument != null) ? olePatronDocument.getBorrowerTypeName() : "");
518         checkedInItem.setBillName(getBillName(olePatronDocument, oleItemSearch.getItemBarCode()));
519         checkedInItem.setItemType(oleItemSearch.getItemType());
520         if(oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.ITEM_STATUS_IN_TRANSIT )|| oleItemRecordForCirc.getItemStatusToBeUpdatedTo().equals(OLEConstants.ITEM_STATUS_IN_TRANSIT_HOLD)) {
521             checkedInItem.setRouteToLocation(oleItemRecordForCirc.getRouteToLocation());
522         }
523         addCheckedInItemToCheckedInItemList(checkedInItem, oleForm);
524         setCheckedInItem(checkedInItem, oleForm);
525     }
526 
527     private String getBillName(OlePatronDocument olePatronDocument, String itemBarcode) {
528         if (null != olePatronDocument) {
529             List<PatronBillPayment> patronBillPayments = olePatronDocument.getPatronBillPayments();
530             for (Iterator<PatronBillPayment> iterator = patronBillPayments.iterator(); iterator.hasNext(); ) {
531                 PatronBillPayment patronBillPayment = iterator.next();
532                 for (Iterator<FeeType> patronBillPaymentIterator = patronBillPayment.getFeeType().iterator(); patronBillPaymentIterator.hasNext(); ) {
533                     FeeType feeType = patronBillPaymentIterator.next();
534                     if (null != feeType.getItemBarcode() && feeType.getItemBarcode().equalsIgnoreCase(itemBarcode)) {
535                         return feeType.getOleFeeType().getFeeTypeCode();
536                     }
537                 }
538             }
539         }
540         return null;
541     }
542 
543     private String generateBillPayment(String selectedCirculationDesk, OleLoanDocument loanDocument, Date customDueDateMap, ItemFineRate itemFineRate) throws Exception {
544         String billPayment = null;
545         if (null == itemFineRate.getFineRate() || null == itemFineRate.getMaxFine() || null == itemFineRate.getInterval()) {
546             LOG.error("No fine rule found");
547         } else {
548             Double overdueFine = new OleCalendarServiceImpl().calculateOverdueFine(selectedCirculationDesk, loanDocument.getLoanDueDate(), new Timestamp(customDueDateMap.getTime()), itemFineRate);
549             overdueFine = overdueFine >= itemFineRate.getMaxFine() ? itemFineRate.getMaxFine() : overdueFine;
550 
551             if (null != loanDocument.getReplacementBill() && loanDocument.getReplacementBill().compareTo(BigDecimal.ZERO) > 0) {
552                 billPayment = getPatronBillGenerator().generatePatronBillPayment(loanDocument, OLEConstants.REPLACEMENT_FEE, loanDocument.getReplacementBill().doubleValue());
553             } else if (null != overdueFine && overdueFine > 0) {
554                 billPayment = getPatronBillGenerator().generatePatronBillPayment(loanDocument, OLEConstants.OVERDUE_FINE, overdueFine);
555             }
556         }
557 
558         return billPayment;
559     }
560 
561     private PatronBillGenerator getPatronBillGenerator() {
562         return new PatronBillGenerator();
563     }
564 
565     private void updateLoanDocument(OleLoanDocument loanDocument, OleItemSearch oleItemSearch, ItemRecord itemRecord) throws Exception {
566         createCirculationHistoryAndTemporaryHistoryRecords(loanDocument, oleItemSearch, itemRecord);
567         getBusinessObjectService().delete(loanDocument);
568     }
569 
570     private void updateItemStatusAndCircCount(OleItemRecordForCirc oleItemRecordForCirc) {
571         HashMap parameterValues = new HashMap();
572         parameterValues.put("patronId", null);
573         parameterValues.put("proxyPatronId", null);
574         parameterValues.put("itemCheckoutDateTime", null);
575         parameterValues.put("loanDueDate", null);
576         parameterValues.put("numRenewals", null);
577         parameterValues.put("itemStatus", oleItemRecordForCirc.getItemStatusToBeUpdatedTo());
578         parameterValues.put("locationsCheckinCountRecordToBeUpdated", oleItemRecordForCirc.getLocationsCheckinCountRecordToBeUpdated());
579         parameterValues.put("claimsReturnNote", oleItemRecordForCirc.getItemRecord().getClaimsReturnedNote());
580         Timestamp claimsReturnedFlagCreateDate = oleItemRecordForCirc.getItemRecord().getClaimsReturnedFlagCreateDate();
581         parameterValues.put("ClaimsReturnedDate", claimsReturnedFlagCreateDate == null ? claimsReturnedFlagCreateDate : convertToString(claimsReturnedFlagCreateDate));
582         parameterValues.put("itemClaimsReturnedRecords", prepareClaimsReturnHistoryRecords(oleItemRecordForCirc.getItemRecord()));
583         parameterValues.put("itemClaimsReturnedFlag", oleItemRecordForCirc.getItemRecord().getClaimsReturnedFlag());
584         parameterValues.put("missingPieceItemFlag", oleItemRecordForCirc.getItemRecord().isMissingPieceFlag());
585         parameterValues.put("missingPieceItemNote", oleItemRecordForCirc.getItemRecord().getMissingPieceFlagNote());
586         parameterValues.put("missingPieceItemCount", oleItemRecordForCirc.getItemRecord().getMissingPiecesCount());
587         parameterValues.put("noOfmissingPiece", oleItemRecordForCirc.getItemRecord().getNumberOfPieces());
588         Timestamp missingPieceItemDate = oleItemRecordForCirc.getItemRecord().getMissingPieceEffectiveDate();
589         parameterValues.put("missingPieceItemDate", missingPieceItemDate == null ? missingPieceItemDate : convertToString(missingPieceItemDate));
590         parameterValues.put("itemMissingPieceItemRecords", prepareMissingPieceHistoryRecords(oleItemRecordForCirc.getItemRecord()));
591         updateItemInfoInSolr(parameterValues, oleItemRecordForCirc.getItemUUID(), true);
592     }
593 
594     private List<ItemClaimsReturnedRecord> prepareClaimsReturnHistoryRecords(ItemRecord itemRecord) {
595         List<org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.ItemClaimsReturnedRecord> claimsReturnedRecordList = itemRecord.getItemClaimsReturnedRecords();
596         List<ItemClaimsReturnedRecord> itemClaimsReturnedRecordList = new ArrayList<>();
597         for (Iterator<org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.ItemClaimsReturnedRecord> iterator = claimsReturnedRecordList.iterator(); iterator.hasNext(); ) {
598             org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.ItemClaimsReturnedRecord itemClaimsReturnedRecord = iterator.next();
599             ItemClaimsReturnedRecord claimsReturnedRecord = new ItemClaimsReturnedRecord();
600             if (itemClaimsReturnedRecord.getClaimsReturnedFlagCreateDate() != null && !itemClaimsReturnedRecord.getClaimsReturnedFlagCreateDate().toString().isEmpty()) {
601                 String formatedDateStringForClaimsReturn = convertToString(itemClaimsReturnedRecord.getClaimsReturnedFlagCreateDate());
602                 claimsReturnedRecord.setClaimsReturnedFlagCreateDate(formatedDateStringForClaimsReturn);
603             }
604             claimsReturnedRecord.setClaimsReturnedNote(itemClaimsReturnedRecord.getClaimsReturnedNote());
605             claimsReturnedRecord.setClaimsReturnedPatronBarcode(itemClaimsReturnedRecord.getClaimsReturnedPatronBarcode());
606             claimsReturnedRecord.setClaimsReturnedOperatorId(itemClaimsReturnedRecord.getClaimsReturnedOperatorId());
607             claimsReturnedRecord.setItemId(itemClaimsReturnedRecord.getItemId());
608             itemClaimsReturnedRecordList.add(claimsReturnedRecord);
609         }
610         return itemClaimsReturnedRecordList;
611     }
612 
613     private List<MissingPieceItemRecord> prepareMissingPieceHistoryRecords(ItemRecord itemRecord) {
614         SimpleDateFormat dateFormatForMissingItem = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
615         List<org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.MissingPieceItemRecord> missingPieceItemRecordList = itemRecord.getMissingPieceItemRecordList();
616         List<MissingPieceItemRecord> itemMissingPieceRecordList = new ArrayList<>();
617         for (Iterator<org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.MissingPieceItemRecord> iterator = missingPieceItemRecordList.iterator(); iterator.hasNext(); ) {
618             org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.MissingPieceItemRecord itemMissingPieceItemRecord = iterator.next();
619             MissingPieceItemRecord missingPieceItemRecord = new MissingPieceItemRecord();
620             if (itemMissingPieceItemRecord.getMissingPieceDate() != null && !itemMissingPieceItemRecord.getMissingPieceDate().toString().isEmpty()) {
621                 Timestamp formatedDateStringForDamagedItem = itemMissingPieceItemRecord.getMissingPieceDate();
622                 missingPieceItemRecord.setMissingPieceDate(dateFormatForMissingItem.format(formatedDateStringForDamagedItem));
623             }
624             missingPieceItemRecord.setMissingPieceFlagNote(itemMissingPieceItemRecord.getMissingPieceFlagNote());
625             missingPieceItemRecord.setMissingPieceCount(itemMissingPieceItemRecord.getMissingPieceCount());
626             missingPieceItemRecord.setPatronBarcode(itemMissingPieceItemRecord.getPatronBarcode());
627             missingPieceItemRecord.setOperatorId(itemMissingPieceItemRecord.getOperatorId());
628             missingPieceItemRecord.setItemId(itemMissingPieceItemRecord.getItemId());
629             itemMissingPieceRecordList.add(missingPieceItemRecord);
630         }
631         return itemMissingPieceRecordList;
632     }
633 
634 
635     private OleLoanDocument getLoanDocument(String itemBarcode) {
636         HashMap<String, Object> criteriaMap = new HashMap<>();
637         criteriaMap.put("itemId", itemBarcode);
638         List<OleLoanDocument> oleLoanDocuments = (List<OleLoanDocument>) getBusinessObjectService().findMatching(OleLoanDocument.class, criteriaMap);
639         if (!CollectionUtils.isEmpty(oleLoanDocuments)) {
640             return oleLoanDocuments.get(0);
641         }
642         return null;
643     }
644 
645     private void createCirculationHistoryAndTemporaryHistoryRecords(OleLoanDocument oleLoanDocument, OleItemSearch oleItemSearch, ItemRecord itemRecord) throws Exception {
646         try {
647             OlePatronDocument olePatronDocument = oleLoanDocument.getOlePatron();
648             OleCirculationHistory oleCirculationHistory = new OleCirculationHistory();
649             oleCirculationHistory.setLoanId(oleLoanDocument.getLoanId());
650             oleCirculationHistory.setCirculationPolicyId(oleLoanDocument.getCirculationPolicyId());
651             oleCirculationHistory.setBibAuthor(oleItemSearch.getAuthor());
652             oleCirculationHistory.setBibTitle(oleItemSearch.getTitle());
653             oleCirculationHistory.setCheckInDate(oleLoanDocument.getCheckInDate() != null ? oleLoanDocument.getCheckInDate() : new Timestamp(System.currentTimeMillis()));
654             oleCirculationHistory.setCreateDate(oleLoanDocument.getCreateDate());
655             oleCirculationHistory.setCirculationLocationId(oleLoanDocument.getCirculationLocationId());
656             oleCirculationHistory.setDueDate(oleLoanDocument.getLoanDueDate());
657             oleCirculationHistory.setItemId(oleLoanDocument.getItemId());
658             oleCirculationHistory.setNumberOfOverdueNoticesSent(oleLoanDocument.getNumberOfOverdueNoticesSent());
659             oleCirculationHistory.setNumberOfRenewals(oleLoanDocument.getNumberOfRenewals());
660             oleCirculationHistory.setStatisticalCategory(olePatronDocument.getStatisticalCategory());
661             oleCirculationHistory.setRepaymentFeePatronBillId(oleLoanDocument.getRepaymentFeePatronBillId());
662             oleCirculationHistory.setProxyPatronId(olePatronDocument.getProxyPatronId());
663             if (olePatronDocument.getOleBorrowerType() != null) {
664                 oleCirculationHistory.setPatronTypeId(olePatronDocument.getOleBorrowerType().getBorrowerTypeId());
665             }
666             oleCirculationHistory.setPatronId(oleLoanDocument.getPatronId());
667             oleCirculationHistory.setPastDueDate(oleLoanDocument.getPastDueDate());
668             oleCirculationHistory.setOverdueNoticeDate(oleLoanDocument.getOverDueNoticeDate());
669             oleCirculationHistory.setOleRequestId(oleLoanDocument.getOleRequestId());
670             oleCirculationHistory.setItemUuid(oleLoanDocument.getItemUuid());
671             oleCirculationHistory.setItemLocation(itemRecord.getLocation());
672             oleCirculationHistory.setHoldingsLocation(getHoldingsLocation(itemRecord.getHoldingsId()));
673 
674             OleCirculationHistory savedCircHistoryRecord = getBusinessObjectService().save(oleCirculationHistory);
675 
676             OleTemporaryCirculationHistory oleTemporaryCirculationHistory = new OleTemporaryCirculationHistory();
677             oleTemporaryCirculationHistory.setCirculationLocationId(oleLoanDocument.getCirculationLocationId());
678             oleTemporaryCirculationHistory.setOlePatronId(oleLoanDocument.getPatronId());
679             oleTemporaryCirculationHistory.setItemId(oleLoanDocument.getItemId());
680             oleTemporaryCirculationHistory.setCheckInDate(oleLoanDocument.getCheckInDate() != null ? oleLoanDocument.getCheckInDate() : new Timestamp(System.currentTimeMillis()));
681             oleTemporaryCirculationHistory.setItemUuid(oleLoanDocument.getItemUuid());
682             oleTemporaryCirculationHistory.setDueDate(oleLoanDocument.getLoanDueDate());
683             oleTemporaryCirculationHistory.setCheckOutDate(oleLoanDocument.getCreateDate());
684             OleTemporaryCirculationHistory savedTempCircHistoryRecord = getBusinessObjectService().save(oleTemporaryCirculationHistory);
685 
686         } catch (Exception tempHistoryException) {
687             throw new Exception("Unable to record the transaction in temporary circulation history.");
688         }
689 
690     }
691 
692     private String getHoldingsLocation(String holdignsId) {
693         HashMap<String, Object> map = new HashMap<>();
694         map.put("holdingsId", holdignsId);
695         HoldingsRecord byPrimaryKey = getBusinessObjectService().findByPrimaryKey(HoldingsRecord.class, map);
696         if (null != byPrimaryKey) {
697             return byPrimaryKey.getLocation();
698         }
699         return null;
700     }
701 
702     private void createOrUpdateRecentlyReturnedRecord(String itemUUID, String circulationDeskId) {
703         HashMap<String, String> map = new HashMap<String, String>();
704         map.put("itemUuid", itemUUID);
705         OleRecentlyReturned oleRecentlyReturned = getBusinessObjectService().findByPrimaryKey(OleRecentlyReturned.class, map);
706         if (oleRecentlyReturned != null) {
707             oleRecentlyReturned.setCirculationDeskId(circulationDeskId);
708         } else {
709             oleRecentlyReturned = new OleRecentlyReturned();
710             oleRecentlyReturned.setCirculationDeskId(circulationDeskId);
711             oleRecentlyReturned.setItemUuid(itemUUID);
712         }
713         getBusinessObjectService().save(oleRecentlyReturned);
714     }
715 
716     private OleLoanDocumentsFromSolrBuilder getOleLoanDocumentsFromSolrBuilder() {
717         if (null == oleLoanDocumentsFromSolrBuilder) {
718             oleLoanDocumentsFromSolrBuilder = new OleLoanDocumentsFromSolrBuilder();
719         }
720         return oleLoanDocumentsFromSolrBuilder;
721     }
722 
723 }