001package org.kuali.ole.deliver.controller;
002
003import org.apache.commons.lang3.StringUtils;
004import org.apache.log4j.Logger;
005import org.kuali.asr.ASRConstants;
006import org.kuali.asr.service.ASRHelperServiceImpl;
007import org.kuali.ole.DataCarrierService;
008import org.kuali.ole.OLEConstants;
009import org.kuali.ole.deliver.batch.OleDeliverBatchServiceImpl;
010import org.kuali.ole.deliver.bo.*;
011import org.kuali.ole.deliver.processor.LoanProcessor;
012import org.kuali.ole.deliver.service.CircDeskLocationResolver;
013import org.kuali.ole.deliver.service.OLEDeliverNoticeHelperService;
014import org.kuali.ole.deliver.service.OleDeliverRequestDocumentHelperServiceImpl;
015import org.kuali.ole.deliver.service.impl.OLEDeliverNoticeHelperServiceImpl;
016import org.kuali.ole.docstore.common.document.content.instance.Item;
017import org.kuali.ole.ingest.pojo.MatchBo;
018import org.kuali.ole.service.OleCirculationPolicyService;
019import org.kuali.ole.service.OleCirculationPolicyServiceImpl;
020import org.kuali.ole.sys.context.SpringContext;
021import org.kuali.ole.util.DocstoreUtil;
022import org.kuali.rice.core.api.exception.RiceRuntimeException;
023import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
024import org.kuali.rice.core.api.util.xml.XmlHelper;
025import org.kuali.rice.kew.rule.xmlrouting.XPathHelper;
026import org.kuali.rice.krad.maintenance.MaintenanceDocument;
027import org.kuali.rice.krad.maintenance.MaintenanceUtils;
028import org.kuali.rice.krad.service.KRADServiceLocator;
029import org.kuali.rice.krad.util.GlobalVariables;
030import org.kuali.rice.krad.util.KRADConstants;
031import org.kuali.rice.krad.util.ObjectUtils;
032import org.kuali.rice.krad.web.controller.MaintenanceDocumentController;
033import org.kuali.rice.krad.web.form.DocumentFormBase;
034import org.kuali.rice.krad.web.form.MaintenanceDocumentForm;
035import org.kuali.rice.krad.web.form.UifFormBase;
036import org.kuali.rice.krms.api.KrmsApiServiceLocator;
037import org.kuali.rice.krms.api.engine.*;
038import org.kuali.rice.krms.impl.repository.AgendaBo;
039import org.springframework.stereotype.Controller;
040import org.springframework.validation.BindingResult;
041import org.springframework.web.bind.annotation.ModelAttribute;
042import org.springframework.web.bind.annotation.RequestMapping;
043import org.springframework.web.servlet.ModelAndView;
044import org.w3c.dom.Document;
045
046import javax.servlet.http.HttpServletRequest;
047import javax.servlet.http.HttpServletResponse;
048import javax.xml.xpath.XPath;
049import javax.xml.xpath.XPathConstants;
050import java.io.ByteArrayInputStream;
051import java.sql.Timestamp;
052import java.util.*;
053
054/**
055 * Created with IntelliJ IDEA.
056 * User: ?
057 * Date: 10/17/12
058 * Time: 1:59 PM
059 * To change this template use File | Settings | File Templates.
060 */
061@Controller
062@RequestMapping(value = "/deliverRequestMaintenance")
063public class OleDeliverRequestMaintenanceDocumentController extends MaintenanceDocumentController {
064    private static final Logger LOG = Logger.getLogger(OleDeliverRequestMaintenanceDocumentController.class);
065    private static final String NAMESPACE_CODE_SELECTOR = "namespaceCode";
066    private static final String NAME_SELECTOR = "name";
067    private final static String RULE_EVALUATED = "Rule Evaluated";
068    private final static String ROUTED_EXTERNAL = "Routed External";
069    private LoanProcessor loanProcessor;
070    private DocstoreUtil docstoreUtil = getDocstoreUtil();
071    private OleDeliverRequestDocumentHelperServiceImpl service =  getService();
072    private OLEDeliverNoticeHelperService oleDeliverNoticeHelperService ;
073    private OleCirculationPolicyService oleCirculationPolicyService;
074    private CircDeskLocationResolver circDeskLocationResolver;
075
076    private CircDeskLocationResolver getCircDeskLocationResolver() {
077        if (circDeskLocationResolver == null) {
078            circDeskLocationResolver = new CircDeskLocationResolver();
079        }
080        return circDeskLocationResolver;
081    }
082
083    public void setCircDeskLocationResolver(CircDeskLocationResolver circDeskLocationResolver) {
084        this.circDeskLocationResolver = circDeskLocationResolver;
085    }
086    /**
087     * This method initiate LoanProcessor.
088     *
089     * @return LoanProcessor
090     */
091    private LoanProcessor getLoanProcessor() {
092        if (loanProcessor == null) {
093            loanProcessor = new LoanProcessor();
094        }
095        return loanProcessor;
096    }
097
098    public DocstoreUtil getDocstoreUtil(){
099        if(docstoreUtil == null){
100            docstoreUtil = new DocstoreUtil();
101        }
102        return docstoreUtil;
103    }
104
105    public OleDeliverRequestDocumentHelperServiceImpl getService(){
106        if(service == null){
107            service = new OleDeliverRequestDocumentHelperServiceImpl();
108        }
109        return service;
110
111    }
112
113    public OLEDeliverNoticeHelperService getOleDeliverNoticeHelperService() {
114        if(oleDeliverNoticeHelperService ==null){
115            oleDeliverNoticeHelperService = SpringContext.getBean(OLEDeliverNoticeHelperServiceImpl.class);
116        }
117        return oleDeliverNoticeHelperService;
118    }
119
120    /**
121     * Gets the oleCirculationPolicyService attribute.
122     *
123     * @return Returns the oleCirculationPolicyService
124     */
125    public OleCirculationPolicyService getOleCirculationPolicyService() {
126        if (null == oleCirculationPolicyService) {
127            oleCirculationPolicyService = SpringContext.getBean(OleCirculationPolicyServiceImpl.class);
128        }
129        return oleCirculationPolicyService;
130    }
131
132    public void setOleDeliverNoticeHelperService(OLEDeliverNoticeHelperService oleDeliverNoticeHelperService) {
133        this.oleDeliverNoticeHelperService = oleDeliverNoticeHelperService;
134    }
135
136    @RequestMapping(params = "methodToCall=" + "maintenanceCancel")
137    public ModelAndView maintenanceCancel(@ModelAttribute("KualiForm") MaintenanceDocumentForm form, BindingResult result,
138                                          HttpServletRequest request, HttpServletResponse response) throws Exception {
139        setupMaintenanceForDelete(form, request, "Cancel");
140        return getUIFModelAndView(form);
141    }
142
143
144    /**
145     * This method invokes deleteAttachment method to delete attachment and set the error accordingly ..
146     *
147     * @param form
148     * @param result
149     * @param request
150     * @param response
151     * @return ModelAndView
152     * @throws Exception
153     */
154    @RequestMapping(params = "methodToCall=" + "cancelDocument")
155    public ModelAndView cancelDocument(@ModelAttribute("KualiForm") MaintenanceDocumentForm form, BindingResult result,
156                                       HttpServletRequest request, HttpServletResponse response) throws Exception {
157        LOG.debug("Inside Cancel document");
158        MaintenanceDocument document = form.getDocument();
159        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) document.getOldMaintainableObject().getDataObject();
160        service.cancelDocument(oleDeliverRequestBo);
161
162        return back(form, result, request, response);
163    }
164
165    /**
166     * This method populates confirmation to delete the document.
167     *
168     * @param form
169     * @param request
170     * @param maintenanceAction
171     */
172    protected void setupMaintenanceForDelete(MaintenanceDocumentForm form, HttpServletRequest request, String maintenanceAction) {
173        MaintenanceDocument document = form.getDocument();
174        if (document == null) {
175            document = getMaintenanceDocumentService()
176                    .setupNewMaintenanceDocument(form.getDataObjectClassName(), form.getDocTypeName(),
177                            maintenanceAction);
178
179            form.setDocument(document);
180            form.setDocTypeName(document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName());
181        }
182
183        form.setMaintenanceAction(maintenanceAction);
184        getMaintenanceDocumentService().setupMaintenanceObject(document, maintenanceAction, request.getParameterMap());
185        MaintenanceUtils.checkForLockingDocument(document, false);
186    }
187
188    @Override
189    @RequestMapping(params = "methodToCall=route")
190    public ModelAndView route(@ModelAttribute("KualiForm") DocumentFormBase form, BindingResult result,
191                              HttpServletRequest request, HttpServletResponse response) {
192        LOG.debug("Inside route document");
193
194        MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
195        MaintenanceDocument maintenanceDocument = (MaintenanceDocument) form.getDocument();
196        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) maintenanceDocument.getDocumentDataObject();
197        oleDeliverRequestBo.setMessage(null);
198        oleDeliverRequestBo.setValidToProcess(true);
199        if (oleDeliverRequestBo.getOperatorModifiedId() == null) {
200            if (!docstoreUtil.isItemAvailableInDocStore(oleDeliverRequestBo)) {
201                oleDeliverRequestBo.setValidToProcess(false);
202                GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID, OLEConstants.ITEM_NOT_AVAILABLE);
203                //return super.route(form,result,request,response);
204            }
205
206            oleDeliverRequestBo = service.processRequestType(oleDeliverRequestBo);
207            if (oleDeliverRequestBo.getBorrowerId() == null) {
208                oleDeliverRequestBo.setValidToProcess(false);
209                GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.BORROWER_ID, OLEConstants.OleDeliverRequest.INVALID_PATRON_BARCODE);
210                return getUIFModelAndView(form);
211            }
212            if (oleDeliverRequestBo.getRequestTypeId() == null || (oleDeliverRequestBo.getRequestTypeId() != null && oleDeliverRequestBo.getRequestTypeId().trim().isEmpty())) {
213                GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, OLEConstants.OleDeliverRequest.INVALID_REQUEST_TYPE);
214                oleDeliverRequestBo.setValidToProcess(false);
215                // return getUIFModelAndView(form);
216            }
217            if (oleDeliverRequestBo.getRequestCreator().equals(OLEConstants.OleDeliverRequest.REQUESTER_PROXY_PATRON) && oleDeliverRequestBo.getProxyBorrowerId() == null) {
218                GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.PROXY_BORROWER_ID, OLEConstants.OleDeliverRequest.INVALID_PROXY_PATRON);
219                oleDeliverRequestBo.setValidToProcess(false);
220                //  return getUIFModelAndView(form);
221            }
222            if (oleDeliverRequestBo.getRequestTypeId() != null && !oleDeliverRequestBo.getRequestTypeId().equals("7") && !oleDeliverRequestBo.getRequestTypeId().equals("8")) {
223
224                String message = service.patronRecordExpired(oleDeliverRequestBo);
225                if (message != null) {
226                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.BORROWER_ID, message);
227                    oleDeliverRequestBo.setValidToProcess(false);
228                }
229
230                if (!service.isValidProxyPatron(oleDeliverRequestBo)) {
231                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.PROXY_BORROWER_ID, OLEConstants.OleDeliverRequest.INVALID_PROXY);
232                    oleDeliverRequestBo.setValidToProcess(false);
233                }
234                if (!service.validateDeliveryPrivilege(oleDeliverRequestBo)) {
235                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.NO_DELIVERY_PRIVILEGE);
236                    oleDeliverRequestBo.setValidToProcess(false);
237                }
238                if (!service.validatePagingPrivilege(oleDeliverRequestBo)) {
239                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.NO_PAGE_PRIVILEGE);
240                    oleDeliverRequestBo.setValidToProcess(false);
241                }
242
243                if (service.isRequestAlreadyRaisedByPatron(oleDeliverRequestBo)) {
244                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.ALREADY_RAISED);
245                    oleDeliverRequestBo.setValidToProcess(false);
246                }
247
248                /* if( service.isItemAvailable(oleDeliverRequestBo)){
249                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID,OLEConstants.OleDeliverRequest.ITEM_AVAILABLE);
250                }*/
251                ASRHelperServiceImpl asrHelperService = new ASRHelperServiceImpl();
252                String itemLocation = oleDeliverRequestBo.getItemLocation();
253                if(itemLocation!=null ){
254                    if (oleDeliverRequestBo.isASRItem() && oleDeliverRequestBo.getItemStatus().equals(getLoanProcessor().getParameter(ASRConstants.ASR_REQUEST_ITEM_STATUS)) && !oleDeliverRequestBo.getRequestTypeCode().equals(getLoanProcessor().getParameter(ASRConstants.ASR_TYP_RQST))){
255                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "Cannot create "+oleDeliverRequestBo.getRequestTypeCode()+" for this item");
256                        oleDeliverRequestBo.setValidToProcess(false);
257                    }else if(oleDeliverRequestBo.isASRItem() && !oleDeliverRequestBo.getItemStatus().equals(getLoanProcessor().getParameter(ASRConstants.ASR_REQUEST_ITEM_STATUS)) && oleDeliverRequestBo.getRequestTypeCode().equals(getLoanProcessor().getParameter(ASRConstants.ASR_TYP_RQST))){
258                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "Cannot create "+oleDeliverRequestBo.getRequestTypeCode()+" for this item");
259                        oleDeliverRequestBo.setValidToProcess(false);
260                    }
261                }
262                if (!service.canRaiseRequest(oleDeliverRequestBo)) {
263                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID, OLEConstants.OleDeliverRequest.NO_REQUEST,oleDeliverRequestBo.getRequestTypeCode(), oleDeliverRequestBo.getItemStatus());
264                    oleDeliverRequestBo.setValidToProcess(false);
265                }
266                if (!service.isItemEligible(oleDeliverRequestBo)) {
267                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID, OLEConstants.OleDeliverRequest.ITEM_NOT_ELIGIBLE);
268                    oleDeliverRequestBo.setValidToProcess(false);
269                }
270
271                if (service.isAlreadyLoaned(oleDeliverRequestBo)) {
272                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID, OLEConstants.OleDeliverRequest.ITEM_ALREADY_LOANED);
273                    oleDeliverRequestBo.setValidToProcess(false);
274                }
275
276            }
277            if (oleDeliverRequestBo.getRequestTypeId() != null && oleDeliverRequestBo.getRequestTypeId().equals("8")) {
278                if (!oleDeliverRequestBo.getRequestCreator().equals(OLEConstants.OleDeliverRequest.REQUESTER_OPERATOR)) {
279                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.TRANSIT_ERROR);
280                    oleDeliverRequestBo.setValidToProcess(false);
281                }
282                else if (!service.isItemAvailableForLoan(oleDeliverRequestBo)) {
283                    if (service.isRequestRaised(oleDeliverRequestBo)) {
284                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.ITEM_IN_LOAN);
285                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.TRANSIT_REQUEST_RAISED);
286                        oleDeliverRequestBo.setValidToProcess(false);
287                    }
288                    else
289                    {
290                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.ITEM_IN_LOAN);
291                        oleDeliverRequestBo.setValidToProcess(false);
292                    }
293
294                }
295                else  if (service.isRequestRaised(oleDeliverRequestBo)) {
296                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.TRANSIT_REQUEST_RAISED);
297                    oleDeliverRequestBo.setValidToProcess(false);
298                }
299
300                else if (service.processOperator(GlobalVariables.getUserSession().getPrincipalId())) {
301                    LoanProcessor loanProcessor = getLoanProcessor();
302                    try {
303
304                        Item oleItem = oleDeliverRequestBo.getOleItem();
305                        oleItem.setItemStatusEffectiveDate(new Date(System.currentTimeMillis()).toString());
306                        if (oleDeliverRequestBo.getInTransitCheckInNote() != null && !oleDeliverRequestBo.getInTransitCheckInNote().isEmpty()) {
307                            oleItem.setCheckinNote(oleDeliverRequestBo.getInTransitCheckInNote());
308                        }
309                        loanProcessor.updateItemStatus(oleItem, OLEConstants.OleDeliverRequest.INTRANSIT_STATUS);
310                    } catch (Exception e) {
311                        LOG.error("Exception", e);
312                    }
313                /*    if (!service.isItemAvailableForLoan(oleDeliverRequestBo)) {
314                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.ITEM_IN_LOAN);
315                    }
316                    if (service.isRequestRaised(oleDeliverRequestBo)) {
317                        GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, OLEConstants.OleDeliverRequest.TRANSIT_REQUEST_RAISED);
318                    }    */
319
320                } else {
321                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.REQUESTER_OPERATOR, OLEConstants.OleDeliverRequest.INVALID_OPERATOR);
322                    oleDeliverRequestBo.setValidToProcess(false);
323                }
324            }
325            if (oleDeliverRequestBo.getRequestTypeId() != null && oleDeliverRequestBo.getRequestTypeId().equals("7")) {
326                String message = service.patronRecordExpired(oleDeliverRequestBo);
327                if (message != null) {
328                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.BORROWER_ID, message);
329                    oleDeliverRequestBo.setValidToProcess(false);
330                }
331                if (service.isRequestAlreadyRaisedByPatron(oleDeliverRequestBo)) {
332                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.BORROWER_ID, OLEConstants.OleDeliverRequest.ALREADY_RAISED);
333                    oleDeliverRequestBo.setValidToProcess(false);
334                }
335                if (!service.canRaiseRequest(oleDeliverRequestBo)) {
336                    GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.ITEM_ID, OLEConstants.OleDeliverRequest.NO_REQUEST,oleDeliverRequestBo.getRequestTypeCode(), oleDeliverRequestBo.getItemStatus());
337                    oleDeliverRequestBo.setValidToProcess(false);
338                 }
339
340            }
341
342            oleDeliverRequestBo = service.processRequester(oleDeliverRequestBo);
343             if(oleDeliverRequestBo.isValidToProcess()){
344            boolean valid = false;
345            EngineResults engineResult = executeEngineResults(oleDeliverRequestBo);
346            if (engineResult != null) {
347                List<ResultEvent> allResults = engineResult.getAllResults();
348                if (allResults.size() > 0) {
349                    for (Iterator<ResultEvent> resultEventIterator = allResults.iterator(); resultEventIterator.hasNext(); ) {
350                        ResultEvent resultEvent = resultEventIterator.next();
351                        if (resultEvent.getType().equals(RULE_EVALUATED)) {
352                            valid |= resultEvent.getResult();
353                        }
354                    }
355                }
356                if(oleDeliverRequestBo.getNewDueDate() != null){
357                    try {
358                        Item oleItem = oleDeliverRequestBo.getOleItem();
359                        oleItem.setDueDateTime(loanProcessor.convertToString(new Timestamp(oleDeliverRequestBo.getNewDueDate().getTime())));
360                        loanProcessor.updateItemStatus(oleItem,oleItem.getItemStatus().getCodeValue());
361                    } catch (Exception e) {
362                        LOG.error("Exception", e);
363                    }
364                }
365            }
366            //  oleDeliverRequestBo = service.reOrderQueuePosition(oleDeliverRequestBo);
367        }
368            if(org.apache.commons.lang.StringUtils.isNotBlank(oleDeliverRequestBo.getRequestTypeId()) && (oleDeliverRequestBo.getRequestTypeId().equals("1") || oleDeliverRequestBo.getRequestTypeId().equals("2"))){
369                oleDeliverRequestBo.setRecallNoticeSentDate(new java.sql.Date(System.currentTimeMillis()));
370            }
371        if ((oleDeliverRequestBo.getMessage() != null && !oleDeliverRequestBo.getMessage().isEmpty())) {
372            return getUIFModelAndView(form);
373        }
374       // oleDeliverRequestBo.setItemFullLocation(oleDeliverRequestBo.getOleItem().);
375        oleDeliverRequestBo.setOleItem(null);
376
377        return  super.route(form, result, request, response);
378        }else{
379            return  super.route(form, result, request, response);
380        }
381    }
382
383
384    private EngineResults executeEngineResults(OleDeliverRequestBo oleDeliverRequestBo) {
385        List<OleDeliverRequestBo> recallList = new ArrayList<OleDeliverRequestBo>();
386        List<OleDeliverRequestBo> holdList = new ArrayList<OleDeliverRequestBo>();
387        List<OleDeliverRequestBo> pageList = new ArrayList<OleDeliverRequestBo>();
388        List<OleDeliverRequestBo> asrList = new ArrayList<OleDeliverRequestBo>();
389        List<OleDeliverRequestBo> requestsByBorrower = new ArrayList<OleDeliverRequestBo>();
390        Engine engine = KrmsApiServiceLocator.getEngine();
391        EngineResults engineResult = null;
392        HashMap<String, Object> agendaValue = new HashMap<String, Object>();
393        agendaValue.put(OLEConstants.NAME_NM, OLEConstants.REQUEST_AGENDA_NM);
394        List<AgendaBo> agendaBos = (List<AgendaBo>) KRADServiceLocator.getBusinessObjectService().findMatching(AgendaBo.class, agendaValue);
395        if (agendaBos != null && agendaBos.size() > 0) {
396            AgendaBo agendaBo = agendaBos.get(0);
397            HashMap<String, String> map = new HashMap<String, String>();
398            map.put(OLEConstants.AGENDA_NAME, agendaBo.getName());
399            List<MatchBo> matchBos = (List<MatchBo>) KRADServiceLocator.getBusinessObjectService().findMatching(MatchBo.class, map);
400
401            SelectionCriteria selectionCriteria =
402                    SelectionCriteria.createCriteria(null, getSelectionContext(agendaBo.getContext().getName()),
403                            getAgendaContext(OLEConstants.REQUEST_AGENDA_NM));
404
405            ExecutionOptions executionOptions = new ExecutionOptions();
406            executionOptions.setFlag(ExecutionFlag.LOG_EXECUTION, true);
407
408            Facts.Builder factBuilder = Facts.Builder.create();
409
410            String borrowerType = "";
411            if (oleDeliverRequestBo.getOlePatron() != null && oleDeliverRequestBo.getOlePatron().getOleBorrowerType() != null) {
412                borrowerType = oleDeliverRequestBo.getOlePatron().getOleBorrowerType().getBorrowerTypeCode();
413            }
414            String itemType = oleDeliverRequestBo.getItemType();
415
416            String requestTypeId = oleDeliverRequestBo.getRequestTypeId();
417
418            String requestType = oleDeliverRequestBo.getRequestTypeCode();
419
420            String location = oleDeliverRequestBo.getShelvingLocation();
421            LoanProcessor loanProcessor = getLoanProcessor();
422
423
424
425            List<FeeType> feeTypeList = getOleCirculationPolicyService().getPatronBillPayment(oleDeliverRequestBo.getBorrowerId());
426            Integer overdueFineAmt = 0;
427            Integer replacementFeeAmt = 0;
428            Integer serviceFeeAmt = 0;
429            for (FeeType feeType : feeTypeList) {
430                Integer fineAmount = feeType.getFeeAmount().subtract(feeType.getPaidAmount()).intValue();
431                overdueFineAmt += feeType.getOleFeeType().getFeeTypeName().equalsIgnoreCase(OLEConstants.OVERDUE_FINE) ? fineAmount : 0;
432                replacementFeeAmt += feeType.getOleFeeType().getFeeTypeName().equalsIgnoreCase(OLEConstants.REPLACEMENT_FEE) ? fineAmount : 0;
433                serviceFeeAmt += feeType.getOleFeeType().getFeeTypeName().equalsIgnoreCase(OLEConstants.SERVICE_FEE) ? fineAmount : 0;
434            }
435
436
437            OleLoanDocument oleLoanDocument = loanProcessor.getOleLoanDocumentUsingItemUUID(oleDeliverRequestBo.getItemUuid());
438            DataCarrierService dataCarrierService = GlobalResourceLoader.getService(OLEConstants.DATA_CARRIER_SERVICE);
439            dataCarrierService.addData(OLEConstants.LOANED_DATE, oleLoanDocument != null ? oleLoanDocument.getCreateDate() : null);
440            dataCarrierService.addData(OLEConstants.DUE_DATE,oleLoanDocument!=null?oleLoanDocument.getLoanDueDate():null);
441            String patronId = oleDeliverRequestBo.getBorrowerId()!=null ?  oleDeliverRequestBo.getBorrowerId() : "";
442            String itemId = oleDeliverRequestBo.getItemId()!=null ?  oleDeliverRequestBo.getItemId() : "";
443            dataCarrierService.removeData(patronId+itemId);
444            String borrowerId = oleDeliverRequestBo.getBorrowerId();
445            Map<String, String> requestMap = new HashMap<String, String>();
446            requestMap.put(OLEConstants.ITEM_UUID, oleDeliverRequestBo.getItemUuid());
447            if (requestTypeId != null && (requestTypeId.equals("1") || requestTypeId.equals("2"))) {
448                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "1");
449                recallList = (List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap);
450                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "2");
451                recallList.addAll((List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap));
452            } else if (requestTypeId != null && (requestTypeId.equals("3") || requestTypeId.equals("4"))) {
453                //  holdList = (List<OleDeliverRequestBo>)getBusinessObjectService().findMatching(OleDeliverRequestBo.class,requestMap);
454                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "3");
455                holdList = (List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap);
456                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "4");
457                holdList.addAll((List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap));
458            } else if (requestTypeId != null && (requestTypeId.equals("5") || requestTypeId.equals("6"))) {
459                // pageList = (List<OleDeliverRequestBo>)getBusinessObjectService().findMatching(OleDeliverRequestBo.class,requestMap);
460                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "5");
461                pageList = (List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap);
462                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "6");
463                pageList.addAll((List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap));
464            } else if(requestTypeId != null && (requestTypeId.equals("9"))){
465                requestMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, "9");
466                asrList.addAll((List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestMap));
467
468            }
469            Map<String, String> requestByBorrower = new HashMap<String, String>();
470            requestByBorrower.put(OLEConstants.OleDeliverRequest.BORROWER_ID, borrowerId);
471            requestsByBorrower = (List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, requestByBorrower);
472            HashMap<String, Object> termValues = new HashMap<String, Object>();
473            termValues.put(OLEConstants.BORROWER_TYPE, borrowerType);
474            termValues.put(OLEConstants.ITEM_TYPE, itemType);
475            termValues.put(OLEConstants.LOCATION, location);
476            termValues.put(OLEConstants.ITEM_SHELVING, oleDeliverRequestBo.getShelvingLocation());
477            termValues.put(OLEConstants.ITEM_COLLECTION, oleDeliverRequestBo.getItemCollection());
478            termValues.put(OLEConstants.ITEM_LIBRARY, oleDeliverRequestBo.getItemLibrary());
479            termValues.put(OLEConstants.ITEM_CAMPUS, oleDeliverRequestBo.getItemCampus());
480            termValues.put(OLEConstants.ITEM_INSTITUTION, oleDeliverRequestBo.getItemInstitution());
481            termValues.put(OLEConstants.MAX_NO_OF_RECALL_REQUEST, new Integer(recallList.size()) + 1);
482            termValues.put(OLEConstants.MAX_NO_OF_HOLD_REQUEST, new Integer(holdList.size()) + 1);
483            termValues.put(OLEConstants.MAX_NO_OF_PAGE_REQUEST, new Integer(pageList.size()) + 1);
484            termValues.put(OLEConstants.MAX_NO_OF_ASR_REQUEST, new Integer(asrList.size()) + 1);
485            termValues.put(OLEConstants.OleDeliverRequest.CLAIMS_RETURNED_FLAG, oleDeliverRequestBo.isClaimsReturnedFlag());
486            termValues.put(OLEConstants.FINE_AMOUNT, overdueFineAmt + replacementFeeAmt + serviceFeeAmt);
487            // termValues.put("maxNumberOfRequestByBorrower",requestsByBorrower.size());
488            termValues.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_ID, requestTypeId);
489            termValues.put(OLEConstants.REQUEST_TYPE, requestType);
490            termValues.put(OLEConstants.PATRON_ID_POLICY, patronId);
491            termValues.put(OLEConstants.ITEM_ID_POLICY, itemId);
492
493            for (Iterator<MatchBo> matchBoIterator = matchBos.iterator(); matchBoIterator.hasNext(); ) {
494                MatchBo matchBo = matchBoIterator.next();
495                factBuilder.addFact(matchBo.getTermName(), termValues.get((matchBo.getTermName())));
496            }
497            if (LOG.isDebugEnabled()){
498                LOG.debug("termValues.toString()" + termValues.toString());
499            }
500            engineResult = engine.execute(selectionCriteria, factBuilder.build(), executionOptions);
501            dataCarrierService.removeData(patronId+itemId);
502            List<String> errorMessage = (List<String>) engineResult.getAttribute(OLEConstants.ERROR_ACTION);
503            java.sql.Date d = (java.sql.Date) engineResult.getAttribute(OLEConstants.REQ_EXPIRATION_DATE);
504            Timestamp recallDueDate = (Timestamp) engineResult.getAttribute(OLEConstants.RECALL_DUE_DATE);
505            String notice = (String) engineResult.getAttribute(OLEConstants.NOTICE);
506            oleDeliverRequestBo.setNoticeType(notice);
507            oleDeliverRequestBo.setRequestExpiryDate(d);
508            StringBuffer failures = new StringBuffer();
509            if (errorMessage != null && errorMessage.size() > 0) {
510                int i = 1;
511                for (String errMsg : errorMessage) {
512                    failures.append(i++ + ". " + errMsg + OLEConstants.BREAK);
513                }
514            }
515            if (!failures.toString().isEmpty()) {
516                oleDeliverRequestBo.setMessage(failures.toString());
517            }
518            else if(failures.toString().trim().isEmpty()){
519
520            if(oleLoanDocument!=null && (oleDeliverRequestBo.getRequestTypeId().equals("1") || oleDeliverRequestBo.getRequestTypeId().equals("2"))){
521
522                Timestamp itemDueDate = null;
523                if(ObjectUtils.isNotNull(oleLoanDocument)){
524                    itemDueDate = oleLoanDocument.getLoanDueDate();
525                }
526                Item oleItem = oleDeliverRequestBo.getOleItem();
527                if(itemDueDate == null && recallDueDate!=null){
528                    // oleDeliverRequestBo.setOriginalDueDate((new java.sql.Date(itemDueDate.getTime())));
529                    oleDeliverRequestBo.setNewDueDate(new java.sql.Date(recallDueDate.getTime()));
530                    oleLoanDocument.setLoanDueDate(recallDueDate);
531                    oleDeliverRequestBo.setRecallDueDate(recallDueDate);
532                    oleItem.setDueDateTime(recallDueDate.toString());
533                    getBusinessObjectService().save(oleLoanDocument);
534                    OleCirculationDesk oleCirculationDesk = oleLoanDocument.getCirculationLocationId() != null ?
535                            getCircDeskLocationResolver().getOleCirculationDesk(oleLoanDocument.getCirculationLocationId()) : null;
536                    oleLoanDocument.setOleCirculationDesk(oleCirculationDesk);
537                    OLEDeliverNoticeHelperService oleDeliverNoticeHelperService =getOleDeliverNoticeHelperService();
538                    oleDeliverNoticeHelperService.deleteDeliverNotices(oleLoanDocument.getLoanId());
539                    try{
540                     /*   oleDeliverNoticeHelperService.generateDeliverNotices(oleLoanDocument.getPatronId(), oleLoanDocument.getItemUuid(),
541                                oleLoanDocument.getOleCirculationDesk()!=null ? oleLoanDocument.getOleCirculationDesk().getCirculationDeskCode() : null,
542                                oleLoanDocument.getBorrowerTypeCode(),itemType, oleDeliverRequestBo.getItemStatus(),
543                                oleLoanDocument.isClaimsReturnedIndicator() ? OLEConstants.TRUE : OLEConstants.FALSE,
544                                oleLoanDocument.getRepaymentFeePatronBillId() != null ? OLEConstants.TRUE : OLEConstants.FALSE,
545                                oleDeliverRequestBo.getShelvingLocation(), oleDeliverRequestBo.getItemCollection(), oleDeliverRequestBo.getItemLibrary(),
546                                oleDeliverRequestBo.getItemCampus(), oleDeliverRequestBo.getItemInstitution(), oleLoanDocument.getLoanDueDate(),oleLoanDocument.getLoanId(),oleDeliverRequestBo.getRequestTypeCode());
547                    */
548                        List<OLEDeliverNotice> deliverNotices = (List<OLEDeliverNotice>) engineResult.getAttribute("deliverNotices");
549                        if(deliverNotices!=null){
550                            for(OLEDeliverNotice deliverNotice : deliverNotices){
551                                deliverNotice.setLoanId(oleLoanDocument.getLoanId());
552                                deliverNotice.setPatronId(oleLoanDocument.getPatronId());
553                            }
554                            getBusinessObjectService().save(deliverNotices);
555                        }
556                    }catch(Exception e){
557                        LOG.info("Exception occured while updating the date in notice table");
558                        LOG.error(e,e);
559                    }
560                    oleItem.setDueDateTime(getLoanProcessor().convertDateToString(recallDueDate,"MM/dd/yyyy HH:mm:ss"));
561                    try{
562                        service.updateItem(oleItem);
563                    }catch(Exception e){
564                        if(LOG.isInfoEnabled()){
565                            LOG.info("Exception occured while updating the item . " +e.getMessage() );
566                        }
567                        LOG.error(e,e);
568                    }
569                }
570                if (recallDueDate != null && itemDueDate!=null ) {
571                   // if(itemDueDate.compareTo(recallDueDate) > 0){
572                        oleDeliverRequestBo.setOriginalDueDate((new java.sql.Date(itemDueDate.getTime())));
573                        oleDeliverRequestBo.setNewDueDate(new java.sql.Date(recallDueDate.getTime()));
574                        oleLoanDocument.setLoanDueDate(recallDueDate);
575                        oleDeliverRequestBo.setRecallDueDate(recallDueDate);
576                        getBusinessObjectService().save(oleLoanDocument);
577                        OleCirculationDesk oleCirculationDesk = oleLoanDocument.getCirculationLocationId() != null ?
578                                getCircDeskLocationResolver().getOleCirculationDesk(oleLoanDocument.getCirculationLocationId()) : null;
579                        oleLoanDocument.setOleCirculationDesk(oleCirculationDesk);
580                        OLEDeliverNoticeHelperService oleDeliverNoticeHelperService =getOleDeliverNoticeHelperService();
581                        oleDeliverNoticeHelperService.deleteDeliverNotices(oleLoanDocument.getLoanId());
582                        try{
583      /*                      oleDeliverNoticeHelperService.generateDeliverNotices(oleLoanDocument.getPatronId(), oleLoanDocument.getItemUuid(),
584                                    oleLoanDocument.getOleCirculationDesk()!=null ? oleLoanDocument.getOleCirculationDesk().getCirculationDeskCode() : null,
585                                    oleLoanDocument.getBorrowerTypeCode(),itemType, oleDeliverRequestBo.getItemStatus(),
586                                    oleLoanDocument.isClaimsReturnedIndicator() ? OLEConstants.TRUE : OLEConstants.FALSE,
587                                    oleLoanDocument.getRepaymentFeePatronBillId() != null ? OLEConstants.TRUE : OLEConstants.FALSE,
588                                    oleDeliverRequestBo.getShelvingLocation(), oleDeliverRequestBo.getItemCollection(), oleDeliverRequestBo.getItemLibrary(),
589                                    oleDeliverRequestBo.getItemCampus(), oleDeliverRequestBo.getItemInstitution(), oleLoanDocument.getLoanDueDate(),oleLoanDocument.getLoanId(),oleDeliverRequestBo.getRequestTypeCode());
590                       */
591                            List<OLEDeliverNotice> deliverNotices = (List<OLEDeliverNotice>) engineResult.getAttribute("deliverNotices");
592                            if(deliverNotices!=null){
593                                for(OLEDeliverNotice deliverNotice : deliverNotices){
594                                    deliverNotice.setLoanId(oleLoanDocument.getLoanId());
595                                    deliverNotice.setPatronId(oleLoanDocument.getPatronId());
596                                }
597                                getBusinessObjectService().save(deliverNotices);
598                            }
599                        }catch(Exception e){
600                            LOG.info("Exception occured while updating the date in notice table");
601                            LOG.error(e,e);
602                        }
603                        oleItem.setDueDateTime(getLoanProcessor().convertDateToString(recallDueDate,"MM/dd/yyyy HH:mm:ss"));
604                        try{
605                            service.updateItem(oleItem);
606                        }catch(Exception e){
607                            if(LOG.isInfoEnabled()){
608                                LOG.info("Exception occured while updating the item . " +e.getMessage() );
609                            }
610                            LOG.error(e,e);
611                        }
612                    /*}else{
613                        oleDeliverRequestBo.setNewDueDate((new java.sql.Date(oleLoanDocument.getLoanDueDate().getTime())));
614                        oleDeliverRequestBo.setOriginalDueDate((new java.sql.Date(oleLoanDocument.getLoanDueDate().getTime())));
615                    }*/
616                }
617            }
618
619            }
620            dataCarrierService.addData(OLEConstants.ERROR_ACTION, null);
621
622        }
623        return engineResult;
624    }
625
626    /**
627     * This method returns ElementValue using docContent and xpathExpression..
628     *
629     * @param docContent
630     * @param xpathExpression
631     * @return value
632     */
633    private String getElementValue(String docContent, String xpathExpression) {
634        try {
635            Document document = XmlHelper.trimXml(new ByteArrayInputStream(docContent.getBytes()));
636
637            XPath xpath = XPathHelper.newXPath();
638            String value = (String) xpath.evaluate(xpathExpression, document, XPathConstants.STRING);
639
640            return value;
641
642        } catch (Exception e) {
643            LOG.error("Exception while getting element value", e);
644            throw new RiceRuntimeException();
645        }
646    }
647
648    /**
649     * This method returns SelectionContext using contextName.
650     *
651     * @param contextName
652     * @return Map
653     */
654    protected Map<String, String> getSelectionContext(String contextName) {
655        Map<String, String> selector = new HashMap<String, String>();
656        selector.put(NAMESPACE_CODE_SELECTOR, OLEConstants.OLE_NAMESPACE);
657        selector.put(NAME_SELECTOR, contextName);
658        return selector;
659    }
660
661    /**
662     * This method returns AgendaContext using agendaName..
663     *
664     * @param agendaName
665     * @return Map
666     */
667    protected Map<String, String> getAgendaContext(String agendaName) {
668        Map<String, String> selector = new HashMap<String, String>();
669        selector.put(NAME_SELECTOR, agendaName);
670        return selector;
671    }
672
673
674    @RequestMapping(params = "methodToCall=refreshPageView")
675    public ModelAndView refreshPageView(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
676                                        HttpServletRequest request, HttpServletResponse response) throws Exception {
677        super.refresh(form, result, request, response);
678        MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
679        MaintenanceDocument maintenanceDocument = (MaintenanceDocument) maintenanceForm.getDocument();
680        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) maintenanceDocument.getDocumentDataObject();
681
682        oleDeliverRequestBo.setRequestTypeId(null);
683        if (oleDeliverRequestBo.getRequestTypeId() == null && oleDeliverRequestBo.getRequestTypeCode() != null && !oleDeliverRequestBo.getRequestTypeCode().trim().isEmpty()) {
684            Map<String, String> requestTypeMap = new HashMap<String, String>();
685            requestTypeMap.put(OLEConstants.OleDeliverRequest.REQUEST_TYPE_CD, oleDeliverRequestBo.getRequestTypeCode());
686            List<OleDeliverRequestType> oleDeliverRequestTypeList = (List<OleDeliverRequestType>) getBusinessObjectService().findMatching(OleDeliverRequestType.class, requestTypeMap);
687            if (oleDeliverRequestTypeList != null && oleDeliverRequestTypeList.size() == 0) {
688                GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, OLEConstants.OleDeliverRequest.INVALID_REQUEST_TYPE);
689            } else if (oleDeliverRequestTypeList != null && oleDeliverRequestTypeList.size() > 0) {
690                oleDeliverRequestBo.setRequestTypeId(oleDeliverRequestTypeList.get(0).getRequestTypeId());
691            }
692        }
693        return getUIFModelAndView(form);
694    }
695
696
697    @RequestMapping(params = "methodToCall=searchItem")
698    public ModelAndView searchItem(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
699                                   HttpServletRequest request, HttpServletResponse response) throws Exception {
700
701        MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
702        MaintenanceDocument maintenanceDocument = (MaintenanceDocument) maintenanceForm.getDocument();
703        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) maintenanceDocument.getDocumentDataObject();
704        if (!docstoreUtil.isItemAvailableInDocStore(oleDeliverRequestBo)) {
705            oleDeliverRequestBo.setTitle(null);
706            oleDeliverRequestBo.setAuthor(null);
707            oleDeliverRequestBo.setCallNumber(null);
708            oleDeliverRequestBo.setCopyNumber(null);
709            oleDeliverRequestBo.setShelvingLocation(null);
710            GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, OLEConstants.OlePatron.INV_ITEM_BAR);
711        }
712        return getUIFModelAndView(form);
713    }
714
715
716    @RequestMapping(params = "methodToCall=searchPatron")
717    public ModelAndView searchPatron(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
718                                     HttpServletRequest request, HttpServletResponse response) throws Exception {
719        MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
720        MaintenanceDocument maintenanceDocument = (MaintenanceDocument) maintenanceForm.getDocument();
721        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) maintenanceDocument.getDocumentDataObject();
722        service.processPatron(oleDeliverRequestBo);
723        if (oleDeliverRequestBo.getBorrowerName() == null || (oleDeliverRequestBo.getBorrowerName() != null && oleDeliverRequestBo.getBorrowerName().isEmpty()))
724            GlobalVariables.getMessageMap().putError(OLEConstants.OleDeliverRequest.BORROWER_ID, OLEConstants.OleDeliverRequest.INVALID_PATRON);
725        return getUIFModelAndView(form);
726    }
727
728
729    @RequestMapping(params = "methodToCall=printPdf")
730    public void printPdf(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
731                         HttpServletRequest request, HttpServletResponse response) throws Exception {
732        MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) form;
733        MaintenanceDocument maintenanceDocument = (MaintenanceDocument) maintenanceForm.getDocument();
734        OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) maintenanceDocument.getDocumentDataObject();
735        if (oleDeliverRequestBo.getRequestCreator().equals(OLEConstants.OleDeliverRequest.REQUESTER_OPERATOR) && oleDeliverRequestBo.getRequestTypeId().equals("8")) {
736            int errorCount = GlobalVariables.getMessageMap().getErrorCount();
737            if (errorCount == 0) {
738                OleDeliverBatchServiceImpl oleDeliverBatchServiceimpl = new OleDeliverBatchServiceImpl();
739                oleDeliverBatchServiceimpl.createPdfForIntransitRequest(oleDeliverRequestBo, response);
740            }
741        }
742    }
743
744
745}
746
747