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.fp.document.validation.impl; 017 018 import static org.kuali.kfs.sys.KFSConstants.ACCOUNTING_LINE_ERRORS; 019 import static org.kuali.kfs.sys.KFSKeyConstants.ERROR_DOCUMENT_BALANCE_CONSIDERING_SOURCE_AND_TARGET_AMOUNTS; 020 import static org.kuali.kfs.sys.KFSKeyConstants.ERROR_DOCUMENT_PC_TRANSACTION_TOTAL_ACCTING_LINE_TOTAL_NOT_EQUAL; 021 022 import java.util.List; 023 024 import org.kuali.kfs.fp.businessobject.ProcurementCardTargetAccountingLine; 025 import org.kuali.kfs.fp.businessobject.ProcurementCardTransactionDetail; 026 import org.kuali.kfs.fp.document.ProcurementCardDocument; 027 import org.kuali.kfs.sys.businessobject.TargetAccountingLine; 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 033 /** 034 * Validates that an accounting line does not have a capital object object code 035 */ 036 public class ProcurementCardBalanceValidation extends GenericValidation { 037 private ProcurementCardDocument accountingDocumentForValidation; 038 039 /** 040 * Validates that an accounting line does not have a capital object object code 041 * <strong>Expects an accounting line as the first a parameter</strong> 042 * @see org.kuali.kfs.sys.document.validation.Validation#validate(java.lang.Object[]) 043 */ 044 public boolean validate(AttributedDocumentEvent event) { 045 ProcurementCardDocument pcDocument = (ProcurementCardDocument) getAccountingDocumentForValidation(); 046 047 KualiDecimal targetTotal = pcDocument.getTargetTotal(); 048 KualiDecimal sourceTotal = pcDocument.getSourceTotal(); 049 050 boolean isValid = targetTotal.compareTo(sourceTotal) == 0; 051 052 if (!isValid) { 053 GlobalVariables.getMessageMap().putError(ACCOUNTING_LINE_ERRORS, ERROR_DOCUMENT_BALANCE_CONSIDERING_SOURCE_AND_TARGET_AMOUNTS, new String[] { sourceTotal.toString(), targetTotal.toString() }); 054 } 055 056 List<ProcurementCardTransactionDetail> pcTransactionEntries = pcDocument.getTransactionEntries(); 057 058 for (ProcurementCardTransactionDetail pcTransactionDetail : pcTransactionEntries) { 059 isValid &= isTransactionBalanceValid(pcTransactionDetail); 060 } 061 062 return isValid; 063 } 064 065 /** 066 * This method validates the balance of the transaction given. A procurement card transaction is in balance if 067 * the total amount of the transaction equals the total of the target accounting lines corresponding to the transaction. 068 * 069 * @param pcTransaction The transaction detail used to retrieve the procurement card transaction and target accounting 070 * lines used to check for in balance. 071 * @return True if the amounts are equal and the transaction is in balance, false otherwise. 072 */ 073 protected boolean isTransactionBalanceValid(ProcurementCardTransactionDetail pcTransactionDetail) { 074 boolean inBalance = true; 075 KualiDecimal transAmount = pcTransactionDetail.getTransactionTotalAmount(); 076 List<ProcurementCardTargetAccountingLine> targetAcctingLines = pcTransactionDetail.getTargetAccountingLines(); 077 078 KualiDecimal targetLineTotal = KualiDecimal.ZERO; 079 080 for (TargetAccountingLine targetLine : targetAcctingLines) { 081 targetLineTotal = targetLineTotal.add(targetLine.getAmount()); 082 } 083 084 // perform absolute value check because current system has situations where amounts may be opposite in sign 085 // This will no longer be necessary following completion of KULFDBCK-1290 086 inBalance = transAmount.abs().equals(targetLineTotal.abs()); 087 088 if (!inBalance) { 089 GlobalVariables.getMessageMap().putError(ACCOUNTING_LINE_ERRORS, ERROR_DOCUMENT_PC_TRANSACTION_TOTAL_ACCTING_LINE_TOTAL_NOT_EQUAL, new String[] { transAmount.toString(), targetLineTotal.toString() }); 090 } 091 092 return inBalance; 093 } 094 095 /** 096 * Gets the accountingDocumentForValidation attribute. 097 * @return Returns the accountingDocumentForValidation. 098 */ 099 public ProcurementCardDocument getAccountingDocumentForValidation() { 100 return accountingDocumentForValidation; 101 } 102 103 /** 104 * Sets the accountingDocumentForValidation attribute value. 105 * @param accountingDocumentForValidation The accountingDocumentForValidation to set. 106 */ 107 public void setAccountingDocumentForValidation(ProcurementCardDocument accountingDocumentForValidation) { 108 this.accountingDocumentForValidation = accountingDocumentForValidation; 109 } 110 111 112 }