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.fp.document.validation.impl.AuxiliaryVoucherDocumentRuleConstants.AUXILIARY_VOUCHER_ACCOUNTING_PERIOD_GRACE_PERIOD;
019    import static org.kuali.kfs.sys.KFSConstants.DOCUMENT_ERRORS;
020    import static org.kuali.kfs.sys.KFSKeyConstants.ERROR_DOCUMENT_ACCOUNTING_TWO_PERIODS;
021    
022    import java.sql.Date;
023    import java.sql.Timestamp;
024    
025    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
026    import org.kuali.kfs.coa.service.AccountingPeriodService;
027    import org.kuali.kfs.fp.document.AuxiliaryVoucherDocument;
028    import org.kuali.kfs.sys.document.validation.GenericValidation;
029    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
030    import org.kuali.kfs.sys.service.UniversityDateService;
031    import org.kuali.rice.kns.service.ParameterService;
032    import org.kuali.rice.kns.util.GlobalVariables;
033    
034    /**
035     * Validation for Auxiliary Voucher documents that tests whether the accounting period for the document is within the defined grace period.
036     */
037    public class AuxiliaryVoucherAccountingPeriodWithinGracePeriodValidation extends GenericValidation {
038        private AuxiliaryVoucherDocument auxiliaryVoucherDocumentForValidation;
039        private AccountingPeriodService accountingPeriodService;
040        private UniversityDateService universityDateService;
041        private ParameterService parameterService;
042    
043        /**
044         * A validation to check if the given accounting period is within the "grace period" of the AV doc, defined in JIRA KULRNE-4634.
045         * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
046         */
047        public boolean validate(AttributedDocumentEvent event) {
048            /*
049             * Nota bene: a full summarization of these rules can be found in the comments to KULRNE-4634
050             */
051            // first we need to get the period itself to check these things
052            boolean valid = true;
053            AccountingPeriod acctPeriod = getAccountingPeriodService().getByPeriod(getAuxiliaryVoucherDocumentForValidation().getPostingPeriodCode(), getAuxiliaryVoucherDocumentForValidation().getPostingYear());        
054    
055            Timestamp ts = new Timestamp(new java.util.Date().getTime());
056            AccountingPeriod currPeriod = getAccountingPeriodService().getByDate(new Date(ts.getTime()));
057    
058            if (acctPeriod.getUniversityFiscalYear().equals(getUniversityDateService().getCurrentFiscalYear())) {
059                if (getAccountingPeriodService().compareAccountingPeriodsByDate(acctPeriod, currPeriod) < 0) {
060                    // we've only got problems if the av's accounting period is earlier than now
061    
062                    // are we in the grace period for this accounting period?
063                    if (!getAuxiliaryVoucherDocumentForValidation().calculateIfWithinGracePeriod(new Date(ts.getTime()), acctPeriod)) {
064                        GlobalVariables.getMessageMap().putError(DOCUMENT_ERRORS, ERROR_DOCUMENT_ACCOUNTING_TWO_PERIODS);
065                        return false;
066                    }
067                }
068            }
069            else {
070                // it's not the same fiscal year, so we need to test whether we are currently
071                // in the grace period of the acctPeriod
072                if (!getAuxiliaryVoucherDocumentForValidation().calculateIfWithinGracePeriod(new Date(ts.getTime()), acctPeriod) && getAuxiliaryVoucherDocumentForValidation().isEndOfPreviousFiscalYear(acctPeriod)) {
073                    GlobalVariables.getMessageMap().putError(DOCUMENT_ERRORS, ERROR_DOCUMENT_ACCOUNTING_TWO_PERIODS);
074                    return false;
075                }
076            }
077    
078            return valid;
079        }
080    
081        /**
082         * Gets the auxiliaryVoucherDocumentForValidation attribute. 
083         * @return Returns the auxiliaryVoucherDocumentForValidation.
084         */
085        public AuxiliaryVoucherDocument getAuxiliaryVoucherDocumentForValidation() {
086            return auxiliaryVoucherDocumentForValidation;
087        }
088    
089        /**
090         * Sets the auxiliaryVoucherDocumentForValidation attribute value.
091         * @param auxiliaryVoucherDocumentForValidation The auxiliaryVoucherDocumentForValidation to set.
092         */
093        public void setAuxiliaryVoucherDocumentForValidation(AuxiliaryVoucherDocument accountingDocumentForValidation) {
094            this.auxiliaryVoucherDocumentForValidation = accountingDocumentForValidation;
095        }
096    
097        /**
098         * Gets the accountingPeriodService attribute. 
099         * @return Returns the accountingPeriodService.
100         */
101        public AccountingPeriodService getAccountingPeriodService() {
102            return accountingPeriodService;
103        }
104    
105        /**
106         * Sets the accountingPeriodService attribute value.
107         * @param accountingPeriodService The accountingPeriodService to set.
108         */
109        public void setAccountingPeriodService(AccountingPeriodService accountingPeriodService) {
110            this.accountingPeriodService = accountingPeriodService;
111        }
112    
113        /**
114         * Gets the universityDateService attribute. 
115         * @return Returns the universityDateService.
116         */
117        public UniversityDateService getUniversityDateService() {
118            return universityDateService;
119        }
120    
121        /**
122         * Sets the universityDateService attribute value.
123         * @param universityDateService The universityDateService to set.
124         */
125        public void setUniversityDateService(UniversityDateService universityDateService) {
126            this.universityDateService = universityDateService;
127        }
128    
129        /**
130         * Gets the parameterService attribute. 
131         * @return Returns the parameterService.
132         */
133        public ParameterService getParameterService() {
134            return parameterService;
135        }
136    
137        /**
138         * Sets the parameterService attribute value.
139         * @param parameterService The parameterService to set.
140         */
141        public void setParameterService(ParameterService parameterService) {
142            this.parameterService = parameterService;
143        }
144    }