/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.document.validation.impl; import java.util.Map; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase; import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry; import org.kuali.kfs.sys.document.validation.AccountingRuleEngineRule; import org.kuali.kfs.sys.document.validation.Validation; import org.kuali.kfs.sys.document.validation.event.AttributedAddAdHocRoutePersonEvent; import org.kuali.kfs.sys.document.validation.event.AttributedAddAdHocRouteWorkgroupEvent; import org.kuali.kfs.sys.document.validation.event.AttributedAddNoteEvent; import org.kuali.kfs.sys.document.validation.event.AttributedApproveDocumentEvent; import org.kuali.kfs.sys.document.validation.event.AttributedBlanketApproveDocumentEvent; import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; import org.kuali.kfs.sys.document.validation.event.AttributedRouteDocumentEvent; import org.kuali.kfs.sys.document.validation.event.AttributedSaveDocumentEvent; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.bo.AdHocRoutePerson; import org.kuali.rice.krad.bo.AdHocRouteWorkgroup; import org.kuali.rice.krad.bo.Note; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.document.TransactionalDocument; import org.kuali.rice.kns.rules.DocumentRuleBase; import org.kuali.rice.krad.rules.rule.event.ApproveDocumentEvent; import org.kuali.rice.krad.rules.rule.event.BlanketApproveDocumentEvent; /** * A rule that uses the accounting rule engine to perform rule validations. */ public class AccountingRuleEngineRuleBase extends DocumentRuleBase implements AccountingRuleEngineRule { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountingRuleEngineRuleBase.class); /** * Constructs a AccountingRuleEngineRuleBase.java. */ public AccountingRuleEngineRuleBase() { super(); } /** * @see org.kuali.kfs.sys.document.validation.AccountingRuleEngineRule#validateForEvent(org.kuali.rice.krad.rule.event.KualiDocumentEvent) */ public boolean validateForEvent(AttributedDocumentEvent event) { final FinancialSystemTransactionalDocumentEntry documentEntry = getDataDictionaryEntryForDocument((TransactionalDocument)event.getDocument()); final Map<Class, String> validationMap = documentEntry.getValidationMap(); if (validationMap == null || !validationMap.containsKey(event.getClass())) { return true; // no validation? just return true } else { final String beanName = validationMap.get(event.getClass()); Validation validationBean = SpringContext.getBean(Validation.class, beanName); final boolean valid = validationBean.stageValidation(event); return valid; } } /** * Returns the validation from the data dictionary for the document in the event * @param document the document to look up a data dictionary entry for * @return a document entry */ protected FinancialSystemTransactionalDocumentEntry getDataDictionaryEntryForDocument(TransactionalDocument document) { return (FinancialSystemTransactionalDocumentEntry)SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getDictionaryObjectEntry(document.getClass().getName()); } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomAddAdHocRoutePersonBusinessRules(org.kuali.rice.krad.document.Document, org.kuali.rice.krad.bo.AdHocRoutePerson) */ @Override protected boolean processCustomAddAdHocRoutePersonBusinessRules(Document document, AdHocRoutePerson person) { boolean result = super.processCustomAddAdHocRoutePersonBusinessRules(document, person); result &= validateForEvent(new AttributedAddAdHocRoutePersonEvent(document, person)); return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomAddAdHocRouteWorkgroupBusinessRules(org.kuali.rice.krad.document.Document, org.kuali.rice.krad.bo.AdHocRouteWorkgroup) */ @Override protected boolean processCustomAddAdHocRouteWorkgroupBusinessRules(Document document, AdHocRouteWorkgroup workgroup) { boolean result = super.processCustomAddAdHocRouteWorkgroupBusinessRules(document, workgroup); result &= validateForEvent(new AttributedAddAdHocRouteWorkgroupEvent(document, workgroup)); return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomAddNoteBusinessRules(org.kuali.rice.krad.document.Document, org.kuali.rice.krad.bo.Note) */ @Override protected boolean processCustomAddNoteBusinessRules(Document document, Note note) { boolean result = super.processCustomAddNoteBusinessRules(document, note); result &= validateForEvent(new AttributedAddNoteEvent(document, note)); return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomApproveDocumentBusinessRules(org.kuali.rice.krad.rule.event.ApproveDocumentEvent) */ @Override protected boolean processCustomApproveDocumentBusinessRules(ApproveDocumentEvent approveEvent) { boolean result = super.processCustomApproveDocumentBusinessRules(approveEvent); if (approveEvent instanceof BlanketApproveDocumentEvent) { result &= validateForEvent(new AttributedBlanketApproveDocumentEvent(approveEvent.getErrorPathPrefix(), approveEvent.getDocument())); } else { result &= validateForEvent(new AttributedApproveDocumentEvent(approveEvent.getErrorPathPrefix(), approveEvent.getDocument())); } return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.krad.document.Document) */ @Override protected boolean processCustomRouteDocumentBusinessRules(Document document) { boolean result = super.processCustomRouteDocumentBusinessRules(document); AttributedRouteDocumentEvent event = new AttributedRouteDocumentEvent(document); result &= validateForEvent(event); return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.krad.document.Document) */ @Override protected boolean processCustomSaveDocumentBusinessRules(Document document) { boolean result = super.processCustomSaveDocumentBusinessRules(document); result &= validateForEvent(new AttributedSaveDocumentEvent(document)); return result; } /** * @see org.kuali.rice.krad.rules.DocumentRuleBase#isDocumentAttributesValid(org.kuali.rice.krad.document.Document, boolean) */ @Override public boolean isDocumentAttributesValid(Document document, boolean validateRequired) { FinancialSystemTransactionalDocumentEntry documentEntry = getDataDictionaryEntryForDocument((TransactionalDocument)document); Integer maxDictionaryValidationDepth = documentEntry.getMaxDictionaryValidationDepth(); if(maxDictionaryValidationDepth != null) { this.setMaxDictionaryValidationDepth(maxDictionaryValidationDepth); } //refresh the document's reference objects.. document.refreshNonUpdateableReferences(); //refresh GLPE nonupdateable business object references.... if (document instanceof GeneralLedgerPostingDocumentBase) { GeneralLedgerPostingDocumentBase glpeDocument = (GeneralLedgerPostingDocumentBase) document; for (GeneralLedgerPendingEntry glpe : glpeDocument.getGeneralLedgerPendingEntries()) { glpe.refreshReferenceObject(KFSPropertyConstants.FINANCIAL_OBJECT); } } return super.isDocumentAttributesValid(document, validateRequired); } }