1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.ole.module.purap.document.web.struts;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.apache.struts.action.ActionForm;
20  import org.apache.struts.action.ActionForward;
21  import org.apache.struts.action.ActionMapping;
22  import org.kuali.ole.DocumentUniqueIDPrefix;
23  import org.kuali.ole.coa.businessobject.Account;
24  import org.kuali.ole.docstore.common.client.DocstoreClientLocator;
25  import org.kuali.ole.docstore.common.document.Bib;
26  import org.kuali.ole.docstore.common.document.Holdings;
27  import org.kuali.ole.module.purap.PurapConstants;
28  import org.kuali.ole.module.purap.PurapKeyConstants;
29  import org.kuali.ole.module.purap.PurapParameterConstants;
30  import org.kuali.ole.module.purap.PurapPropertyConstants;
31  import org.kuali.ole.module.purap.businessobject.PurApAccountingLine;
32  import org.kuali.ole.module.purap.businessobject.PurApItem;
33  import org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocument;
34  import org.kuali.ole.module.purap.document.PurchasingDocument;
35  import org.kuali.ole.module.purap.document.RequisitionDocument;
36  import org.kuali.ole.module.purap.document.service.OlePurapService;
37  import org.kuali.ole.module.purap.document.service.PurapService;
38  import org.kuali.ole.pojo.OleBibRecord;
39  import org.kuali.ole.pojo.OleEditorResponse;
40  import org.kuali.ole.select.OleSelectConstant;
41  import org.kuali.ole.select.bo.OLEDonor;
42  import org.kuali.ole.select.bo.OLELinkPurapDonor;
43  import org.kuali.ole.select.bo.OLEEditorResponse;
44  import org.kuali.ole.select.businessobject.*;
45  import org.kuali.ole.select.constants.OleSelectPropertyConstants;
46  import org.kuali.ole.select.document.OleDefaultValueAssignment;
47  import org.kuali.ole.select.document.OleInvoiceDocument;
48  import org.kuali.ole.select.document.OleRequisitionDocument;
49  import org.kuali.ole.select.document.service.OleCopyHelperService;
50  import org.kuali.ole.select.document.service.OleDocstoreHelperService;
51  import org.kuali.ole.select.document.service.OleRequisitionDocumentService;
52  import org.kuali.ole.select.document.validation.event.CopiesRequisitionEvent;
53  import org.kuali.ole.select.document.validation.event.DiscountRequisitionEvent;
54  import org.kuali.ole.select.document.validation.event.ForeignCurrencyRequisitionEvent;
55  import org.kuali.ole.select.document.web.struts.OleRequisitionForm;
56  import org.kuali.ole.sys.OLEConstants;
57  import org.kuali.ole.sys.OLEPropertyConstants;
58  import org.kuali.ole.sys.businessobject.AccountingLineBase;
59  import org.kuali.ole.sys.businessobject.SourceAccountingLine;
60  import org.kuali.ole.sys.context.SpringContext;
61  import org.kuali.ole.sys.document.validation.event.AddAccountingLineEvent;
62  import org.kuali.ole.vnd.VendorConstants;
63  import org.kuali.ole.vnd.businessobject.*;
64  import org.kuali.ole.vnd.document.service.VendorService;
65  import org.kuali.rice.core.api.config.property.ConfigurationService;
66  import org.kuali.rice.core.api.util.RiceKeyConstants;
67  import org.kuali.rice.core.api.util.type.KualiDecimal;
68  import org.kuali.rice.core.api.util.type.KualiInteger;
69  import org.kuali.rice.coreservice.framework.parameter.ParameterService;
70  import org.kuali.rice.kew.api.exception.WorkflowException;
71  import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
72  import org.kuali.rice.krad.service.*;
73  import org.kuali.rice.krad.util.GlobalVariables;
74  import org.kuali.rice.krad.util.KRADConstants;
75  import org.kuali.rice.krad.util.ObjectUtils;
76  
77  import javax.servlet.http.HttpServletRequest;
78  import javax.servlet.http.HttpServletResponse;
79  import java.math.BigDecimal;
80  import java.math.RoundingMode;
81  import java.util.*;
82  
83  public class OleRequisitionAction extends RequisitionAction {
84      protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OleRequisitionAction.class);
85      private static transient ConfigurationService kualiConfigurationService;
86      private boolean sufficientFundChecklag = true;
87      private DocstoreClientLocator docstoreClientLocator;
88      private static transient OlePurapService olePurapService;
89  
90      public DocstoreClientLocator getDocstoreClientLocator() {
91          if (docstoreClientLocator == null) {
92              docstoreClientLocator = SpringContext.getBean(DocstoreClientLocator.class);
93          }
94          return docstoreClientLocator;
95      }
96  
97      public static OlePurapService getOlePurapService() {
98          if (olePurapService == null) {
99              olePurapService = SpringContext.getBean(OlePurapService.class);
100         }
101         return olePurapService;
102     }
103 
104     public static void setOlePurapService(OlePurapService olePurapService) {
105         OleRequisitionAction.olePurapService = olePurapService;
106     }
107     
108 
109 
110 
111 
112     @Override
113     protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
114         LOG.debug("Inside the OleRequisitionAction class Create Document");
115         super.createDocument(kualiDocumentFormBase);
116         OleRequisitionForm oleRequisitionForm = (OleRequisitionForm) kualiDocumentFormBase;
117         OleRequisitionItem oleRequisitionItem = (OleRequisitionItem) oleRequisitionForm.getNewPurchasingItemLine();
118         ((RequisitionDocument) kualiDocumentFormBase.getDocument()).initiateDocument();
119         RequisitionDocument requisitionDocument = (RequisitionDocument) kualiDocumentFormBase.getDocument();
120         new OleDefaultValueAssignment(oleRequisitionForm.getDefaultDocumentTypeName(), oleRequisitionItem, requisitionDocument);
121     }
122 
123     
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134     @Override
135     public ActionForward calculate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
136         LOG.debug("Inside the OleRequisitionAction class Calculate");
137         PurchasingAccountsPayableFormBase purchasingForm = (PurchasingAccountsPayableFormBase) form;
138         List<PurApItem> purApItems = ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItems();
139         for(PurApItem purApItem:purApItems){
140             List<KualiDecimal> existingAmount=new ArrayList<>();
141             for(PurApAccountingLine oldSourceAccountingLine:purApItem.getSourceAccountingLines()) {
142                 if(oldSourceAccountingLine instanceof OleRequisitionAccount) {
143                     if(((OleRequisitionAccount)oldSourceAccountingLine).getExistingAmount()!=null){
144                         existingAmount.add(((OleRequisitionAccount)oldSourceAccountingLine).getExistingAmount());
145                     }
146                 }
147             }
148             int count=0;
149             for(PurApAccountingLine account:purApItem.getSourceAccountingLines()){
150 
151                 if (ObjectUtils.isNotNull(account.getAccountLinePercent()) || ObjectUtils.isNotNull(account.getAmount())) {
152                     if (account.getAmount()!=null&&count<existingAmount.size()&&existingAmount.size() != 0 && !existingAmount.get(count).toString().equals(account.getAmount().toString())) {
153                         KualiDecimal calculatedPercent = new KualiDecimal(account.getAmount().multiply(new KualiDecimal(100)).divide(purApItem.getTotalAmount()).toString());
154                         account.setAccountLinePercent(calculatedPercent.bigDecimalValue().setScale(OLEConstants.BIG_DECIMAL_SCALE,BigDecimal.ROUND_CEILING));
155                     }
156                     else {
157                         if(account.getAccountLinePercent().intValue()==100&&(account.getAmount()==null||account.getAccount()!=null)){
158                             KualiDecimal calculatedAmount = new KualiDecimal(account.getAccountLinePercent().multiply(purApItem.getTotalAmount().bigDecimalValue()).divide(new BigDecimal(100)).toString());
159                             account.setAmount(calculatedAmount);
160                         }
161                         else{
162                             KualiDecimal calculatedAmount = new KualiDecimal(account.getAccountLinePercent().multiply(purApItem.getTotalAmount().bigDecimalValue()).divide(new BigDecimal(100)).toString());
163                             account.setAmount(calculatedAmount);
164                         }
165                     }
166                 }
167                 count++;
168             }
169             for(PurApAccountingLine oldSourceAccountingLine:purApItem.getSourceAccountingLines()) {
170                 if(oldSourceAccountingLine instanceof OleRequisitionAccount) {
171                     ((OleRequisitionAccount)oldSourceAccountingLine).setExistingAmount(oldSourceAccountingLine.getAmount());
172                 }
173             }
174         }
175         ActionForward forward = super.calculate(mapping, form, request, response);
176         purchasingForm = (PurchasingAccountsPayableFormBase) form;
177         PurchasingDocument purDoc = (PurchasingDocument) purchasingForm.getDocument();
178         PurchasingFormBase formBase = (PurchasingFormBase) form;
179         OleRequisitionDocument reqDoc = (OleRequisitionDocument) formBase.getDocument();
180         boolean foreignCurrencyIndicator = false;
181 
182         List<OleRequisitionItem> item = reqDoc.getItems();
183         if (purDoc.getVendorDetail()!=null) {
184             foreignCurrencyIndicator = isForeignCurrency(purDoc.getVendorDetail().getCurrencyType());
185         }
186         if (purDoc.getVendorDetail() == null || (purDoc.getVendorDetail() != null && (!foreignCurrencyIndicator))) {
187             for (int i = 0; purDoc.getItems().size() > i; i++) {
188                 OleRequisitionItem items = (OleRequisitionItem) purDoc.getItem(i);
189                 if ((items.getItemType().isQuantityBasedGeneralLedgerIndicator())) {
190                     boolean rulePassed = getKualiRuleService().applyRules(new DiscountRequisitionEvent(reqDoc, items));
191                     if (rulePassed) {
192                         items.setItemUnitPrice(SpringContext.getBean(OlePurapService.class).calculateDiscount(items).setScale(2, BigDecimal.ROUND_HALF_UP));
193                     }
194                     rulePassed = getKualiRuleService().applyRules(new CopiesRequisitionEvent(reqDoc, items));
195                 }
196 
197             }
198         } else {
199             LOG.debug("###########Foreign Currency Field Calculation###########");
200             for (int i = 0; item.size() > i; i++) {
201                 OleRequisitionItem items = (OleRequisitionItem) reqDoc.getItem(i);
202                 if ((items.getItemType().isQuantityBasedGeneralLedgerIndicator())) {
203                     boolean rulePassed = getKualiRuleService().applyRules(new ForeignCurrencyRequisitionEvent(reqDoc, items));
204                     if (rulePassed) {
205                         SpringContext.getBean(OlePurapService.class).calculateForeignCurrency(items);
206                         Long id = reqDoc.getVendorDetail().getCurrencyType().getCurrencyTypeId();
207                         Map documentNumberMap = new HashMap();
208                         documentNumberMap.put(OleSelectConstant.CURRENCY_TYPE_ID, id);
209                         BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
210                         List<OleExchangeRate> exchangeRateList = (List) businessObjectService.findMatchingOrderBy(OleExchangeRate.class, documentNumberMap, OleSelectConstant.EXCHANGE_RATE_DATE, false);
211                         Iterator iterator = exchangeRateList.iterator();
212                         if (iterator.hasNext()) {
213                             OleExchangeRate tempOleExchangeRate = (OleExchangeRate) iterator.next();
214                             items.setItemExchangeRate(new KualiDecimal(tempOleExchangeRate.getExchangeRate()));
215                         }
216                         if (items.getItemExchangeRate() != null && items.getItemForeignUnitCost() != null) {
217                             items.setItemUnitCostUSD(new KualiDecimal(items.getItemForeignUnitCost().bigDecimalValue().divide(items.getItemExchangeRate().bigDecimalValue(), 4, RoundingMode.HALF_UP)));
218                             items.setItemUnitPrice(items.getItemUnitCostUSD().bigDecimalValue().setScale(2, BigDecimal.ROUND_HALF_UP));
219                             items.setItemListPrice(items.getItemUnitCostUSD());
220                             items.setTotalAmount(items.getTotalAmount());
221                         }
222                     }
223                 }
224             }
225         }
226         purchasingForm = (PurchasingAccountsPayableFormBase) form;
227         List<PurApItem> newpurApItems = ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItems();
228         for(PurApItem purApItem:newpurApItems){
229             for(PurApAccountingLine account:purApItem.getSourceAccountingLines()){
230                 KualiDecimal calculatedAmount = new KualiDecimal(account.getAccountLinePercent().multiply(purApItem.getTotalAmount().bigDecimalValue()).divide(new BigDecimal(100)).toString());
231                 account.setAmount(calculatedAmount);
232             }
233         }
234         forward = super.calculate(mapping, form, request, response);
235         
236 
237         
238         OleRequisitionDocumentService oleRequisitionDocumentService = (OleRequisitionDocumentService) SpringContext
239                 .getBean("oleRequisitionDocumentService");
240         List<SourceAccountingLine> sourceAccountingLineList = reqDoc.getSourceAccountingLines();
241         for (SourceAccountingLine accLine : sourceAccountingLineList) {
242             String notificationOption = null;
243             boolean sufficientFundCheck;
244             Map<String, Object> key = new HashMap<String, Object>();
245             String chartCode = accLine.getChartOfAccountsCode();
246             String accNo = accLine.getAccountNumber();
247             key.put(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartCode);
248             key.put(OLEPropertyConstants.ACCOUNT_NUMBER, accNo);
249             OleSufficientFundCheck account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(
250                     OleSufficientFundCheck.class, key);
251             if (account != null) {
252                 notificationOption = account.getNotificationOption();
253             }
254             if (notificationOption != null && notificationOption.equals(OLEPropertyConstants.BLOCK_USE)) {
255                 sufficientFundCheck = oleRequisitionDocumentService.hasSufficientFundsOnRequisition(accLine);
256                 if (sufficientFundCheck) {
257                     GlobalVariables.getMessageMap().putError(
258                             OLEConstants.SufficientFundCheck.ERROR_MSG_FOR_INSUFF_FUND, RiceKeyConstants.ERROR_CUSTOM,
259                             OLEConstants.SufficientFundCheck.INSUFF_FUND_REQ + accLine.getAccountNumber());
260                 }
261             }
262         }
263         
264         if (LOG.isDebugEnabled()) {
265             LOG.debug("Inside the OleRequisitionAcrion class Calculate" + formBase.getNewPurchasingItemLine().getItemUnitPrice());
266         }
267         return forward;
268     }
269 
270     
271 
272 
273 
274 
275 
276 
277 
278 
279 
280     @Override
281     public ActionForward addItem(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
282         LOG.debug("###########Inside AddItem in oleRequisitionAction ###########");
283         PurchasingFormBase purchasingForm = (PurchasingFormBase) form;
284         OleRequisitionItem item = (OleRequisitionItem) purchasingForm.getNewPurchasingItemLine();
285         OleRequisitionDocument document = (OleRequisitionDocument) purchasingForm.getDocument();
286         OleRequisitionForm oleForm = (OleRequisitionForm) form;
287         OleRequisitionDocument doc = (OleRequisitionDocument) oleForm.getDocument();
288         Iterator itemIterator = doc.getItems().iterator();
289         int itemCounter = 0;
290         while (itemIterator.hasNext()) {
291             OleRequisitionItem tempItem = (OleRequisitionItem) itemIterator.next();
292             if (tempItem.getItemTypeCode().equals(PurapConstants.ItemTypeCodes.ITEM_TYPE_ITEM_CODE)) {
293                 itemCounter++;
294             }
295         }
296         String itemNo = String.valueOf(itemCounter);
297         BibInfoBean xmlBibInfoBean = new BibInfoBean();
298         if (item.getBibInfoBean() == null) {
299             item.setBibInfoBean(xmlBibInfoBean);
300             if (item.getBibInfoBean().getDocStoreOperation() == null) {
301                 item.getBibInfoBean().setDocStoreOperation(OleSelectConstant.DOCSTORE_OPERATION_STAFF);
302             }
303         } else {
304             if (item.getBibInfoBean().getDocStoreOperation() == null) {
305                 item.getBibInfoBean().setDocStoreOperation(OleSelectConstant.DOCSTORE_OPERATION_STAFF);
306             }
307         }
308         String fileName = document.getDocumentNumber() + "_" + itemNo;
309         
310 
311         setItemDescription(item, fileName);
312         if (document.getVendorDetail().getVendorHeader().getVendorForeignIndicator() != null) {
313             if ((document.getVendorDetail() == null) || (document.getVendorDetail().getVendorName() != null && !document.getVendorDetail().getVendorHeader().getVendorForeignIndicator())) {
314                 purchasingForm.getNewPurchasingItemLine().setItemUnitPrice(SpringContext.getBean(OlePurapService.class).calculateDiscount(item).setScale(2, BigDecimal.ROUND_HALF_UP));
315                 super.addItem(mapping, purchasingForm, request, response);
316                 
317             } else {
318                 LOG.debug("###########Foreign Currency Field Calculation for requisition###########");
319                 SpringContext.getBean(OlePurapService.class).calculateForeignCurrency(item);
320                 Long currencyTypeId = document.getVendorDetail().getCurrencyType().getCurrencyTypeId();
321                 Map documentNumberMap = new HashMap();
322                 documentNumberMap.put(OleSelectConstant.CURRENCY_TYPE_ID, currencyTypeId);
323                 BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
324                 List<OleExchangeRate> exchangeRateList = (List) businessObjectService.findMatchingOrderBy(OleExchangeRate.class, documentNumberMap, OleSelectConstant.EXCHANGE_RATE_DATE, false);
325                 Iterator iterator = exchangeRateList.iterator();
326                 if (iterator.hasNext()) {
327                     OleExchangeRate tempOleExchangeRate = (OleExchangeRate) iterator.next();
328                     item.setItemExchangeRate(new KualiDecimal(tempOleExchangeRate.getExchangeRate()));
329                 }
330                 if (item.getItemExchangeRate() != null && item.getItemForeignUnitCost() != null) {
331                     item.setItemUnitCostUSD(new KualiDecimal(item.getItemForeignUnitCost().bigDecimalValue().divide(item.getItemExchangeRate().bigDecimalValue(), 4, RoundingMode.HALF_UP)));
332                     item.setItemUnitPrice(item.getItemUnitCostUSD().bigDecimalValue().setScale(2, BigDecimal.ROUND_HALF_UP));
333                     item.setItemListPrice(item.getItemUnitCostUSD());
334                 }
335                 super.addItem(mapping, purchasingForm, request, response);
336             }
337         } else {
338             purchasingForm.getNewPurchasingItemLine().setItemUnitPrice(SpringContext.getBean(OlePurapService.class).calculateDiscount(item).setScale(2, BigDecimal.ROUND_HALF_UP));
339             super.addItem(mapping, purchasingForm, request, response);
340         }
341         if(item.getClaimDate()==null){
342             getOlePurapService().setClaimDateForReq(item,document.getVendorDetail());
343         }
344         return mapping.findForward(OLEConstants.MAPPING_BASIC);
345     }
346 
347     
348 
349 
350 
351 
352 
353 
354 
355 
356 
357     public ActionForward performPRLookup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
358         LOG.debug("Inside performPRLookup Method of OleRequisitionAction");
359         ActionForward forward = super.performLookup(mapping, form, request, response);
360         String path = forward.getPath();
361         if (path.contains("kr/" + KRADConstants.LOOKUP_ACTION)) {
362             path = path.replace("kr/" + KRADConstants.LOOKUP_ACTION, OLEConstants.PR_LOOKUP_ACTION);
363             
364         } else if (path.contains(KRADConstants.LOOKUP_ACTION)) {
365             path = path.replace(KRADConstants.LOOKUP_ACTION, OLEConstants.PR_LOOKUP_ACTION);
366             
367         }
368         forward.setPath(path);
369         LOG.debug("Leaving performPRLookup Method of OleRequisitionAction");
370         return forward;
371     }
372 
373 
374     
375 
376 
377 
378 
379 
380 
381 
382 
383 
384 
385     public ActionForward addNote(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
386         LOG.debug("Inside addNote Method of OleRequisitionAction");
387         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
388         int line = this.getSelectedLine(request);
389         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItem(line);
390         OleRequisitionNotes note = new OleRequisitionNotes();
391         note.setNoteTypeId(item.getNoteTypeId());
392         note.setNote(item.getNote());
393         item.getNotes().add(note);
394         LOG.debug("Adding Note to the RequisitionItem");
395         item.setNoteTypeId(null);
396         item.setNote(null);
397         LOG.debug("Leaving addNote Method of OleRequisitionAction");
398         return mapping.findForward(OLEConstants.MAPPING_BASIC);
399     }
400 
401     
402 
403 
404 
405 
406 
407 
408 
409 
410 
411     public ActionForward deleteNote(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
412         LOG.debug("Inside deleteNote Method of OleRequisitionAction");
413         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
414         String[] indexes = getSelectedLineForAccounts(request);
415         int itemIndex = Integer.parseInt(indexes[0]);
416         int noteIndex = Integer.parseInt(indexes[1]);
417         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItem((itemIndex));
418         item.getNotes().remove(noteIndex);
419         LOG.debug("Selected Note is Remove");
420         LOG.debug("Leaving deleteNote Method of OleRequisitionAction");
421         return mapping.findForward(OLEConstants.MAPPING_BASIC);
422     }
423 
424     @Override
425     public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
426         PurchasingFormBase purchasingForm = (PurchasingFormBase) form;
427         PurchasingDocument purDoc = (PurchasingDocument) purchasingForm.getDocument();
428         PurchasingFormBase formBase = (PurchasingFormBase) form;
429         OleRequisitionDocument reqDoc = (OleRequisitionDocument) formBase.getDocument();
430         List<OleRequisitionItem> items = reqDoc.getItems();
431         
432         if (requiresCalculate(purchasingForm)) {
433             GlobalVariables.getMessageMap().putError(OLEConstants.DOCUMENT_ERRORS, PurapKeyConstants.ERROR_PURCHASING_REQUIRES_CALCULATE);
434             return mapping.findForward(OLEConstants.MAPPING_BASIC);
435         }
436         
437         SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(purDoc);
438         this.calculate(mapping, purchasingForm, request, response);
439         for (OleRequisitionItem item : items) {
440             if (null != item.getItemType() && item.getItemType().isQuantityBasedGeneralLedgerIndicator()) {
441                 if (item.getItemQuantity() != null && item.getItemNoOfParts() != null && !item.getItemQuantity().isGreaterThan(new KualiDecimal(1))
442                         && !item.getItemNoOfParts().isGreaterThan(new KualiInteger(1))) {
443                     OleCopy oleCopy = new OleCopy();
444                     oleCopy.setLocation(item.getItemLocation());
445                     oleCopy.setBibId(item.getItemTitleId());
446                     if (StringUtils.isNotBlank(item.getLinkToOrderOption()) && (item.getLinkToOrderOption().equals(OLEConstants.NB_PRINT) || item.getLinkToOrderOption().equals(OLEConstants.EB_PRINT))) {
447                         oleCopy.setCopyNumber(item.getSingleCopyNumber() != null && !item.getSingleCopyNumber().isEmpty() ? item.getSingleCopyNumber() : null);
448                     }
449                     oleCopy.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
450                     List<OleCopy> copyList = new ArrayList<>();
451                     copyList.add(oleCopy);
452                     item.setCopyList(copyList);
453                 }
454             }
455         }
456         if (sufficientFundChecklag) {
457             return super.route(mapping, form, request, response);
458         }
459         return mapping.findForward(OLEConstants.MAPPING_BASIC);
460     }
461 
462     
463 
464     
465 
466 
467 
468     @Override
469     public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
470         LOG.debug("<<<---------Inside OleRequisitionAction Refresh------>>>");
471         ActionForward forward = super.refresh(mapping, form, request, response);
472         OleRequisitionForm rqForm = (OleRequisitionForm) form;
473         OleRequisitionDocument document = (OleRequisitionDocument) rqForm.getDocument();
474         OleRequisitionItem item = (OleRequisitionItem) rqForm.getNewPurchasingItemLine();
475         
476         document.setOrganizationAutomaticPurchaseOrderLimit(SpringContext.getBean(PurapService.class).getApoLimit(document.getVendorContractGeneratedIdentifier(), document.getChartOfAccountsCode(), document.getOrganizationCode()));
477         
478         if (LOG.isInfoEnabled()) {
479             LOG.info("Currency Type on Requisition :" + document.getVendorDetail().getCurrencyType());
480         }
481         if (document.getVendorDetail() != null) {
482             if (document.getVendorDetail().getVendorTransmissionFormat().size() > 0) {
483                 List<VendorTransmissionFormatDetail> vendorTransmissionFormat = document.getVendorDetail().getVendorTransmissionFormat();
484                 for (VendorTransmissionFormatDetail iter : vendorTransmissionFormat) {
485                     if (iter.isVendorPreferredTransmissionFormat()) {
486                         if (iter.getVendorTransmissionFormat().getVendorTransmissionFormat() != null) {
487                             if (iter.getVendorTransmissionFormat().getVendorTransmissionFormat().equalsIgnoreCase(OleSelectConstant.VENDOR_TRANSMISSION_FORMAT_EDI) ||
488                                     iter.getVendorTransmissionFormat().getVendorTransmissionFormat().equalsIgnoreCase(OleSelectConstant.VENDOR_TRANSMISSION_FORMAT_PDF)) {
489                                 document.setPurchaseOrderTransmissionMethodCode(OleSelectConstant.METHOD_OF_PO_TRANSMISSION_NOPR);
490                             } else {
491                                 document.setPurchaseOrderTransmissionMethodCode(SpringContext.getBean(ParameterService.class).getParameterValueAsString(RequisitionDocument.class, PurapParameterConstants.PURAP_DEFAULT_PO_TRANSMISSION_CODE));
492                             }
493                         }
494                     }
495                 }
496             } else {
497                 document.setPurchaseOrderTransmissionMethodCode(SpringContext.getBean(ParameterService.class).getParameterValueAsString(RequisitionDocument.class, PurapParameterConstants.PURAP_DEFAULT_PO_TRANSMISSION_CODE));
498             }
499             boolean foreignCurrencyIndicator = isForeignCurrency(document.getVendorDetail().getCurrencyType());
500           
501                 if ((!foreignCurrencyIndicator) && item.getItemType().isQuantityBasedGeneralLedgerIndicator()) {
502                     if (document.getVendorDetail().getCurrencyType() != null) {
503                         Long currencyTypeId = document.getVendorDetail().getCurrencyType().getCurrencyTypeId();
504                         Map documentNumberMap = new HashMap();
505                         documentNumberMap.put(OleSelectConstant.CURRENCY_TYPE_ID, currencyTypeId);
506                         BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
507                         List<OleExchangeRate> exchangeRateList = (List) businessObjectService.findMatchingOrderBy(OleExchangeRate.class, documentNumberMap, OleSelectConstant.EXCHANGE_RATE_DATE, false);
508                         Iterator iterator = exchangeRateList.iterator();
509                         if (iterator.hasNext()) {
510                             OleExchangeRate tempOleExchangeRate = (OleExchangeRate) iterator.next();
511                             item.setItemExchangeRate(new KualiDecimal(tempOleExchangeRate.getExchangeRate()));
512                         }
513                     }
514                 }
515             
516         }
517         return forward;
518     }
519 
520     private boolean isForeignCurrency(OleCurrencyType oleCurrencyType){
521         boolean foreignCurrencyIndicator = false;
522         if(oleCurrencyType!=null){
523             if(!oleCurrencyType.getCurrencyType().equalsIgnoreCase(OleSelectConstant.CURRENCY_TYPE_NAME)){
524                 foreignCurrencyIndicator = true;
525             }
526         }
527         return foreignCurrencyIndicator;
528     }
529 
530     
531 
532 
533     @Override
534     public ActionForward clearVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
535 
536         ActionForward forward = super.clearVendor(mapping, form, request, response);
537         OleRequisitionForm rqForm = (OleRequisitionForm) form;
538         OleRequisitionDocument document = (OleRequisitionDocument) rqForm.getDocument();
539         document.setPurchaseOrderTransmissionMethodCode(OleSelectConstant.METHOD_OF_PO_TRANSMISSION_NOPR);
540         return forward;
541     }
542     
543     
544 
545     
546 
547 
548 
549     @Override
550     public ActionForward insertSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
551         
552         PurchasingAccountsPayableFormBase purapForm = (PurchasingAccountsPayableFormBase) form;
553 
554 
555         
556         int itemIndex = getSelectedLine(request);
557         PurApItem item = null;
558 
559 
560         
561         if (processCustomInsertAccountingLine(purapForm, request) == false) {
562             String errorPrefix = null;
563             PurApAccountingLine line = null;
564 
565             boolean rulePassed = false;
566             if (itemIndex >= 0) {
567                 item = ((PurchasingAccountsPayableDocument) purapForm.getDocument()).getItem((itemIndex));
568                 
569                 PurApAccountingLine lineItem = item.getNewSourceLine();
570                 if (item.getTotalAmount() != null && !item.getTotalAmount().equals(KualiDecimal.ZERO)) {
571                     if (lineItem.getAccountLinePercent() != null && (lineItem.getAmount() == null || lineItem.getAmount().equals(KualiDecimal.ZERO))) {
572                         BigDecimal percent = lineItem.getAccountLinePercent().divide(new BigDecimal(100));
573                         lineItem.setAmount((item.getTotalAmount().multiply(new KualiDecimal(percent))));
574                     } else if (lineItem.getAmount() != null && lineItem.getAmount().isNonZero() && lineItem.getAccountLinePercent() == null) {
575                         KualiDecimal dollar = lineItem.getAmount().multiply(new KualiDecimal(100));
576                         BigDecimal dollarToPercent = dollar.bigDecimalValue().divide((item.getTotalAmount().bigDecimalValue()), 0, RoundingMode.FLOOR);
577                         lineItem.setAccountLinePercent(dollarToPercent);
578                     } else if (lineItem.getAmount() != null && lineItem.getAmount().isZero() && lineItem.getAccountLinePercent() == null) {
579                         lineItem.setAccountLinePercent(new BigDecimal(0));
580                     }
581                     else if(lineItem.getAmount()!=null&& lineItem.getAccountLinePercent().intValue()== 100){
582                         KualiDecimal dollar = lineItem.getAmount().multiply(new KualiDecimal(100));
583                         BigDecimal dollarToPercent = dollar.bigDecimalValue().divide((item.getTotalAmount().bigDecimalValue()),0,RoundingMode.FLOOR);
584                         lineItem.setAccountLinePercent(dollarToPercent);
585                     }
586                     else if(lineItem.getAmount()!=null&&lineItem.getAccountLinePercent() != null){
587                         BigDecimal percent = lineItem.getAccountLinePercent().divide(new BigDecimal(100));
588                         lineItem.setAmount((item.getTotalAmount().multiply(new KualiDecimal(percent))));
589                     }
590                 } else {
591                     lineItem.setAmount(new KualiDecimal(0));
592                 }
593                 line = (PurApAccountingLine) ObjectUtils.deepCopy(lineItem);
594                 
595                 
596                 errorPrefix = OLEPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.ITEM + "[" + Integer.toString(itemIndex) + "]." + OLEConstants.NEW_SOURCE_ACCT_LINE_PROPERTY_NAME;
597                 rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AddAccountingLineEvent(errorPrefix, purapForm.getDocument(), line));
598             } else if (itemIndex == -2) {
599                 
600                 
601                 line = ((PurchasingFormBase) purapForm).getAccountDistributionnewSourceLine();
602                 
603                 errorPrefix = PurapPropertyConstants.ACCOUNT_DISTRIBUTION_NEW_SRC_LINE;
604                 rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AddAccountingLineEvent(errorPrefix, purapForm.getDocument(), line));
605             }
606             if (rulePassed) {
607                 AccountingLineBase accountingLineBase = (AccountingLineBase) item.getNewSourceLine();
608                 if (accountingLineBase != null) {
609                     String accountNumber = accountingLineBase.getAccountNumber();
610                     String chartOfAccountsCode = accountingLineBase.getChartOfAccountsCode();
611                     Map<String, String> criteria = new HashMap<String, String>();
612                     criteria.put(OleSelectConstant.ACCOUNT_NUMBER, accountNumber);
613                     criteria.put(OleSelectConstant.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
614                     Account account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(Account.class,criteria);
615                     rulePassed = checkForValidAccount(account);
616                 }
617             }
618             if (rulePassed) {
619                 
620                 SpringContext.getBean(PersistenceService.class).retrieveNonKeyFields(line);
621                 PurApAccountingLine newSourceLine = item.getNewSourceLine();
622                 List<PurApAccountingLine> existingSourceLine = item.getSourceAccountingLines();
623 
624                 BigDecimal initialValue = OleSelectConstant.ZERO_PERCENT;
625 
626                 for (PurApAccountingLine accountLine : existingSourceLine) {
627                     initialValue = initialValue.add(accountLine.getAccountLinePercent());
628 
629                 }
630                 if (itemIndex >= 0) {
631 
632                     if ((newSourceLine.getAccountLinePercent().intValue() <= OleSelectConstant.ACCOUNTINGLINE_PERCENT_HUNDRED && newSourceLine.getAccountLinePercent().intValue() <= OleSelectConstant.MAX_PERCENT.subtract(initialValue).intValue()) && newSourceLine.getAccountLinePercent().intValue() > OleSelectConstant.ZERO) {
633                         if (OleSelectConstant.MAX_PERCENT.subtract(initialValue).intValue() != OleSelectConstant.ZERO) {
634                             insertAccountingLine(purapForm, item, line);
635                         }
636                     } else {
637                         checkAccountingLinePercent(newSourceLine);
638 
639                     }
640                     for(PurApAccountingLine oldSourceAccountingLine:item.getSourceAccountingLines()) {
641                         if(oldSourceAccountingLine instanceof OleRequisitionAccount) {
642                             ((OleRequisitionAccount)oldSourceAccountingLine).setExistingAmount(oldSourceAccountingLine.getAmount());
643                         }
644                     }
645                     List<PurApAccountingLine> existingAccountingLine = item.getSourceAccountingLines();
646                     BigDecimal totalPercent = new BigDecimal(100);
647                     BigDecimal initialPercent = new BigDecimal(0);
648                     for (PurApAccountingLine purApAccountingLine : existingAccountingLine) {
649                         initialPercent = initialPercent.add(purApAccountingLine.getAccountLinePercent());
650 
651                     }
652                     initialPercent = totalPercent.subtract(initialPercent);
653                     BigDecimal maxPercent = initialPercent.max(OleSelectConstant.ZERO_PERCENT);
654                     if (maxPercent.intValue() == OleSelectConstant.ZERO) {
655                         item.resetAccount(OleSelectConstant.ZERO_PERCENT);
656 
657                     } else {
658                         item.resetAccount(initialPercent);
659 
660                     }
661                 } else if (itemIndex == -2) {
662                     
663                     ((PurchasingFormBase) purapForm).addAccountDistributionsourceAccountingLine(line);
664                 }
665             }
666         }
667 
668         return mapping.findForward(OLEConstants.MAPPING_BASIC);
669     }
670 
671     private void checkAccountingLinePercent(PurApAccountingLine newSourceLine) {
672         if (newSourceLine.getAccountLinePercent().intValue() >= OleSelectConstant.ACCOUNTINGLINE_PERCENT_HUNDRED) {
673             GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
674                     OleSelectPropertyConstants.ERROR_PERCENT_SHOULD_GREATER, OleSelectConstant.PERCENT);
675         } else if (newSourceLine.getAccountLinePercent().intValue() == OleSelectConstant.ZERO) {
676             GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
677                     OleSelectPropertyConstants.ERROR_PERCENT_ZERO, OleSelectConstant.PERCENT);
678         } else {
679 
680         }
681 
682     }
683 
684     private boolean checkForValidAccount(Account account) {
685         boolean result = true;
686         if (account != null) {
687             String subFundGroupParameter = getParameterService().getParameterValueAsString(Account.class,
688                     OleSelectConstant.SUB_FUND_GRP_CD);
689             if (account.getSubFundGroupCode().equalsIgnoreCase(subFundGroupParameter)) {
690                 GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
691                         OleSelectPropertyConstants.ERROR_ACCOUNT_NUMBER,
692                         new String[]{OleSelectConstant.REQUISITION});
693                 result = false;
694             }
695         }
696         return result;
697     }
698 
699     private void setItemDescription(OleRequisitionItem item, String fileName) throws Exception{
700 
701         if (OleDocstoreResponse.getInstance().getEditorResponse() != null) {
702             Map<String, OLEEditorResponse> oleEditorResponses = OleDocstoreResponse.getInstance().getEditorResponse();
703             OLEEditorResponse oleEditorResponse = oleEditorResponses.get(fileName);
704             Bib bib = oleEditorResponse != null ? oleEditorResponse.getBib() : null;
705             if (bib != null) {
706                 String title = (bib.getTitle() != null&& !bib.getTitle().isEmpty()) ? bib.getTitle() + ", " : "";
707                 String author = (bib.getAuthor()!=null && !bib.getAuthor().isEmpty()) ? bib.getAuthor() + ", " : "";
708                 String publisher = (bib.getPublisher()!=null && !bib.getPublisher().isEmpty()) ? bib.getPublisher() + ", " : "";
709                 String isbn = (bib.getIsbn()!=null && !bib.getIsbn().isEmpty()) ? bib.getIsbn() + ", " : "";
710                 String description = title + author + publisher + isbn;
711                 item.setDocFormat(DocumentUniqueIDPrefix.getBibFormatType(bib.getId().toString()));
712                 item.setItemDescription(description.substring(0, (description.lastIndexOf(","))));
713             }
714             if (bib != null) {
715                 item.setBibUUID(bib.getId());
716                 item.setItemTitleId(bib.getId());
717                 item.setLinkToOrderOption(oleEditorResponse.getLinkToOrderOption());
718             }
719             OleDocstoreResponse.getInstance().getEditorResponse().remove(oleEditorResponse);
720         }
721 
722     }
723 
724     public ActionForward addCopy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
725                                  HttpServletResponse response) throws Exception {
726         LOG.debug("Inside addCopy Method of OleRequisitionAction");
727         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
728         int line = this.getSelectedLine(request);
729         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm
730                 .getDocument()).getItem(line);
731         OleRequisitionCopies itemCopy = new OleRequisitionCopies();
732         OleCopyHelperService oleCopyHelperService = SpringContext.getBean(OleCopyHelperService.class);
733         boolean isValid = true;
734         List<String> volChar = new ArrayList<>();
735         String[] volNumbers = item.getVolumeNumber() != null ? item.getVolumeNumber().split(",") : new String[0];
736         for (String volStr : volNumbers) {
737             volChar.add(volStr);
738         }
739         Integer itemCount = volChar.size();
740         isValid = oleCopyHelperService.checkCopyEntry(
741                 item.getItemCopies(), item.getLocationCopies(), itemCount, item.getItemQuantity(), item.getItemNoOfParts(), item.getCopies(), item.getVolumeNumber(), false);
742         if (isValid) {
743             itemCopy.setItemCopies(item.getItemCopies());
744             itemCopy.setLocationCopies(item.getLocationCopies());
745             itemCopy.setParts(item.getItemNoOfParts());
746             itemCopy.setStartingCopyNumber(item.getStartingCopyNumber());
747             itemCopy.setCaption(item.getCaption());
748             itemCopy.setVolumeNumber(item.getVolumeNumber());
749             item.setOleRequisitionCopy(itemCopy);
750             List<OleCopy> copyList = oleCopyHelperService.setCopyValues(item.getOleRequisitionCopy(), item.getItemTitleId(), volChar);
751             item.getCopyList().addAll(copyList);
752             item.getCopies().add(itemCopy);
753             item.setParts(null);
754             item.setItemCopies(null);
755             item.setPartEnumeration(null);
756             item.setLocationCopies(null);
757             item.setCaption(null);
758             item.setVolumeNumber(null);
759         }
760         return mapping.findForward(OLEConstants.MAPPING_BASIC);
761     }
762 
763     public boolean checkForCopiesAndLocation(OleRequisitionItem item) {
764         boolean isValid = true;
765         if (null == item.getItemCopies() || null == item.getLocationCopies()) {
766             GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
767                     OLEConstants.ITEM_ITEMCOPIES_OR_LOCATIONCOPIES_SHOULDNOT_BE_NULL, new String[]{});
768             isValid = false;
769         }
770         return isValid;
771     }
772 
773     public boolean checkForItemCopiesGreaterThanQuantity(OleRequisitionItem item) {
774         boolean isValid = true;
775         if (item.getItemCopies().isGreaterThan(item.getItemQuantity())) {
776             GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
777                     OLEConstants.ITEM_COPIES_ITEMCOPIES_GREATERTHAN_ITEMCOPIESORDERED, new String[]{});
778             isValid = false;
779         }
780         return isValid;
781     }
782 
783     public boolean checkForTotalCopiesGreaterThanQuantity(OleRequisitionItem item) {
784         boolean isValid = true;
785         int copies = 0;
786         if (item.getCopies().size() > 0) {
787             for (int itemCopies = 0; itemCopies < item.getCopies().size(); itemCopies++) {
788                 copies = copies + item.getCopies().get(itemCopies).getItemCopies().intValue();
789             }
790             if (item.getItemQuantity().isLessThan(item.getItemCopies().add(new KualiDecimal(copies)))) {
791                 GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
792                         OLEConstants.TOTAL_OF_ITEM_COPIES_ITEMCOPIES_GREATERTHAN_ITEMCOPIESORDERED, new String[]{});
793                 isValid = false;
794             }
795         }
796         return isValid;
797     }
798 
799 
800     
801 
802 
803 
804 
805 
806 
807     public OleRequisitionCopies setCopyValues(OleRequisitionItem item) {
808         OleRequisitionCopies itemCopy = new OleRequisitionCopies();
809         itemCopy.setParts(item.getItemNoOfParts());
810         itemCopy.setItemCopies(item.getItemCopies());
811         StringBuffer enumeration = new StringBuffer();
812         if (item.getStartingCopyNumber() != null && item.getStartingCopyNumber().isNonZero()) {
813             itemCopy.setStartingCopyNumber(item.getStartingCopyNumber());
814         } else {
815             int startingCopies = 1;
816             for (int copy = 0; copy < item.getCopies().size(); copy++) {
817                 startingCopies = startingCopies + item.getCopies().get(copy).getItemCopies().intValue();
818             }
819             itemCopy.setStartingCopyNumber(new KualiInteger(startingCopies));
820         }
821 
822         String partEnumerationCopy = getConfigurationService().getPropertyValueAsString(
823                 OLEConstants.PART_ENUMERATION_COPY);
824         String partEnumerationVolume = getConfigurationService().getPropertyValueAsString(
825                 OLEConstants.PART_ENUMERATION_VOLUME);
826         int startingCopyNumber = itemCopy.getStartingCopyNumber().intValue();
827         for (int noOfCopies = 0; noOfCopies < item.getItemCopies().intValue(); noOfCopies++) {
828             for (int noOfParts = 0; noOfParts < item.getItemNoOfParts().intValue(); noOfParts++) {
829                 int newNoOfCopies = startingCopyNumber + noOfCopies;
830                 int newNoOfParts = noOfParts + 1;
831                 if (noOfCopies + 1 == item.getItemCopies().intValue()
832                         && newNoOfParts == item.getItemNoOfParts().intValue()) {
833                     enumeration = enumeration.append(
834                             partEnumerationCopy + newNoOfCopies + OLEConstants.DOT_TO_SEPARATE_COPIES_PARTS).append(
835                             partEnumerationVolume + newNoOfParts);
836                 } else {
837                     enumeration = enumeration.append(
838                             partEnumerationCopy + newNoOfCopies + OLEConstants.DOT_TO_SEPARATE_COPIES_PARTS).append(
839                             partEnumerationVolume + newNoOfParts + OLEConstants.COMMA_TO_SEPARATE_ENUMERATION);
840                 }
841             }
842         }
843         itemCopy.setPartEnumeration(enumeration.toString());
844         itemCopy.setLocationCopies(item.getLocationCopies());
845         return itemCopy;
846     }
847 
848     
849 
850 
851 
852 
853 
854 
855 
856 
857 
858     public ActionForward deleteCopy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
859                                     HttpServletResponse response) throws Exception {
860         LOG.debug("Inside deleteCopy Method of OleRequisitionAction");
861         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
862         String[] indexes = getSelectedLineForAccounts(request);
863         int itemIndex = Integer.parseInt(indexes[0]);
864         int copyIndex = Integer.parseInt(indexes[1]);
865         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm
866                 .getDocument()).getItem((itemIndex));
867         List<OleCopy> copyList = new ArrayList<>();
868         for(int i=0;i<item.getCopyList().size();i++){
869             OleCopy oleCopy = item.getCopyList().get(i);
870             if(item.getCopies().get(copyIndex).getLocationCopies().equalsIgnoreCase(oleCopy.getLocation())){
871                 copyList.add(oleCopy);
872             }
873         }
874         for(OleCopy copy : copyList){
875             item.getCopyList().remove(copy);
876             item.getDeletedCopiesList().add(copy);
877         }
878         item.getCopies().remove(copyIndex);
879         LOG.debug("Selected Copy is Remove");
880         LOG.debug("Leaving deleteCopy Method of OleRequisitionAction");
881         return mapping.findForward(OLEConstants.MAPPING_BASIC);
882     }
883 
884     
885 
886 
887 
888 
889 
890 
891 
892 
893 
894     public ActionForward addPaymentHistory(ActionMapping mapping, ActionForm form, HttpServletRequest request,
895                                            HttpServletResponse response) throws Exception {
896         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
897         int line = this.getSelectedLine(request);
898         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm
899                 .getDocument()).getItem(line);
900         OleRequisitionPaymentHistory paymentHistory = new OleRequisitionPaymentHistory();
901         paymentHistory.setPaymentHistory("");
902         item.getRequisitionPaymentHistory().add(paymentHistory);
903         return mapping.findForward(OLEConstants.MAPPING_BASIC);
904     }
905 
906     
907 
908 
909 
910 
911 
912 
913 
914 
915 
916     public ActionForward deletePaymentHistory(ActionMapping mapping, ActionForm form, HttpServletRequest request,
917                                               HttpServletResponse response) throws Exception {
918 
919         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
920         String[] indexes = getSelectedLineForAccounts(request);
921         int itemIndex = Integer.parseInt(indexes[0]);
922         int copyIndex = Integer.parseInt(indexes[1]);
923         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm
924                 .getDocument()).getItem((itemIndex));
925         item.getRequisitionPaymentHistory().remove(copyIndex);
926         return mapping.findForward(OLEConstants.MAPPING_BASIC);
927     }
928 
929     public static ConfigurationService getConfigurationService() {
930         if (kualiConfigurationService == null) {
931             kualiConfigurationService = SpringContext.getBean(ConfigurationService.class);
932         }
933         return kualiConfigurationService;
934     }
935 
936     @Override
937     public ActionForward copy(ActionMapping mapping, ActionForm form, HttpServletRequest request,
938                               HttpServletResponse response) throws Exception {
939         ActionForward actionForward = super.copy(mapping, form, request, response);
940 
941         KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form;
942         PurchasingAccountsPayableDocument purapDocument = (PurchasingAccountsPayableDocument) kualiDocumentFormBase
943                 .getDocument();
944         if(purapDocument.getIsReqsDoc()) {
945             OleRequisitionDocument oleRequisitionDocument = (OleRequisitionDocument)purapDocument;
946             if(oleRequisitionDocument.getRequisitionSource().getRequisitionSourceCode().equalsIgnoreCase(OleSelectConstant.REQUISITON_SRC_TYPE_AUTOINGEST)) {
947                 ((OleRequisitionDocument) purapDocument).setRequisitionSourceCode(null);
948             }
949         }
950 
951         
952         List<PurApItem> items = purapDocument.getItems();
953 
954         for (PurApItem item : items) {
955             OleRequisitionItem oleRequisitionItem = (OleRequisitionItem) item;
956             oleRequisitionItem.setInvoiceDocuments(new ArrayList<OleInvoiceDocument>());
957             oleRequisitionItem.setNoOfCopiesReceived("");
958             oleRequisitionItem.setNoOfPartsReceived("");
959             oleRequisitionItem.setReceiptStatusId(null);
960             for (OleCopy oleCopy : ((OleRequisitionItem) item).getCopyList()) {
961                 oleCopy.setCopyId(null);
962                 oleCopy.setReqItemId(null);
963                 oleCopy.setPoDocNum(null);
964                 oleCopy.setPoItemId(null);
965                 oleCopy.setReceivingItemId(null);
966                 oleCopy.setCorrectionItemId(null);
967                 oleCopy.setSerialReceivingIdentifier(null);
968                 oleCopy.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
969             }
970             for (OLELinkPurapDonor oleLinkPurapDonor : ((OleRequisitionItem) item).getOleDonors()) {
971                 oleLinkPurapDonor.setLinkPurapDonorId(null);
972                 oleLinkPurapDonor.setCorrectionItemId(null);
973                 oleLinkPurapDonor.setReceivingItemId(null);
974                 oleLinkPurapDonor.setReqItemId(null);
975                 oleLinkPurapDonor.setPoDocNum(null);
976                 oleLinkPurapDonor.setPoItemId(null);
977             }
978             if(oleRequisitionItem.getItemQuantity().equals(new KualiDecimal("1")) && oleRequisitionItem.getItemNoOfParts().equals(new KualiInteger("1"))){
979                 oleRequisitionItem.setCopyList(new ArrayList<OleCopy>());
980                 oleRequisitionItem.setCopies(new ArrayList<OleCopies>());
981             }
982         }
983 
984         return actionForward;
985     }
986 
987     @Override
988     public ActionForward blanketApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request,
989                                         HttpServletResponse response) throws Exception {
990         OleRequisitionDocument document = (OleRequisitionDocument) ((PurchasingFormBase) form).getDocument();
991         boolean budgetReviewRequired = isBudgetReviewRequired(document);
992         if(budgetReviewRequired){
993             route(mapping, form, request, response);
994             return mapping.findForward(OLEConstants.MAPPING_BASIC);
995         }
996         Iterator itemIterator = document.getItems().iterator();
997         PurchasingFormBase purchasingForm = (PurchasingFormBase) form;
998         OleRequisitionDocument reqDoc = (OleRequisitionDocument) purchasingForm.getDocument();
999         List<OleRequisitionItem> items = reqDoc.getItems();
1000         boolean rulePassed = true;
1001         while (itemIterator.hasNext()) {
1002             OleRequisitionItem tempItem = (OleRequisitionItem) itemIterator.next();
1003             if (tempItem.getItemTypeCode().equals(PurapConstants.ItemTypeCodes.ITEM_TYPE_ITEM_CODE)) {
1004                 List<PurApAccountingLine> accountingLineBase = tempItem.getSourceAccountingLines();
1005                 if (accountingLineBase != null) {
1006                     for (int accountingLine = 0; accountingLine < accountingLineBase.size(); accountingLine++) {
1007                         String accountNumber = accountingLineBase.get(accountingLine).getAccountNumber();
1008                         String chartOfAccountsCode = accountingLineBase.get(accountingLine).getChartOfAccountsCode();
1009                         Map<String, String> criteria = new HashMap<String, String>();
1010                         criteria.put(OleSelectConstant.ACCOUNT_NUMBER, accountNumber);
1011                         criteria.put(OleSelectConstant.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
1012                         Account account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(
1013                                 Account.class, criteria);
1014                         rulePassed = checkForValidAccount(account);
1015                         if (!rulePassed) {
1016                             return mapping.findForward(OLEConstants.MAPPING_BASIC);
1017                         }
1018                     }
1019                 }
1020             }
1021         }
1022         if (requiresCalculate(purchasingForm)) {
1023             GlobalVariables.getMessageMap().putError(OLEConstants.DOCUMENT_ERRORS,
1024                     PurapKeyConstants.ERROR_PURCHASING_REQUIRES_CALCULATE);
1025             return mapping.findForward(OLEConstants.MAPPING_BASIC);
1026         }
1027         
1028         SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(document);
1029         this.calculate(mapping, purchasingForm, request, response);
1030         for (OleRequisitionItem item : items) {
1031             if (null != item.getItemType() && item.getItemType().isQuantityBasedGeneralLedgerIndicator()) {
1032                 if (item.getItemQuantity() != null && item.getItemNoOfParts() != null && !item.getItemQuantity().isGreaterThan(new KualiDecimal(1))
1033                         && !item.getItemNoOfParts().isGreaterThan(new KualiInteger(1))) {
1034                     OleCopy oleCopy = new OleCopy();
1035                     oleCopy.setLocation(item.getItemLocation());
1036                     oleCopy.setBibId(item.getItemTitleId());
1037                     if (StringUtils.isNotBlank(item.getLinkToOrderOption()) && (item.getLinkToOrderOption().equals(OLEConstants.NB_PRINT) || item.getLinkToOrderOption().equals(OLEConstants.EB_PRINT))) {
1038                         oleCopy.setCopyNumber(item.getSingleCopyNumber() != null && !item.getSingleCopyNumber().isEmpty() ? item.getSingleCopyNumber() : OLEConstants.ONE.toString());
1039                     }
1040                     oleCopy.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
1041                     List<OleCopy> copyList = new ArrayList<>();
1042                     copyList.add(oleCopy);
1043                     item.setCopyList(copyList);
1044                 }
1045             }
1046         }
1047         if (sufficientFundChecklag) {
1048             return super.blanketApprove(mapping, form, request, response);
1049         }
1050         return mapping.findForward(OLEConstants.MAPPING_BASIC);
1051     }
1052 
1053     public ActionForward selectVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
1054         OleRequisitionForm rqForm = (OleRequisitionForm) form;
1055         OleRequisitionDocument document = (OleRequisitionDocument) rqForm.getDocument();
1056         if (document.getVendorAliasName() != null && document.getVendorAliasName().length() > 0) { 
1057             
1058             Map vendorAliasMap = new HashMap();
1059             vendorAliasMap.put(OLEConstants.VENDOR_ALIAS_NAME, document.getVendorAliasName());
1060             org.kuali.rice.krad.service.BusinessObjectService businessObject = SpringContext.getBean(org.kuali.rice.krad.service.BusinessObjectService.class);
1061             List<VendorAlias> vendorAliasList = (List<VendorAlias>) getLookupService().findCollectionBySearchHelper(VendorAlias.class, vendorAliasMap, true);
1062             if (vendorAliasList != null && vendorAliasList.size() > 0) {
1063                 Map vendorDetailMap = new HashMap();
1064                 vendorDetailMap.put(OLEConstants.VENDOR_HEADER_IDENTIFIER, vendorAliasList.get(0).getVendorHeaderGeneratedIdentifier());
1065                 vendorDetailMap.put(OLEConstants.VENDOR_DETAIL_IDENTIFIER, vendorAliasList.get(0).getVendorDetailAssignedIdentifier());
1066                 VendorDetail vendorDetail = businessObject.findByPrimaryKey(VendorDetail.class, vendorDetailMap);
1067                 document.setVendorDetail(vendorDetail);
1068                 document.setVendorHeaderGeneratedIdentifier(vendorAliasList.get(0).getVendorHeaderGeneratedIdentifier());
1069                 document.setVendorDetailAssignedIdentifier(vendorAliasList.get(0).getVendorDetailAssignedIdentifier());
1070                 refreshVendor(mapping, form, request, response);
1071             } else {
1072                 GlobalVariables.getMessageMap().putError(PurapConstants.VENDOR_ERRORS, OLEConstants.VENDOR_NOT_FOUND);
1073             }
1074         }
1075         return mapping.findForward(OLEConstants.MAPPING_BASIC);
1076     }
1077 
1078 
1079     public ActionForward refreshVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
1080         PurchasingAccountsPayableFormBase baseForm = (PurchasingAccountsPayableFormBase) form;
1081 
1082         PurchasingDocument document = (PurchasingDocument) baseForm.getDocument();
1083         if (StringUtils.equals(OLEConstants.REFRESH_VENDOR_CALLER, VendorConstants.VENDOR_LOOKUPABLE_IMPL) && document.getVendorDetailAssignedIdentifier() != null && document.getVendorHeaderGeneratedIdentifier() != null) {
1084             document.setVendorContractGeneratedIdentifier(null);
1085             document.refreshReferenceObject(OLEConstants.VENDOR_CONTRACT);
1086 
1087             
1088             document.refreshReferenceObject(OLEConstants.VENDOR_DETAILS);
1089             document.templateVendorDetail(document.getVendorDetail());
1090 
1091             
1092             VendorAddress defaultAddress = SpringContext.getBean(VendorService.class).getVendorDefaultAddress(document.getVendorDetail().getVendorAddresses(), document.getVendorDetail().getVendorHeader().getVendorType().getAddressType().getVendorAddressTypeCode(), document.getDeliveryCampusCode());
1093             document.templateVendorAddress(defaultAddress);
1094         }
1095         return refresh(mapping, form, request, response);
1096     }
1097 
1098     private LookupService getLookupService() {
1099         return KRADServiceLocatorWeb.getLookupService();
1100     }
1101 
1102     public boolean isBudgetReviewRequired(OleRequisitionDocument document) {
1103         OleRequisitionDocumentService oleRequisitionDocumentService = (OleRequisitionDocumentService) SpringContext
1104                 .getBean("oleRequisitionDocumentService");
1105         List<SourceAccountingLine> sourceAccountingLineList = document.getSourceAccountingLines();
1106         boolean sufficientFundCheck = false;
1107         for (SourceAccountingLine accLine : sourceAccountingLineList) {
1108             String notificationOption = null;
1109             Map<String, Object> key = new HashMap<String, Object>();
1110             String chartCode = accLine.getChartOfAccountsCode();
1111             String accNo = accLine.getAccountNumber();
1112             key.put(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartCode);
1113             key.put(OLEPropertyConstants.ACCOUNT_NUMBER, accNo);
1114             OleSufficientFundCheck account = SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(
1115                     OleSufficientFundCheck.class, key);
1116             if (account != null) {
1117                 notificationOption = account.getNotificationOption();
1118             }
1119             if (notificationOption != null
1120                     && (notificationOption.equals(OLEPropertyConstants.BUD_REVIEW))) {
1121                 sufficientFundCheck = oleRequisitionDocumentService.hasSufficientFundsOnBlanketApproveRequisition(accLine);
1122                 if (sufficientFundCheck) {
1123                     return sufficientFundCheck;
1124                 }
1125 
1126             }
1127         }
1128         return sufficientFundCheck;
1129     }
1130     public ActionForward addDonor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
1131         boolean flag = true;
1132         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
1133         int line = this.getSelectedLine(request);
1134         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItem(line);
1135         Map map = new HashMap();
1136         if (item.getDonorCode() != null) {
1137             map.put(OLEConstants.DONOR_CODE, item.getDonorCode());
1138             List<OLEDonor> oleDonorList = (List<OLEDonor>) getLookupService().findCollectionBySearch(OLEDonor.class, map);
1139             if (oleDonorList != null && oleDonorList.size() > 0) {
1140                 OLEDonor oleDonor = oleDonorList.get(0);
1141                 if (oleDonor != null) {
1142                     for (OLELinkPurapDonor oleLinkPurapDonor : item.getOleDonors()) {
1143                         if (oleLinkPurapDonor.getDonorCode().equalsIgnoreCase(item.getDonorCode())) {
1144                             flag = false;
1145                             GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
1146                                     OLEConstants.DONOR_CODE_EXISTS, new String[]{});
1147                             return mapping.findForward(OLEConstants.MAPPING_BASIC);
1148                         }
1149                     }
1150                     if (flag) {
1151                         OLELinkPurapDonor donor = new OLELinkPurapDonor();
1152                         donor.setDonorId(oleDonor.getDonorId());
1153                         donor.setDonorCode(oleDonor.getDonorCode());
1154                         item.getOleDonors().add(donor);
1155                         item.setDonorCode(null);
1156                     }
1157                 }
1158             } else {
1159                 GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY,
1160                         OLEConstants.ERROR_DONOR_CODE, new String[]{});
1161             }
1162         }
1163         return mapping.findForward(OLEConstants.MAPPING_BASIC);
1164     }
1165 
1166     public ActionForward deleteDonor(ActionMapping mapping, ActionForm form, HttpServletRequest request,
1167                                      HttpServletResponse response) throws Exception {
1168         LOG.debug("Inside deleteDonor Method of OleRequisitionAction");
1169         OleRequisitionForm purchasingForm = (OleRequisitionForm) form;
1170         String[] indexes = getSelectedLineForAccounts(request);
1171         int itemIndex = Integer.parseInt(indexes[0]);
1172         int donorIndex = Integer.parseInt(indexes[1]);
1173         OleRequisitionItem item = (OleRequisitionItem) ((PurchasingAccountsPayableDocument) purchasingForm.getDocument()).getItem((itemIndex));
1174         item.getOleDonors().remove(donorIndex);
1175         LOG.debug("Selected Donor is Remove");
1176         LOG.debug("Leaving deleteDonor Method of OleRequisitionAction");
1177         return mapping.findForward(OLEConstants.MAPPING_BASIC);
1178     }
1179 
1180     
1181 
1182 
1183 
1184 
1185 
1186 
1187 
1188 
1189 
1190 
1191 
1192 
1193 
1194 
1195 
1196 
1197 
1198 
1199 
1200 
1201 
1202 
1203 
1204 
1205 
1206 
1207 
1208 
1209 
1210 
1211 
1212 
1213 
1214 
1215 
1216 
1217 
1218 
1219 
1220 
1221 
1222 
1223 
1224 
1225 
1226 
1227 
1228 
1229 
1230 
1231 
1232 
1233 
1234 
1235 
1236 
1237 
1238 
1239 
1240 
1241 
1242 
1243 
1244 
1245 
1246 
1247 
1248 
1249 
1250 
1251 
1252 
1253 
1254 
1255 
1256 
1257 
1258 
1259 
1260 
1261 
1262 
1263 
1264 
1265 
1266 
1267 
1268 
1269 
1270 
1271 
1272 
1273 
1274 
1275 
1276 
1277 
1278 
1279 
1280 
1281 
1282 
1283 
1284 
1285 
1286 
1287 
1288 
1289 
1290 
1291 
1292 
1293 
1294 
1295 
1296 
1297 
1298 
1299 
1300 
1301 
1302 
1303 
1304 
1305 
1306 
1307 
1308 
1309 
1310 
1311 
1312 
1313 
1314 }