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.ld.document.validation.impl;
017    
018    import static org.kuali.kfs.sys.businessobject.AccountingLineOverride.CODE.EXPIRED_ACCOUNT;
019    import static org.kuali.kfs.sys.businessobject.AccountingLineOverride.CODE.EXPIRED_ACCOUNT_AND_NON_FRINGE_ACCOUNT_USED;
020    
021    import java.util.ArrayList;
022    import java.util.Iterator;
023    import java.util.List;
024    import java.util.Map;
025    
026    import org.apache.commons.lang.StringUtils;
027    import org.kuali.kfs.coa.businessobject.Account;
028    import org.kuali.kfs.module.ld.LaborConstants ;
029    import org.kuali.kfs.module.ld.LaborKeyConstants; 
030    import org.kuali.kfs.module.ld.LaborPropertyConstants;
031    import org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine;
032    import org.kuali.kfs.module.ld.businessobject.ExpenseTransferSourceAccountingLine;
033    import org.kuali.kfs.module.ld.businessobject.LaborObject;
034    import org.kuali.kfs.module.ld.document.LaborExpenseTransferDocumentBase;
035    import org.kuali.kfs.sys.KFSKeyConstants;
036    import org.kuali.kfs.sys.KFSPropertyConstants;
037    import org.kuali.kfs.sys.ObjectUtil;
038    import org.kuali.kfs.sys.businessobject.AccountingLine;
039    import org.kuali.kfs.sys.document.validation.GenericValidation;
040    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
041    import org.kuali.rice.kns.document.Document;
042    import org.kuali.rice.kns.util.GlobalVariables;
043    import org.kuali.rice.kns.util.KualiDecimal;
044    
045    /**
046     * determine whether the given accounting line has already been in the given document
047     * 
048     * @param accountingDocument the given document
049     * @param accountingLine the given accounting line
050     * @return true if the given accounting line has already been in the given document; otherwise, false
051     */
052    public class LaborExpenseTransferAccountLineTotalsMatchValidation extends GenericValidation {
053        private Document documentForValidation;
054        
055        /**
056         * Validates before the document routes 
057         * @see org.kuali.kfs.validation.Validation#validate(java.lang.Object[])
058         */
059        public boolean validate(AttributedDocumentEvent event) {
060            boolean result = true;
061               
062            Document documentForValidation = getDocumentForValidation();
063            
064            LaborExpenseTransferDocumentBase expenseTransferDocument = (LaborExpenseTransferDocumentBase) documentForValidation;
065            
066            List sourceLines = expenseTransferDocument.getSourceAccountingLines();
067            List targetLines = expenseTransferDocument.getTargetAccountingLines();
068    
069            // check to ensure totals of accounting lines in source and target sections match
070            if (!isAccountingLineTotalsMatch(sourceLines, targetLines)) {
071                GlobalVariables.getMessageMap().putError(KFSPropertyConstants.SOURCE_ACCOUNTING_LINES, LaborKeyConstants.ACCOUNTING_LINE_TOTALS_MISMATCH_ERROR);
072                return false;
073            }
074    
075            return result;       
076        }
077    
078        /**
079         * This method checks if the total sum amount of the source accounting line matches the total sum amount of the target
080         * accounting line, return true if the totals match, false otherwise.
081         * 
082         * @param sourceLines
083         * @param targetLines
084         * @return
085         */
086        public boolean isAccountingLineTotalsMatch(List sourceLines, List targetLines) {
087            boolean isValid = true;
088    
089            AccountingLine line = null;
090    
091            // totals for the from and to lines.
092            KualiDecimal sourceLinesAmount = KualiDecimal.ZERO;
093            KualiDecimal targetLinesAmount = KualiDecimal.ZERO;
094    
095            // sum source lines
096            for (Iterator i = sourceLines.iterator(); i.hasNext();) {
097                line = (ExpenseTransferAccountingLine) i.next();
098                sourceLinesAmount = sourceLinesAmount.add(line.getAmount());
099            }
100    
101            // sum target lines
102            for (Iterator i = targetLines.iterator(); i.hasNext();) {
103                line = (ExpenseTransferAccountingLine) i.next();
104                targetLinesAmount = targetLinesAmount.add(line.getAmount());
105            }
106    
107            // if totals don't match, then add error message
108            if (sourceLinesAmount.compareTo(targetLinesAmount) != 0) {
109                isValid = false;
110            }
111    
112            return isValid;
113        }
114           
115        /**
116         * Gets the documentForValidation attribute. 
117         * @return Returns the documentForValidation.
118         */
119        public Document getDocumentForValidation() {
120            return documentForValidation;
121        }
122    
123        /**
124         * Sets the accountingDocumentForValidation attribute value.
125         * @param documentForValidation The documentForValidation to set.
126         */
127        public void setDocumentForValidation(Document documentForValidation) {
128            this.documentForValidation = documentForValidation;
129        }    
130    }