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.coa.document.validation.impl;
017    
018    import java.util.Iterator;
019    import java.util.List;
020    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
021    import org.kuali.kfs.sys.KFSKeyConstants;
022    import org.kuali.kfs.sys.businessobject.SystemOptions;
023    import org.kuali.kfs.sys.context.SpringContext;
024    import org.kuali.rice.kns.document.MaintenanceDocument;
025    import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
026    import org.kuali.rice.kns.service.KeyValuesService;
027    
028    /**
029     * Business rule(s) applicable to AccountingPeriodMaintence documents.
030     */
031    public class AccountingPeriodRule extends MaintenanceDocumentRuleBase {
032    
033        protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountingPeriodRule.class);
034    
035        protected static final String GENERAL_FUND_CD = "GF";
036        protected static final String RESTRICTED_FUND_CD = "RF";
037        protected static final String ENDOWMENT_FUND_CD = "EN";
038        protected static final String PLANT_FUND_CD = "PF";
039    
040        protected static final String RESTRICTED_CD_RESTRICTED = "R";
041        protected static final String RESTRICTED_CD_UNRESTRICTED = "U";
042        protected static final String RESTRICTED_CD_TEMPORARILY_RESTRICTED = "T";
043        protected static final String SUB_FUND_GROUP_MEDICAL_PRACTICE_FUNDS = "MPRACT";
044        protected static final String BUDGET_RECORDING_LEVEL_MIXED = "M";
045    
046        protected AccountingPeriod oldAccountingPeriod;
047        protected AccountingPeriod newAccountingPeriod;
048    
049        public AccountingPeriodRule() {
050        }
051    
052        /**
053         * This method sets the convenience objects like newAccount and oldAccount, so you have short and easy handles to the new and
054         * old objects contained in the maintenance document. It also calls the BusinessObjectBase.refresh(), which will attempt to load
055         * all sub-objects from the DB by their primary keys, if available.
056         * 
057         * @param document - the maintenanceDocument being evaluated
058         */
059        public void setupConvenienceObjects() {
060    
061            // setup oldAccountingPeriod convenience objects, make sure all possible sub-objects are populated
062            oldAccountingPeriod = (AccountingPeriod) super.getOldBo();
063    
064            // setup newAccountingPeriod convenience objects, make sure all possible sub-objects are populated
065            newAccountingPeriod = (AccountingPeriod) super.getNewBo();
066        }
067    
068        /**
069         * This method checks the following rules: calls processCustomRouteDocumentBusinessRules but does not fail if any of them fail
070         * (this only happens on routing)
071         * 
072         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
073         */
074        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
075    
076            LOG.info("processCustomSaveDocumentBusinessRules called");
077            // call the route rules to report all of the messages, but ignore the result
078            processCustomRouteDocumentBusinessRules(document);
079    
080            // Save always succeeds, even if there are business rule failures
081            return true;
082        }
083    
084        /**
085         * This method checks to see if the fiscal year for any of {@link Options} is the same as the {@link AccountingPeriod}'s fiscal
086         * year
087         * 
088         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
089         */
090        protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
091    
092            LOG.info("processCustomRouteDocumentBusinessRules called");
093            setupConvenienceObjects();
094    
095            Boolean foundYear = false;
096    
097            KeyValuesService boService = SpringContext.getBean(KeyValuesService.class);
098            List optionList = (List) boService.findAll(SystemOptions.class);
099            if ( newAccountingPeriod.getUniversityFiscalYear() != null) {
100                for (Iterator iter = optionList.iterator(); iter.hasNext();) {
101                    SystemOptions options = (SystemOptions) iter.next();
102                    if (options.getUniversityFiscalYear().compareTo(newAccountingPeriod.getUniversityFiscalYear()) == 0) {
103                        foundYear = true;
104                        break;
105                    }
106                }
107            }
108            if (!foundYear) {
109                // display an error
110                putFieldError("universityFiscalYear", KFSKeyConstants.ERROR_DOCUMENT_FISCAL_PERIOD_YEAR_DOESNT_EXIST);
111            }
112    
113            return foundYear;
114        }
115    
116    }