View Javadoc
1   /*
2    * Copyright 2011 The Kuali Foundation.
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.ole.select.document;
17  
18  import org.apache.commons.lang.StringEscapeUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.kuali.ole.docstore.common.client.*;
21  import org.kuali.ole.docstore.common.client.impl.DocstoreClientLocatorServiceImpl;
22  import org.kuali.ole.docstore.common.document.Bib;
23  import org.kuali.ole.docstore.common.document.BibMarc;
24  import org.kuali.ole.DocumentUniqueIDPrefix;
25  import org.kuali.ole.docstore.model.bo.WorkBibDocument;
26  import org.kuali.ole.docstore.model.bo.WorkInstanceDocument;
27  import org.kuali.ole.docstore.model.bo.WorkItemDocument;
28  import org.kuali.ole.docstore.model.enums.DocType;
29  import org.kuali.ole.gl.service.SufficientFundsService;
30  import org.kuali.ole.module.purap.PurapWorkflowConstants;
31  import org.kuali.ole.module.purap.businessobject.PurchaseOrderType;
32  import org.kuali.ole.module.purap.document.PurchaseOrderAmendmentDocument;
33  import org.kuali.ole.module.purap.document.RequisitionDocument;
34  import org.kuali.ole.module.purap.document.service.OlePurapService;
35  import org.kuali.ole.module.purap.service.PurapAccountingService;
36  import org.kuali.ole.select.OleSelectConstant;
37  import org.kuali.ole.select.businessobject.*;
38  import org.kuali.ole.select.document.service.*;
39  import org.kuali.ole.sys.OLEConstants;
40  import org.kuali.ole.sys.OLEPropertyConstants;
41  import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry;
42  import org.kuali.ole.sys.businessobject.SourceAccountingLine;
43  import org.kuali.ole.sys.businessobject.SufficientFundsItem;
44  import org.kuali.ole.sys.context.SpringContext;
45  import org.kuali.ole.sys.service.GeneralLedgerPendingEntryService;
46  import org.kuali.ole.sys.service.UniversityDateService;
47  import org.kuali.ole.vnd.businessobject.VendorAlias;
48  import org.kuali.rice.core.api.util.type.KualiDecimal;
49  import org.kuali.rice.core.api.util.type.KualiInteger;
50  import org.kuali.rice.kew.api.action.RoutingReportCriteria;
51  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteLevelChange;
52  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
53  import org.kuali.rice.krad.bo.Note;
54  import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent;
55  import org.kuali.rice.krad.service.BusinessObjectService;
56  import org.kuali.rice.krad.service.DocumentService;
57  
58  import java.math.BigDecimal;
59  import java.util.*;
60  
61  public class OlePurchaseOrderAmendmentDocument extends PurchaseOrderAmendmentDocument {
62      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OlePurchaseOrderAmendmentDocument.class);
63  
64      private String vendorPoNumber;
65      private static transient OlePatronRecordHandler olePatronRecordHandler;
66      private static transient OlePatronDocumentList olePatronDocumentList;
67      private static transient OleSelectDocumentService oleSelectDocumentService;
68      private static transient OlePurapService olePurapService;
69      private static transient OleCopyHelperService oleCopyHelperService;
70      private String vendorAliasName;
71      private DocstoreClientLocator docstoreClientLocator;
72  
73      public DocstoreClientLocator getDocstoreClientLocator() {
74          if (docstoreClientLocator == null) {
75              docstoreClientLocator = SpringContext.getBean(DocstoreClientLocator.class);
76          }
77          return docstoreClientLocator;
78      }
79  
80      public static OleSelectDocumentService getOleSelectDocumentService() {
81          if (oleSelectDocumentService == null) {
82              oleSelectDocumentService = SpringContext.getBean(OleSelectDocumentService.class);
83          }
84          return oleSelectDocumentService;
85      }
86  
87      public static void setOleSelectDocumentService(OleSelectDocumentService oleSelectDocumentService) {
88          OlePurchaseOrderAmendmentDocument.oleSelectDocumentService = oleSelectDocumentService;
89      }
90  
91      public static OlePatronDocumentList getOlePatronDocumentList() {
92          if (olePatronDocumentList == null) {
93              olePatronDocumentList = SpringContext.getBean(OlePatronDocumentList.class);
94          }
95          return olePatronDocumentList;
96      }
97  
98      public static void setOlePatronDocumentList(OlePatronDocumentList olePatronDocumentList) {
99          OlePurchaseOrderAmendmentDocument.olePatronDocumentList = olePatronDocumentList;
100     }
101 
102 
103     public OlePatronRecordHandler getOlePatronRecordHandler() {
104         if (null == olePatronRecordHandler) {
105             olePatronRecordHandler = new OlePatronRecordHandler();
106         }
107         return olePatronRecordHandler;
108     }
109 
110     public void setOlePatronRecordHandler(OlePatronRecordHandler olePatronRecordHandler) {
111         this.olePatronRecordHandler = olePatronRecordHandler;
112     }
113 
114     public String getVendorAliasName() {
115         return vendorAliasName;
116     }
117 
118     public void setVendorAliasName(String vendorAliasName) {
119         this.vendorAliasName = vendorAliasName;
120     }
121 
122     public static OlePurapService getOlePurapService() {
123         if (olePurapService == null) {
124             olePurapService = SpringContext.getBean(OlePurapService.class);
125         }
126         return olePurapService;
127     }
128 
129     public static void setOlePurapService(OlePurapService olePurapService) {
130         OlePurchaseOrderAmendmentDocument.olePurapService = olePurapService;
131     }
132 
133     public static OleCopyHelperService getOleCopyHelperService() {
134         if(oleCopyHelperService  == null){
135             oleCopyHelperService = SpringContext.getBean(OleCopyHelperService.class);
136         }
137         return oleCopyHelperService;
138     }
139 
140     public static void setOleCopyHelperService(OleCopyHelperService oleCopyHelperService) {
141         OlePurchaseOrderAmendmentDocument.oleCopyHelperService = oleCopyHelperService;
142     }
143 
144     @Override
145     public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
146         super.doRouteStatusChange(statusChangeEvent);
147         if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
148             SpringContext.getBean(OlePurchaseOrderService.class).setStatusCompletePurchaseOrderAmendment(this);
149         }
150     }
151 
152     /**
153      * This method is overridden to populate newly added ole fields from requisition into Ole Purchase Order Amendment Document.
154      *
155      * @see org.kuali.ole.module.purap.document.PurchaseOrderDocument#populatePurchaseOrderFromRequisition(org.kuali.ole.module.purap.document.RequisitionDocument)
156      */
157     @Override
158     public void populatePurchaseOrderFromRequisition(RequisitionDocument requisitionDocument) {
159 
160         LOG.debug("Inside populatePurchaseOrderFromRequisition of OlePurchaseOrderAmendmentDocument");
161         SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).populatePurchaseOrderFromRequisition(this, requisitionDocument);
162 
163 
164     }
165 
166     /**
167      * This method is overriden to populate bib info in Ole Purchase Order Amendment Document
168      *
169      * @see org.kuali.ole.module.purap.document.PurchaseOrderDocument#prepareForSave(org.kuali.rice.krad.rule.event.KualiDocumentEvent)
170      */
171     @Override
172     public void prepareForSave(KualiDocumentEvent event) {
173 
174         LOG.debug("Inside prepareForSave of OlePurchaseOrderAmendmentDocument");
175         //For single copy, if the itemLocation is changed, based on the user input from Location Change prompt, the itemLocation is updated in docstore's item record.
176         OleDocstoreHelperService oleDocstoreHelperService = SpringContext
177                 .getBean(OleDocstoreHelperService.class);
178         List<OlePurchaseOrderItem> purItem = this.getItems();
179         for (int i = 0; purItem.size() > i; i++) {
180             OlePurchaseOrderItem item = (OlePurchaseOrderItem) this.getItem(i);
181             if (item.isItemLocationChangeFlag()) {
182                 oleDocstoreHelperService.updateItemLocation(this, item);
183             }
184         }
185         SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).prepareForSave(this, event);
186         super.prepareForSave(event);
187     }
188 
189     /**
190      * This method is overriden to populate bib info in Ole Purchase Order Amendment Document
191      *
192      * @see org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocumentBase#processAfterRetrieve()
193      */
194     @Override
195     public void processAfterRetrieve() {
196         LOG.debug("Inside processAfterRetrieve of OlePurchaseOrderAmendmentDocument");
197         if (this.getVendorAliasName() == null) {
198             populateVendorAliasName();
199         }
200         try {
201             PurchaseOrderType purchaseOrderTypeDoc = getOlePurapService().getPurchaseOrderType(this.getPurchaseOrderTypeId());
202             if(purchaseOrderTypeDoc != null){
203                 this.setOrderType(purchaseOrderTypeDoc);
204             }
205         } catch (Exception e) {
206             LOG.error("Error in OlePurchaseOrderDocument:processAfterRetrieve for OleRequisitionItem " + e.getMessage());
207             throw new RuntimeException(e);
208         }
209         try {
210             List<OlePurchaseOrderItem> items = this.getItems();
211             Iterator iterator = items.iterator();
212             while (iterator.hasNext()) {
213                 Object object = iterator.next();
214                 if (object instanceof OlePurchaseOrderItem) {
215                     OlePurchaseOrderItem singleItem = (OlePurchaseOrderItem) object;
216                     setItemDetailWhileProcessAfterRetrive(singleItem);
217                 }
218             }
219         } catch (Exception e) {
220             LOG.error("Exception in OlePurchaseOrderDocument:processAfterRetrieve for OlePurchaseOrderItem " + e.getMessage());
221             throw new RuntimeException(e);
222         }
223     }
224 
225     /**
226      * This method is used to set the item detail while processafterretrive method is executed
227      * @param olePurchaseOrderItem
228      */
229     private void setItemDetailWhileProcessAfterRetrive(OlePurchaseOrderItem olePurchaseOrderItem)throws Exception{
230         if (olePurchaseOrderItem.getRequestorId() != null) {
231             olePurchaseOrderItem.setRequestorFirstName(getOlePurapService().getPatronName(olePurchaseOrderItem.getRequestorId()));
232         }
233         olePurchaseOrderItem.setPreviousItemQuantity(olePurchaseOrderItem.getItemQuantity());
234         olePurchaseOrderItem.setPreviousItemNoOfParts(olePurchaseOrderItem.getItemNoOfParts());
235         // Added for jira OLE-2811 ends
236         if (olePurchaseOrderItem.getBibInfoBean() == null) {
237             olePurchaseOrderItem.setBibInfoBean(new BibInfoBean());
238         }
239         if ((!StringUtils.isEmpty(olePurchaseOrderItem.getInternalRequestorId()) || !StringUtils.isEmpty(olePurchaseOrderItem
240                 .getRequestorId())) && olePurchaseOrderItem.getBibInfoBean().getRequestorType() == null) {
241             String requestorType = OleSelectConstant.REQUESTOR_TYPE_STAFF;
242             Map<String, Object> criteria = new HashMap<String, Object>();
243             criteria.put(OleSelectConstant.REQUESTOR_TYPE, requestorType);
244             Collection<OleRequestorType> requestorTypeList = SpringContext.getBean(BusinessObjectService.class).findMatching(OleRequestorType.class, criteria);
245             LOG.debug("###########inside prepareForSave getting requestor type###########");
246             olePurchaseOrderItem.setRequestorTypeId(requestorTypeList.iterator().next().getRequestorTypeId());
247         }
248         if(olePurchaseOrderItem.getItemUnitPrice()!=null){
249             olePurchaseOrderItem.setItemUnitPrice(olePurchaseOrderItem.getItemUnitPrice().setScale(2, BigDecimal.ROUND_HALF_UP));
250         }
251         if (olePurchaseOrderItem.getItemTitleId() != null) {
252             LOG.debug("###########inside processAfterRetrieve OlePurchaseOrderAmendmentDocument ###########");
253             Bib bib = new BibMarc();
254             if (olePurchaseOrderItem.getItemTitleId() != null && olePurchaseOrderItem.getItemTitleId() != "") {
255                 bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(olePurchaseOrderItem.getItemTitleId());
256                 olePurchaseOrderItem.setBibUUID(bib.getId());
257             }
258             olePurchaseOrderItem.setDocFormat(DocumentUniqueIDPrefix.getBibFormatType(olePurchaseOrderItem.getItemTitleId()));
259             olePurchaseOrderItem.setBibInfoBean(new BibInfoBean());
260             olePurchaseOrderItem.setItemDescription(getOlePurapService().getItemDescription(bib));
261         }
262         if (olePurchaseOrderItem.getItemType() != null && olePurchaseOrderItem.getItemType().isQuantityBasedGeneralLedgerIndicator()) {
263             populateCopiesSection(olePurchaseOrderItem);
264         }
265         if(olePurchaseOrderItem.getCopyList().size() > 0) {
266             getOlePurapService().setInvoiceDocumentsForPO(olePurchaseOrderItem);
267         }
268     }
269 
270     /**
271      * This method is used to populated the copies section details
272      * @param singleItem
273      */
274     private void populateCopiesSection(OlePurchaseOrderItem singleItem) {
275         if (singleItem.getCopies().size() > 0) {
276             List<OleCopy> copyList = getOleCopyHelperService().setCopyValuesForList(singleItem.getCopies(), singleItem.getItemTitleId(), null);
277             if (copyList.size() >= singleItem.getCopyList().size()) {
278                 int copyCount = 0;
279                 for (OleCopy oleCopy : singleItem.getCopyList()) {
280                     OleCopy copy = copyList.get(copyCount);
281                     oleCopy.setLocation(copy.getLocation());
282                     oleCopy.setEnumeration(copy.getEnumeration());
283                     oleCopy.setCopyNumber(copy.getCopyNumber());
284                     oleCopy.setPartNumber(copy.getPartNumber());
285                     copyCount++;
286                 }
287                 for(int i = copyCount ; i<copyList.size() ; i++){
288                     singleItem.getCopyList().add(copyList.get(copyCount));
289                     copyCount++;
290                 }
291             }
292         }
293         else {
294             if (singleItem.getItemQuantity() != null && singleItem.getItemNoOfParts() != null && (singleItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
295                     || singleItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1)))) {
296                 singleItem.setCopies(getOleCopyHelperService().setCopiesToLineItem(singleItem.getCopyList(), singleItem.getItemNoOfParts(), singleItem.getItemTitleId()));
297             }
298         }
299         if (singleItem.getItemQuantity() != null && singleItem.getItemNoOfParts() != null && !singleItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
300                 && !singleItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1))&&singleItem.getCopyList().size()>0) {
301             singleItem.setSingleCopyNumber(singleItem.getCopyList().get(0).getCopyNumber());
302         }
303     }
304 
305     // Added for Jira OLE-1900 Starts
306 
307     /**
308      * This method will set copies into list of copies for LineItem.
309      *
310      * @param singleItem
311      * @param workBibDocument
312      * @return
313      */
314     public List<OleCopies> setCopiesToLineItem(OlePurchaseOrderItem singleItem, WorkBibDocument workBibDocument) {
315         List<WorkInstanceDocument> instanceDocuments = workBibDocument.getWorkInstanceDocumentList();
316         List<OleCopies> copies = new ArrayList<OleCopies>();
317         for (WorkInstanceDocument workInstanceDocument : instanceDocuments) {
318             List<WorkItemDocument> itemDocuments = workInstanceDocument.getItemDocumentList();
319             StringBuffer enumeration = new StringBuffer();
320             for (int itemDocs = 0; itemDocs < itemDocuments.size(); itemDocs++) {
321                 if (itemDocs + 1 == itemDocuments.size()) {
322                     enumeration = enumeration.append(itemDocuments.get(itemDocs).getEnumeration());
323                 } else {
324                     enumeration = enumeration.append(itemDocuments.get(itemDocs).getEnumeration() + ",");
325                 }
326 
327             }
328             int startingCopy = 0;
329             if (singleItem.getItemNoOfParts().intValue() != 0 && null != enumeration) {
330                 String enumerationSplit = enumeration.substring(1, 2);
331                 boolean isint = checkIsEnumerationSplitIsIntegerOrNot(enumerationSplit);
332                 if (isint) {
333                     startingCopy = Integer.parseInt(enumerationSplit);
334                 }
335             }
336             if (singleItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
337                     || singleItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1))) {
338                 boolean isValid = checkForEnumeration(enumeration);
339                 if (isValid) {
340                     int noOfCopies = workInstanceDocument.getItemDocumentList().size()
341                             / singleItem.getItemNoOfParts().intValue();
342                     OleRequisitionCopies copy = new OleRequisitionCopies();
343                     copy.setParts(singleItem.getItemNoOfParts());
344                     copy.setLocationCopies(workInstanceDocument.getHoldingsDocument().getLocationName());
345                     copy.setItemCopies(new KualiDecimal(noOfCopies));
346                     copy.setPartEnumeration(enumeration.toString());
347                     copy.setStartingCopyNumber(new KualiInteger(startingCopy));
348                     copies.add(copy);
349                 }
350             }
351         }
352         return copies;
353     }
354 
355     public boolean checkForEnumeration(StringBuffer enumeration) {
356         if (null != enumeration && !(enumeration.equals("")) && !(enumeration.toString().equals("null"))) {
357             return true;
358         } else {
359             return false;
360         }
361     }
362 
363     public boolean checkIsEnumerationSplitIsIntegerOrNot(String enumerationSplit) {
364         try {
365             int startingCopy = Integer.parseInt(enumerationSplit);
366         } catch (NumberFormatException e) {
367             return false;
368         }
369         return true;
370     }
371 
372     /**
373      * This method takes List of UUids as parameter and creates a LinkedHashMap with instance as key and id as value. and calls
374      * Docstore's QueryServiceImpl class getWorkBibRecords method and return workBibDocument for passed instance Id.
375      *
376      * @param instanceIdsList
377      * @return List<WorkBibDocument>
378      */
379 //    private List<WorkBibDocument> getWorkBibDocuments(List<String> instanceIdsList) {
380 //        List<LinkedHashMap<String, String>> instanceIdMapList = new ArrayList<LinkedHashMap<String, String>>();
381 //        for (String instanceId : instanceIdsList) {
382 //            LinkedHashMap<String, String> instanceIdMap = new LinkedHashMap<String, String>();
383 //            instanceIdMap.put(DocType.INSTANCE.getDescription(), instanceId);
384 //            instanceIdMapList.add(instanceIdMap);
385 //        }
386 //
387 //        QueryService queryService = QueryServiceImpl.getInstance();
388 //        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
389 //        try {
390 //            workBibDocuments = queryService.getWorkBibRecords(instanceIdMapList);
391 //        } catch (Exception ex) {
392 //            // TODO Auto-generated catch block
393 //            ex.printStackTrace();
394 //        }
395 //        return workBibDocuments;
396 //    }
397 
398     // Added for Jira OLE-1900 Ends
399 
400     @Override
401     public List getItemsActiveOnly() {
402         LOG.debug("Inside getItemsActiveOnly of OlePurchaseOrderReopenDocument");
403         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getItemsActiveOnly(this);
404     }
405 
406     /**
407      * Gets the active items in this Purchase Order, and sets up the alternate amount for GL entry creation.
408      *
409      * @return the list of all active items in this Purchase Order.
410      */
411     @Override
412     public List getItemsActiveOnlySetupAlternateAmount() {
413         LOG.debug("Inside getItemsActiveOnlySetupAlternateAmount of OlePurchaseOrderReopenDocument");
414         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getItemsActiveOnlySetupAlternateAmount(this);
415     }
416 
417     @Override
418     public boolean getAdditionalChargesExist() {
419         LOG.debug("Inside getAdditionalChargesExist of OlePurchaseOrderReopenDocument");
420         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getAdditionalChargesExist(this);
421     }
422 
423     /**
424      * This method returns if Purchase Order Document created is in Final Status
425      *
426      * @return
427      */
428     public boolean getIsFinalReqs() {
429         LOG.debug("Inside getIsFinalReqs of OlePurchaseOrderAmendmentDocument");
430 
431         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getIsFinalReqs(this);
432     }
433 
434     public boolean getIsSplitPO() {
435         LOG.debug("Inside getIsSplitPO of OlePurchaseOrderAmendmentDocument");
436         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getIsSplitPO(this);
437     }
438 
439     public boolean getIsReOpenPO() {
440         LOG.debug("Inside getIsReOpenPO of OlePurchaseOrderAmendmentDocument");
441         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getIsReOpenPO(this);
442     }
443 
444     /**
445      * This method is used to get the bibedtior creat url from propertie file
446      *
447      * @return Bibeditor creat url string
448      */
449     public String getBibeditorCreateURL() {
450         LOG.debug("Inside getBibeditorCreateURL of OlePurchaseOrderAmendmentDocument");
451         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getBibeditorCreateURL();
452     }
453 
454     public String getBibSearchURL() {
455         LOG.debug("Inside getBibSearchURL of OlePurchaseOrderAmendmentDocument");
456         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getBibSearchURL();
457     }
458 
459     /**
460      * This method is used to get the bibedtior edit url from propertie file
461      *
462      * @return Bibeditor edit url string
463      */
464     public String getBibeditorEditURL() {
465         LOG.debug("Inside getBibeditorEditURL of OlePurchaseOrderAmendmentDocument");
466         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getBibeditorEditURL();
467     }
468 
469     /**
470      * This method is used to get the dublinedtior edit url from propertie file
471      *
472      * @return Dublineditor edit url string
473      */
474     public String getDublinEditorEditURL() {
475         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getDublinEditorEditURL();
476     }
477     /**
478      * This method is used to get the Instanceeditor url from propertie file
479      *
480      * @return Instanceeditor url string
481      */
482     public String getInstanceEditorURL() {
483         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getInstanceEditorURL();
484     }
485 
486     /**
487      * This method is used to get the bibedtior view url from propertie file
488      *
489      * @return Bibeditor view url string
490      */
491     public String getBibeditorViewURL() {
492         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getBibeditorViewURL();
493     }
494     /**
495      * This method is used to get the dublinedtior view url from propertie file
496      *
497      * @return dublineditor view url string
498      */
499     public String getDublinEditorViewURL() {
500         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getDublinEditorViewURL();
501     }
502     /**
503      * This method is used to get the directory path where the marc xml files need to be created
504      *
505      * @return Directory path string
506      */
507     public String getMarcXMLFileDirLocation() throws Exception {
508         LOG.debug("Inside getMarcXMLFileDirLocation of OlePurchaseOrderAmendmentDocument");
509         return SpringContext.getBean(OlePurchaseOrderDocumentHelperService.class).getMarcXMLFileDirLocation();
510     }
511 
512     @Override
513     public Class getItemClass() {
514         return OlePurchaseOrderItem.class;
515     }
516 
517 
518     @Override
519     public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
520         if (nodeName.equals(PurapWorkflowConstants.HAS_NEW_UNORDERED_ITEMS)) {
521             return isNewUnorderedItem();
522         }
523         if (nodeName.equals(PurapWorkflowConstants.CONTRACT_MANAGEMENT_REVIEW_REQUIRED)) {
524             return isContractManagementReviewRequired();
525         }
526         if (nodeName.equals(PurapWorkflowConstants.AWARD_REVIEW_REQUIRED)) {
527             return isAwardReviewRequired();
528         }
529         if (nodeName.equals(PurapWorkflowConstants.BUDGET_REVIEW_REQUIRED)) {
530             return isBudgetReviewRequired();
531         }
532         if (nodeName.equals(PurapWorkflowConstants.VENDOR_IS_EMPLOYEE_OR_NON_RESIDENT_ALIEN)) {
533             return isVendorEmployeeOrNonResidentAlien();
534         }
535 
536         if (nodeName.equals(PurapWorkflowConstants.NOTIFY_BUDGET_REVIEW)) {
537             return isNotificationRequired();
538         }
539         throw new UnsupportedOperationException("Cannot answer split question for this node you call \"" + nodeName + "\"");
540     }
541 
542     public String getVendorPoNumber() {
543         return vendorPoNumber;
544     }
545 
546     public void setVendorPoNumber(String vendorPoNumber) {
547         this.vendorPoNumber = vendorPoNumber;
548     }
549 
550     /**
551      * This method is used to check the status of the document for displaying view and edit buttons in line item
552      *
553      * @return boolean
554      */
555     public boolean getIsSaved() {
556         if (this.getDocumentHeader().getWorkflowDocument().isSaved() || this.getDocumentHeader().getWorkflowDocument().isInitiated()) {
557             return true;
558         }
559         return false;
560     }
561 
562     public boolean getIsATypeOfRCVGDoc() {
563         return false;
564     }
565 
566     public boolean getIsATypeOfCORRDoc() {
567         return false;
568     }
569 
570 
571     @Override
572     public void doRouteLevelChange(DocumentRouteLevelChange levelChangeEvent) {
573         super.doRouteLevelChange(levelChangeEvent);
574         try {
575             String newNodeName = levelChangeEvent.getNewNodeName();
576             String documentId = this.getDocumentNumber();
577             if (!OLEConstants.PO_NOTE_MAP.containsKey(documentId)
578                     && newNodeName != null
579                     && (newNodeName.equalsIgnoreCase(PurapWorkflowConstants.BUDGET_NODE) || newNodeName
580                     .equalsIgnoreCase(PurapWorkflowConstants.FYI_BUDGET))) {
581                 addPurchaseOrderNote(levelChangeEvent);
582                 OLEConstants.PO_NOTE_MAP.put(documentId, true);
583 
584             }
585         } catch (Exception e) {
586             String errorMsg = "Workflow Error found checking actions requests on document with id "
587                     + getDocumentNumber() + ". *** WILL NOT UPDATE PURAP STATUS ***";
588             LOG.error(errorMsg, e);
589         }
590     }
591 
592     public void addPurchaseOrderNote(DocumentRouteLevelChange levelChangeEvent) {
593 
594         String newNodeName = levelChangeEvent.getNewNodeName();
595         RoutingReportCriteria.Builder reportCriteria = RoutingReportCriteria.Builder
596                 .createByDocumentIdAndTargetNodeName(getDocumentNumber(), newNodeName);
597         if (newNodeName != null
598                 && (newNodeName.equalsIgnoreCase(PurapWorkflowConstants.BUDGET_NODE) || newNodeName
599                 .equalsIgnoreCase(PurapWorkflowConstants.FYI_BUDGET))) {
600             String note = "";
601             if(newNodeName.equalsIgnoreCase(PurapWorkflowConstants.BUDGET_NODE)){
602                  note = OLEConstants.SufficientFundCheck.POA_NOTE;
603             }
604             if(newNodeName.equalsIgnoreCase(PurapWorkflowConstants.FYI_BUDGET)){
605                 note = OLEConstants.SufficientFundCheck.FYI_NOTE;
606             }
607             DocumentService documentService = SpringContext.getBean(DocumentService.class);
608             Note apoNote = documentService.createNoteFromDocument(this, note);
609             this.addNote(apoNote);
610             String documentTypeName = this.getDocumentHeader().getWorkflowDocument().getDocumentTypeName();
611             if (documentTypeName != null
612                     && documentTypeName.equals(OLEConstants.FinancialDocumentTypeCodes.PURCHASE_ORDER_AMENDMENT)) {
613                 documentService.saveDocumentNotes(this);
614             }
615 
616         }
617 
618     }
619 
620     /**
621      * Method overridden for Fund Check Makes sure that accounts for routing has been generated, so that other information can be
622      * retrieved from that
623      */
624     @Override
625     protected void populateAccountsForRouting() {
626         List<SufficientFundsItem> fundsItems = new ArrayList<SufficientFundsItem>();
627         String documentId = this.getDocumentNumber();
628         try {
629             String nodeName = getFinancialSystemDocumentHeader().getWorkflowDocument().getCurrentNodeNames().iterator()
630                     .next();
631             if (nodeName != null
632                     && (nodeName.equalsIgnoreCase(PurapWorkflowConstants.BUDGET_NODE) || nodeName
633                     .equalsIgnoreCase(PurapWorkflowConstants.BUDGET_REVIEW_REQUIRED))) {
634                 if (SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear()
635                         .compareTo(getPostingYear()) >= 0) {
636                     List<GeneralLedgerPendingEntry> pendingEntries = getPendingLedgerEntriesForSufficientFundsChecking();
637                     for (GeneralLedgerPendingEntry glpe : pendingEntries) {
638                         glpe.getChartOfAccountsCode();
639                     }
640                     SpringContext.getBean(GeneralLedgerPendingEntryService.class).delete(getDocumentNumber());
641                     fundsItems = SpringContext.getBean(SufficientFundsService.class).checkSufficientFunds(
642                             pendingEntries);
643                     SpringContext.getBean(GeneralLedgerPendingEntryService.class).generateGeneralLedgerPendingEntries(
644                             this);
645                     SpringContext.getBean(BusinessObjectService.class).save(getGeneralLedgerPendingEntries());
646                 }
647                 SpringContext.getBean(PurapAccountingService.class).updateAccountAmounts(this);
648                 accountsForRouting = (SpringContext.getBean(PurapAccountingService.class).generateSummary(getItems()));
649                 String documentFiscalYearString = this.getPostingYear().toString();
650                 List<String> fundsItemList = new ArrayList<String>();
651                 List<String> accountsList = new ArrayList<String>();
652                 for (SufficientFundsItem fundsItem : fundsItems) {
653                     fundsItemList.add(fundsItem.getAccount().getChartOfAccountsCode());
654                 }
655                 setAccountsForRouting(accountsForRouting);
656                 refreshNonUpdateableReferences();
657                 for (SourceAccountingLine sourceLine : getAccountsForRouting()) {
658                     sourceLine.refreshNonUpdateableReferences();
659                 }
660             } else {
661                 super.populateAccountsForRouting();
662             }
663         } catch (Exception e) {
664             logAndThrowRuntimeException("Error in populateAccountsForRouting while submitting document with id "
665                     + getDocumentNumber(), e);
666         }
667     }
668 
669 
670     @Override
671     protected boolean isBudgetReviewRequired() {
672         OleRequisitionDocumentService oleRequisitionDocumentService = (OleRequisitionDocumentService) SpringContext
673                 .getBean("oleRequisitionDocumentService");
674         boolean sufficientFundCheck = false;
675         List<SourceAccountingLine> sourceAccountingLineList = this.getSourceAccountingLines();
676         for (SourceAccountingLine accLine : sourceAccountingLineList) {
677             Map searchMap = new HashMap();
678             String notificationOption = null;
679             Map<String, Object> key = new HashMap<String, Object>();
680             String chartCode = accLine.getChartOfAccountsCode();
681             String accNo = accLine.getAccountNumber();
682             String objectCd = accLine.getFinancialObjectCode();
683             key.put(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartCode);
684             key.put(OLEPropertyConstants.ACCOUNT_NUMBER, accNo);
685             OleSufficientFundCheck account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(
686                     OleSufficientFundCheck.class, key);
687             if (account != null) {
688                 notificationOption = account.getNotificationOption();
689             }
690             if (notificationOption != null
691                     && (notificationOption.equals(OLEPropertyConstants.BUD_REVIEW))) {
692                 sufficientFundCheck = oleRequisitionDocumentService.hasSufficientFundsOnRequisition(accLine);
693                 if (sufficientFundCheck) {
694                     return true;
695                 }
696             }
697         }
698         return sufficientFundCheck;
699     }
700 
701     private boolean isNotificationRequired() {
702         OleRequisitionDocumentService oleRequisitionDocumentService = (OleRequisitionDocumentService) SpringContext
703                 .getBean("oleRequisitionDocumentService");
704         List<SourceAccountingLine> sourceAccountingLineList = this.getSourceAccountingLines();
705         boolean sufficientFundCheck = false;
706         for (SourceAccountingLine accLine : sourceAccountingLineList) {
707             Map searchMap = new HashMap();
708             String notificationOption = null;
709             Map<String, Object> key = new HashMap<String, Object>();
710             String chartCode = accLine.getChartOfAccountsCode();
711             String accNo = accLine.getAccountNumber();
712             String objectCd = accLine.getFinancialObjectCode();
713             key.put(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartCode);
714             key.put(OLEPropertyConstants.ACCOUNT_NUMBER, accNo);
715             OleSufficientFundCheck account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(
716                     OleSufficientFundCheck.class, key);
717             if (account != null) {
718                 notificationOption = account.getNotificationOption();
719             }
720             if (notificationOption != null && notificationOption.equals(OLEPropertyConstants.NOTIFICATION)) {
721                 sufficientFundCheck =  oleRequisitionDocumentService.hasSufficientFundsOnRequisition(accLine);
722                 if (sufficientFundCheck) {
723                     return true;
724                 }
725             }
726         }
727         return sufficientFundCheck;
728     }
729 
730     private void populateVendorAliasName() {
731         Map vendorDetailMap = new HashMap();
732         vendorDetailMap.put(OLEConstants.VENDOR_HEADER_IDENTIFIER, this.getVendorHeaderGeneratedIdentifier());
733         vendorDetailMap.put(OLEConstants.VENDOR_DETAIL_IDENTIFIER, this.getVendorDetailAssignedIdentifier());
734         List<VendorAlias> vendorDetailList = (List) getBusinessObjectService().findMatching(VendorAlias.class, vendorDetailMap);
735         if (vendorDetailList != null && vendorDetailList.size() > 0) {
736             this.setVendorAliasName(vendorDetailList.get(0).getVendorAliasName());
737         }
738     }
739 
740 }