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.apache.commons.lang.StringUtils;
019    import org.kuali.kfs.coa.businessobject.Account;
020    import org.kuali.kfs.sys.KFSKeyConstants;
021    import org.kuali.rice.kns.document.Document;
022    import org.kuali.rice.kns.document.MaintenanceDocument;
023    import org.kuali.rice.kns.maintenance.Maintainable;
024    import org.kuali.rice.kns.rule.RouteDocumentRule;
025    import org.kuali.rice.kns.rule.SaveDocumentRule;
026    import org.kuali.rice.kns.util.GlobalVariables;
027    
028    /**
029     * This class provides some basic saving and routing rules for Chart documents
030     */
031    public class ChartRuleBase implements RouteDocumentRule, SaveDocumentRule {
032        protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ChartRuleBase.class);
033    
034        /**
035         * This routes the document
036         * 
037         * @see org.kuali.rice.kns.rule.RouteDocumentRule#processRouteDocument(org.kuali.rice.kns.document.Document)
038         */
039        public boolean processRouteDocument(Document document) {
040            MaintenanceDocument maintenanceDocument = (MaintenanceDocument) document;
041    
042            if (isDocumentValidForRouting(maintenanceDocument)) {
043                return processCustomSaveDocumentBusinessRules((MaintenanceDocument) document);
044            }
045            else {
046                return false;
047            }
048        }
049    
050        /**
051         * This saves the document
052         * 
053         * @see org.kuali.rice.kns.rule.SaveDocumentRule#processSaveDocument(org.kuali.rice.kns.document.Document)
054         */
055        public boolean processSaveDocument(Document document) {
056            MaintenanceDocument maintenanceDocument = (MaintenanceDocument) document;
057    
058            if (isDocumentValidForSave(maintenanceDocument)) {
059                return processCustomSaveDocumentBusinessRules((MaintenanceDocument) document);
060            }
061            else {
062                return false;
063            }
064        }
065    
066        /**
067         * This method should be overridden to provide custom rules for processing document saving
068         * 
069         * @param document
070         * @return
071         */
072        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
073            return true;
074        }
075    
076        /**
077         * This method should be overridden to provide custom rules for processing document routing
078         * 
079         * @param document
080         * @return
081         */
082        protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
083            return true;
084        }
085    
086        // Document Validation Helper Methods
087        /**
088         * Performs common validation for Maintenance Document saves.
089         * 
090         * @param maintenanceDocument
091         * @return boolean True if the document is valid for saving, false otherwise.
092         */
093        protected boolean isDocumentValidForSave(MaintenanceDocument maintenanceDocument) {
094            if (null == maintenanceDocument) {
095                return false;
096            }
097    
098            boolean valid = true;
099    
100            // do common checks here
101    
102            return valid;
103        }
104    
105        /**
106         * This method performs common validation for Maintenance Document routes.
107         * 
108         * @param maintenanceDocument
109         * @return boolean True if the document is valid for routing, false otherwise.
110         */
111        protected boolean isDocumentValidForRouting(MaintenanceDocument maintenanceDocument) {
112            boolean success = true;
113    
114            success &= validateDocument((Document) maintenanceDocument);
115            success &= validateMaintenanceDocument(maintenanceDocument);
116    
117            return success;
118        }
119    
120        private boolean validateDocument(Document document) {
121            boolean success = true;
122    
123            String documentHeaderId = document.getDocumentNumber();
124            if (documentHeaderId == null) {
125                GlobalVariables.getMessageMap().putError("documentHeaderId", KFSKeyConstants.ERROR_REQUIRED);
126                success = false;
127            }
128    
129            return success;
130        }
131    
132    
133        private boolean validateMaintenanceDocument(MaintenanceDocument maintenanceDocument) {
134            boolean success = true;
135    
136            GlobalVariables.getMessageMap().addToErrorPath("newMaintainableObject");
137            Maintainable newMaintainable = maintenanceDocument.getNewMaintainableObject();
138            if (newMaintainable == null) {
139                GlobalVariables.getMessageMap().putError("", KFSKeyConstants.ERROR_REQUIRED, "Account");
140                success = false;
141            }
142            else {
143                Account newAccount = (Account) newMaintainable.getBusinessObject();
144                if (StringUtils.isBlank(newAccount.getAccountName())) {
145                    GlobalVariables.getMessageMap().putError("accountNumber", KFSKeyConstants.ERROR_REQUIRED, "Account Number");
146                    success = false;
147                }
148            }
149            GlobalVariables.getMessageMap().removeFromErrorPath("newMaintainableObject");
150    
151            if (maintenanceDocument.isOldBusinessObjectInDocument()) {
152                GlobalVariables.getMessageMap().addToErrorPath("oldMaintainableObject");
153                Maintainable oldMaintainable = maintenanceDocument.getOldMaintainableObject();
154                if (oldMaintainable == null) {
155                    GlobalVariables.getMessageMap().putError("", KFSKeyConstants.ERROR_REQUIRED, "Account");
156                    success = false;
157                }
158                else {
159                    Account oldAccount = (Account) oldMaintainable.getBusinessObject();
160                    if (StringUtils.isBlank(oldAccount.getAccountName())) {
161                        GlobalVariables.getMessageMap().putError("accountNumber", KFSKeyConstants.ERROR_REQUIRED, "Account Number");
162                        success = false;
163                    }
164                }
165                GlobalVariables.getMessageMap().removeFromErrorPath("oldMaintainableObject");
166            }
167    
168            return success;
169        }
170    
171    }