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.service.impl;
17  
18  import org.apache.commons.collections.CollectionUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.kuali.ole.docstore.common.client.DocstoreClientLocator;
21  import org.kuali.ole.docstore.common.document.*;
22  import org.kuali.ole.DocumentUniqueIDPrefix;
23  import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor;
24  import org.kuali.ole.docstore.common.document.content.instance.xstream.InstanceOlemlRecordProcessor;
25  import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
26  import org.kuali.ole.integration.purap.CapitalAssetSystem;
27  import org.kuali.ole.module.purap.PurapConstants;
28  import org.kuali.ole.module.purap.PurapConstants.PurchaseOrderStatuses;
29  import org.kuali.ole.module.purap.businessobject.*;
30  import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
31  import org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocument;
32  import org.kuali.ole.module.purap.document.RequisitionDocument;
33  import org.kuali.ole.module.purap.document.service.OlePurapService;
34  import org.kuali.ole.select.OleSelectConstant;
35  import org.kuali.ole.select.OleSelectNotificationConstant;
36  import org.kuali.ole.select.businessobject.*;
37  import org.kuali.ole.select.document.OlePurchaseOrderDocument;
38  import org.kuali.ole.select.document.OleRequisitionDocument;
39  import org.kuali.ole.select.document.service.OlePurchaseOrderDocumentHelperService;
40  import org.kuali.ole.select.document.service.OleRequestorService;
41  import org.kuali.ole.select.document.service.OleSelectDocumentService;
42  import org.kuali.ole.select.service.BibInfoWrapperService;
43  import org.kuali.ole.select.service.FileProcessingService;
44  import org.kuali.ole.select.service.OleUrlResolver;
45  import org.kuali.ole.select.service.impl.BibInfoWrapperServiceImpl;
46  import org.kuali.ole.sys.OLEConstants;
47  import org.kuali.ole.sys.context.SpringContext;
48  import org.kuali.rice.core.api.config.property.ConfigurationService;
49  import org.kuali.rice.core.api.datetime.DateTimeService;
50  import org.kuali.rice.core.api.util.type.KualiDecimal;
51  import org.kuali.rice.core.api.util.type.KualiInteger;
52  import org.kuali.rice.kew.api.WorkflowDocument;
53  import org.kuali.rice.kew.api.exception.WorkflowException;
54  import org.kuali.rice.kim.api.identity.Person;
55  import org.kuali.rice.kim.api.identity.PersonService;
56  import org.kuali.rice.krad.UserSession;
57  import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent;
58  import org.kuali.rice.krad.service.KRADServiceLocator;
59  import org.kuali.rice.krad.util.GlobalVariables;
60  import java.math.BigDecimal;
61  import java.util.*;
62  
63  public class OlePurchaseOrderDocumentHelperServiceImpl implements OlePurchaseOrderDocumentHelperService {
64  
65      protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OlePurchaseOrderDocumentHelperServiceImpl.class);
66      private final String UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkIn&stringContent=";
67      private final String CHECKOUT_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkOut&uuid=";
68      private final String CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING = "docAction=ingestContent&stringContent=";
69      private ItemOlemlRecordProcessor itemOlemlRecordProcessor;
70      private HoldingOlemlRecordProcessor holdingOlemlRecordProcessor;
71      private InstanceOlemlRecordProcessor instanceOlemlRecordProcessor;
72      private transient OleUrlResolver oleUrlResolver;
73      private static transient OlePatronRecordHandler olePatronRecordHandler;
74      private static transient OlePatronDocumentList olePatronDocumentList;
75      private static transient OleSelectDocumentService oleSelectDocumentService;
76      private static transient OlePurapService olePurapService;
77      private DocstoreClientLocator docstoreClientLocator;
78      protected ConfigurationService kualiConfigurationService;
79  
80      public DocstoreClientLocator getDocstoreClientLocator() {
81          if (docstoreClientLocator == null) {
82              docstoreClientLocator = SpringContext.getBean(DocstoreClientLocator.class);
83          }
84          return docstoreClientLocator;
85      }
86      public static OleSelectDocumentService getOleSelectDocumentService() {
87          if (oleSelectDocumentService == null) {
88              oleSelectDocumentService = SpringContext.getBean(OleSelectDocumentService.class);
89          }
90          return oleSelectDocumentService;
91      }
92  
93      public static void setOleSelectDocumentService(OleSelectDocumentService oleSelectDocumentService) {
94          OlePurchaseOrderDocumentHelperServiceImpl.oleSelectDocumentService = oleSelectDocumentService;
95      }
96  
97      public static OlePatronDocumentList getOlePatronDocumentList() {
98          if (olePatronDocumentList == null) {
99              olePatronDocumentList = SpringContext.getBean(OlePatronDocumentList.class);
100         }
101         return olePatronDocumentList;
102     }
103 
104     public static void setOlePatronDocumentList(OlePatronDocumentList olePatronDocumentList) {
105         OlePurchaseOrderDocumentHelperServiceImpl.olePatronDocumentList = olePatronDocumentList;
106     }
107 
108 
109     public OlePatronRecordHandler getOlePatronRecordHandler() {
110         if (null == olePatronRecordHandler) {
111             olePatronRecordHandler = new OlePatronRecordHandler();
112         }
113         return olePatronRecordHandler;
114     }
115 
116     public void setOlePatronRecordHandler(OlePatronRecordHandler olePatronRecordHandler) {
117         this.olePatronRecordHandler = olePatronRecordHandler;
118     }
119 
120     public static OlePurapService getOlePurapService() {
121         if (olePurapService == null) {
122             olePurapService = SpringContext.getBean(OlePurapService.class);
123         }
124         return olePurapService;
125     }
126 
127     public static void setOlePurapService(OlePurapService olePurapService) {
128         OlePurchaseOrderDocumentHelperServiceImpl.olePurapService = olePurapService;
129     }
130 
131 
132     /**
133      * This method is overridden to populate newly added ole fields from requisition into Purchase Order Document.
134      *
135      * @see org.kuali.ole.select.document.service.OlePurchaseOrderDocumentHelperService#populatePurchaseOrderFromRequisition(org.kuali.ole.module.purap.document.PurchaseOrderDocument, org.kuali.ole.module.purap.document.RequisitionDocument)
136      */
137     @Override
138     public void populatePurchaseOrderFromRequisition(PurchaseOrderDocument purchaseOrderDoc, RequisitionDocument requisitionDoc) {
139         LOG.debug("Inside populatePurchaseOrderFromRequisition of OlePurchaseOrderDocumentHelperServiceImpl");
140         OlePurchaseOrderDocument purchaseOrderDocument = (OlePurchaseOrderDocument) purchaseOrderDoc;
141         OleRequisitionDocument requisitionDocument = (OleRequisitionDocument) requisitionDoc;
142         purchaseOrderDocument.setPurchaseOrderCreateTimestamp(SpringContext.getBean(DateTimeService.class).getCurrentTimestamp());
143         purchaseOrderDocument.getDocumentHeader().setOrganizationDocumentNumber(requisitionDocument.getDocumentHeader().getOrganizationDocumentNumber());
144         purchaseOrderDocument.getDocumentHeader().setDocumentDescription(requisitionDocument.getDocumentHeader().getDocumentDescription());
145         purchaseOrderDocument.getDocumentHeader().setExplanation(requisitionDocument.getDocumentHeader().getExplanation());
146         purchaseOrderDocument.setBillingName(requisitionDocument.getBillingName());
147         purchaseOrderDocument.setBillingLine1Address(requisitionDocument.getBillingLine1Address());
148         purchaseOrderDocument.setBillingLine2Address(requisitionDocument.getBillingLine2Address());
149         purchaseOrderDocument.setBillingCityName(requisitionDocument.getBillingCityName());
150         purchaseOrderDocument.setBillingStateCode(requisitionDocument.getBillingStateCode());
151         purchaseOrderDocument.setBillingPostalCode(requisitionDocument.getBillingPostalCode());
152         purchaseOrderDocument.setBillingCountryCode(requisitionDocument.getBillingCountryCode());
153         purchaseOrderDocument.setBillingPhoneNumber(requisitionDocument.getBillingPhoneNumber());
154 
155         purchaseOrderDocument.setReceivingName(requisitionDocument.getReceivingName());
156         purchaseOrderDocument.setReceivingCityName(requisitionDocument.getReceivingCityName());
157         purchaseOrderDocument.setReceivingLine1Address(requisitionDocument.getReceivingLine1Address());
158         purchaseOrderDocument.setReceivingLine2Address(requisitionDocument.getReceivingLine2Address());
159         purchaseOrderDocument.setReceivingStateCode(requisitionDocument.getReceivingStateCode());
160         purchaseOrderDocument.setReceivingPostalCode(requisitionDocument.getReceivingPostalCode());
161         purchaseOrderDocument.setReceivingCountryCode(requisitionDocument.getReceivingCountryCode());
162         purchaseOrderDocument.setAddressToVendorIndicator(requisitionDocument.getAddressToVendorIndicator());
163 
164         purchaseOrderDocument.setDeliveryBuildingCode(requisitionDocument.getDeliveryBuildingCode());
165         purchaseOrderDocument.setDeliveryBuildingRoomNumber(requisitionDocument.getDeliveryBuildingRoomNumber());
166         purchaseOrderDocument.setDeliveryBuildingName(requisitionDocument.getDeliveryBuildingName());
167         purchaseOrderDocument.setDeliveryCampusCode(requisitionDocument.getDeliveryCampusCode());
168         purchaseOrderDocument.setDeliveryCityName(requisitionDocument.getDeliveryCityName());
169         purchaseOrderDocument.setDeliveryCountryCode(requisitionDocument.getDeliveryCountryCode());
170         purchaseOrderDocument.setDeliveryInstructionText(requisitionDocument.getDeliveryInstructionText());
171         purchaseOrderDocument.setDeliveryBuildingLine1Address(requisitionDocument.getDeliveryBuildingLine1Address());
172         purchaseOrderDocument.setDeliveryBuildingLine2Address(requisitionDocument.getDeliveryBuildingLine2Address());
173         purchaseOrderDocument.setDeliveryPostalCode(requisitionDocument.getDeliveryPostalCode());
174         purchaseOrderDocument.setDeliveryRequiredDate(requisitionDocument.getDeliveryRequiredDate());
175         purchaseOrderDocument.setDeliveryRequiredDateReasonCode(requisitionDocument.getDeliveryRequiredDateReasonCode());
176         purchaseOrderDocument.setDeliveryStateCode(requisitionDocument.getDeliveryStateCode());
177         purchaseOrderDocument.setDeliveryToEmailAddress(requisitionDocument.getDeliveryToEmailAddress());
178         purchaseOrderDocument.setDeliveryToName(requisitionDocument.getDeliveryToName());
179         purchaseOrderDocument.setDeliveryToPhoneNumber(requisitionDocument.getDeliveryToPhoneNumber());
180         purchaseOrderDocument.setDeliveryBuildingOtherIndicator(requisitionDocument.isDeliveryBuildingOtherIndicator());
181         purchaseOrderDocument.setPurchaseOrderTypeId(requisitionDocument.getPurchaseOrderTypeId());
182         purchaseOrderDocument.setPurchaseOrderBeginDate(requisitionDocument.getPurchaseOrderBeginDate());
183         purchaseOrderDocument.setPurchaseOrderCostSourceCode(requisitionDocument.getPurchaseOrderCostSourceCode());
184         purchaseOrderDocument.setPostingYear(requisitionDocument.getPostingYear());
185         purchaseOrderDocument.setPurchaseOrderEndDate(requisitionDocument.getPurchaseOrderEndDate());
186         purchaseOrderDocument.setChartOfAccountsCode(requisitionDocument.getChartOfAccountsCode());
187         purchaseOrderDocument.setDocumentFundingSourceCode(requisitionDocument.getDocumentFundingSourceCode());
188         purchaseOrderDocument.setInstitutionContactEmailAddress(requisitionDocument.getInstitutionContactEmailAddress());
189         purchaseOrderDocument.setInstitutionContactName(requisitionDocument.getInstitutionContactName());
190         purchaseOrderDocument.setInstitutionContactPhoneNumber(requisitionDocument.getInstitutionContactPhoneNumber());
191         purchaseOrderDocument.setNonInstitutionFundAccountNumber(requisitionDocument.getNonInstitutionFundAccountNumber());
192         purchaseOrderDocument.setNonInstitutionFundChartOfAccountsCode(requisitionDocument.getNonInstitutionFundChartOfAccountsCode());
193         purchaseOrderDocument.setNonInstitutionFundOrgChartOfAccountsCode(requisitionDocument.getNonInstitutionFundOrgChartOfAccountsCode());
194         purchaseOrderDocument.setNonInstitutionFundOrganizationCode(requisitionDocument.getNonInstitutionFundOrganizationCode());
195         purchaseOrderDocument.setOrganizationCode(requisitionDocument.getOrganizationCode());
196         purchaseOrderDocument.setRecurringPaymentTypeCode(requisitionDocument.getRecurringPaymentTypeCode());
197         purchaseOrderDocument.setRequestorPersonEmailAddress(requisitionDocument.getRequestorPersonEmailAddress());
198         purchaseOrderDocument.setRequestorPersonName(requisitionDocument.getRequestorPersonName());
199         purchaseOrderDocument.setRequestorPersonPhoneNumber(requisitionDocument.getRequestorPersonPhoneNumber());
200         purchaseOrderDocument.setRequisitionIdentifier(requisitionDocument.getPurapDocumentIdentifier());
201         purchaseOrderDocument.setPurchaseOrderTotalLimit(requisitionDocument.getPurchaseOrderTotalLimit());
202         purchaseOrderDocument.setPurchaseOrderTransmissionMethodCode(requisitionDocument.getPurchaseOrderTransmissionMethodCode());
203         purchaseOrderDocument.setUseTaxIndicator(requisitionDocument.isUseTaxIndicator());
204         purchaseOrderDocument.setPurchaseOrderTypeId(requisitionDocument.getPurchaseOrderTypeId());
205         purchaseOrderDocument.setVendorCityName(requisitionDocument.getVendorCityName());
206         purchaseOrderDocument.setVendorContractGeneratedIdentifier(requisitionDocument.getVendorContractGeneratedIdentifier());
207         purchaseOrderDocument.setVendorCountryCode(requisitionDocument.getVendorCountryCode());
208         purchaseOrderDocument.setVendorCustomerNumber(requisitionDocument.getVendorCustomerNumber());
209         purchaseOrderDocument.setVendorAttentionName(requisitionDocument.getVendorAttentionName());
210         purchaseOrderDocument.setVendorDetailAssignedIdentifier(requisitionDocument.getVendorDetailAssignedIdentifier());
211         purchaseOrderDocument.setVendorFaxNumber(requisitionDocument.getVendorFaxNumber());
212         purchaseOrderDocument.setVendorHeaderGeneratedIdentifier(requisitionDocument.getVendorHeaderGeneratedIdentifier());
213         purchaseOrderDocument.setVendorLine1Address(requisitionDocument.getVendorLine1Address());
214         purchaseOrderDocument.setVendorLine2Address(requisitionDocument.getVendorLine2Address());
215         purchaseOrderDocument.setVendorAddressInternationalProvinceName(requisitionDocument.getVendorAddressInternationalProvinceName());
216         purchaseOrderDocument.setVendorName(requisitionDocument.getVendorName());
217         purchaseOrderDocument.setVendorNoteText(requisitionDocument.getVendorNoteText());
218         purchaseOrderDocument.setVendorPhoneNumber(requisitionDocument.getVendorPhoneNumber());
219         purchaseOrderDocument.setVendorPostalCode(requisitionDocument.getVendorPostalCode());
220         purchaseOrderDocument.setVendorStateCode(requisitionDocument.getVendorStateCode());
221         purchaseOrderDocument.setVendorRestrictedIndicator(requisitionDocument.getVendorRestrictedIndicator());
222         purchaseOrderDocument.setVendorPoNumber(requisitionDocument.getVendorPoNumber());
223         purchaseOrderDocument.setExternalOrganizationB2bSupplierIdentifier(requisitionDocument.getExternalOrganizationB2bSupplierIdentifier());
224         purchaseOrderDocument.setRequisitionSourceCode(requisitionDocument.getRequisitionSourceCode());
225         purchaseOrderDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(requisitionDocument.getAccountsPayablePurchasingDocumentLinkIdentifier());
226         purchaseOrderDocument.setReceivingDocumentRequiredIndicator(requisitionDocument.isReceivingDocumentRequiredIndicator());
227         purchaseOrderDocument.setPaymentRequestPositiveApprovalIndicator(requisitionDocument.isPaymentRequestPositiveApprovalIndicator());
228         /*purchaseOrderDocument.setLicensingRequirementIndicator(requisitionDocument.isLicensingRequirementIndicator());*/
229        /* purchaseOrderDocument.setLicensingRequirementCode(requisitionDocument.getLicensingRequirementCode());*/
230 
231         purchaseOrderDocument.setStatusCode(PurapConstants.PurchaseOrderStatuses.APPDOC_IN_PROCESS);
232 
233         // Copy items from requisition (which will copy the item's accounts and capital assets)
234         List<OlePurchaseOrderItem> items = new ArrayList();
235         for (PurApItem reqItem : ((PurchasingAccountsPayableDocument) requisitionDocument).getItems()) {
236             RequisitionCapitalAssetItem reqCamsItem = (RequisitionCapitalAssetItem) requisitionDocument.getPurchasingCapitalAssetItemByItemIdentifier(reqItem.getItemIdentifier().intValue());
237             items.add(new OlePurchaseOrderItem((OleRequisitionItem) reqItem, purchaseOrderDocument, reqCamsItem));
238         }
239         purchaseOrderDocument.setItems(items);
240 
241         // Copy capital asset information that is directly off the document.
242         purchaseOrderDocument.setCapitalAssetSystemTypeCode(requisitionDocument.getCapitalAssetSystemTypeCode());
243         purchaseOrderDocument.setCapitalAssetSystemStateCode(requisitionDocument.getCapitalAssetSystemStateCode());
244         for (CapitalAssetSystem capitalAssetSystem : requisitionDocument.getPurchasingCapitalAssetSystems()) {
245             purchaseOrderDocument.getPurchasingCapitalAssetSystems().add(new PurchaseOrderCapitalAssetSystem(capitalAssetSystem));
246         }
247 
248         purchaseOrderDocument.fixItemReferences();
249     }
250 
251     /**
252      * This method is overriden to populate bib info in  Purchase Order Document
253      *
254      * @see org.kuali.ole.select.document.service.OlePurchaseOrderDocumentHelperService#prepareForSave(org.kuali.ole.module.purap.document.PurchaseOrderDocument, org.kuali.rice.krad.rule.event.KualiDocumentEvent)
255      */
256     @Override
257     public void prepareForSave(PurchaseOrderDocument purchaseOrderDocument, KualiDocumentEvent event) {
258         LOG.debug("Inside prepareForSave of OlePurchaseOrderDocumentHelperServiceImpl");
259         WorkflowDocument workFlowDocument = purchaseOrderDocument.getDocumentHeader().getWorkflowDocument();
260         try {
261             List<OlePurchaseOrderItem> items = purchaseOrderDocument.getItems();
262             Iterator iterator = items.iterator();
263             while (iterator.hasNext()) {
264                 Object object = iterator.next();
265                 if (object instanceof OlePurchaseOrderItem) {
266                     OlePurchaseOrderItem singleItem = (OlePurchaseOrderItem) object;
267                     if ((!StringUtils.isEmpty(singleItem.getInternalRequestorId()) || !StringUtils.isEmpty(singleItem
268                             .getRequestorId())) && singleItem.getRequestorTypeId() == null) {
269                         KualiInteger staffRequestorTypeId = getRequestorTypeId(OleSelectConstant.REQUESTOR_TYPE_STAFF);
270                         singleItem.setRequestorTypeId(staffRequestorTypeId.intValue());
271                     }
272                 }
273             }
274         } catch (Exception e) {
275             LOG.error("Exception in OlePurchaseOrderDocumentHelperServiceImpl:prepareForSave: " + e.getMessage());
276             throw new RuntimeException(e);
277         }
278         if (event instanceof org.kuali.rice.krad.rules.rule.event.RouteDocumentEvent &&
279                 purchaseOrderDocument.getRequisitionIdentifier() == null) {
280             try {
281                 UserSession userSession = GlobalVariables.getUserSession();
282                 //TODO: need to configure a user/role
283                 //GlobalVariables.setUserSession(new UserSession("ole-khuntley"));
284                 String user = null;
285                 if (GlobalVariables.getUserSession() == null) {
286                     kualiConfigurationService = SpringContext.getBean(ConfigurationService.class);
287                     user = kualiConfigurationService.getPropertyValueAsString(getOleSelectDocumentService().getSelectParameterValue(OleSelectNotificationConstant.ACCOUNT_DOCUMENT_INTIATOR));
288                     GlobalVariables.setUserSession(new UserSession(user));
289                 }
290                 RequisitionDocument rdoc = SpringContext.getBean(org.kuali.ole.module.purap.document.service.RequisitionService.class)
291                         .generateRequisitionFromPurchaseOrder(purchaseOrderDocument);
292                 if (LOG.isDebugEnabled()) {
293                     LOG.debug("Requisition Document Status Code---->" + rdoc.getApplicationDocumentStatus());
294                 }
295                 rdoc.setRequisitionSourceCode("STAN");
296                 List adhocRouteRecipientList = new ArrayList();
297                 adhocRouteRecipientList.addAll(purchaseOrderDocument.getAdHocRoutePersons());
298                 adhocRouteRecipientList.addAll(purchaseOrderDocument.getAdHocRouteWorkgroups());
299                 SpringContext.getBean(org.kuali.rice.krad.service.DocumentService.class).blanketApproveDocument(rdoc, "Automatic Approval From PO", adhocRouteRecipientList);
300                 GlobalVariables.setUserSession(userSession);
301                 purchaseOrderDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(rdoc.getPurapDocumentIdentifier());
302                 purchaseOrderDocument.setRequisitionIdentifier(rdoc.getPurapDocumentIdentifier());
303             } catch (WorkflowException e) {
304                 LOG.error("Exception in OlePurchaseOrderDocumentHelperServiceImpl:prepareForSave: " + e.getMessage());
305                 throw new RuntimeException("Error in OlePurchaseOrderDocumentHelperServiceImpl:prepareForSave: " + e.getMessage());
306             }
307 
308             purchaseOrderDocument.setStatusCode(PurchaseOrderStatuses.APPDOC_IN_PROCESS);
309         }
310     }
311 
312     private KualiInteger getRequestorTypeId(String requestorType) {
313         KualiInteger requestorTypeId = null;
314         Map<String, Object> criteria = new HashMap<String, Object>();
315         criteria.put(OleSelectConstant.REQUESTOR_TYPE, requestorType);
316         org.kuali.rice.krad.service.BusinessObjectService businessObjectService = SpringContext.getBean(org.kuali.rice.krad.service.BusinessObjectService.class);
317         Collection<OleRequestorType> requestorTypeList = businessObjectService.findMatching(OleRequestorType.class, criteria);
318         requestorTypeId = new KualiInteger(requestorTypeList.iterator().next().getRequestorTypeId());
319         return requestorTypeId;
320     }
321 
322     protected void setRequestorNameOnItem(OlePurchasingItem singleItem) {
323         String requestorFirstName = singleItem.getRequestorFirstName();
324         if ((singleItem.getRequestorId() != null) || (singleItem.getInternalRequestorId() != null)) {
325             int requestorTypeId = singleItem.getRequestorTypeId();
326             Map requestorTypeIdMap = new HashMap();
327             requestorTypeIdMap.put("requestorTypeId", requestorTypeId);
328             org.kuali.rice.krad.service.BusinessObjectService businessObjectService = SpringContext.getBean(org.kuali.rice.krad.service.BusinessObjectService.class);
329             List<OleRequestorType> oleRequestorTypeList = (List) businessObjectService.findMatching(OleRequestorType.class, requestorTypeIdMap);
330             for (int i = 0; i < oleRequestorTypeList.size(); i++) {
331                 if (oleRequestorTypeList.get(i).getRequestorType().equalsIgnoreCase(OleSelectConstant.REQUESTOR_TYPE_STAFF)) {
332                     Person personImpl = SpringContext.getBean(PersonService.class).getPerson(singleItem.getInternalRequestorId());
333                     if (singleItem.getRequestorId() == null && singleItem.getInternalRequestorId() != null) {
334                         if (personImpl != null) {
335                             singleItem.setRequestorFirstName(personImpl.getName());
336                         }
337                     }
338                 }
339                 /*
340                  * else { Map requestorIdMap = new HashMap(); requestorIdMap.put("requestorId", singleItem.getRequestorId());
341                  * List<OleRequestor> oleRequestorList = (List) businessObjectService.findMatching(OleRequestor.class,
342                  * requestorIdMap); singleItem.setRequestorFirstName(oleRequestorList.get(0).getRequestorFirstName()); }
343                  */
344             }
345         }
346     }
347 
348 
349     /**
350      * This method is overriden to populate bib info in  Purchase Order Document
351      *
352      * @see org.kuali.ole.select.document.service.OlePurchaseOrderDocumentHelperService#processAfterRetrieve(org.kuali.ole.module.purap.document.PurchaseOrderDocument)
353      */
354     @Override
355     public void processAfterRetrieve(PurchaseOrderDocument purchaseOrderDocument) {
356         // super.processAfterRetrieve();
357         LOG.debug("Inside processAfterRetrieve of OlePurchaseOrderDocumentHelperServiceImpl");
358          // if(!purchaseOrderDocument.getFinancialDocumentTypeCode().equals("OLE_POC")) {
359         try {
360             PurchaseOrderType purchaseOrderTypeDoc = getOlePurapService().getPurchaseOrderType(purchaseOrderDocument.getPurchaseOrderTypeId());
361             if(purchaseOrderTypeDoc != null){
362                 purchaseOrderDocument.setOrderType(purchaseOrderTypeDoc);
363             }
364             List<OlePurchaseOrderItem> items = purchaseOrderDocument.getItems();
365             Iterator iterator = items.iterator();
366             while (iterator.hasNext()) {
367                 Object object = iterator.next();
368                 if (object instanceof OlePurchaseOrderItem) {
369                     OlePurchaseOrderItem singleItem = (OlePurchaseOrderItem) object;
370                     setItemDetailWhileProcessAfterRetrive(singleItem);
371                 }
372             }
373         } catch (Exception e) {
374             LOG.error("Exception in OlePurchaseOrderDocument:processAfterRetrieve for OlePurchaseOrderItem " + e.getMessage());
375             throw new RuntimeException(e);
376         }
377     // }
378     }
379 
380     /**
381      * This method is used to set the item detail while processafterretrive method is executed
382      * @param olePurchaseOrderItem
383      */
384     private void setItemDetailWhileProcessAfterRetrive(OlePurchaseOrderItem olePurchaseOrderItem)throws Exception{
385         if(olePurchaseOrderItem.getRequestorId()!=null){
386             olePurchaseOrderItem.setRequestorFirstName(getOlePurapService().getPatronName(olePurchaseOrderItem.getRequestorId()));
387         }
388         // Added for jira OLE-2811 ends
389         setRequestorNameOnItem(olePurchaseOrderItem);
390         HashMap<String, String> dataMap = new HashMap<String, String>();
391         if(olePurchaseOrderItem.getItemUnitPrice()!=null){
392             olePurchaseOrderItem.setItemUnitPrice(olePurchaseOrderItem.getItemUnitPrice().setScale(2, BigDecimal.ROUND_HALF_UP));
393         }
394         if (olePurchaseOrderItem.getItemTitleId() != null) {
395             Bib bib = new BibMarc();
396             if (olePurchaseOrderItem.getItemTitleId() != null && olePurchaseOrderItem.getItemTitleId() != "") {
397                 bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(olePurchaseOrderItem.getItemTitleId());
398             }
399             olePurchaseOrderItem.setBibUUID(bib.getId());
400             dataMap.put(OleSelectConstant.TITLE_ID, olePurchaseOrderItem.getItemTitleId());
401             dataMap.put(OleSelectConstant.DOC_CATEGORY_TYPE, OleSelectConstant.DOC_CATEGORY_TYPE_ITEMLINKS);
402             olePurchaseOrderItem.setDocFormat(DocumentUniqueIDPrefix.getBibFormatType(olePurchaseOrderItem.getItemTitleId()));
403             olePurchaseOrderItem.setItemDescription(getOlePurapService().getItemDescription(bib));
404         }
405         BibTree bibTree = new BibTree();
406         if(olePurchaseOrderItem.getItemTitleId() != null && olePurchaseOrderItem.getItemTitleId() != ""){
407             bibTree = getDocstoreClientLocator().getDocstoreClient().retrieveBibTree(olePurchaseOrderItem.getItemTitleId());
408         }
409         if (null != olePurchaseOrderItem.getItemTitleId()) {
410             if (olePurchaseOrderItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
411                     || olePurchaseOrderItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1))) {
412                 List<OleCopies> copies = setCopiesToLineItem(olePurchaseOrderItem, bibTree);
413                 if(CollectionUtils.isNotEmpty(bibTree.getHoldingsTrees())){
414                     if(CollectionUtils.isNotEmpty(bibTree.getHoldingsTrees().get(0).getItems())){
415                         olePurchaseOrderItem.setItemTypeDescription(bibTree.getHoldingsTrees().get(0).getItems().get(0).getItemType());
416                     }else{
417                         olePurchaseOrderItem.setItemTypeDescription("");
418                     }
419                 }else {
420                     olePurchaseOrderItem.setItemTypeDescription("");
421                 }
422                 olePurchaseOrderItem.setCopies(copies);
423             }
424         }
425         if (olePurchaseOrderItem.getItemQuantity() != null && olePurchaseOrderItem.getItemNoOfParts() != null && !olePurchaseOrderItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
426                 && !olePurchaseOrderItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1))&&olePurchaseOrderItem.getCopyList().size()>0) {
427             olePurchaseOrderItem.setSingleCopyNumber(olePurchaseOrderItem.getCopyList().get(0).getCopyNumber());
428         }
429     }
430 
431     public List<OleCopies> setCopiesToLineItem(OlePurchaseOrderItem singleItem, BibTree bibTree) {
432         List<HoldingsTree> instanceDocuments = bibTree.getHoldingsTrees();
433         List<OleCopies> copies = new ArrayList<OleCopies>();
434         for (HoldingsTree holdingsTree : instanceDocuments) {
435             List<Item> itemDocuments = holdingsTree.getItems();
436             StringBuffer enumeration = new StringBuffer();
437             for (int itemDocs = 0; itemDocs < itemDocuments.size(); itemDocs++) {
438                 if (itemDocs + 1 == itemDocuments.size()) {
439                     enumeration = enumeration.append(itemDocuments.get(itemDocs).getEnumeration());
440                 } else {
441                     enumeration = enumeration.append(itemDocuments.get(itemDocs).getEnumeration() + ";");
442                 }
443 
444             }
445             int startingCopy = 0;
446             if (singleItem.getItemNoOfParts().intValue() != 0 && null != enumeration && StringUtils.isNotEmpty(enumeration.toString())) {
447                 String enumerationSplit = enumeration.substring(1, 2);
448                 boolean isint = checkIsEnumerationSplitIsIntegerOrNot(enumerationSplit);
449                 if (isint) {
450                     startingCopy = Integer.parseInt(enumerationSplit);
451                 }
452             }
453             if (singleItem.getItemQuantity().isGreaterThan(new KualiDecimal(1))
454                     || singleItem.getItemNoOfParts().isGreaterThan(new KualiInteger(1))) {
455                 int noOfCopies = holdingsTree.getItems().size()
456                         / singleItem.getItemNoOfParts().intValue();
457                 OleRequisitionCopies copy = new OleRequisitionCopies();
458                 copy.setParts(singleItem.getItemNoOfParts());
459                 copy.setLocationCopies(holdingsTree.getHoldings().getLocationName());
460                 copy.setItemCopies(new KualiDecimal(noOfCopies));
461                 copy.setPartEnumeration(enumeration.toString());
462                 copy.setStartingCopyNumber(new KualiInteger(startingCopy));
463                 copies.add(copy);
464             }
465         }
466         return copies;
467     }
468 
469     public boolean checkIsEnumerationSplitIsIntegerOrNot(String enumerationSplit) {
470         try {
471             int startingCopy = Integer.parseInt(enumerationSplit);
472         } catch (NumberFormatException e) {
473             return false;
474         }
475         return true;
476     }
477 
478     /**
479      * This method takes List of UUids as parameter and creates a LinkedHashMap with instance as key and id as value. and calls
480      * Docstore's QueryServiceImpl class getWorkBibRecords method and return workBibDocument for passed instance Id.
481      *
482      * @param instanceIdsList
483      * @return List<WorkBibDocument>
484      */
485 //    private List<WorkBibDocument> getWorkBibDocuments(List<String> instanceIdsList) {
486 //        List<LinkedHashMap<String, String>> instanceIdMapList = new ArrayList<LinkedHashMap<String, String>>();
487 //        for (String instanceId : instanceIdsList) {
488 //            LinkedHashMap<String, String> instanceIdMap = new LinkedHashMap<String, String>();
489 //            instanceIdMap.put(DocType.BIB.getDescription(), instanceId);
490 //            instanceIdMapList.add(instanceIdMap);
491 //        }
492 //
493 //        QueryService queryService = QueryServiceImpl.getInstance();
494 //        List<WorkBibDocument> workBibDocuments = new ArrayList<WorkBibDocument>();
495 //        try {
496 //            workBibDocuments = queryService.getWorkBibRecords(instanceIdMapList);
497 //        } catch (Exception ex) {
498 //            // TODO Auto-generated catch block
499 //            ex.printStackTrace();
500 //        }
501 //        return workBibDocuments;
502 //    }
503 
504     // Added for Jira OLE-1900 Ends
505 
506     @Override
507     public void setBibInfoBean(BibInfoBean bibInfoBean, OlePurchaseOrderItem singleItem) {
508         bibInfoBean.setTitle(singleItem.getItemTitle());
509         bibInfoBean.setAuthor(singleItem.getItemAuthor());
510         bibInfoBean.setRequestor(singleItem.getRequestorId() == null ? null : singleItem.getRequestorId().toString());
511     }
512 
513     @Override
514     public void setBibInfoBean(BibInfoBean bibInfoBean, OleRequisitionItem singleItem) {
515         bibInfoBean.setTitle(singleItem.getBibInfoBean().getTitle());
516         bibInfoBean.setAuthor(singleItem.getBibInfoBean().getAuthor());
517         bibInfoBean.setRequestor(singleItem.getRequestorId() == null ? null : singleItem.getRequestorId().toString());
518     }
519 
520     /**
521      * This method returns if Purchase Order Document created is in Final Status
522      *
523      * @see org.kuali.ole.select.document.service.OlePurchaseOrderDocumentHelperService#getIsFinalReqs(org.kuali.ole.module.purap.document.PurchaseOrderDocument)
524      */
525     @Override
526     public boolean getIsFinalReqs(PurchaseOrderDocument purchaseOrderDocument) {
527         LOG.debug("Inside getIsFinalReqs of OlePurchaseOrderDocumentHelperServiceImpl");
528         if (purchaseOrderDocument.getDocumentHeader().getWorkflowDocument().isFinal()) {
529             return true;
530         }
531         return false;
532     }
533 
534 
535     @Override
536     public boolean getIsSplitPO(PurchaseOrderDocument purchaseOrderDocument) {
537         LOG.debug("Inside getIsSplitPO of OlePurchaseOrderDocumentHelperServiceImpl");
538         if (purchaseOrderDocument.getDocumentHeader().getWorkflowDocument().getDocumentTypeName().equalsIgnoreCase(OLEConstants.FinancialDocumentTypeCodes.PURCHASE_ORDER_SPLIT) && purchaseOrderDocument.getDocumentHeader().getWorkflowDocument().isSaved()) {
539             return true;
540         }
541         return false;
542     }
543 
544     @Override
545     public boolean getIsReOpenPO(PurchaseOrderDocument purchaseOrderDocument) {
546         LOG.debug("Inside getIsSplitPO of OlePurchaseOrderDocumentHelperServiceImpl");
547         if (purchaseOrderDocument.getDocumentHeader().getWorkflowDocument().getDocumentTypeName().equalsIgnoreCase(OLEConstants.FinancialDocumentTypeCodes.PURCHASE_ORDER_REOPEN) && purchaseOrderDocument.getDocumentHeader().getWorkflowDocument().isSaved()) {
548             return true;
549         }
550         return false;
551     }
552 
553     /**
554      * This method is used to get the bibedtior creat url from propertie file
555      *
556      * @return Bibeditor creat url string
557      */
558     @Override
559     public String getBibeditorCreateURL() {
560         String bibeditorCreateURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.BIBEDITOR_CREATE_URL_KEY);
561         return bibeditorCreateURL;
562     }
563 
564     @Override
565     public String getBibSearchURL() {
566         String bibSearchURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.BIBEDITOR_SEARCH_URL_KEY);
567         return bibSearchURL;
568     }
569 
570     /**
571      * This method is used to get the bibedtior edit url from propertie file
572      *
573      * @return Bibeditor edit url string
574      */
575     @Override
576     public String getBibeditorEditURL() {
577         String bibeditorEditURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.BIBEDITOR_URL_KEY);
578         return bibeditorEditURL;
579     }
580 
581     /**
582      * This method is used to get the dublinedtior edit url from propertie file
583      *
584      * @return Dublineditor edit url string
585      */
586     public String getDublinEditorEditURL() {
587         String dublinEditorEditURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.DUBLINEDITOR_URL_KEY);
588         return dublinEditorEditURL;
589     }
590     /**
591      * This method is used to get the bibedtior view url from propertie file
592      *
593      * @return Bibeditor view url string
594      */
595     @Override
596     public String getBibeditorViewURL() {
597         String bibeditorViewURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.DOCSTORE_APP_URL_KEY);
598         return bibeditorViewURL;
599     }
600     /**
601      * This method is used to get the dublinedtior view url from propertie file
602      *
603      * @return dublineditor view url string
604      */
605     public String getDublinEditorViewURL() {
606         String dublinEditorViewURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.DOCSTORE_VIEW_URL_KEY);
607         return dublinEditorViewURL;
608     }
609     /**
610      * This method is used to get the Instanceeditor url from propertie file
611      *
612      * @return Instanceeditor url string
613      */
614     @Override
615     public String getInstanceEditorURL() {
616         String instanceEditorURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(
617                 OLEConstants.INSTANCEEDITOR_URL_KEY);
618         return instanceEditorURL;
619     }
620 
621     /**
622      * This method is used to get the directory path where the marc xml files need to be created
623      *
624      * @return Directory path string
625      */
626     @Override
627     public String getMarcXMLFileDirLocation() throws Exception {
628         FileProcessingService fileProcessingService = SpringContext.getBean(FileProcessingService.class);
629         String externaleDirectory = fileProcessingService.getMarcXMLFileDirLocation();
630         return externaleDirectory;
631     }
632 
633 
634     @Override
635     public List getItemsActiveOnly(PurchaseOrderDocument purchaseOrderDocument) {
636         List returnList = new ArrayList();
637         for (Iterator iter = purchaseOrderDocument.getItems().iterator(); iter.hasNext(); ) {
638             OlePurchaseOrderItem item = (OlePurchaseOrderItem) iter.next();
639             if (item.isItemActiveIndicator()) {
640                 returnList.add(item);
641             }
642         }
643         return returnList;
644     }
645 
646     /**
647      * Gets the active items in this Purchase Order, and sets up the alternate amount for GL entry creation.
648      *
649      * @return the list of all active items in this Purchase Order.
650      */
651     @Override
652     public List getItemsActiveOnlySetupAlternateAmount(PurchaseOrderDocument purchaseOrderDocument) {
653         List returnList = new ArrayList();
654         for (Iterator iter = purchaseOrderDocument.getItems().iterator(); iter.hasNext(); ) {
655             OlePurchaseOrderItem item = (OlePurchaseOrderItem) iter.next();
656             if (item.isItemActiveIndicator()) {
657                 for (Object element : item.getSourceAccountingLines()) {
658                     PurchaseOrderAccount account = (PurchaseOrderAccount) element;
659                     account.setAlternateAmountForGLEntryCreation(account.getItemAccountOutstandingEncumbranceAmount());
660                 }
661                 returnList.add(item);
662             }
663         }
664         return returnList;
665     }
666 
667     @Override
668     public boolean getAdditionalChargesExist(PurchaseOrderDocument purchaseOrderDocument) {
669         List<OlePurchaseOrderItem> items = purchaseOrderDocument.getItems();
670         for (OlePurchaseOrderItem item : items) {
671             if ((item != null) &&
672                     (item.getItemType() != null) &&
673                     (item.getItemType().isAdditionalChargeIndicator()) &&
674                     (item.getExtendedPrice() != null) &&
675                     (!KualiDecimal.ZERO.equals(item.getExtendedPrice()))) {
676                 return true;
677             }
678         }
679         return false;
680     }
681 }