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 java.util.List;
019    
020    import org.kuali.kfs.coa.businessobject.Account;
021    import org.kuali.kfs.module.ld.LaborKeyConstants;
022    import org.kuali.kfs.module.ld.businessobject.ExpenseTransferSourceAccountingLine;
023    import org.kuali.kfs.module.ld.document.BenefitExpenseTransferDocument;
024    import org.kuali.kfs.module.ld.document.LaborExpenseTransferDocumentBase;
025    import org.kuali.kfs.sys.KFSPropertyConstants;
026    import org.kuali.kfs.sys.businessobject.AccountingLine;
027    import org.kuali.kfs.sys.document.AccountingDocument;
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.document.Document;
031    import org.kuali.rice.kns.util.GlobalVariables;
032    
033    /**
034     * Validates that the given accounting line and source lines are the same
035     */
036    public class BenefitExpenseTransferSameAccountValidation extends GenericValidation {
037        private Document documentForValidation;
038        private AccountingLine accountingLineForValidation;
039        
040        /**
041         * Validates that the given accounting lines in the accounting document have 
042         * the same account as the source accounting lines. 
043         * <strong>Expects an accounting document as the first a parameter</strong>
044         * @see org.kuali.kfs.validation.Validation#validate(java.lang.Object[])
045         */
046        public boolean validate(AttributedDocumentEvent event) {
047            boolean result = true;
048            
049            Document documentForValidation = getDocumentForValidation() ;
050            AccountingLine accountingLine = getAccountingLineForValidation();
051            
052            boolean isTargetLine = accountingLine.isTargetAccountingLine();
053            if (!isTargetLine) {
054                if (!hasSameAccount(documentForValidation, accountingLine)) {
055                    GlobalVariables.getMessageMap().putError(KFSPropertyConstants.TARGET_ACCOUNTING_LINES, LaborKeyConstants.ERROR_ACCOUNT_NOT_SAME);
056                    result = false;
057                }
058            }
059            return result ;    
060        }
061    
062        /**
063         * Determines whether the given accounting line has the same account as the source accounting lines
064         * 
065         * @param document the given document
066         * @param accountingLine the given accounting line
067         * @return true if the given accounting line has the same account as the source accounting lines; otherwise, false
068         */  
069        public boolean hasSameAccount(Document document, AccountingLine accountingLine) {
070            LaborExpenseTransferDocumentBase expenseTransferDocument = (LaborExpenseTransferDocumentBase) document;
071            List<ExpenseTransferSourceAccountingLine> sourceAccountingLines = expenseTransferDocument.getSourceAccountingLines();
072    
073            accountingLine.refreshReferenceObject(KFSPropertyConstants.ACCOUNT);
074            
075            Account cachedAccount = accountingLine.getAccount();
076            for (AccountingLine sourceAccountingLine : sourceAccountingLines) {
077                Account account = sourceAccountingLine.getAccount();
078    
079                // account number was not retrieved correctly, so the two statements are used to populate the fields manually
080                account.setChartOfAccountsCode(sourceAccountingLine.getChartOfAccountsCode());
081                account.setAccountNumber(sourceAccountingLine.getAccountNumber());
082    
083                if (!account.equals(cachedAccount)) {
084                    return false;
085                }
086            }
087    
088            return true;
089         }
090    
091        /**
092         * Sets the accountingDocumentForValidation attribute value.
093         * @param accountingDocumentForValidation The accountingDocumentForValidation to set.
094         */
095        public void setDocumentForValidation(Document documentForValidation) {
096            this.documentForValidation = documentForValidation;
097        }
098        
099        /**
100         * Gets the DocumentForValidation attribute. 
101         * @return Returns the documentForValidation.
102         */
103        public Document getDocumentForValidation() {
104            return documentForValidation;
105        }
106    
107        /**
108         * Gets the accountingLineForValidation attribute. 
109         * @return Returns the accountingLineForValidation.
110         */
111        public AccountingLine getAccountingLineForValidation() {
112            return accountingLineForValidation;
113        }    
114        
115        /**
116         * Sets the accountingLineForValidation attribute value.
117         * @param accountingDocumentForValidation The accountingDocumentForValidation to set.
118         */
119        public void setAccountingLineForValidation(AccountingLine accountingLineForValidation) {
120            this.accountingLineForValidation = accountingLineForValidation;
121        }
122    }