/* * 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.fp.document.authorization; import java.util.Set; import org.apache.commons.collections.CollectionUtils; import org.kuali.kfs.fp.document.DisbursementVoucherConstants; import org.kuali.kfs.fp.document.DisbursementVoucherDocument; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KfsAuthorizationConstants; import org.kuali.kfs.sys.KfsAuthorizationConstants.DisbursementVoucherEditMode; import org.kuali.kfs.sys.document.authorization.AccountingDocumentPresentationControllerBase; import org.kuali.rice.kew.api.WorkflowDocument; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.util.ObjectUtils; public class DisbursementVoucherDocumentPresentationController extends AccountingDocumentPresentationControllerBase { /** * @see org.kuali.rice.krad.document.authorization.DocumentPresentationControllerBase#canBlanketApprove(org.kuali.rice.krad.document.Document) */ @Override public boolean canBlanketApprove(Document document) { return false; } @Override public Set<String> getDocumentActions(Document document) { Set<String> documentActions = super.getDocumentActions(document); documentActions.remove(KFSConstants.YEAR_END_ACCOUNTING_PERIOD_VIEW_DOCUMENT_ACTION); return documentActions; } /** * Returns true if DV is approved (FINAL) and hasn't been extracted. * * @param document * @return */ protected boolean canExtractNow(Document document) { DisbursementVoucherDocument dvDoc = (DisbursementVoucherDocument)document; boolean canExtractNow = true; canExtractNow &= dvDoc.getDocumentHeader().getWorkflowDocument().isApproved(); canExtractNow &= ObjectUtils.isNull(dvDoc.getExtractDate()); // Note: We don't need to check if the Permission "Use Transactional Document DV extractNow" exists and is active, because we have // it set to active by default. If the permission is not defined or is inactive, it means there will be no authorization checking on // using this button and thus everyone can use it. Institutions that don't want to allow anyone to use this button should set the // role assignments for this permission to inactive or just remove the role assignments. return canExtractNow; } /** * @see org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase#getEditModes(org.kuali.rice.krad.document.Document) */ @Override public Set<String> getEditModes(Document document) { Set<String> editModes = super.getEditModes(document); editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.TAX_ENTRY); editModes.add(KfsAuthorizationConstants.TransactionalEditMode.FRN_ENTRY); editModes.add(KfsAuthorizationConstants.TransactionalEditMode.WIRE_ENTRY); editModes.add(KfsAuthorizationConstants.TransactionalEditMode.IMMEDIATE_DISBURSEMENT_ENTRY); addFullEntryEntryMode(document, editModes); addPayeeEditEntryMode(document, editModes); addTravelEntryMode(document, editModes); addPaymentHandlingEntryMode(document, editModes); addVoucherDeadlineEntryMode(document, editModes); addSpecialHandlingChagingEntryMode(document, editModes); addPaymentReasonEditMode(document, editModes); // if DV can be extracted now (based on document status), add the EXTRACT_NOW_ACTION if (canExtractNow(document)) { editModes.add(DisbursementVoucherEditMode.EXTRACT_NOW); } return editModes; } protected void addPaymentReasonEditMode(Document document, Set<String> editModes) { if (isAtNode(document, DisbursementVoucherConstants.RouteLevelNames.CAMPUS) && document.getDocumentHeader().getWorkflowDocument().isApprovalRequested()) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.PAYMENT_REASON_EDIT_MODE); } } protected boolean isAtNode(Document document, String nodeName) { Set<String> currentNodes = document.getDocumentHeader().getWorkflowDocument().getCurrentNodeNames(); return currentNodes.contains(nodeName) ; } protected void addPayeeEditEntryMode(Document document, Set<String> editModes) { WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument.isCompletionRequested())) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.PAYEE_ENTRY); } else if (workflowDocument.isEnroute()) { Set<String> currentRouteLevels = workflowDocument.getCurrentNodeNames(); if (CollectionUtils.isNotEmpty(currentRouteLevels) && (currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.ACCOUNT) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TAX) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.AWARD) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.CAMPUS) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TRAVEL))) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.PAYEE_ENTRY); } } } protected void addFullEntryEntryMode(Document document, Set<String> editModes) { WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument.isCompletionRequested())) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.FULL_ENTRY); } } /** * If at a proper route node, adds the ability to edit payment handling fields * @param document the disbursement voucher document authorization is being sought on * @param editModes the edit modes so far, which can be added to */ protected void addPaymentHandlingEntryMode(Document document, Set<String> editModes) { final WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument.isCompletionRequested())) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.PAYMENT_HANDLING_ENTRY); } final Set<String> currentRouteLevels = workflowDocument.getCurrentNodeNames(); if (CollectionUtils.isNotEmpty(currentRouteLevels) && (currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.ACCOUNT) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.CAMPUS) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TRAVEL) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TAX))) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.PAYMENT_HANDLING_ENTRY); } } /** * If at a proper route node, adds the ability to edit the due date for the voucher * @param document the disbursement voucher document authorization is being sought on * @param editModes the edit modes so far, which can be added to */ protected void addVoucherDeadlineEntryMode(Document document, Set<String> editModes) { final WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument.isCompletionRequested())) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.VOUCHER_DEADLINE_ENTRY); } final Set<String> currentRouteLevels = workflowDocument.getCurrentNodeNames(); if (CollectionUtils.isNotEmpty(currentRouteLevels) && (currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.ACCOUNT) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.CAMPUS) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TAX) || currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TRAVEL))) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.VOUCHER_DEADLINE_ENTRY); } } /** * If at a proper route node, adds the ability to edit the travel information on the disbursement voucher * @param document the disbursement voucher document authorization is being sought on * @param editModes the edit modes so far, which can be added to */ protected void addTravelEntryMode(Document document, Set<String> editModes) { final WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); final Set<String> currentRouteLevels = workflowDocument.getCurrentNodeNames(); if (CollectionUtils.isNotEmpty(currentRouteLevels)) { if (currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.ACCOUNT)) { //FO? } else if (currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.TAX)) { //tax manager? Then only allow this if we're going to route to travel node anyway if (((DisbursementVoucherDocument)document).isTravelReviewRequired()) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.TRAVEL_ENTRY); } } else if (currentRouteLevels.contains(KFSConstants.RouteLevelNames.PAYMENT_METHOD) && ((DisbursementVoucherDocument)document).getDisbVchrPaymentMethodCode().equals(KFSConstants.PaymentSourceConstants.PAYMENT_METHOD_DRAFT)) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.TRAVEL_ENTRY); } else { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.TRAVEL_ENTRY); // we're not FO? Then always add it, as KIM permissions will take it out if we shouldn't have it } } else { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.TRAVEL_ENTRY); // we're not FO? Then always add it, as KIM permissions will take it out if we shouldn't have it } } /** * If at a proper route node, adds the ability to edit whether special handling is needed on the disbursement voucher * @param document the disbursement voucher document authorization is being sought on * @param editModes the edit modes so far, which can be added to */ protected void addSpecialHandlingChagingEntryMode(Document document, Set<String> editModes) { final WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); final Set<String> currentRouteLevels = workflowDocument.getCurrentNodeNames(); if (CollectionUtils.isNotEmpty(currentRouteLevels) && !currentRouteLevels.contains(DisbursementVoucherConstants.RouteLevelNames.PURCHASING)) { editModes.add(KfsAuthorizationConstants.DisbursementVoucherEditMode.SPECIAL_HANDLING_CHANGING_ENTRY); } } }