001/* 002 * Copyright 2008 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.fp.document.validation.impl; 017 018import java.util.ArrayList; 019import java.util.Iterator; 020import java.util.List; 021 022import org.kuali.ole.fp.document.TransferOfFundsDocument; 023import org.kuali.ole.fp.document.service.TransferOfFundsService; 024import org.kuali.ole.sys.OLEKeyConstants; 025import org.kuali.ole.sys.businessobject.AccountingLine; 026import org.kuali.ole.sys.document.AccountingDocument; 027import org.kuali.ole.sys.document.validation.GenericValidation; 028import org.kuali.ole.sys.document.validation.event.AttributedDocumentEvent; 029import org.kuali.rice.core.api.util.type.KualiDecimal; 030import org.kuali.rice.krad.util.GlobalVariables; 031 032/** 033 * Transfer of Funds document validation which checks that mandatory and non-mandatory transfer totals are in balance. 034 */ 035public class TransferOfFundsTransferTotalsBalancedValidation extends GenericValidation { 036 private AccountingDocument accountingDocumentForValidation; 037 private TransferOfFundsService transferOfFundsService; 038 039 /** 040 * This method checks the sum of all of the "From" accounting lines with mandatory transfer object codes against the sum of all 041 * of the "To" accounting lines with mandatory transfer object codes. In addition, it does the same, but for accounting lines 042 * with non-mandatory transfer object code. This is to enforce the rule that the document must balance within the object code 043 * object sub-type codes of mandatory transfers and non-mandatory transfers. 044 * @see org.kuali.ole.sys.document.validation.Validation#validate(org.kuali.ole.sys.document.validation.event.AttributedDocumentEvent) 045 */ 046 public boolean validate(AttributedDocumentEvent event) { 047 TransferOfFundsDocument tofDoc = (TransferOfFundsDocument)accountingDocumentForValidation; 048 List lines = new ArrayList(); 049 050 lines.addAll(tofDoc.getSourceAccountingLines()); 051 lines.addAll(tofDoc.getTargetAccountingLines()); 052 053 // sum the from lines. 054 KualiDecimal mandatoryTransferFromAmount = KualiDecimal.ZERO; 055 KualiDecimal nonMandatoryTransferFromAmount = KualiDecimal.ZERO; 056 KualiDecimal mandatoryTransferToAmount = KualiDecimal.ZERO; 057 KualiDecimal nonMandatoryTransferToAmount = KualiDecimal.ZERO; 058 059 for (Iterator i = lines.iterator(); i.hasNext();) { 060 AccountingLine line = (AccountingLine) i.next(); 061 String objectSubTypeCode = line.getObjectCode().getFinancialObjectSubTypeCode(); 062 063 if (transferOfFundsService.isNonMandatoryTransfersSubType(objectSubTypeCode)) { 064 if (line.isSourceAccountingLine()) { 065 nonMandatoryTransferFromAmount = nonMandatoryTransferFromAmount.add(line.getAmount()); 066 } 067 else { 068 nonMandatoryTransferToAmount = nonMandatoryTransferToAmount.add(line.getAmount()); 069 } 070 } 071 else if (transferOfFundsService.isMandatoryTransfersSubType(objectSubTypeCode)) { 072 if (line.isSourceAccountingLine()) { 073 mandatoryTransferFromAmount = mandatoryTransferFromAmount.add(line.getAmount()); 074 } 075 else { 076 mandatoryTransferToAmount = mandatoryTransferToAmount.add(line.getAmount()); 077 } 078 } 079 } 080 081 // check that the amounts balance across mandatory transfers and non-mandatory transfers 082 boolean isValid = true; 083 084 if (mandatoryTransferFromAmount.compareTo(mandatoryTransferToAmount) != 0) { 085 isValid = false; 086 GlobalVariables.getMessageMap().putError("document.sourceAccountingLines", OLEKeyConstants.ERROR_DOCUMENT_TOF_MANDATORY_TRANSFERS_DO_NOT_BALANCE); 087 } 088 089 if (nonMandatoryTransferFromAmount.compareTo(nonMandatoryTransferToAmount) != 0) { 090 isValid = false; 091 GlobalVariables.getMessageMap().putError("document.sourceAccountingLines", OLEKeyConstants.ERROR_DOCUMENT_TOF_NON_MANDATORY_TRANSFERS_DO_NOT_BALANCE); 092 } 093 094 return isValid; 095 } 096 097 /** 098 * Gets the accountingDocumentForValidation attribute. 099 * @return Returns the accountingDocumentForValidation. 100 */ 101 public AccountingDocument getAccountingDocumentForValidation() { 102 return accountingDocumentForValidation; 103 } 104 105 /** 106 * Sets the accountingDocumentForValidation attribute value. 107 * @param accountingDocumentForValidation The accountingDocumentForValidation to set. 108 */ 109 public void setAccountingDocumentForValidation(AccountingDocument accountingDocumentForValidation) { 110 this.accountingDocumentForValidation = accountingDocumentForValidation; 111 } 112 113 /** 114 * Gets the transferOfFundsService attribute. 115 * @return Returns the transferOfFundsService. 116 */ 117 public TransferOfFundsService getTransferOfFundsService() { 118 return transferOfFundsService; 119 } 120 121 /** 122 * Sets the transferOfFundsService attribute value. 123 * @param transferOfFundsService The transferOfFundsService to set. 124 */ 125 public void setTransferOfFundsService(TransferOfFundsService transferOfFundsService) { 126 this.transferOfFundsService = transferOfFundsService; 127 } 128}