001/*
002 * Copyright 2009 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.module.purap.document.validation.impl;
017
018import org.kuali.ole.module.purap.PurapConstants;
019import org.kuali.ole.module.purap.PurapKeyConstants;
020import org.kuali.ole.module.purap.businessobject.PaymentRequestItem;
021import org.kuali.ole.module.purap.businessobject.PurApAccountingLine;
022import org.kuali.ole.select.businessobject.OlePaymentRequestItem;
023import org.kuali.ole.sys.document.validation.GenericValidation;
024import org.kuali.ole.sys.document.validation.event.AttributedDocumentEvent;
025import org.kuali.rice.core.api.util.type.KualiDecimal;
026import org.kuali.rice.krad.util.GlobalVariables;
027
028public class PaymentRequestAccountTotalValidation extends GenericValidation {
029
030    private PaymentRequestItem itemForValidation;
031
032    /**
033     * Verifies account percent. If the total percent does not equal 100, the validation fails.
034     */
035    @Override
036    public boolean validate(AttributedDocumentEvent event) {
037        boolean valid = true;
038
039        // validate that the amount total
040        KualiDecimal totalAmount = KualiDecimal.ZERO;
041        KualiDecimal desiredAmount =
042                (itemForValidation.getTotalAmount() == null) ? new KualiDecimal(0) : itemForValidation.getTotalAmount();
043
044        KualiDecimal prorateSurcharge = KualiDecimal.ZERO;
045        OlePaymentRequestItem preqItem = (OlePaymentRequestItem) itemForValidation;
046        if (preqItem.getItemType().isQuantityBasedGeneralLedgerIndicator() && preqItem.getExtendedPrice() != null && preqItem.getExtendedPrice().compareTo(KualiDecimal.ZERO) != 0) {
047            if (preqItem.getItemSurcharge() != null && preqItem.getItemTypeCode().equals("ITEM")) {
048                prorateSurcharge = new KualiDecimal(preqItem.getItemSurcharge()).multiply(preqItem.getItemQuantity());
049            }
050            desiredAmount = desiredAmount.subtract(prorateSurcharge);
051        }
052
053        for (PurApAccountingLine account : itemForValidation.getSourceAccountingLines()) {
054            if (account.getAmount() != null) {
055                totalAmount = totalAmount.add(account.getAmount());
056            } else {
057                totalAmount = totalAmount.add(KualiDecimal.ZERO);
058            }
059        }
060
061        if (desiredAmount.compareTo(totalAmount) != 0) {
062            GlobalVariables.getMessageMap().putError(PurapConstants.ITEM_TAB_ERROR_PROPERTY, PurapKeyConstants.ERROR_ITEM_ACCOUNTING_TOTAL_AMOUNT, itemForValidation.getItemIdentifierString(), desiredAmount.toString());
063            valid = false;
064        }
065
066
067        return valid;
068    }
069
070    public PaymentRequestItem getItemForValidation() {
071        return itemForValidation;
072    }
073
074    public void setItemForValidation(PaymentRequestItem itemForValidation) {
075        this.itemForValidation = itemForValidation;
076    }
077
078}