/* * 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.authorization; import java.util.Set; import org.joda.time.DateTime; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.AmountTotaling; import org.kuali.kfs.sys.document.Correctable; import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument; import org.kuali.kfs.sys.document.LedgerPostingDocument; import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry; import org.kuali.kfs.sys.service.BankService; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.kfs.sys.service.impl.KfsParameterConstants; import org.kuali.rice.core.api.parameter.ParameterEvaluator; import org.kuali.rice.core.api.parameter.ParameterEvaluatorService; import org.kuali.rice.kew.api.WorkflowDocument; import org.kuali.rice.kns.document.authorization.TransactionalDocumentPresentationControllerBase; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.datadictionary.DocumentEntry; import org.kuali.rice.krad.document.Document; import org.springframework.util.ObjectUtils; /** * Base class for all FinancialSystemDocumentPresentationControllers. */ public class FinancialSystemTransactionalDocumentPresentationControllerBase extends TransactionalDocumentPresentationControllerBase implements FinancialSystemTransactionalDocumentPresentationController { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(FinancialSystemTransactionalDocumentPresentationControllerBase.class); private static ParameterEvaluatorService parameterEvaluatorService; private static BankService bankService; private static UniversityDateService universityDateService; private static DataDictionaryService dataDictionaryService; /** * Makes sure that the given document implements error correction, that error correction is turned on for the document in the * data dictionary, and that the document is in a workflow state that allows error correction. * * @see org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationController#canErrorCorrect(org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument) */ @Override public boolean canErrorCorrect(FinancialSystemTransactionalDocument document) { if (!(document instanceof Correctable)) { return false; } if (!this.canCopy(document)) { return false; } DocumentEntry documentEntry = getDataDictionaryService().getDataDictionary().getDocumentEntry(document.getClass().getName()); //FinancialSystemTransactionalDocumentEntry documentEntry = (FinancialSystemTransactionalDocumentEntry) (); if ( !(documentEntry instanceof FinancialSystemTransactionalDocumentEntry) || !((FinancialSystemTransactionalDocumentEntry)documentEntry).getAllowsErrorCorrection()) { return false; } if (document.getFinancialSystemDocumentHeader().getCorrectedByDocumentId() != null) { return false; } if (document.getFinancialSystemDocumentHeader().getFinancialDocumentInErrorNumber() != null) { return false; } WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); if (!isApprovalDateWithinFiscalYear(workflowDocument)) { return false; } return workflowDocument.isApproved(); } protected boolean isApprovalDateWithinFiscalYear(WorkflowDocument workflowDocument) { if ( workflowDocument != null ) { DateTime approvalDate = workflowDocument.getDateApproved(); if ( approvalDate != null ) { // compare approval fiscal year with current fiscal year Integer approvalYear = getUniversityDateService().getFiscalYear(approvalDate.toDate()); Integer currentFiscalYear = getUniversityDateService().getCurrentFiscalYear(); return ObjectUtils.nullSafeEquals(currentFiscalYear, approvalYear); } } return true; } /** * @see org.kuali.rice.krad.document.authorization.DocumentPresentationControllerBase#getDocumentActions(org.kuali.rice.krad.document.Document) */ @Override public Set<String> getDocumentActions(Document document) { Set<String> documentActions = super.getDocumentActions(document); if (document instanceof FinancialSystemTransactionalDocument) { if (canErrorCorrect((FinancialSystemTransactionalDocument) document)) { documentActions.add(KFSConstants.KFS_ACTION_CAN_ERROR_CORRECT); } if (canHaveBankEntry(document)) { documentActions.add(KFSConstants.KFS_ACTION_CAN_EDIT_BANK); } } // CSU 6702 BEGIN // rSmart-jkneal-KFSCSU-199-begin mod for adding accounting period view action if (document instanceof LedgerPostingDocument) { // check account period selection is enabled // PERFORMANCE: cache this setting - move call to service boolean accountingPeriodEnabled = getParameterService().getParameterValueAsBoolean(KFSConstants.CoreModuleNamespaces.KFS, KfsParameterConstants.YEAR_END_ACCOUNTING_PERIOD_PARAMETER_NAMES.DETAIL_PARAMETER_TYPE, KfsParameterConstants.YEAR_END_ACCOUNTING_PERIOD_PARAMETER_NAMES.ENABLE_FISCAL_PERIOD_SELECTION_IND, false); if ( accountingPeriodEnabled) { // check accounting period is enabled for doc type in system parameter String docType = document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName(); // PERFORMANCE: cache this setting - move call to service ParameterEvaluator evaluator = getParameterEvaluatorService().getParameterEvaluator(KFSConstants.CoreModuleNamespaces.KFS, KfsParameterConstants.YEAR_END_ACCOUNTING_PERIOD_PARAMETER_NAMES.DETAIL_PARAMETER_TYPE, KfsParameterConstants.YEAR_END_ACCOUNTING_PERIOD_PARAMETER_NAMES.FISCAL_PERIOD_SELECTION_DOCUMENT_TYPES, docType); if (evaluator.evaluationSucceeds()) { documentActions.add(KFSConstants.YEAR_END_ACCOUNTING_PERIOD_VIEW_DOCUMENT_ACTION); } } } // rSmart-jkneal-KFSCSU-199-end mod // CSU 6702 END return documentActions; } /** * @see org.kuali.rice.krad.document.authorization.TransactionalDocumentPresentationControllerBase#getEditModes(org.kuali.rice.krad.document.Document) */ @Override public Set<String> getEditModes(Document document) { Set<String> editModes = super.getEditModes(document); if (document instanceof AmountTotaling) { editModes.add(KFSConstants.AMOUNT_TOTALING_EDITING_MODE); } if (this.canHaveBankEntry(document)) { editModes.add(KFSConstants.BANK_ENTRY_VIEWABLE_EDITING_MODE); } return editModes; } // check if bank entry should be viewable for the given document protected boolean canHaveBankEntry(Document document) { boolean bankSpecificationEnabled = getBankService().isBankSpecificationEnabled(); if (bankSpecificationEnabled) { String documentTypeName = document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName(); return getBankService().isBankSpecificationEnabledForDocument(document.getClass()); } return false; } protected ParameterEvaluatorService getParameterEvaluatorService() { if (parameterEvaluatorService == null) { parameterEvaluatorService = SpringContext.getBean(ParameterEvaluatorService.class); } return parameterEvaluatorService; } protected BankService getBankService() { if (bankService == null) { bankService = SpringContext.getBean(BankService.class); } return bankService; } public DataDictionaryService getDataDictionaryService() { if (dataDictionaryService == null) { dataDictionaryService = SpringContext.getBean(DataDictionaryService.class); } return dataDictionaryService; } public UniversityDateService getUniversityDateService() { if (universityDateService == null) { universityDateService = SpringContext.getBean(UniversityDateService.class); } return universityDateService; } }