View Javadoc
1   /*
2    * Copyright 2011 The Kuali Foundation.
3    *
4    * Licensed under the Educational Community License, Version 1.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/ecl1.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.module.purap.document.service.impl;
17  
18  import org.apache.commons.lang.StringEscapeUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.apache.commons.lang.time.DateUtils;
21  import org.kuali.ole.DocumentUniqueIDPrefix;
22  import org.kuali.ole.docstore.common.document.Bib;
23  import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecord;
24  import org.kuali.ole.docstore.common.document.content.bib.marc.DataField;
25  import org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.BibInfoRecord;
26  import org.kuali.ole.module.purap.businessobject.PurApItem;
27  import org.kuali.ole.module.purap.businessobject.PurchaseOrderType;
28  import org.kuali.ole.module.purap.document.*;
29  import org.kuali.ole.module.purap.document.service.OlePurapService;
30  import org.kuali.ole.select.OleSelectConstant;
31  import org.kuali.ole.select.businessobject.*;
32  import org.kuali.ole.select.document.OleInvoiceDocument;
33  import org.kuali.ole.select.document.OlePaymentRequestDocument;
34  import org.kuali.ole.select.document.OleRequisitionDocument;
35  import org.kuali.ole.sys.OLEConstants;
36  import org.kuali.ole.sys.context.SpringContext;
37  import org.kuali.ole.vnd.businessobject.VendorDetail;
38  import org.kuali.rice.core.api.datetime.DateTimeService;
39  import org.kuali.rice.core.api.util.type.KualiDecimal;
40  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
41  import org.kuali.rice.coreservice.impl.parameter.ParameterBo;
42  import org.kuali.rice.kim.api.identity.Person;
43  import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
44  import org.kuali.rice.krad.service.BusinessObjectService;
45  import org.kuali.rice.krad.service.DocumentHeaderService;
46  import org.kuali.rice.krad.service.KRADServiceLocator;
47  import org.kuali.rice.krad.util.GlobalVariables;
48  
49  import java.math.BigDecimal;
50  import java.util.*;
51  
52  public class OlePurapServiceImpl implements OlePurapService {
53  
54      protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OlePurapServiceImpl.class);
55      protected ParameterService parameterService;
56      private static transient BusinessObjectService businessObjectService;
57      private DateTimeService dateTimeService;
58      private static final String timeStampFormat = "MMddyyHHmm";
59  
60      public BusinessObjectService getBusinessObjectService() {
61          if (businessObjectService == null) {
62              businessObjectService = SpringContext.getBean(BusinessObjectService.class);
63          }
64          return businessObjectService;
65      }
66  
67      public DateTimeService getDateTimeService() {
68          if (dateTimeService == null) {
69              dateTimeService = SpringContext.getBean(DateTimeService.class);
70          }
71          return dateTimeService;
72      }
73  
74      public void setBusinessObjectService(BusinessObjectService businessObjectService) {
75          this.businessObjectService = businessObjectService;
76      }
77  
78      public void setParameterService(ParameterService parameterService) {
79          this.parameterService = parameterService;
80      }
81      @Override
82      public BigDecimal calculateDiscount(OleRequisitionItem oleRequisition) {
83  
84          if (oleRequisition.getItemListPrice() != null && oleRequisition.getItemDiscountType() != null) {
85  
86              if (oleRequisition.getItemDiscount() == null) {
87                  oleRequisition.setItemDiscount(new KualiDecimal(0));
88              }
89              if (oleRequisition.getItemDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
90                  LOG.debug("###### Percentage ##### ");
91                  return oleRequisition.getItemListPrice().bigDecimalValue().subtract((oleRequisition.getItemDiscount().bigDecimalValue().multiply(new BigDecimal(0.01))).multiply(oleRequisition.getItemListPrice().bigDecimalValue()));
92              } else {
93                  LOG.debug("###### Dollor ##### ");
94                  if (LOG.isDebugEnabled()) {
95                      LOG.debug("oleRequisition.getItemDiscountType()**********" + oleRequisition.getItemDiscountType());
96                  }
97                  return oleRequisition.getItemListPrice().bigDecimalValue().subtract(oleRequisition.getItemDiscount().bigDecimalValue());
98              }
99          } else {
100             oleRequisition.setItemListPrice(new KualiDecimal(0.0));
101             return new BigDecimal(0.0);
102         }
103 
104     }
105 
106     @Override
107     public BigDecimal calculateDiscount(OlePurchaseOrderItem olePurchaseOrder) {
108 
109         if (olePurchaseOrder.getItemListPrice() != null && olePurchaseOrder.getItemDiscountType() != null) {
110             if (olePurchaseOrder.getItemDiscount() == null) {
111                 olePurchaseOrder.setItemDiscount(new KualiDecimal(0));
112             }
113             if (olePurchaseOrder.getItemDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
114                 return olePurchaseOrder.getItemListPrice().bigDecimalValue().subtract((olePurchaseOrder.getItemDiscount().bigDecimalValue().multiply(new BigDecimal(0.01))).multiply(olePurchaseOrder.getItemListPrice().bigDecimalValue()));
115             } else {
116                 return olePurchaseOrder.getItemListPrice().bigDecimalValue().subtract(olePurchaseOrder.getItemDiscount().bigDecimalValue());
117             }
118         } else {
119             olePurchaseOrder.setItemListPrice(new KualiDecimal(0.0));
120             return new BigDecimal(0.0);
121         }
122 
123     }
124 
125 
126 // Foreign Currency Conversion
127 
128     @Override
129     public OleRequisitionItem calculateForeignCurrency(OleRequisitionItem oleRequisition) {
130         if (oleRequisition.getItemForeignListPrice() != null && oleRequisition.getItemForeignDiscountType() != null) {
131             if (oleRequisition.getItemForeignDiscount() == null) {
132                 oleRequisition.setItemForeignDiscount(new KualiDecimal(0));
133             }
134             if (oleRequisition.getItemForeignDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
135                 BigDecimal calculatedForeignDiscountAmt = oleRequisition.getItemForeignDiscount().bigDecimalValue().multiply(new BigDecimal(0.01)).multiply(oleRequisition.getItemForeignListPrice().bigDecimalValue());
136                 oleRequisition.setItemForeignDiscountAmt(new KualiDecimal(calculatedForeignDiscountAmt.setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
137                 oleRequisition.setItemForeignUnitCost(oleRequisition.getItemForeignListPrice().subtract(oleRequisition.getItemForeignDiscountAmt()));
138                 return oleRequisition;
139             } else {
140                 oleRequisition.setItemForeignDiscountAmt((oleRequisition.getItemForeignDiscount()));
141                 oleRequisition.setItemForeignUnitCost(new KualiDecimal(oleRequisition.getItemForeignListPrice().bigDecimalValue().subtract(oleRequisition.getItemForeignDiscount().bigDecimalValue())));
142                 return oleRequisition;
143             }
144         } else {
145             return oleRequisition;
146         }
147     }
148 
149     @Override
150     public OlePurchaseOrderItem calculateForeignCurrency(OlePurchaseOrderItem olePurchaseOrder) {
151         if (olePurchaseOrder.getItemForeignListPrice() != null && olePurchaseOrder.getItemForeignDiscountType() != null) {
152             if (olePurchaseOrder.getItemForeignDiscount() == null) {
153                 olePurchaseOrder.setItemForeignDiscount(new KualiDecimal(0));
154             }
155             if (olePurchaseOrder.getItemForeignDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
156                 BigDecimal calculatedForeignDiscountAmt = olePurchaseOrder.getItemForeignDiscount().bigDecimalValue().multiply(new BigDecimal(0.01)).multiply(olePurchaseOrder.getItemForeignListPrice().bigDecimalValue());
157                 olePurchaseOrder.setItemForeignDiscountAmt(new KualiDecimal(calculatedForeignDiscountAmt.setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
158                 olePurchaseOrder.setItemForeignUnitCost(olePurchaseOrder.getItemForeignListPrice().subtract(olePurchaseOrder.getItemForeignDiscountAmt()));
159                 return olePurchaseOrder;
160             } else {
161                 olePurchaseOrder.setItemForeignDiscountAmt(olePurchaseOrder.getItemForeignDiscount());
162                 olePurchaseOrder.setItemForeignUnitCost(olePurchaseOrder.getItemForeignListPrice().subtract(olePurchaseOrder.getItemForeignDiscount()));
163                 return olePurchaseOrder;
164             }
165         } else {
166             return olePurchaseOrder;
167         }
168     }
169 
170     @Override
171     public BigDecimal calculateDiscount(OlePaymentRequestItem olePaymentRequestOrder) {
172 
173         if (olePaymentRequestOrder.getItemListPrice() != null) {
174             if (olePaymentRequestOrder.getItemDiscount() == null) {
175                 olePaymentRequestOrder.setItemDiscount(new KualiDecimal(0));
176             }
177             if (olePaymentRequestOrder.getItemDiscountType() != null && olePaymentRequestOrder.getItemDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
178                 return olePaymentRequestOrder.getItemListPrice().bigDecimalValue().subtract((olePaymentRequestOrder.getItemDiscount().bigDecimalValue().multiply(new BigDecimal(0.01))).multiply(olePaymentRequestOrder.getItemListPrice().bigDecimalValue()));
179             } else {
180                 return olePaymentRequestOrder.getItemListPrice().bigDecimalValue().subtract(olePaymentRequestOrder.getItemDiscount().bigDecimalValue());
181             }
182         } else {
183             olePaymentRequestOrder.setItemListPrice(new KualiDecimal(0.0));
184             return new BigDecimal(0.0);
185         }
186 
187     }
188 
189     @Override
190     public BigDecimal calculateDiscount(OleInvoiceItem oleInvoiceOrder) {
191 
192         if (oleInvoiceOrder.getItemListPrice() != null) {
193             if (oleInvoiceOrder.getItemDiscount() == null) {
194                 oleInvoiceOrder.setItemDiscount(new KualiDecimal(0));
195             }
196             if (oleInvoiceOrder.getItemDiscountType() != null && oleInvoiceOrder.getItemDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
197                 return oleInvoiceOrder.getItemListPrice().bigDecimalValue().subtract((oleInvoiceOrder.getItemDiscount().bigDecimalValue().multiply(new BigDecimal(0.01))).multiply(oleInvoiceOrder.getItemListPrice().bigDecimalValue()));
198             } else {
199                 return oleInvoiceOrder.getItemListPrice().bigDecimalValue().subtract(oleInvoiceOrder.getItemDiscount().bigDecimalValue());
200             }
201         } else {
202             oleInvoiceOrder.setItemListPrice(new KualiDecimal(0.0));
203             return new BigDecimal(0.0);
204         }
205 
206     }
207 
208     @Override
209     public OlePaymentRequestItem calculateForeignCurrency(OlePaymentRequestItem item) {
210         if (item.getItemForeignListPrice() != null) {
211             if (item.getItemForeignDiscount() == null) {
212                 item.setItemForeignDiscount(new KualiDecimal(0));
213             }
214             if (item.getItemForeignDiscountType() != null && item.getItemForeignDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
215                 BigDecimal calculatedForeignDiscountAmt = item.getItemForeignDiscount().bigDecimalValue().multiply(new BigDecimal(0.01)).multiply(item.getItemForeignListPrice().bigDecimalValue());
216                 item.setItemForeignDiscountAmt(new KualiDecimal(calculatedForeignDiscountAmt.setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
217                 item.setItemForeignUnitCost(item.getItemForeignListPrice().subtract(item.getItemForeignDiscountAmt()));
218                 return item;
219             } else {
220                 item.setItemForeignDiscountAmt(item.getItemForeignDiscount());
221                 item.setItemForeignUnitCost(item.getItemForeignListPrice().subtract(item.getItemForeignDiscount()));
222                 return item;
223             }
224         } else {
225             return item;
226         }
227     }
228 
229 
230     @Override
231     public OleInvoiceItem calculateForeignCurrency(OleInvoiceItem item) {
232         if (item.getItemForeignListPrice() != null) {
233             if (item.getItemForeignDiscount() == null) {
234                 item.setItemForeignDiscount(new KualiDecimal(0));
235             }
236             if (item.getItemForeignDiscountType() != null && item.getItemForeignDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
237                 BigDecimal calculatedForeignDiscountAmt = item.getItemForeignDiscount().bigDecimalValue().multiply(new BigDecimal(0.01)).multiply(item.getItemForeignListPrice().bigDecimalValue());
238                 item.setItemForeignDiscountAmt(new KualiDecimal(calculatedForeignDiscountAmt.setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
239                 item.setItemForeignUnitCost(item.getItemForeignListPrice().subtract(item.getItemForeignDiscountAmt()));
240                 return item;
241             } else {
242                 item.setItemForeignDiscountAmt(item.getItemForeignDiscount());
243                 item.setItemForeignUnitCost(item.getItemForeignListPrice().subtract(item.getItemForeignDiscount()));
244                 return item;
245             }
246         } else {
247             return item;
248         }
249     }
250 
251 
252     /**
253      * Returns first, middle and last initials of logged in user
254      * to be appended in the document description
255      *
256      * @return initials of logged in user
257      */
258     public String getOperatorInitials() {
259         LOG.debug("Inside getOperatorInitials()");
260         StringBuffer operatorInitials = new StringBuffer();
261         Person person = GlobalVariables.getUserSession().getPerson();
262         operatorInitials.append(StringUtils.isEmpty(person.getFirstName()) ? "" : person.getFirstName().toLowerCase().charAt(0));
263         operatorInitials.append(StringUtils.isEmpty(person.getMiddleName()) ? "" : person.getMiddleName().toLowerCase().charAt(0));
264         operatorInitials.append(StringUtils.isEmpty(person.getLastName()) ? "" : person.getLastName().toLowerCase().charAt(0));
265         LOG.debug("End of getOperatorInitials()");
266         return operatorInitials.toString();
267     }
268 
269     public OleCreditMemoItem calculateForeignCurrency(OleCreditMemoItem oleCreditMemoItem) {
270         if (oleCreditMemoItem.getItemForeignListPrice() != null && oleCreditMemoItem.getItemForeignDiscountType() != null) {
271             if (oleCreditMemoItem.getItemForeignDiscount() == null) {
272                 oleCreditMemoItem.setItemForeignDiscount(new KualiDecimal(0));
273             }
274             if (oleCreditMemoItem.getItemForeignDiscountType().equalsIgnoreCase(OleSelectConstant.DISCOUNT_TYPE_PERCENTAGE)) {
275                 BigDecimal calculatedForeignDiscountAmt = oleCreditMemoItem.getItemForeignDiscount().bigDecimalValue().multiply(new BigDecimal(0.01)).multiply(oleCreditMemoItem.getItemForeignListPrice().bigDecimalValue());
276                 oleCreditMemoItem.setItemForeignDiscountAmt(new KualiDecimal(calculatedForeignDiscountAmt.setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
277                 oleCreditMemoItem.setItemForeignUnitCost(oleCreditMemoItem.getItemForeignListPrice().subtract(oleCreditMemoItem.getItemForeignDiscountAmt()));
278                 return oleCreditMemoItem;
279             } else {
280                 oleCreditMemoItem.setItemForeignDiscountAmt(oleCreditMemoItem.getItemForeignDiscount());
281                 oleCreditMemoItem.setItemForeignUnitCost(oleCreditMemoItem.getItemForeignListPrice().subtract(oleCreditMemoItem.getItemForeignDiscount()));
282                 return oleCreditMemoItem;
283             }
284         } else {
285             return oleCreditMemoItem;
286         }
287     }
288 
289     /**
290      * This method returns the section Name that are to be collapsed while opening the document
291      * @param document
292      * @return collapseSections
293      */
294     public void getInitialCollapseSections(PurchasingAccountsPayableDocument document) {
295         LOG.debug("Inside getInitialCollapseSections()");
296         String[] collapseSections = new String[]{};
297         try {
298             if (document instanceof RequisitionDocument) {
299                 OleRequisitionDocument requisitionDocument = (OleRequisitionDocument)document;
300                 collapseSections = parameterService.getParameterValuesAsString(RequisitionDocument.class,
301                         OLEConstants.INITIAL_COLLAPSE_SECTIONS).toArray(new String[]{});
302                 requisitionDocument.setOverviewFlag(canCollapse(OLEConstants.OVERVIEW_SECTION, collapseSections));
303                 requisitionDocument.setDeliveryFlag(canCollapse(OLEConstants.DELIVERY_SECTION, collapseSections));
304                 requisitionDocument.setVendorFlag(canCollapse(OLEConstants.VENDOR_SECTION, collapseSections));
305                 requisitionDocument.setTitlesFlag(canCollapse(OLEConstants.TITLES_SECTION, collapseSections));
306                 requisitionDocument.setPaymentInfoFlag(canCollapse(OLEConstants.PAYMENT_INFO_SECTION, collapseSections));
307                 requisitionDocument.setAdditionalInstitutionalInfoFlag(canCollapse(OLEConstants.ADDITIONAL_INSTUT_SECTION, collapseSections));
308                 requisitionDocument.setAccountSummaryFlag(canCollapse(OLEConstants.ACCOUNT_SUMMARY_SECTION, collapseSections));
309                 requisitionDocument.setRelatedDocumentsFlag(canCollapse(OLEConstants.RELATED_DOCUMENT_SECTION, collapseSections));
310                 requisitionDocument.setPaymentHistoryFlag(canCollapse(OLEConstants.PAYMENT_HISTORY_SECTION, collapseSections));
311                 requisitionDocument.setNotesAndAttachmentFlag(canCollapse(OLEConstants.NOTES_AND_ATTACH_SECTION, collapseSections));
312                 requisitionDocument.setAdHocRecipientsFlag(canCollapse(OLEConstants.ADHOC_RECIPIENT_SECTION, collapseSections));
313                 requisitionDocument.setRouteLogFlag(canCollapse(OLEConstants.ROUTE_LOG_SECTION, collapseSections));
314             }
315             else if (document instanceof PurchaseOrderDocument) {
316                 PurchaseOrderDocument poDocument = (PurchaseOrderDocument)document;
317                 collapseSections = parameterService.getParameterValuesAsString(PurchaseOrderDocument.class,
318                         OLEConstants.INITIAL_COLLAPSE_SECTIONS).toArray(new String[]{});
319                 poDocument.setOverviewFlag(canCollapse(OLEConstants.OVERVIEW_SECTION,collapseSections));
320                 poDocument.setDeliveryFlag(canCollapse(OLEConstants.DELIVERY_SECTION,collapseSections));
321                 poDocument.setVendorFlag(canCollapse(OLEConstants.VENDOR_SECTION,collapseSections));
322                 poDocument.setTitlesFlag(canCollapse(OLEConstants.TITLES_SECTION,collapseSections));
323                 poDocument.setPaymentInfoFlag(canCollapse(OLEConstants.PAYMENT_INFO_SECTION,collapseSections));
324                 poDocument.setAdditionalInstitutionalInfoFlag(canCollapse(OLEConstants.ADDITIONAL_INSTUT_SECTION,collapseSections));
325                 poDocument.setAccountSummaryFlag(canCollapse(OLEConstants.ACCOUNT_SUMMARY_SECTION,collapseSections));
326                 poDocument.setRelatedDocumentsFlag(canCollapse(OLEConstants.RELATED_DOCUMENT_SECTION,collapseSections));
327                 poDocument.setPaymentHistoryFlag(canCollapse(OLEConstants.PAYMENT_HISTORY_SECTION,collapseSections));
328                 poDocument.setNotesAndAttachmentFlag(canCollapse(OLEConstants.NOTES_AND_ATTACH_SECTION,collapseSections));
329                 poDocument.setAdHocRecipientsFlag(canCollapse(OLEConstants.ADHOC_RECIPIENT_SECTION,collapseSections));
330                 poDocument.setRouteLogFlag(canCollapse(OLEConstants.ROUTE_LOG_SECTION,collapseSections));
331             }
332             else if (document instanceof PaymentRequestDocument) {
333                 PaymentRequestDocument paymentRequestDoc = (PaymentRequestDocument)document;
334                 collapseSections = parameterService.getParameterValuesAsString(PaymentRequestDocument.class,
335                         OLEConstants.INITIAL_COLLAPSE_SECTIONS).toArray(new String[]{});
336                 paymentRequestDoc.setOverviewFlag(canCollapse(OLEConstants.OVERVIEW_SECTION,collapseSections));
337                 paymentRequestDoc.setDeliveryFlag(canCollapse(OLEConstants.DELIVERY_SECTION,collapseSections));
338                 paymentRequestDoc.setInvoiceInfoFlag(canCollapse(OLEConstants.INVOICE_SECTION,collapseSections));
339                 paymentRequestDoc.setProcessItemsFlag(canCollapse(OLEConstants.PROCESS_ITEM_SECTION,collapseSections));
340                 paymentRequestDoc.setAccountSummaryFlag(canCollapse(OLEConstants.ACCOUNT_SUMMARY_SECTION,collapseSections));
341                 paymentRequestDoc.setRelatedDocumentsFlag(canCollapse(OLEConstants.RELATED_DOCUMENT_SECTION,collapseSections));
342                 paymentRequestDoc.setPaymentHistoryFlag(canCollapse(OLEConstants.PAYMENT_HISTORY_SECTION,collapseSections));
343                 paymentRequestDoc.setGeneralEntriesFlag(canCollapse(OLEConstants.GENERAL_ENTRY_SECTION,collapseSections));
344                 paymentRequestDoc.setNotesAndAttachmentFlag(canCollapse(OLEConstants.NOTES_AND_ATTACH_SECTION,collapseSections));
345                 paymentRequestDoc.setAdHocRecipientsFlag(canCollapse(OLEConstants.ADHOC_RECIPIENT_SECTION,collapseSections));
346                 paymentRequestDoc.setRouteLogFlag(canCollapse(OLEConstants.ROUTE_LOG_SECTION,collapseSections));
347             }
348             else if (document instanceof VendorCreditMemoDocument) {
349                 VendorCreditMemoDocument vmDocument = (VendorCreditMemoDocument)document;
350                 collapseSections = parameterService.getParameterValuesAsString(VendorCreditMemoDocument.class,
351                         OLEConstants.INITIAL_COLLAPSE_SECTIONS).toArray(new String[]{});
352                 vmDocument.setOverviewFlag(canCollapse(OLEConstants.OVERVIEW_SECTION,collapseSections));
353                 vmDocument.setVendorFlag(canCollapse(OLEConstants.VENDOR_SECTION,collapseSections));
354                 vmDocument.setCreditMemoInfoFlag(canCollapse(OLEConstants.VENDOR_SECTION,collapseSections));
355                 vmDocument.setProcessItemsFlag(canCollapse(OLEConstants.PROCESS_ITEM_SECTION,collapseSections));
356                 vmDocument.setAccountSummaryFlag(canCollapse(OLEConstants.ACCOUNT_SUMMARY_SECTION,collapseSections));
357                 vmDocument.setRelatedDocumentsFlag(canCollapse(OLEConstants.RELATED_DOCUMENT_SECTION,collapseSections));
358                 vmDocument.setPaymentHistoryFlag(canCollapse(OLEConstants.PAYMENT_HISTORY_SECTION,collapseSections));
359                 vmDocument.setGeneralEntriesFlag(canCollapse(OLEConstants.GENERAL_ENTRY_SECTION,collapseSections));
360                 vmDocument.setNotesAndAttachmentFlag(canCollapse(OLEConstants.NOTES_AND_ATTACH_SECTION,collapseSections));
361                 vmDocument.setAdHocRecipientsFlag(canCollapse(OLEConstants.ADHOC_RECIPIENT_SECTION,collapseSections));
362                 vmDocument.setRouteLogFlag(canCollapse(OLEConstants.ROUTE_LOG_SECTION,collapseSections));
363             }
364 
365         }
366         catch (Exception e) {
367             LOG.error("Error while getting the default Collapse section on PurchasingAccountsPayable Document");
368             throw new RuntimeException(e);
369         }
370         LOG.debug("Leaving getInitialCollapseSections()");
371 
372     }
373 
374     private boolean canCollapse(String sectionName, String[] collapseSections) {
375         LOG.debug("Inside method canCollapse()");
376         List<String> sectionLists = Arrays.asList(collapseSections);
377         if (sectionLists.contains(sectionName)) {
378             return false;
379         }
380         return true;
381     }
382 
383 
384     /*
385     Method to return the First and Last name of a patron given the patronid
386     This method is used only for the purpose of displaying the Patron name information on the Requisition Document..
387      */
388     public String getPatronName(String patronId){
389         StringBuffer patronName = new StringBuffer();
390         try{
391             if(LOG.isDebugEnabled()){
392                 LOG.debug("Getting name for patron -" + patronId);
393             }
394             Map<String,String> map=new HashMap<String,String>();
395             map.put("entityId",patronId);
396             EntityNameBo entityNameBo=(EntityNameBo) KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(EntityNameBo.class,map);
397             patronName.append(entityNameBo.getLastName()).append(", ").append(entityNameBo.getFirstName());
398             if(LOG.isDebugEnabled()){
399                 LOG.debug("Returning Name:" + patronName + ": for patronId :" + patronId + ":");
400             }
401         } catch(Exception e){
402             LOG.error("Exception while trying to get name for patron ",e);
403         }
404         return patronName.toString();
405     }//end getPatronName method...
406 
407     /**
408      * This method is used to set the BibMarcRecord which in turn used for creation of Bib record into docstore.
409      * @param bibMarcRecord
410      * @param bibInfoBean
411      */
412     public void setBibMarcRecord(BibMarcRecord bibMarcRecord,BibInfoBean bibInfoBean){
413         LOG.debug("Inside setBibMarcRecord method.....");
414         List<org.kuali.ole.docstore.common.document.content.bib.marc.DataField> dataFieldList = new ArrayList<DataField>();
415         if(bibInfoBean.getTitle() != null){
416             dataFieldList.add(setDataField(org.kuali.ole.OLEConstants.MARC_EDITOR_TITLE_245,bibInfoBean.getTitle()));
417         }
418         if(bibInfoBean.getAuthor() !=null){
419             dataFieldList.add(setDataField(org.kuali.ole.OLEConstants.MARC_EDITOR_TITLE_100,bibInfoBean.getAuthor()));
420         }
421         bibMarcRecord.setDataFields(dataFieldList);
422         LOG.debug("setBibMarcRecord method successfull.....");
423     }
424 
425     /**
426      * This method is used the set the Datafield for the given tag and value
427      * @param tag
428      * @param value
429      * @return
430      */
431     private DataField setDataField(String tag,String value){
432         if(LOG.isDebugEnabled()){
433             LOG.debug("inside setDataField method.....");
434             LOG.debug("tag---->"+tag+" "+"value---->"+value);
435         }
436         DataField dataField = new DataField();
437         dataField.setTag(tag);
438         List<org.kuali.ole.docstore.common.document.content.bib.marc.SubField> subFields = new ArrayList<org.kuali.ole.docstore.common.document.content.bib.marc.SubField>();
439         org.kuali.ole.docstore.common.document.content.bib.marc.SubField subField = new org.kuali.ole.docstore.common.document.content.bib.marc.SubField();
440         subField.setCode(org.kuali.ole.OLEConstants.A);
441         subField.setValue(value);
442         subFields.add(subField);
443         dataField.setSubFields(subFields);
444         return dataField;
445     }
446 
447     /**
448      * This method is to retrieve the Invoice Documents related to Requisition
449      * @param purApItem
450      */
451     public void setInvoiceDocumentsForRequisition(PurApItem purApItem) {
452         OleRequisitionItem singleItem = (OleRequisitionItem) purApItem;
453         Map<String, OleInvoiceDocument> paidDocuments = new HashMap<String, OleInvoiceDocument>();
454         Map<String, OlePaymentRequestDocument> paymentRequests = new HashMap<String, OlePaymentRequestDocument>();
455         for (OleCopy oleCopy : singleItem.getCopyList()) {
456             if (oleCopy.getOlePaidCopies().size() > 0) {
457                 for (OLEPaidCopy olePaidCopy : oleCopy.getOlePaidCopies()) {
458                     OleInvoiceDocument invoiceDocument = null;
459                     if (olePaidCopy.getInvoiceItemId() != null &&
460                             paidDocuments.containsKey(olePaidCopy.getInvoiceItemId().toString())) {
461                         OleInvoiceItem invoiceItem = olePaidCopy.getInvoiceItem();
462                         invoiceDocument = paidDocuments.get(olePaidCopy.getInvoiceItemId());
463                         if (invoiceItem.getPoItemIdentifier().compareTo(oleCopy.getPoItemId()) == 0 && invoiceDocument != null) {
464                             ((OleInvoiceItem)invoiceDocument.getItem(invoiceItem.getItemLineNumber())).setRequisitionItemIdentifier(oleCopy.getReqItemId());
465                         }
466                     }
467                     else if (olePaidCopy.getInvoiceItem().getInvoiceDocument() != null && olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier() != null
468                             && (paidDocuments.containsKey(olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier().toString()))) {
469                         OleInvoiceItem invoiceItem = olePaidCopy.getInvoiceItem();
470                         invoiceDocument = paidDocuments.get(olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier());
471                         if (invoiceItem.getPoItemIdentifier().compareTo(oleCopy.getPoItemId()) == 0 && invoiceDocument != null) {
472                             ((OleInvoiceItem)invoiceDocument.getItem(invoiceItem.getItemLineNumber())).setRequisitionItemIdentifier(oleCopy.getReqItemId());
473                         }
474                     }
475                     else {
476                         if (olePaidCopy.getInvoiceItem() != null && olePaidCopy.getInvoiceItem().isDebitItem()) {
477                             OleInvoiceItem invoiceItem = olePaidCopy.getInvoiceItem();
478                             invoiceDocument = (OleInvoiceDocument)olePaidCopy.getInvoiceItem().getInvoiceDocument();
479                             if (invoiceDocument != null && SpringContext.getBean(DocumentHeaderService.class) != null) {
480                                 invoiceDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(invoiceDocument.getDocumentNumber()));
481                                 if (invoiceItem.getPoItemIdentifier().compareTo(oleCopy.getPoItemId()) == 0) {
482                                     invoiceItem.setRequisitionItemIdentifier(oleCopy.getReqItemId());
483                                 }
484                                 paidDocuments.put(invoiceDocument.getPurapDocumentIdentifier().toString(),
485                                         invoiceDocument);
486                                 invoiceDocument.setPaymentRequestDocuments(new ArrayList<OlePaymentRequestDocument>());
487                             }
488                         }
489                     }
490                     if (invoiceDocument != null && olePaidCopy.getPreqItem() != null) {
491                         OlePaymentRequestDocument preq = (OlePaymentRequestDocument) olePaidCopy.getPreqItem().getPaymentRequestDocument();
492                         if (preq != null && !paymentRequests.containsKey(preq.getDocumentNumber())) {
493                             paymentRequests.put(preq.getDocumentNumber(), preq);
494                             invoiceDocument.getPaymentRequestDocuments().add(preq);
495                         }
496                     }
497                     if (invoiceDocument != null && SpringContext.getBean(DocumentHeaderService.class) != null) {
498                         invoiceDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(invoiceDocument.getDocumentNumber()));
499                         paidDocuments.put(invoiceDocument.getPurapDocumentIdentifier().toString(),
500                                 invoiceDocument);
501                     }
502                 }
503             }
504         }
505         Collection collection = (Collection) (paidDocuments.values());
506         List list = new ArrayList(collection);
507         singleItem.setInvoiceDocuments(list);
508     }
509 
510     /**
511      * This method is to retrieve the Invoice Documents related to PO
512      * @param purApItem
513      */
514     public void setInvoiceDocumentsForPO(PurApItem purApItem) {
515         OlePurchaseOrderItem singleItem = (OlePurchaseOrderItem) purApItem;
516         Map<String, OleInvoiceDocument> paidDocuments = new HashMap<String, OleInvoiceDocument>();
517         Map<String, OlePaymentRequestDocument> paymentRequests = new HashMap<String, OlePaymentRequestDocument>();
518         for (OleCopy oleCopy : singleItem.getCopyList()) {
519             if (oleCopy.getOlePaidCopies().size() > 0) {
520                 for (OLEPaidCopy olePaidCopy : oleCopy.getOlePaidCopies()) {
521                     OleInvoiceDocument invoiceDocument = null;
522                     if (olePaidCopy.getInvoiceItemId() != null &&
523                             paidDocuments.containsKey(olePaidCopy.getInvoiceItemId().toString())) {
524                         invoiceDocument = paidDocuments.get(olePaidCopy.getInvoiceItemId());
525                     }
526                     else if (olePaidCopy.getInvoiceItem().getInvoiceDocument() != null && olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier() != null
527                             && (paidDocuments.containsKey(olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier().toString()))) {
528                         invoiceDocument = paidDocuments.get(olePaidCopy.getInvoiceItem().getInvoiceDocument().getPurapDocumentIdentifier());
529                     }
530                     else {
531                         if (olePaidCopy.getInvoiceItem() != null) {
532                             invoiceDocument = (OleInvoiceDocument)olePaidCopy.getInvoiceItem().getInvoiceDocument();
533                             if (invoiceDocument != null && SpringContext.getBean(DocumentHeaderService.class) != null) {
534                                 invoiceDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(invoiceDocument.getDocumentNumber()));
535                                 paidDocuments.put(invoiceDocument.getPurapDocumentIdentifier().toString(),
536                                         invoiceDocument);
537                                 invoiceDocument.setPaymentRequestDocuments(new ArrayList<OlePaymentRequestDocument>());
538                             }
539                         }
540                     }
541                     if (invoiceDocument != null && olePaidCopy.getPreqItem() != null) {
542                         OlePaymentRequestDocument preq = (OlePaymentRequestDocument)olePaidCopy.getPreqItem().getPaymentRequestDocument();
543                         if (preq != null && !paymentRequests.containsKey(preq.getDocumentNumber())) {
544                             paymentRequests.put(preq.getDocumentNumber(),preq);
545                             invoiceDocument.getPaymentRequestDocuments().add(preq);
546                         }
547                     }
548                     if (invoiceDocument != null && SpringContext.getBean(DocumentHeaderService.class) != null) {
549                         invoiceDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(invoiceDocument.getDocumentNumber()));
550                         paidDocuments.put(invoiceDocument.getPurapDocumentIdentifier().toString(),
551                                 invoiceDocument);
552                     }
553                 }
554             }
555         }
556         Collection collection = (Collection)(paidDocuments.values());
557         List list = new ArrayList(collection);
558         singleItem.setInvoiceDocuments(list);
559     }
560 
561     /**
562      * This method is used to get the requestor type id for the given requestor type
563      * @param requestorType
564      * @return
565      */
566     public Integer getRequestorTypeId(String requestorType) {
567         Map<String, Object> criteria = new HashMap<String, Object>();
568         criteria.put(OleSelectConstant.REQUESTOR_TYPE, requestorType);
569         Collection<OleRequestorType> requestorTypeList = getBusinessObjectService().findMatching(OleRequestorType.class, criteria);
570         return requestorTypeList.iterator().next().getRequestorTypeId();
571     }
572 
573     /**
574      * This method is used to set the claimdate for Requisition
575      * @param oleRequisitionItem
576      */
577     public void setClaimDateForReq(OleRequisitionItem oleRequisitionItem,VendorDetail vendorDetail){
578         if (vendorDetail != null) {
579             String claimInterval = vendorDetail.getClaimInterval();
580             if (StringUtils.isNotBlank(claimInterval)) {
581                 Integer actIntvl = Integer.parseInt(claimInterval);
582                 oleRequisitionItem.setClaimDate(new java.sql.Date(DateUtils.addDays(new java.util.Date(), actIntvl).getTime()));
583             }
584         }
585     }
586 
587     /**
588      * This method is used to set the claimdate for Purchase Order
589      * @param olePurchaseOrderItem
590      */
591     public void setClaimDateForPO(OlePurchaseOrderItem olePurchaseOrderItem,VendorDetail vendorDetail){
592         if (vendorDetail != null) {
593             String claimInterval = vendorDetail.getClaimInterval();
594             if (StringUtils.isNotBlank(claimInterval)) {
595                 Integer actIntvl = Integer.parseInt(claimInterval);
596                 olePurchaseOrderItem.setClaimDate(new java.sql.Date(DateUtils.addDays(new java.util.Date(), actIntvl).getTime()));
597             }
598         }
599     }
600 
601     /**
602      * This method is used to get the item description for the given Bib
603      * @param bib
604      */
605     public String getItemDescription(Bib bib){
606         LOG.debug("### Inside setItemDescription() of OleRequisitionDocument ###");
607         String itemDescription = ((bib.getTitle() != null && !bib.getTitle().isEmpty()) ? bib.getTitle() + "," : "") + ((bib.getAuthor() != null && !bib.getAuthor().isEmpty()) ? bib.getAuthor() + "," : "") + ((bib.getPublisher() != null && !bib.getPublisher().isEmpty()) ? bib.getPublisher() + "," : "") + ((bib.getIsbn() != null && !bib.getIsbn().isEmpty()) ? bib.getIsbn() + "," : "");
608         itemDescription = itemDescription.lastIndexOf(",") < 0 ? itemDescription :
609                 itemDescription.substring(0, itemDescription.lastIndexOf(","));
610         if(LOG.isDebugEnabled()){
611             LOG.debug("Item Description---------->"+itemDescription);
612         }
613         StringEscapeUtils stringEscapeUtils = new StringEscapeUtils();
614         itemDescription = stringEscapeUtils.unescapeHtml(itemDescription);
615         return itemDescription;
616     }
617 
618 
619     public String getItemDescription(OlePurchaseOrderItem olePurchaseOrderItem) {
620         BibInfoRecord bibInfoRecord = olePurchaseOrderItem.getBibInfoRecord();
621         String itemDescription = null;
622         if (bibInfoRecord != null) {
623             olePurchaseOrderItem.setBibUUID(bibInfoRecord.getBibIdStr());
624             olePurchaseOrderItem.setDocFormat(DocumentUniqueIDPrefix.getBibFormatType(olePurchaseOrderItem.getItemTitleId()));
625 
626             itemDescription = ((bibInfoRecord.getTitle() != null && !bibInfoRecord.getTitle().isEmpty()) ? bibInfoRecord.getTitle().trim() + ", " : "")
627                     + ((bibInfoRecord.getAuthor() != null && !bibInfoRecord
628                     .getAuthor().isEmpty()) ? bibInfoRecord.getAuthor().trim() + ", "
629                     : "")
630                     + ((bibInfoRecord.getPublisher() != null && !bibInfoRecord
631                     .getPublisher().isEmpty()) ? bibInfoRecord.getPublisher().trim()
632                     + ", " : "")
633                     + ((bibInfoRecord.getIsxn() != null && !bibInfoRecord.getIsxn()
634                     .isEmpty()) ? bibInfoRecord.getIsxn().trim() + ", " : "");
635         }
636         if (itemDescription != null && !(itemDescription.equals(""))) {
637             itemDescription = itemDescription.lastIndexOf(",") < 0 ? itemDescription :
638                     itemDescription.substring(0, itemDescription.lastIndexOf(","));
639             StringEscapeUtils stringEscapeUtils = new StringEscapeUtils();
640             itemDescription = stringEscapeUtils.unescapeXml(itemDescription);
641         }
642         return itemDescription;
643     }
644 
645     /**
646      *  This method is used to get the Purchase Order Type object based on the given purchase order type id
647      * @param purchaseOrderTypeId
648      * @return
649      */
650     public PurchaseOrderType getPurchaseOrderType(BigDecimal purchaseOrderTypeId){
651         Map purchaseOrderTypeIdMap = new HashMap();
652         purchaseOrderTypeIdMap.put(org.kuali.ole.OLEConstants.PURCHASE_ORDER_TYPE_ID, purchaseOrderTypeId);
653         List<PurchaseOrderType> purchaseOrderTypeDocumentList = (List) getBusinessObjectService().findMatching(PurchaseOrderType.class, purchaseOrderTypeIdMap);
654         if (purchaseOrderTypeDocumentList != null && purchaseOrderTypeDocumentList.size() > 0) {
655             return purchaseOrderTypeDocumentList.get(0);
656         }else{
657             return null;
658         }
659     }
660 
661     /**
662      * This method returns the system parameter value for the given input.
663      * @param name
664      * @return
665      */
666     public String getParameter(String name) {
667         LOG.debug("Inside getParameter()");
668         String parameter = "";
669         try {
670             Map<String, String> criteriaMap = new HashMap<String, String>();
671             criteriaMap.put(org.kuali.ole.OLEConstants.NAMESPACE_CODE, org.kuali.ole.OLEConstants.SELECT_NMSPC);
672             criteriaMap.put(org.kuali.ole.OLEConstants.COMPONENT_CODE, org.kuali.ole.OLEConstants.SELECT_CMPNT);
673             criteriaMap.put(org.kuali.ole.OLEConstants.NAME_SELECTOR, name);
674             List<ParameterBo> parametersList = (List<ParameterBo>) getBusinessObjectService().findMatching(ParameterBo.class, criteriaMap);
675             for (ParameterBo parameterBo : parametersList) {
676                 parameter = parameterBo.getValue();
677             }
678         } catch (Exception e) {
679             LOG.error("Exception while getting parameter value", e);
680         }
681         LOG.debug("End of getParameter()");
682         return parameter;
683     }
684 
685     /**
686      * This method gives the current date time value.
687      * @return
688      */
689     public String getCurrentDateTime() {
690         LOG.debug("Inside getCurrentDateTime()");
691         Date date = getDateTimeService().getCurrentDate();
692         String currentDate = SpringContext.getBean(DateTimeService.class).toString(date, timeStampFormat);
693         LOG.debug("End of getCurrentDateTime()");
694         return currentDate;
695     }
696 
697     /**
698      * This method is used to set the Document Description from system parameters.
699      * @param description
700      * @param descMap
701      * @return
702      */
703     public String setDocumentDescription(String description,Map descMap){
704         LOG.debug("Inside setDocumentDescription()");
705         if(description.contains(OLEConstants.OPERATOR_INITIALS)){
706             description = description.replace(OLEConstants.OPERATOR_INITIALS,getOperatorInitials());
707         }
708         if(description.contains(OLEConstants.CURRENT_DATE_TIME)){
709             description = description.replace(OLEConstants.CURRENT_DATE_TIME,getCurrentDateTime());
710         }
711         if(descMap != null){
712             if(description.contains(OLEConstants.PO_DOC_ID)){
713                 description = description.replace(OLEConstants.PO_DOC_ID,descMap.get(OLEConstants.PO_DOC_ID) != null ?descMap.get(OLEConstants.PO_DOC_ID).toString():"");
714             }
715             if(description.contains(OLEConstants.VENDOR_NAME)){
716                 description = description.replace(OLEConstants.VENDOR_NAME,descMap.get(OLEConstants.VENDOR_NAME) != null ?descMap.get(OLEConstants.VENDOR_NAME).toString():"");
717             }
718             if(description.contains(OLEConstants.ORDER_TYP)){
719                 description = description.replace(OLEConstants.ORDER_TYP,descMap.get(OLEConstants.ORDER_TYP) != null ? descMap.get(OLEConstants.ORDER_TYP).toString():"");
720             }
721             if(description.contains(OLEConstants.VND_ITM_ID)){
722                 description = description.replace(OLEConstants.VND_ITM_ID,descMap.get(OLEConstants.VND_ITM_ID) != null ? descMap.get(OLEConstants.VND_ITM_ID).toString():"");
723             }
724         }
725         if(LOG.isDebugEnabled()) {
726             LOG.debug("Document Description ----------------->" +  description);
727         }
728         LOG.debug("End of setDocumentDescription()");
729         return description;
730 
731     }
732 }