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 org.kuali.kfs.coa.businessobject.OffsetDefinition;
019    import org.kuali.kfs.sys.KFSConstants;
020    import org.kuali.kfs.sys.KFSKeyConstants;
021    import org.kuali.kfs.sys.context.SpringContext;
022    import org.kuali.rice.kns.document.MaintenanceDocument;
023    import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
024    import org.kuali.rice.kns.service.ParameterEvaluator;
025    import org.kuali.rice.kns.service.ParameterService;
026    import org.kuali.rice.kns.util.ObjectUtils;
027    
028    /**
029     * 
030     * This class implements the business rules for {@link OffsetDefinition}
031     */
032    public class OffsetDefinitionRule extends MaintenanceDocumentRuleBase {
033        protected OffsetDefinition oldDefinition;
034        protected OffsetDefinition newDefinition;
035    
036    
037        /**
038         * This method sets the convenience objects like newDefinition and oldDefinition, so you have short and easy handles to the new and
039         * old objects contained in the maintenance document. It also calls the BusinessObjectBase.refresh(), which will attempt to load
040         * all sub-objects from the DB by their primary keys, if available.
041         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#setupConvenienceObjects()
042         */
043        @Override
044        public void setupConvenienceObjects() {
045    
046            // setup oldAccount convenience objects, make sure all possible sub-objects are populated
047            oldDefinition = (OffsetDefinition) super.getOldBo();
048    
049            // setup newAccount convenience objects, make sure all possible sub-objects are populated
050            newDefinition = (OffsetDefinition) super.getNewBo();
051        }
052    
053        /**
054         * This performs rules checks on document save
055         * <ul>
056         * <li>{@link OffsetDefinitionRule#checkDocTypeActiveFinancialObjCode(MaintenanceDocument)}</li>
057         * </ul>
058         * This rule does not fail on business rule failures
059         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
060         */
061        @Override
062        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
063            return checkDocTypeActiveFinancialObjCode(document);
064        }
065    
066        /**
067         * This performs rules checks on document route
068         * <ul>
069         * <li>{@link OffsetDefinitionRule#checkDocTypeActiveFinancialObjCode(MaintenanceDocument)}</li>
070         * </ul>
071         * This rule fails on business rule failures
072         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument)
073         */
074        @Override
075        protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
076            return checkDocTypeActiveFinancialObjCode(document);
077        }
078    
079        /**
080         * 
081         * This checks that the doctype used for this {@link OffsetDefinition} is valid and active
082         * @param document
083         * @return false if the {@link org.kuali.rice.kns.bo.Parameter} evaluation fails and the financial object code is either null or inactive
084         */
085        protected boolean checkDocTypeActiveFinancialObjCode(MaintenanceDocument document) {
086            boolean success = true;
087            ParameterEvaluator evaluator = SpringContext.getBean(ParameterService.class).getParameterEvaluator(OffsetDefinition.class, KFSConstants.ChartApcParms.DOCTYPE_AND_OBJ_CODE_ACTIVE, newDefinition.getFinancialDocumentTypeCode());
088            if (!evaluator.evaluationSucceeds()) {
089                if ((ObjectUtils.isNotNull(newDefinition.getFinancialObject()) && !newDefinition.getFinancialObject().isFinancialObjectActiveCode()) || ObjectUtils.isNull(newDefinition.getFinancialObject())) {
090                    putFieldError("financialObjectCode", KFSKeyConstants.ERROR_DOCUMENT_OFFSETDEFMAINT_INACTIVE_OBJ_CODE_FOR_DOCTYPE, new String[] { newDefinition.getFinancialObjectCode(), evaluator.getParameterValuesForMessage() });
091                    success &= false;
092                }
093    
094            }
095            return success;
096        }
097    }