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 org.kuali.kfs.fp.document.AdvanceDepositDocument;
019    import org.kuali.kfs.sys.KFSConstants;
020    import org.kuali.kfs.sys.KFSKeyConstants;
021    import org.kuali.kfs.sys.businessobject.AccountingLine;
022    import org.kuali.kfs.sys.document.validation.GenericValidation;
023    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
024    import org.kuali.kfs.sys.service.ElectronicPaymentClaimingService;
025    import org.kuali.rice.kns.util.GlobalVariables;
026    
027    /**
028     * Validates that if the given advance deposit document has any electronic fund accounting lines,
029     * that all accounting lines on the document go to the electronic funds account
030     */
031    public class AdvanceDepositIfAnyElectronicFundAccountingLineAllElectronicFundValidation extends GenericValidation {
032        private AdvanceDepositDocument advanceDepositDocumentForValidation;
033        private ElectronicPaymentClaimingService electronicPaymentClaimingService;
034    
035        /**
036         * Validates the advance deposit document, that if it has one eft accounting line, all accounting lines represent electronic funds
037         * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
038         */
039        public boolean validate(AttributedDocumentEvent event) {
040            boolean result = true; // assume that the document works just fine
041            if (anyAccountingLinesRepresentElectronicPayments() && !allAccountingLinesRepresentElectronicPayments()) {
042                GlobalVariables.getMessageMap().putError(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.AdvanceDeposit.ERROR_DOCUMENT_ADVANCE_DEPOSIT_INCORRECT_ELECTRONIC_PAYMENT_STATE, new String[] {});
043                result = false; // oh you document! you've disappointed me!
044            }
045            return result;
046        }
047        
048        /**
049         * Determines if any of the accounting lines on the document represent electronic payments
050         * @return true if the document contains an electronic transfer accounting line, false if none do
051         */
052        protected boolean anyAccountingLinesRepresentElectronicPayments() {
053            for (Object accountingLineAsObject : getAdvanceDepositDocumentForValidation().getSourceAccountingLines()) {
054                final AccountingLine accountingLine = (AccountingLine)accountingLineAsObject;
055                if (getElectronicPaymentClaimingService().representsElectronicFundAccount(accountingLine)) {
056                    return true;
057                }
058            }
059            return false;
060        }
061        
062        /**
063         * Determines if all of the accounting lines on the document represent electronic payments
064         * @return true if the document contains all electronic transfer accounting line, false if any accounting line does not represent an electronic payment
065         */
066        protected boolean allAccountingLinesRepresentElectronicPayments() {
067            for (Object accountingLineAsObject : getAdvanceDepositDocumentForValidation().getSourceAccountingLines()) {
068                final AccountingLine accountingLine = (AccountingLine)accountingLineAsObject;
069                if (!getElectronicPaymentClaimingService().representsElectronicFundAccount(accountingLine)) {
070                    return false;
071                }
072            }
073            return true;
074        }
075    
076        /**
077         * Gets the advanceDepositDocumentForValidation attribute. 
078         * @return Returns the advanceDepositDocumentForValidation.
079         */
080        public AdvanceDepositDocument getAdvanceDepositDocumentForValidation() {
081            return advanceDepositDocumentForValidation;
082        }
083    
084        /**
085         * Sets the advanceDepositDocumentForValidation attribute value.
086         * @param advanceDepositDocumentForValidation The advanceDepositDocumentForValidation to set.
087         */
088        public void setAdvanceDepositDocumentForValidation(AdvanceDepositDocument documentForValidation) {
089            this.advanceDepositDocumentForValidation = documentForValidation;
090        }
091    
092        /**
093         * Gets the electronicPaymentClaimingService attribute. 
094         * @return Returns the electronicPaymentClaimingService.
095         */
096        public ElectronicPaymentClaimingService getElectronicPaymentClaimingService() {
097            return electronicPaymentClaimingService;
098        }
099    
100        /**
101         * Sets the electronicPaymentClaimingService attribute value.
102         * @param electronicPaymentClaimingService The electronicPaymentClaimingService to set.
103         */
104        public void setElectronicPaymentClaimingService(ElectronicPaymentClaimingService electronicPaymentClaimingService) {
105            this.electronicPaymentClaimingService = electronicPaymentClaimingService;
106        }
107    }