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 java.util.List;
019    
020    import org.apache.commons.lang.StringUtils;
021    import org.kuali.kfs.module.purap.PurapConstants;
022    import org.kuali.kfs.module.purap.PurapKeyConstants;
023    import org.kuali.kfs.module.purap.PurapPropertyConstants;
024    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
025    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
026    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
027    import org.kuali.kfs.sys.KFSPropertyConstants;
028    import org.kuali.kfs.sys.document.validation.GenericValidation;
029    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
030    import org.kuali.rice.kns.util.GlobalVariables;
031    import org.kuali.rice.kns.util.KualiDecimal;
032    import org.kuali.rice.kns.util.ObjectUtils;
033    
034    public class PaymentRequestPurchaseOrderIdValidation extends GenericValidation {
035    
036        public boolean validate(AttributedDocumentEvent event) {
037            boolean valid = true;
038            PaymentRequestDocument document = (PaymentRequestDocument)event.getDocument();
039            GlobalVariables.getMessageMap().clearErrorPath();
040            GlobalVariables.getMessageMap().addToErrorPath(KFSPropertyConstants.DOCUMENT);
041    
042            Integer POID = document.getPurchaseOrderIdentifier();
043    
044            PurchaseOrderDocument purchaseOrderDocument = document.getPurchaseOrderDocument();
045            if (ObjectUtils.isNull(purchaseOrderDocument)) {
046                GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_PURCHASE_ORDER_NOT_EXIST);
047                valid &= false;
048            }
049            else if (purchaseOrderDocument.isPendingActionIndicator()) {
050                GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_PURCHASE_PENDING_ACTION);
051                valid &= false;
052            }
053            else if (!StringUtils.equals(purchaseOrderDocument.getStatusCode(), PurapConstants.PurchaseOrderStatuses.OPEN)) {
054                GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_PURCHASE_ORDER_NOT_OPEN);
055                valid &= false;
056                // if the PO is pending and it is not a Retransmit, we cannot generate a Payment Request for it
057            }
058            else {
059                // Verify that there exists at least 1 item left to be invoiced
060                //valid &= encumberedItemExistsForInvoicing(purchaseOrderDocument);
061            }
062            GlobalVariables.getMessageMap().clearErrorPath();
063            return valid;
064        }
065    
066        /**
067         * Determines if there are items with encumbrances to be invoiced on passed in
068         * purchase order document.
069         * 
070         * @param document - purchase order document
071         * @return
072         */
073        protected boolean encumberedItemExistsForInvoicing(PurchaseOrderDocument document) {
074            boolean zeroDollar = true;
075            GlobalVariables.getMessageMap().clearErrorPath();
076            GlobalVariables.getMessageMap().addToErrorPath(KFSPropertyConstants.DOCUMENT);
077            for (PurchaseOrderItem poi : (List<PurchaseOrderItem>) document.getItems()) {
078                // Quantity-based items
079                if (poi.getItemType().isLineItemIndicator() && poi.getItemType().isQuantityBasedGeneralLedgerIndicator()) {
080                    KualiDecimal encumberedQuantity = poi.getItemOutstandingEncumberedQuantity() == null ? KualiDecimal.ZERO : poi.getItemOutstandingEncumberedQuantity();
081                    if (encumberedQuantity.compareTo(KualiDecimal.ZERO) == 1) {
082                        zeroDollar = false;
083                        break;
084                    }
085                }
086                // Service Items or Below-the-line Items
087                else if (poi.getItemType().isAmountBasedGeneralLedgerIndicator() || poi.getItemType().isAdditionalChargeIndicator()) {
088                    KualiDecimal encumberedAmount = poi.getItemOutstandingEncumberedAmount() == null ? KualiDecimal.ZERO : poi.getItemOutstandingEncumberedAmount();
089                    if (encumberedAmount.compareTo(KualiDecimal.ZERO) == 1) {
090                        zeroDollar = false;
091                        break;
092                    }
093                }
094            }
095            if (zeroDollar) {
096                GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, PurapKeyConstants.ERROR_NO_ITEMS_TO_INVOICE);
097            }
098            GlobalVariables.getMessageMap().clearErrorPath();
099            return !zeroDollar;
100        }
101    
102    }