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.sys.KFSPropertyConstants.SELECTED_ACCOUNTING_PERIOD;
019    import static org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.ERROR_PATH.DOCUMENT_ERROR_PREFIX;
020    
021    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
022    import org.kuali.kfs.fp.document.JournalVoucherDocument;
023    import org.kuali.kfs.sys.KFSConstants;
024    import org.kuali.kfs.sys.KFSKeyConstants;
025    import org.kuali.kfs.sys.KFSPropertyConstants;
026    import org.kuali.kfs.sys.document.validation.GenericValidation;
027    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
028    import org.kuali.rice.kns.datadictionary.AttributeDefinition;
029    import org.kuali.rice.kns.datadictionary.DataDictionaryEntry;
030    import org.kuali.rice.kns.service.DataDictionaryService;
031    import org.kuali.rice.kns.util.GlobalVariables;
032    import org.kuali.rice.kns.util.ObjectUtils;
033    
034    /**
035     * Validation of the accounting period on a Journal Voucher document.
036     */
037    public class JournalVoucherAccountingPeriodValidation extends GenericValidation {
038        private JournalVoucherDocument journalVoucherForValidation;
039        private DataDictionaryService dataDictionaryService;
040    
041        /**
042         * Checks that the accounting period for a journal voucher is present in the persistence store and currently open
043         * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent)
044         */
045        public boolean validate(AttributedDocumentEvent event) {
046            // retrieve from system to make sure it exists
047            String label = getLabelFromDataDictionary(JournalVoucherDocument.class, KFSPropertyConstants.ACCOUNTING_PERIOD);
048            getJournalVoucherForValidation().refreshReferenceObject(KFSPropertyConstants.ACCOUNTING_PERIOD);
049            AccountingPeriod accountingPeriod = getJournalVoucherForValidation().getAccountingPeriod();
050            if (ObjectUtils.isNull(accountingPeriod)) {
051                GlobalVariables.getMessageMap().putError(DOCUMENT_ERROR_PREFIX + SELECTED_ACCOUNTING_PERIOD, KFSKeyConstants.ERROR_EXISTENCE, label);
052                return false;
053            }
054    
055            // make sure it's open for use
056            if (!accountingPeriod.isActive()) {
057                GlobalVariables.getMessageMap().putError(DOCUMENT_ERROR_PREFIX + SELECTED_ACCOUNTING_PERIOD, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNTING_PERIOD_CLOSED);
058                return false;
059            }
060    
061            return true;
062        }
063        
064        /**
065         * Looks up a label from the data dictionary
066         * @param entryClass the class of the attribute to lookup the label for
067         * @param attributeName the attribute to look up the label for
068         * @return the label
069         */
070        protected String getLabelFromDataDictionary(Class entryClass, String attributeName) {
071            DataDictionaryEntry entry = getDataDictionaryService().getDataDictionary().getDictionaryObjectEntry(entryClass.getName());
072            if (entry == null) {
073                throw new IllegalArgumentException("Cannot find DataDictionary entry for " + entryClass);
074            }
075            AttributeDefinition attributeDefinition = entry.getAttributeDefinition(attributeName);
076            if (attributeDefinition == null) {
077                throw new IllegalArgumentException("Cannot find " + entryClass + " attribute with name " + attributeName);
078            }
079            return attributeDefinition.getLabel();
080        }
081    
082        /**
083         * Gets the journalVoucherForValidation attribute. 
084         * @return Returns the journalVoucherForValidation.
085         */
086        public JournalVoucherDocument getJournalVoucherForValidation() {
087            return journalVoucherForValidation;
088        }
089    
090        /**
091         * Sets the journalVoucherForValidation attribute value.
092         * @param journalVoucherForValidation The journalVoucherForValidation to set.
093         */
094        public void setJournalVoucherForValidation(JournalVoucherDocument journalVoucherForValidation) {
095            this.journalVoucherForValidation = journalVoucherForValidation;
096        }
097    
098        /**
099         * Gets the dataDictionaryService attribute. 
100         * @return Returns the dataDictionaryService.
101         */
102        public DataDictionaryService getDataDictionaryService() {
103            return dataDictionaryService;
104        }
105    
106        /**
107         * Sets the dataDictionaryService attribute value.
108         * @param dataDictionaryService The dataDictionaryService to set.
109         */
110        public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
111            this.dataDictionaryService = dataDictionaryService;
112        }
113    }