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     */
016    package org.kuali.kfs.module.purap.document.validation.impl;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.kfs.module.purap.PurapConstants;
020    import org.kuali.kfs.module.purap.PurapKeyConstants;
021    import org.kuali.kfs.module.purap.PurapPropertyConstants;
022    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
023    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
024    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
025    import org.kuali.kfs.module.purap.document.service.PaymentRequestService;
026    import org.kuali.kfs.module.purap.document.service.PurchaseOrderService;
027    import org.kuali.kfs.sys.document.validation.GenericValidation;
028    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
029    import org.kuali.kfs.vnd.VendorUtils;
030    import org.kuali.kfs.vnd.businessobject.VendorDetail;
031    import org.kuali.kfs.vnd.document.service.VendorService;
032    import org.kuali.rice.kns.util.GlobalVariables;
033    import org.kuali.rice.kns.util.ObjectUtils;
034    
035    public class VendorCreditMemoInitTabReferenceNumberValidation extends GenericValidation {
036    
037        private PaymentRequestService paymentRequestService;
038        private PurchaseOrderService purchaseOrderService;
039        private VendorService vendorService;
040        
041        /**
042         *  Validates only one of preq, po, or vendor number was given. Then validates the existence of that number.
043         */ 
044        public boolean validate(AttributedDocumentEvent event) {
045            boolean valid = true;
046            VendorCreditMemoDocument cmDocument = (VendorCreditMemoDocument) event.getDocument();
047    
048            if (!(ObjectUtils.isNotNull(cmDocument.getPaymentRequestIdentifier()) ^ StringUtils.isNotEmpty(cmDocument.getVendorNumber()) ^ ObjectUtils.isNotNull(cmDocument.getPurchaseOrderIdentifier())) || (ObjectUtils.isNotNull(cmDocument.getPaymentRequestIdentifier()) && StringUtils.isNotEmpty(cmDocument.getVendorNumber()) && ObjectUtils.isNotNull(cmDocument.getPurchaseOrderIdentifier()))) {
049                GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_CREDIT_MEMO_REQUIRED_FIELDS);
050                valid = false;
051            }
052            else {
053                // Make sure PREQ is valid if entered
054                Integer preqNumber = cmDocument.getPaymentRequestIdentifier();
055                if (ObjectUtils.isNotNull(preqNumber)) {
056                    PaymentRequestDocument preq = paymentRequestService.getPaymentRequestById(preqNumber);
057                    if (ObjectUtils.isNull(preq)) {
058                        GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(PurapPropertyConstants.PAYMENT_REQUEST_ID, PurapKeyConstants.ERROR_CREDIT_MEMO_PAYMENT_REQEUEST_INVALID, preqNumber.toString());
059                        valid = false;
060                    }
061                    else if ((PurapConstants.PaymentRequestStatuses.IN_PROCESS.equals(preq.getStatusCode())) || (PurapConstants.PaymentRequestStatuses.CANCELLED_STATUSES.contains(preq.getStatusCode()))) {
062                        GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(PurapPropertyConstants.PAYMENT_REQUEST_ID, PurapKeyConstants.ERROR_CREDIT_MEMO_PAYMENT_REQEUEST_INVALID_SATATUS, preqNumber.toString());
063                        valid = false;
064                    }
065                }
066    
067                // Make sure PO # is valid if entered
068                Integer purchaseOrderID = cmDocument.getPurchaseOrderIdentifier();
069                if (ObjectUtils.isNotNull(purchaseOrderID)) {
070                    PurchaseOrderDocument purchaseOrder = purchaseOrderService.getCurrentPurchaseOrder(purchaseOrderID);
071                    if (ObjectUtils.isNull(purchaseOrder)) {
072                        GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_CREDIT_MEMO_PURCHASE_ORDER_INVALID, purchaseOrderID.toString());
073                        valid = false;
074                    }
075                    else if (purchaseOrder.isPendingActionIndicator()) {
076                        GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_PURCHASE_PENDING_ACTION);
077                        valid &= false;
078                    }
079                    else if (!(StringUtils.equals(purchaseOrder.getStatusCode(), PurapConstants.PurchaseOrderStatuses.OPEN) || StringUtils.equals(purchaseOrder.getStatusCode(), PurapConstants.PurchaseOrderStatuses.CLOSED))) {
080                        GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_CREDIT_MEMO_PURCAHSE_ORDER_INVALID_STATUS, purchaseOrderID.toString());
081                        valid = false;
082                    }
083                }
084    
085                // Make sure vendorNumber is valid if entered
086                String vendorNumber = cmDocument.getVendorNumber();
087                if (StringUtils.isNotEmpty(vendorNumber)) {
088                    VendorDetail vendor = vendorService.getVendorDetail(VendorUtils.getVendorHeaderId(vendorNumber), VendorUtils.getVendorDetailId(vendorNumber));
089                    if (ObjectUtils.isNull(vendor)) {
090                        GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(PurapPropertyConstants.VENDOR_NUMBER, PurapKeyConstants.ERROR_CREDIT_MEMO_VENDOR_NUMBER_INVALID, vendorNumber);
091                        valid = false;
092                    }
093                }
094            }
095            return valid;
096        }
097    
098        public PaymentRequestService getPaymentRequestService() {
099            return paymentRequestService;
100        }
101    
102        public void setPaymentRequestService(PaymentRequestService paymentRequestService) {
103            this.paymentRequestService = paymentRequestService;
104        }
105    
106        public PurchaseOrderService getPurchaseOrderService() {
107            return purchaseOrderService;
108        }
109    
110        public void setPurchaseOrderService(PurchaseOrderService purchaseOrderService) {
111            this.purchaseOrderService = purchaseOrderService;
112        }
113    
114        public VendorService getVendorService() {
115            return vendorService;
116        }
117    
118        public void setVendorService(VendorService vendorService) {
119            this.vendorService = vendorService;
120        }
121    
122    }