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
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
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
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 }