001/*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.ole.select.service;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.ole.module.purap.PurapConstants;
020import org.kuali.ole.module.purap.PurapParameterConstants;
021import org.kuali.ole.module.purap.PurapPropertyConstants;
022import org.kuali.ole.module.purap.businessobject.PurApItemUseTax;
023import org.kuali.ole.module.purap.businessobject.PurchasingCapitalAssetItem;
024import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
025import org.kuali.ole.module.purap.document.service.*;
026import org.kuali.ole.module.purap.util.ExpiredOrClosedAccount;
027import org.kuali.ole.module.purap.util.ExpiredOrClosedAccountEntry;
028import org.kuali.ole.select.OleSelectConstant;
029import org.kuali.ole.select.businessobject.*;
030import org.kuali.ole.select.document.OleInvoiceDocument;
031import org.kuali.ole.select.document.OleLineItemReceivingDocument;
032import org.kuali.ole.select.document.OlePurchaseOrderDocument;
033import org.kuali.ole.select.document.service.OleCopyHelperService;
034import org.kuali.ole.select.document.service.OleInvoiceService;
035import org.kuali.ole.select.document.service.OleLineItemReceivingService;
036import org.kuali.ole.select.document.service.impl.OleLineItemReceivingServiceImpl;
037import org.kuali.ole.sys.OLEConstants;
038import org.kuali.ole.sys.OLEKeyConstants;
039import org.kuali.ole.sys.businessobject.Bank;
040import org.kuali.ole.sys.context.SpringContext;
041import org.kuali.ole.sys.document.validation.event.AttributedBlanketApproveDocumentEvent;
042import org.kuali.ole.sys.service.BankService;
043import org.kuali.ole.vnd.VendorConstants;
044import org.kuali.ole.vnd.businessobject.VendorAddress;
045import org.kuali.ole.vnd.document.service.VendorService;
046import org.kuali.rice.core.api.datetime.DateTimeService;
047import org.kuali.rice.core.api.util.type.AbstractKualiDecimal;
048import org.kuali.rice.core.api.util.type.KualiDecimal;
049import org.kuali.rice.core.api.util.type.KualiInteger;
050import org.kuali.rice.coreservice.framework.parameter.ParameterService;
051import org.kuali.rice.kew.api.exception.WorkflowException;
052import org.kuali.rice.kim.api.KimConstants;
053import org.kuali.rice.kim.api.identity.Person;
054import org.kuali.rice.kim.api.identity.PersonService;
055import org.kuali.rice.kns.service.DocumentHelperService;
056import org.kuali.rice.krad.exception.DocumentAuthorizationException;
057import org.kuali.rice.krad.service.BusinessObjectService;
058import org.kuali.rice.krad.service.DocumentService;
059import org.kuali.rice.krad.service.KRADServiceLocator;
060import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
061import org.kuali.rice.krad.util.GlobalVariables;
062import org.kuali.rice.krad.util.KRADConstants;
063import org.kuali.rice.krad.util.ObjectUtils;
064
065import java.math.BigDecimal;
066import java.math.RoundingMode;
067import java.sql.Date;
068import java.util.ArrayList;
069import java.util.HashMap;
070import java.util.List;
071import java.util.Map;
072import java.util.regex.Matcher;
073import java.util.regex.Pattern;
074
075public class OLEAddTitlesToInvoiceService {
076    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OLEAddTitlesToInvoiceService.class);
077    DocumentService documentService;
078    List<String> receivingDocumentsList = new ArrayList<String>();
079    boolean isAllowedPoForReceiving = false;
080    private static transient OlePurapService olePurapService;
081    private static transient OleInvoiceService invoiceService;
082
083    public static OlePurapService getOlePurapService() {
084        if (olePurapService == null) {
085            olePurapService = SpringContext.getBean(OlePurapService.class);
086        }
087        return olePurapService;
088    }
089
090    public List<String> getReceivingDocumentsList() {
091        return receivingDocumentsList;
092    }
093
094    OleInvoiceDocument oleInvoiceDocument;
095
096    public OleInvoiceDocument getOleInvoiceDocument() {
097        return oleInvoiceDocument;
098    }
099
100    public void setOleInvoiceDocument(OleInvoiceDocument oleInvoiceDocument) {
101        this.oleInvoiceDocument = oleInvoiceDocument;
102    }
103
104    public boolean isAllowedPoForReceiving() {
105        return isAllowedPoForReceiving;
106    }
107
108    public void setAllowedPoForReceiving(boolean allowedPoForReceiving) {
109        isAllowedPoForReceiving = allowedPoForReceiving;
110    }
111
112    public static OleInvoiceService getInvoiceService() {
113        if (invoiceService == null) {
114            invoiceService = SpringContext.getBean(OleInvoiceService.class);
115        }
116        return invoiceService;
117    }
118
119    public List<OlePurchaseOrderItem> populateOlePurchaseOrderItem() {
120        List<OlePurchaseOrderItem> result = new ArrayList<OlePurchaseOrderItem>();
121        List<OlePurchaseOrderDocument> olePurchaseOrderDocuments = (List<OlePurchaseOrderDocument>) KRADServiceLocator.getBusinessObjectService().findAll(OlePurchaseOrderDocument.class);
122        for (OlePurchaseOrderDocument olePurchaseOrderDocument : olePurchaseOrderDocuments) {
123            String olePurchaseOrderDocumentNumber = olePurchaseOrderDocument.getDocumentNumber();
124            List<OlePurchaseOrderItem> olePurchaseOrderItems = olePurchaseOrderDocument.getItems();
125            for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
126                if (olePurchaseOrderItem.getItemTypeCode().toString().equals("ITEM") && olePurchaseOrderItem.getDocumentNumber().equals(olePurchaseOrderDocumentNumber)) {
127                    Map<String, String> map = new HashMap<String, String>();
128                    map.put("poItemIdentifier", olePurchaseOrderItem.getItemIdentifier().toString());
129                            /*List<OleInvoiceItem> oleInvoiceItems=(List<OleInvoiceItem>) KRADServiceLocator.getBusinessObjectService().findMatching(OleInvoiceItem.class,map);*/
130                            /* olePurchaseOrderItem.setSelected(true);*/
131                           /* if(!(oleInvoiceItems.size()>0)){*/
132                    if (validateRecords(olePurchaseOrderDocument.getPurapDocumentIdentifier(), olePurchaseOrderDocument.getDocumentNumber())) {
133                        olePurchaseOrderItem.setOlePurchaseOrderDocument(olePurchaseOrderDocument);
134                        result.add(olePurchaseOrderItem);
135                    }
136                            /*}*/
137                }
138            }
139        }
140        return result;
141    }
142
143    public List<OlePurchaseOrderItem> populateOlePurchaseOrderItemByPoItemList(List<String> purchaseOrderItemIds, List<String> invoicePrice) {
144        List<OlePurchaseOrderItem> result = new ArrayList<OlePurchaseOrderItem>();
145        List<OlePurchaseOrderDocument> olePurchaseOrderDocuments = (List<OlePurchaseOrderDocument>) KRADServiceLocator.getBusinessObjectService().findAll(OlePurchaseOrderDocument.class);
146        int index = 0;
147        for (String poitmId : purchaseOrderItemIds) {
148            for (OlePurchaseOrderDocument olePurchaseOrderDocument : olePurchaseOrderDocuments) {
149                List<OlePurchaseOrderItem> olePurchaseOrderItems = olePurchaseOrderDocument.getItems();
150                for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
151                    if (olePurchaseOrderItem.getItemIdentifier().toString().equalsIgnoreCase(poitmId.toString())) {
152                        if (validateRecords(olePurchaseOrderDocument.getPurapDocumentIdentifier(), olePurchaseOrderDocument.getDocumentNumber())) {
153                            olePurchaseOrderItem.setSelected(true);
154                            olePurchaseOrderItem.setOlePurchaseOrderDocument(olePurchaseOrderDocument);
155                            if (invoicePrice.get(index) != null && (!invoicePrice.get(index).trim().equalsIgnoreCase(""))) {
156                                olePurchaseOrderItem.setInvoiceItemListPrice(invoicePrice.get(index));
157                            } else {
158                                olePurchaseOrderItem.setInvoiceItemListPrice(olePurchaseOrderItem.getExtendedPrice().toString());
159                            }
160                            result.add(olePurchaseOrderItem);
161
162                        }
163                    }
164                }
165
166            }
167            index++;
168        }
169
170
171        return result;
172    }
173
174    public boolean validateSelectOlePurchaseOrderItem(List<OlePurchaseOrderItem> olePurchaseOrderItems) {
175        boolean isSuccess = false;
176
177        for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
178            if (olePurchaseOrderItem.isSelected()) {
179                isSuccess = true;
180            }
181        }
182
183        return isSuccess;
184    }
185
186    public boolean validateOlePurchaseOrderItemByPoId(List<OlePurchaseOrderItem> olePurchaseOrderItems) {
187        List<OlePurchaseOrderItem> result = new ArrayList<OlePurchaseOrderItem>();
188        boolean isSuccess = true;
189        String poId = "";
190        for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
191            if (poId.equalsIgnoreCase("")) {
192                poId = olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString();
193            } else {
194                if (!poId.equalsIgnoreCase(olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString())) {
195                    isSuccess = false;
196                }
197            }
198
199        }
200        return isSuccess;
201    }
202
203    public boolean validateSelectedPurchaseOrderByVendor(List<OlePurchaseOrderItem> olePurchaseOrderItems, String vendorId) {
204        boolean isSuccess = true;
205        for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
206            if (!olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorHeaderGeneratedIdentifier().toString().equalsIgnoreCase(vendorId.toString())) {
207                isSuccess = false;
208            }
209        }
210        return isSuccess;
211    }
212
213    public boolean validateInvoiceDocumentVendor(String invoiceDocumentNumber, List<OlePurchaseOrderItem> purchaseOrderItems) {
214        boolean isValid = true;
215        Map<String, String> map = new HashMap<String, String>();
216        map.put("documentNumber", invoiceDocumentNumber);
217        List<OleInvoiceDocument> oleInvoiceDocuments = (List<OleInvoiceDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OleInvoiceDocument.class, map);
218        OleInvoiceDocument oleInvoiceDocument = oleInvoiceDocuments.get(0);
219        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
220            if (olePurchaseOrderItem.isSelected()) {
221                if (oleInvoiceDocument.getVendorAddressGeneratedIdentifier() != null) {
222                    if (!(olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorHeaderGeneratedIdentifier().toString().equalsIgnoreCase(oleInvoiceDocument.getVendorHeaderGeneratedIdentifier().toString()))) {
223                        if (oleInvoiceDocument.getVendorAddressGeneratedIdentifier().toString().equalsIgnoreCase(olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorAddressGeneratedIdentifier().toString())) {
224                            isValid = false;
225                        }
226                    }
227                } else {
228
229                    if (!(olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorHeaderGeneratedIdentifier().toString().equalsIgnoreCase(oleInvoiceDocument.getVendorHeaderGeneratedIdentifier().toString()))) {
230                        isValid = false;
231                    }
232
233                }
234            }
235        }
236        return isValid;
237    }
238
239    public boolean validateSelectedPurchaseOrderByVendor(List<OlePurchaseOrderItem> purchaseOrderItems) {
240        boolean isSuccess = true;
241        List<String> list = new ArrayList<String>();
242        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
243            if (olePurchaseOrderItem.isSelected()) {
244                if (!list.contains(olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorHeaderGeneratedIdentifier().toString() + "-" + olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorDetailAssignedIdentifier())) {
245                    list.add(olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorHeaderGeneratedIdentifier().toString() + "-" + olePurchaseOrderItem.getOlePurchaseOrderDocument().getVendorDetailAssignedIdentifier());
246                }
247            }
248        }
249        if (list.size() > 1) {
250            isSuccess = false;
251        }
252        return isSuccess;
253    }
254
255    public boolean isSelectedAtleatOneItem(List<OlePurchaseOrderItem> purchaseOrderItems) {
256        boolean isValid = false;
257        List<OlePurchaseOrderItem> olePurchaseOrderItemSelected = new ArrayList<OlePurchaseOrderItem>();
258        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
259            if (olePurchaseOrderItem.isSelected()) {
260                isValid = true;
261            }
262        }
263        return isValid;
264    }
265
266    public List<OlePurchaseOrderItem> getSelectedItems(List<OlePurchaseOrderItem> purchaseOrderItems) {
267        List<OlePurchaseOrderItem> olePurchaseOrderItemSelected = new ArrayList<OlePurchaseOrderItem>();
268        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
269            if (olePurchaseOrderItem.isSelected()) {
270                olePurchaseOrderItemSelected.add(olePurchaseOrderItem);
271            }
272        }
273        return olePurchaseOrderItemSelected;
274    }
275
276    public boolean createNewInvoiceDocument(List<OlePurchaseOrderDocument> olePurchaseOrderDocuments, List<OlePurchaseOrderItem> olePurchaseOrderItems, String paymentMethodId, Date invoiceDate, String invoiceNumber, String vendorInvoiceAmt, String principalId) throws Exception {
277        boolean isSuccess = false;
278        try {
279
280            OleInvoiceDocument oleInvoiceDocument = (OleInvoiceDocument) SpringContext.getBean(DocumentService.class).getNewDocument("OLE_PRQS");
281            java.util.Date date1 = new java.util.Date();
282            oleInvoiceDocument.setInvoiceDate(new Date(SpringContext.getBean(DateTimeService.class).getCurrentDate().getTime()));
283            oleInvoiceDocument.setInvoiceNumber(invoiceNumber);
284            oleInvoiceDocument.setPaymentMethodId(Integer.parseInt(paymentMethodId));
285            oleInvoiceDocument.setVendorInvoiceAmount(new KualiDecimal(vendorInvoiceAmt));
286            oleInvoiceDocument.setInvoiceAmount(vendorInvoiceAmt);
287            oleInvoiceDocument.initiateDocument();
288            /*oleInvoiceDocument.setInvoiceNumber("11112");*/
289
290            /*for(OlePurchaseOrderDocument purchaseOrderDocument:olePurchaseOrderDocuments){
291                List<OlePurchaseOrderItem> olePurchaseOrderItems1=purchaseOrderDocument.getItems();
292                for(OlePurchaseOrderItem olePurchaseOrderItem1:olePurchaseOrderItems){
293                    for(OlePurchaseOrderItem olePurchaseOrderItem2:olePurchaseOrderItems1){
294                        if(olePurchaseOrderItem1.getItemIdentifier().toString().equalsIgnoreCase(olePurchaseOrderItem2.getItemIdentifier().toString())){
295                            olePurchaseOrderItem1.setItemForInvoice(true);
296                        }
297                    }
298                    purchaseOrderDocument.setPendingActionIndicator(false);
299
300                }
301
302            }*/
303            Map<String, ExpiredOrClosedAccount> map1 = new HashMap<String, ExpiredOrClosedAccount>();
304            for (OlePurchaseOrderDocument olePurchaseOrderDocument : olePurchaseOrderDocuments) {
305                if (olePurchaseOrderDocument != null) {
306                    this.populateInvoiceFromPurchaseOrder(olePurchaseOrderDocument, oleInvoiceDocument, null, true);
307                    oleInvoiceDocument.getPurchaseOrderDocuments().add(olePurchaseOrderDocument);
308                }
309            }
310            String description = getOlePurapService().getParameter(OLEConstants.INV_DESC);
311            description = getOlePurapService().setDocumentDescription(description,null);
312            oleInvoiceDocument.getDocumentHeader().setDocumentDescription(description);
313            updateForeignCurrencyDetails(oleInvoiceDocument);
314            List<OleInvoiceItem> oleInvItems = oleInvoiceDocument.getItems();
315            for (OleInvoiceItem oleInvoiceItem : oleInvItems) {
316                getInvoiceService().calculateAccount(oleInvoiceItem);
317            }
318
319            boolean isRulePassed = (KRADServiceLocatorWeb.getKualiRuleService()).applyRules(new AttributedBlanketApproveDocumentEvent("", oleInvoiceDocument));
320            if (isRulePassed) {
321                try {
322                    getOleInvoiceServiceImpl().saveInvoiceDocument(oleInvoiceDocument);
323                } catch (Exception e) {
324                    e.printStackTrace();
325                }
326            } else {
327                return false;
328            }
329            isSuccess = true;
330            if (isSuccess) {
331                this.setOleInvoiceDocument(oleInvoiceDocument);
332            }
333
334        } catch (WorkflowException e) {
335            LOG.error("Exception Occurred during creating Invoice Document" + e);
336            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
337        }
338
339        return isSuccess;
340    }
341
342    public List<OlePurchaseOrderDocument> populatePurchaseOrderDocuments(List<OlePurchaseOrderItem> purchaseOrderItems) {
343        List<OlePurchaseOrderDocument> result = new ArrayList<OlePurchaseOrderDocument>();
344        List<String> poId = new ArrayList<String>();
345        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
346            if (!poId.contains(olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString())) {
347                if (olePurchaseOrderItem.isSelected()) {
348                    poId.add(olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString());
349                }
350            }
351
352        }
353        for (String id : poId) {
354            Map<String, String> map = new HashMap<String, String>();
355            map.put("purapDocumentIdentifier", id);
356            List<OlePurchaseOrderDocument> olePurchaseOrderDocuments = (List<OlePurchaseOrderDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OlePurchaseOrderDocument.class, map);
357            if (olePurchaseOrderDocuments.size() > 0) {
358                for (OlePurchaseOrderDocument olePurchaseOrderDocument : olePurchaseOrderDocuments) {
359                    if (olePurchaseOrderDocument.getPurchaseOrderCurrentIndicatorForSearching()) {
360                        result.add(olePurchaseOrderDocument);
361                    }
362                }
363            }
364
365        }
366
367        for (OlePurchaseOrderItem purchaseOrderItem : purchaseOrderItems) {
368            if (purchaseOrderItem.isSelected()) {
369                purchaseOrderItem.setItemForInvoice(false);
370                for (OlePurchaseOrderDocument olePurchaseOrderDocument : result) {
371                    List<OlePurchaseOrderItem> olePurchaseOrderItems = olePurchaseOrderDocument.getItems();
372                    for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
373                        if (purchaseOrderItem.getItemIdentifier().toString().equalsIgnoreCase(olePurchaseOrderItem.getItemIdentifier().toString()) && olePurchaseOrderItem.getItemTypeCode().equals("ITEM")) {
374                            olePurchaseOrderItem.setSelected(true);
375                            olePurchaseOrderItem.setItemForInvoice(true);
376                            olePurchaseOrderItem.setInvoiceItemListPrice(purchaseOrderItem.getInvoiceItemListPrice());
377
378                        }
379                    }
380                }
381            }
382        }
383        return result;
384    }
385
386
387    public boolean addOlePurchaseOrderItemsToInvoiceDocument(List<OlePurchaseOrderDocument> olePurchaseOrderDocuments, List<OlePurchaseOrderItem> olePurchaseOrderItems, String documentNumber, String principalId, String invoiceAmt) throws Exception {
388        boolean isSuccess = false;
389        //getting invoice document
390        Map<String, String> map = new HashMap<String, String>();
391        map.put("documentNumber", documentNumber);
392        List<OleInvoiceDocument> oleInvoiceDocuments = (List<OleInvoiceDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OleInvoiceDocument.class, map);
393        OleInvoiceDocument oleInvoiceDocument = oleInvoiceDocuments.get(0);
394        /*for(OlePurchaseOrderDocument purchaseOrderDocument:olePurchaseOrderDocuments){
395            List<OlePurchaseOrderItem> olePurchaseOrderItems1=purchaseOrderDocument.getItems();
396            for(OlePurchaseOrderItem olePurchaseOrderItem1:olePurchaseOrderItems){
397                for(OlePurchaseOrderItem olePurchaseOrderItem2:olePurchaseOrderItems1){
398                    if(olePurchaseOrderItem1.getItemIdentifier().toString().equalsIgnoreCase(olePurchaseOrderItem2.getItemIdentifier().toString())){
399                        olePurchaseOrderItem1.setItemForInvoice(true);
400                    }
401                }
402                purchaseOrderDocument.setPendingActionIndicator(false);
403
404            }
405
406        }*/
407        if (invoiceAmt != null) {
408            //oleInvoiceDocument.setInvoiceAmount(invoiceAmt);
409            oleInvoiceDocument.setVendorInvoiceAmount(new KualiDecimal(invoiceAmt));
410        }
411        for (OlePurchaseOrderDocument olePurchaseOrderDocument : olePurchaseOrderDocuments) {
412            if (olePurchaseOrderDocument != null) {
413                this.populateInvoiceFromPurchaseOrder(olePurchaseOrderDocument, oleInvoiceDocument, null, false);
414                oleInvoiceDocument.getPurchaseOrderDocuments().add(olePurchaseOrderDocument);
415            }
416        }
417        String description = getOlePurapService().getParameter(OLEConstants.INV_DESC);
418        description = getOlePurapService().setDocumentDescription(description,null);
419        oleInvoiceDocument.getDocumentHeader().setDocumentDescription(description);
420        boolean isRulePassed = (KRADServiceLocatorWeb.getKualiRuleService()).applyRules(new AttributedBlanketApproveDocumentEvent("", oleInvoiceDocument));
421        if (isRulePassed) {
422            try {
423                getOleInvoiceServiceImpl().saveInvoiceDocument(oleInvoiceDocument);
424            } catch (Exception e) {
425                LOG.error("Exception Occurred during updating Invoice Document" + e);
426                e.printStackTrace();
427            }
428        } else {
429            return false;
430        }
431        isSuccess = true;
432        if (isSuccess) {
433            this.setOleInvoiceDocument(oleInvoiceDocument);
434        }
435        return isSuccess;
436
437
438    }
439
440    public boolean validateReceivingForProcess(List<OlePurchaseOrderItem> purchaseOrderItems) {
441        boolean isValid = false;
442        int selectedItem = 0;
443        int receivingExistForItem = 0;
444        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
445            if (olePurchaseOrderItem.isSelected()) {
446                selectedItem++;
447                Map<String, String> map = new HashMap<String, String>();
448                map.put("purchaseOrderIdentifier", olePurchaseOrderItem
449                        .getItemIdentifier().toString());
450                List<OleLineItemReceivingItem> oleLineItemReceivingItems = (List<OleLineItemReceivingItem>) KRADServiceLocator
451                        .getBusinessObjectService().findMatching(
452                                OleLineItemReceivingItem.class, map);
453                if (oleLineItemReceivingItems.size() > 0) {
454                    OleLineItemReceivingItem oleLineItemReceivingItem = oleLineItemReceivingItems.get(0);
455                    /*if (oleLineItemReceivingItem.getReceiptStatusId().toString().equalsIgnoreCase(
456                            getReceiptStatusDetails(OLEConstants.PO_RECEIPT_STATUS_FULLY_RECEIVED) + "")) {
457                        */
458                    receivingExistForItem++;
459                    isValid = true;
460                    olePurchaseOrderItem.setSelected(false);
461                    /*}*/
462                }
463            }
464        }
465        if (selectedItem != receivingExistForItem) {
466            this.isAllowedPoForReceiving = true;
467        }
468        return isValid;
469    }
470
471    public int getReceiptStatusDetails(String receiptStatusCd) {
472        int receiptStatusId = 0;
473        Map<String, String> receiptStatusCdMap = new HashMap<String, String>();
474        receiptStatusCdMap.put(OLEConstants.RCPT_STATUS_CD, receiptStatusCd);
475        List<OleReceiptStatus> oleReceiptStatusList = (List) SpringContext.getBean(BusinessObjectService.class)
476                .findMatching(OleReceiptStatus.class, receiptStatusCdMap);
477        for (OleReceiptStatus oleReceiptStatus : oleReceiptStatusList) {
478            receiptStatusId = oleReceiptStatus.getReceiptStatusId().intValue();
479        }
480        return receiptStatusId;
481    }
482
483    public OleInvoiceService getOleInvoiceServiceImpl() {
484
485        OleInvoiceService oleInvoiceService = (OleInvoiceService) SpringContext.getBean(OleInvoiceService.class);
486        return oleInvoiceService;
487    }
488
489    public boolean validateForReceiving(List<OlePurchaseOrderItem> purchaseOrderItems) {
490        boolean isValid = true;
491        String poid = "";
492        for (OlePurchaseOrderItem olePurchaseOrderItem : purchaseOrderItems) {
493            if (olePurchaseOrderItem.isSelected()) {
494                if (!poid.equalsIgnoreCase("")) {
495                    if (!olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString().equalsIgnoreCase(poid)) {
496                        isValid = false;
497                        break;
498                    }
499                } else {
500                    poid = olePurchaseOrderItem.getOlePurchaseOrderDocument().getPurapDocumentIdentifier().toString();
501                }
502
503            }
504        }
505        return isValid;
506    }
507
508
509    public void populateInvoiceFromPurchaseOrder(PurchaseOrderDocument po, OleInvoiceDocument oleInvoiceDocument, HashMap<String, ExpiredOrClosedAccountEntry> expiredOrClosedAccountList, boolean isNew) {
510        AccountsPayableDocumentSpecificService accountsPayableDocumentSpecificService = SpringContext.getBean(InvoiceService.class);
511        if (isNew) {
512            VendorService vendorService = SpringContext.getBean(VendorService.class);
513            PurapService purapService = SpringContext.getBean(PurapService.class);
514            //oleInvoiceDocument.setPaymentMethodId(po.getVendorDetail().getPaymentMethodId());
515            oleInvoiceDocument.setPurchaseOrderIdentifier(po.getPurapDocumentIdentifier());
516            oleInvoiceDocument.getDocumentHeader().setOrganizationDocumentNumber(po.getDocumentHeader().getOrganizationDocumentNumber());
517            oleInvoiceDocument.setPostingYear(po.getPostingYear());
518            oleInvoiceDocument.setReceivingDocumentRequiredIndicator(po.isReceivingDocumentRequiredIndicator());
519            oleInvoiceDocument.setUseTaxIndicator(po.isUseTaxIndicator());
520            oleInvoiceDocument.setInvoicePositiveApprovalIndicator(po.isPaymentRequestPositiveApprovalIndicator());
521            oleInvoiceDocument.setVendorCustomerNumber(po.getVendorCustomerNumber());
522            oleInvoiceDocument.setReceivingDocumentRequiredIndicator(po.isReceivingDocumentRequiredIndicator());
523
524            if (po.getPurchaseOrderCostSource() != null) {
525                oleInvoiceDocument.setInvoiceCostSource(po.getPurchaseOrderCostSource());
526                oleInvoiceDocument.setInvoiceCostSourceCode(po.getPurchaseOrderCostSourceCode());
527            }
528
529            if (po.getVendorShippingPaymentTerms() != null) {
530                oleInvoiceDocument.setVendorShippingPaymentTerms(po.getVendorShippingPaymentTerms());
531                oleInvoiceDocument.setVendorShippingPaymentTermsCode(po.getVendorShippingPaymentTermsCode());
532            }
533
534            if (po.getVendorPaymentTerms() != null) {
535                oleInvoiceDocument.setVendorPaymentTermsCode(po.getVendorPaymentTermsCode());
536                oleInvoiceDocument.setVendorPaymentTerms(po.getVendorPaymentTerms());
537            }
538
539            if (po.getRecurringPaymentType() != null) {
540                oleInvoiceDocument.setRecurringPaymentType(po.getRecurringPaymentType());
541                oleInvoiceDocument.setRecurringPaymentTypeCode(po.getRecurringPaymentTypeCode());
542            }
543
544            Bank defaultBank = SpringContext.getBean(BankService.class).getDefaultBankByDocType(oleInvoiceDocument.getClass());
545            if (defaultBank != null) {
546                oleInvoiceDocument.setBankCode(defaultBank.getBankCode());
547                oleInvoiceDocument.setBank(defaultBank);
548            }
549            oleInvoiceDocument.setVendorHeaderGeneratedIdentifier(po.getVendorHeaderGeneratedIdentifier());
550            oleInvoiceDocument.setVendorDetailAssignedIdentifier(po.getVendorDetailAssignedIdentifier());
551            oleInvoiceDocument.setVendorCustomerNumber(po.getVendorCustomerNumber());
552            oleInvoiceDocument.setVendorName(po.getVendorName());
553
554            // set original vendor
555            oleInvoiceDocument.setOriginalVendorHeaderGeneratedIdentifier(po.getVendorHeaderGeneratedIdentifier());
556            oleInvoiceDocument.setOriginalVendorDetailAssignedIdentifier(po.getVendorDetailAssignedIdentifier());
557
558            // set alternate vendor info as well
559            oleInvoiceDocument.setAlternateVendorHeaderGeneratedIdentifier(po.getAlternateVendorHeaderGeneratedIdentifier());
560            oleInvoiceDocument.setAlternateVendorDetailAssignedIdentifier(po.getAlternateVendorDetailAssignedIdentifier());
561
562            // populate preq vendor address with the default remit address type for the vendor if found
563            String userCampus = GlobalVariables.getUserSession().getPerson().getCampusCode();
564            VendorAddress vendorAddress = vendorService.getVendorDefaultAddress(po.getVendorHeaderGeneratedIdentifier(), po.getVendorDetailAssignedIdentifier(), VendorConstants.AddressTypes.REMIT, userCampus);
565            if (vendorAddress != null) {
566                oleInvoiceDocument.templateVendorAddress(vendorAddress);
567                oleInvoiceDocument.setVendorAddressGeneratedIdentifier(vendorAddress.getVendorAddressGeneratedIdentifier());
568                oleInvoiceDocument.setVendorAttentionName(StringUtils.defaultString(vendorAddress.getVendorAttentionName()));
569            } else {
570                // set address from PO
571                oleInvoiceDocument.setVendorAddressGeneratedIdentifier(po.getVendorAddressGeneratedIdentifier());
572                oleInvoiceDocument.setVendorLine1Address(po.getVendorLine1Address());
573                oleInvoiceDocument.setVendorLine2Address(po.getVendorLine2Address());
574                oleInvoiceDocument.setVendorCityName(po.getVendorCityName());
575                oleInvoiceDocument.setVendorAddressInternationalProvinceName(po.getVendorAddressInternationalProvinceName());
576                oleInvoiceDocument.setVendorStateCode(po.getVendorStateCode());
577                oleInvoiceDocument.setVendorPostalCode(po.getVendorPostalCode());
578                oleInvoiceDocument.setVendorCountryCode(po.getVendorCountryCode());
579
580                boolean blankAttentionLine = StringUtils.equalsIgnoreCase(
581                        "Y",
582                        SpringContext.getBean(ParameterService.class).getParameterValueAsString(
583                                PurapConstants.PURAP_NAMESPACE, "Document",
584                                PurapParameterConstants.BLANK_ATTENTION_LINE_FOR_PO_TYPE_ADDRESS));
585
586                if (blankAttentionLine) {
587                    oleInvoiceDocument.setVendorAttentionName(StringUtils.EMPTY);
588                } else {
589                    oleInvoiceDocument.setVendorAttentionName(StringUtils.defaultString(po.getVendorAttentionName()));
590                }
591            }
592        }
593        oleInvoiceDocument.setInvoicePayDate(getOleInvoiceServiceImpl().calculatePayDate(oleInvoiceDocument.getInvoiceDate(), oleInvoiceDocument.getVendorPaymentTerms()));
594
595        //   if (getOleInvoiceServiceImpl().encumberedItemExistsForInvoicing(po)) {
596        for (OlePurchaseOrderItem poi : (List<OlePurchaseOrderItem>) po.getItems()) {
597            // check to make sure it's eligible for payment (i.e. active and has encumbrance available
598            if (poi.isSelected()) {
599                poi.setNoOfCopiesInvoiced(poi.getOleItemQuantity());
600                OleInvoiceItem invoiceItem = new OleInvoiceItem(poi, oleInvoiceDocument);
601                invoiceItem.setPurchaseOrderIdentifier(po.getPurapDocumentIdentifier());
602                invoiceItem.setItemQuantity(poi.getItemQuantity());
603                invoiceItem.setOlePoOutstandingQuantity(new KualiInteger(poi.getOutstandingQuantity().bigDecimalValue()));
604                    /*invoiceItem.setExtendedPrice(poi.getExtendedPrice());*/
605                invoiceItem.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier());
606                invoiceItem.setReceivingDocumentRequiredIndicator(po.isReceivingDocumentRequiredIndicator());
607                    /*if (new KualiDecimal(poi.getInvoiceItemListPrice()).isLessThan(AbstractKualiDecimal.ZERO)) {
608                        invoiceItem.setInvoiceListPrice(poi.getInvoiceItemListPrice());
609                    }
610                    else {
611                        invoiceItem.setItemListPrice(new KualiDecimal(poi.getInvoiceItemListPrice()));
612                    }*/
613                    /*List<OleInvoiceItem> oleInvoiceItems=(List<OleInvoiceItem>)oleInvoiceDocument.getItems();
614                    int pos=1;
615                    if(oleInvoiceItems.size()>0){
616                        for(OleInvoiceItem oleInvoiceItem:oleInvoiceItems){
617                            if(oleInvoiceItem.getItemTypeCode().equalsIgnoreCase("ITEM")){
618                                pos=oleInvoiceItem.getItemLineNumber();
619                            }
620                        }
621                        invoiceItem.setItemLineNumber(new Integer(pos+1));
622                    }  else{
623                        invoiceItem.setItemLineNumber(new Integer(pos));
624                    }*/
625                oleInvoiceDocument.getItems().add(invoiceItem);
626                PurchasingCapitalAssetItem purchasingCAMSItem = po.getPurchasingCapitalAssetItemByItemIdentifier(poi.getItemIdentifier());
627                if (purchasingCAMSItem != null) {
628                    invoiceItem.setCapitalAssetTransactionTypeCode(purchasingCAMSItem.getCapitalAssetTransactionTypeCode());
629                }
630
631
632                // copy use tax items over
633                invoiceItem.getUseTaxItems().clear();
634                for (PurApItemUseTax useTax : poi.getUseTaxItems()) {
635                    invoiceItem.getUseTaxItems().add(useTax);
636                }
637
638            }
639        }
640        // }
641
642        // add missing below the line
643        /*purapService.addBelowLineItems(oleInvoiceDocument);*/
644        /*oleInvoiceDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier());*/
645
646        //fix up below the line items
647        getOleInvoiceServiceImpl().removeIneligibleAdditionalCharges(oleInvoiceDocument);
648
649        oleInvoiceDocument.fixItemReferences();
650        oleInvoiceDocument.refreshNonUpdateableReferences();
651    }
652
653    public boolean receivePO(OleLineItemReceivingDocument oleLineItemReceivingDocument, Integer purchaseOrderIdentifier, boolean isCreateRCV, List<OlePurchaseOrderItem> purchaseOrderItems) {
654        boolean receivePOSuccess = false;
655
656        // Setting defaults
657        oleLineItemReceivingDocument.setPurchaseOrderIdentifier(purchaseOrderIdentifier);
658        DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class);
659        oleLineItemReceivingDocument.setShipmentReceivedDate(dateTimeService.getCurrentSqlDate());
660        // Validations Start
661        boolean isValid = true;
662
663        PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(purchaseOrderIdentifier);
664
665        if (ObjectUtils.isNotNull(po)) {
666            oleLineItemReceivingDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier());
667            if (!SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(oleLineItemReceivingDocument).isAuthorizedByTemplate(oleLineItemReceivingDocument, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, GlobalVariables.getUserSession().getPrincipalId())) {
668                throw new DocumentAuthorizationException(GlobalVariables.getUserSession().getPerson().getPrincipalName(), "initiate document", oleLineItemReceivingDocument.getDocumentNumber());
669            }
670        } else {
671            GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, OLEKeyConstants.ERROR_RECEIVING_LINE_PO_NOT_EXIST, oleLineItemReceivingDocument.getPurchaseOrderIdentifier().toString());
672        }
673
674
675        if (!SpringContext.getBean(ReceivingService.class).isPurchaseOrderActiveForLineItemReceivingDocumentCreation(oleLineItemReceivingDocument.getPurchaseOrderIdentifier())) {
676            GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, OLEKeyConstants.ERROR_RECEIVING_LINE_PONOTACTIVE, oleLineItemReceivingDocument.getPurchaseOrderIdentifier().toString());
677
678            isValid = false;
679            return isValid;
680        }
681
682        if (SpringContext.getBean(ReceivingService.class).canCreateLineItemReceivingDocument(oleLineItemReceivingDocument.getPurchaseOrderIdentifier(), oleLineItemReceivingDocument.getDocumentNumber()) == false) {
683            String inProcessDocNum = "";
684            List<String> inProcessDocNumbers = SpringContext.getBean(ReceivingService.class).getLineItemReceivingDocumentNumbersInProcessForPurchaseOrder(oleLineItemReceivingDocument.getPurchaseOrderIdentifier(), oleLineItemReceivingDocument.getDocumentNumber());
685            if (!inProcessDocNumbers.isEmpty()) {    // should not be empty if we reach this point
686                inProcessDocNum = inProcessDocNumbers.get(0);
687            }
688            GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, OLEKeyConstants.ERROR_RECEIVING_LINE_DOCUMENT_ACTIVE_FOR_PO, oleLineItemReceivingDocument.getPurchaseOrderIdentifier().toString(), inProcessDocNum);
689            isValid = false;
690            return isValid;
691        }
692        try {
693            if (isValid) {
694
695                SpringContext.getBean(ReceivingService.class).populateAndSaveLineItemReceivingDocument(oleLineItemReceivingDocument);
696
697                List<OleLineItemReceivingItem> itemList = new ArrayList<OleLineItemReceivingItem>();
698                for (Object item : oleLineItemReceivingDocument.getItems()) {
699                    OleLineItemReceivingItem rlItem = (OleLineItemReceivingItem) item;
700                    // Receiving 100pc
701                    boolean isPOItemPresent = false;
702                    for (OlePurchaseOrderItem poItem : purchaseOrderItems) {
703                        if (poItem.isSelected()) {
704                            if (!isPOItemPresent
705                                    && poItem.getItemIdentifier().equals(rlItem.getPurchaseOrderIdentifier())) {
706                                rlItem.setOleItemReceivedTotalQuantity(rlItem.getOleItemReceivedToBeQuantity());
707
708                                rlItem.setOleItemReceivedTotalParts(rlItem.getOleItemReceivedToBeParts());
709                                rlItem.setPoSelected(true);
710                                /*
711                                 * rlItem.setItemReceivedTotalQuantity(rlItem.getItemOrderedQuantity());
712                                 * rlItem.setItemReceivedTotalParts(rlItem.getItemOrderedParts());
713                                 */
714                                isPOItemPresent = true;
715                            } else if (!isPOItemPresent) {
716                                rlItem.setItemReceivedTotalQuantity(KualiDecimal.ZERO);
717                                rlItem.setItemReceivedTotalParts(KualiDecimal.ZERO);
718                            }
719                        }
720                    }
721
722                    itemList.add(rlItem);
723                }
724                if (ObjectUtils.isNotNull(itemList) && itemList.size() > 0) {
725                    oleLineItemReceivingDocument.setItems(itemList);
726
727                    Person principalPerson = SpringContext.getBean(PersonService.class).getPerson(GlobalVariables.getUserSession().getPerson().getPrincipalId());
728                    //oleLineItemReceivingDocument.getDocumentHeader().setWorkflowDocument(KRADServiceLocatorWeb.getWorkflowDocumentService().createWorkflowDocument(oleLineItemReceivingDocument.getDocumentHeader().getWorkflowDocument().getDocumentTypeName(), principalPerson));
729                    oleLineItemReceivingDocument.getDocumentHeader().setWorkflowDocument(KRADServiceLocatorWeb.getWorkflowDocumentService().loadWorkflowDocument(oleLineItemReceivingDocument.getDocumentNumber(), principalPerson));
730                    //oleLineItemReceivingDocument.setAdHocRoutePersons(buildFyiRecipient());
731                    if (isCreateRCV) {
732                        SpringContext.getBean(DocumentService.class).saveDocument(oleLineItemReceivingDocument);
733                    } else {
734                        List<OleLineItemReceivingItem> items = oleLineItemReceivingDocument.getItems();
735                        for (OleLineItemReceivingItem item : items) {
736                            OleLineItemReceivingService oleLineItemReceivingService = SpringContext.getBean(OleLineItemReceivingServiceImpl.class);
737                            OlePurchaseOrderItem olePurchaseOrderItem = oleLineItemReceivingService.getOlePurchaseOrderItem(item.getPurchaseOrderIdentifier());
738                            if (olePurchaseOrderItem != null) {
739                                if (item.isPoSelected()) {
740                                    for (OleCopy oleCopy : item.getCopyList()) {
741                                        oleCopy.setReceiptStatus(OLEConstants.OleLineItemReceiving.RECEIVED_STATUS);
742                                    }
743                                    OleCopyHelperService oleCopyHelperService = SpringContext.getBean(OleCopyHelperService.class);
744                                    oleCopyHelperService.updateRequisitionAndPOItems(olePurchaseOrderItem, item, null, oleLineItemReceivingDocument.getIsATypeOfRCVGDoc());
745                                }
746                            }
747                        }
748                        try {
749                            SpringContext.getBean(DocumentService.class).routeDocument(oleLineItemReceivingDocument, "Line Item Receiving from Receiving Queue Search page", null);
750                        } catch (Exception e) {
751                            e.printStackTrace();
752                        }
753
754                    }
755
756                    receivePOSuccess = true;
757                }
758            }
759        } catch (WorkflowException wfe) {
760            String rcvDocNum = oleLineItemReceivingDocument.getDocumentNumber();
761            String poId = oleLineItemReceivingDocument.getPurchaseOrderIdentifier().toString();
762            GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, OLEKeyConstants.ERROR_RECEIVING_LINE_SAVE_OR_SUBMIT, new String[]{poId, rcvDocNum, wfe.getMessage()});
763
764          /*  wfe.printStackTrace();*/
765            isValid = false;
766            return isValid;
767        }
768
769        return receivePOSuccess;
770    }
771
772
773    public boolean receiveAndPay(List<OlePurchaseOrderItem> purchaseOrderItems, OlePurchaseOrderDocument olePurchaseOrderDocument) throws Exception {
774        boolean isSuccess = false;
775
776        OleLineItemReceivingDocument oleLineItemReceivingDocument = (OleLineItemReceivingDocument) KRADServiceLocatorWeb.getDocumentService().getNewDocument("OLE_RCVL");
777        // Elimiate duplicate POs from the list
778        HashMap<Integer, OlePurchaseOrderItem> selectedPOs = getSelectedPurchaseOrders(purchaseOrderItems);
779        // Map containing PO ID and receive PO status
780        HashMap<Integer, Boolean> receivePOStatus = new HashMap<Integer, Boolean>();
781        boolean isInfoMsg = false;
782        for (Map.Entry<Integer, OlePurchaseOrderItem> entry : selectedPOs.entrySet()) {
783            boolean receivePOSuccess = this.receivePO(oleLineItemReceivingDocument, entry.getKey(), false, purchaseOrderItems);
784            if (receivePOSuccess) {
785                receivingDocumentsList.add(oleLineItemReceivingDocument.getDocumentNumber());
786                isInfoMsg = true;
787                isSuccess = true;
788            }
789            receivePOStatus.put(entry.getKey(), receivePOSuccess);
790
791        }
792        List<OlePurchaseOrderItem> refreshedPOList = new ArrayList<OlePurchaseOrderItem>();
793        for (OlePurchaseOrderItem poItem : purchaseOrderItems) {
794            Integer poId = poItem.getPurchaseOrder().getPurapDocumentIdentifier();
795            if (ObjectUtils.isNull(receivePOStatus.get(poId))) {
796                refreshedPOList.add(poItem);
797            } else {
798                if (receivePOStatus.get(poId) == false) {
799                    refreshedPOList.add(poItem);
800                }
801            }
802        }
803        return isSuccess;
804    }
805
806
807    private HashMap<Integer, OlePurchaseOrderItem> getSelectedPurchaseOrders(List<OlePurchaseOrderItem> purchaseOrders) {
808        HashMap<Integer, OlePurchaseOrderItem> poItemMap = new HashMap<Integer, OlePurchaseOrderItem>();
809        for (OlePurchaseOrderItem poItem : purchaseOrders) {
810            if (poItem.isSelected()) {
811                if (ObjectUtils.isNull(poItemMap.get(poItem.getPurchaseOrder().getPurapDocumentIdentifier()))) {
812                    poItemMap.put(poItem.getPurchaseOrder().getPurapDocumentIdentifier(), poItem);
813                }
814            }
815        }
816
817
818        return poItemMap;
819    }
820
821    public boolean validateRecords(Integer purAppNum, String docNumber) {
822        boolean valid = true;
823
824        PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(purAppNum);
825        valid &= SpringContext.getBean(ReceivingService.class).canCreateLineItemReceivingDocument(purAppNum, null);
826        return valid;
827    }
828
829    public boolean validateStatusOfPurchaseOrderDocument(OlePurchaseOrderDocument olePurchaseOrderDocument) {
830        boolean isValid = true;
831        PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(olePurchaseOrderDocument.getPurapDocumentIdentifier());
832        if (po.getApplicationDocumentStatus().equalsIgnoreCase("Closed")) {
833            isValid = false;
834        }
835        return isValid;
836    }
837
838    public boolean validateInvoiceDocumentNumber(String documentNumber) {
839        Map<String, String> map = new HashMap<String, String>();
840        map.put("documentNumber", documentNumber);
841        List<OleInvoiceDocument> oleInvoiceDocuments = (List<OleInvoiceDocument>) KRADServiceLocator.getBusinessObjectService().findMatching(OleInvoiceDocument.class, map);
842        if (oleInvoiceDocuments.size() > 0) {
843            return true;
844        } else {
845            return false;
846        }
847
848    }
849
850    public boolean validateNumber(final String hex) {
851        Pattern pattern = Pattern.compile("[0-9]+");
852        Matcher matcher = pattern.matcher(hex);
853        return matcher.matches();
854
855    }
856
857    public boolean isPoAlreadyPaid(List<OlePurchaseOrderItem> olePurchaseOrderItems) {
858        boolean isPaid = false;
859        for (OlePurchaseOrderItem olePurchaseOrderItem : olePurchaseOrderItems) {
860            if (olePurchaseOrderItem.isSelected()) {
861                if (olePurchaseOrderItem.getCopyList() != null && olePurchaseOrderItem.getCopyList().size() > 0) {
862                    for (OleCopy oleCopy : olePurchaseOrderItem.getCopyList()) {
863                        if (oleCopy != null && oleCopy.getOlePaidCopies() != null && oleCopy.getOlePaidCopies().size() > 0) {
864                            for (OLEPaidCopy olePaidCopy : oleCopy.getOlePaidCopies()) {
865                                if (olePaidCopy != null && olePaidCopy.getPaymentRequestIdentifier() != null) {
866                                    isPaid = true;
867                                    break;
868                                }
869                            }
870                        }
871                    }
872                }
873            }
874        }
875        return isPaid;
876    }
877
878    /*
879        This method updates the Foreign Details on the Invoice Document if it has foreign currency.
880     */
881    private void updateForeignCurrencyDetails(OleInvoiceDocument oleInvoiceDocument) {
882        String currencyType = null;
883        BigDecimal exchangeRate = null;
884        oleInvoiceDocument.setInvoiceCurrencyType(oleInvoiceDocument.getVendorDetail().getCurrencyType().getCurrencyTypeId().toString());
885        if (StringUtils.isNotBlank(oleInvoiceDocument.getInvoiceCurrencyType())) {
886            currencyType = getInvoiceService().getCurrencyType(oleInvoiceDocument.getInvoiceCurrencyType());
887            if (StringUtils.isNotBlank(currencyType)) {
888                // local vendor
889                if (!currencyType.equalsIgnoreCase(OleSelectConstant.CURRENCY_TYPE_NAME)) {
890                    oleInvoiceDocument.setForeignCurrencyFlag(true);
891                    oleInvoiceDocument.setInvoiceCurrencyTypeId(new Long(oleInvoiceDocument.getInvoiceCurrencyType()));
892                    exchangeRate = getInvoiceService().getExchangeRate(oleInvoiceDocument.getInvoiceCurrencyType()).getExchangeRate();
893                    oleInvoiceDocument.setInvoiceCurrencyExchangeRate(exchangeRate.toString());
894                    if (StringUtils.isNotBlank(oleInvoiceDocument.getInvoiceAmount())) {
895                        oleInvoiceDocument.setForeignVendorInvoiceAmount(new BigDecimal(oleInvoiceDocument.getInvoiceAmount()).multiply(exchangeRate));
896                        oleInvoiceDocument.setForeignInvoiceAmount(new KualiDecimal(oleInvoiceDocument.getForeignVendorInvoiceAmount()).toString());
897                        oleInvoiceDocument.setForeignVendorAmount(new KualiDecimal(oleInvoiceDocument.getForeignVendorInvoiceAmount()).toString());
898                    }
899                }
900            }
901        }
902
903    }
904
905
906
907}