/*
* 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.module.ar.document.authorization;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.ar.ArAuthorizationConstants;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.businessobject.CashControlDetail;
import org.kuali.kfs.module.ar.document.CashControlDocument;
import org.kuali.kfs.module.ar.document.PaymentApplicationDocument;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument;
import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase;
import org.kuali.kfs.sys.service.BankService;
import org.kuali.rice.kew.api.WorkflowDocument;
import org.kuali.rice.krad.document.Document;
/**
* Cash Control Document presentation Controller.
*/
public class CashControlDocumentPresentationController extends FinancialSystemTransactionalDocumentPresentationControllerBase {
/**
* @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);
CashControlDocument cashControlDocument = (CashControlDocument) document;
WorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument();
if ((workflowDocument.isInitiated() || workflowDocument.isSaved() || workflowDocument.isCompletionRequested()) && !(cashControlDocument.getElectronicPaymentClaims().size() > 0)) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM);
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_DETAILS);
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_REF_DOC_NBR);
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_BANK_CODE);
if (SpringContext.getBean(BankService.class).isBankSpecificationEnabled()) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_BANK_CODE);
}
}
else {
if (StringUtils.isNotBlank(cashControlDocument.getBankCode())) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_BANK_CODE);
}
}
// if the document is in routing, then we have some special rules
if (workflowDocument.isEnroute()) {
// if doc is cash-type then payment app link always shows, once its in routing
if (ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_APP_DOC);
}
// if not cash, then payapp link only shows once the GLPE's have been generated
else if (!cashControlDocument.getGeneralLedgerPendingEntries().isEmpty()) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_APP_DOC);
}
// the person who has the approval request in their Action List
// should be able to modify the document
if (workflowDocument.isApprovalRequested() && !ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) {
// if glpes have not been generated yet the user can change payment medium and generate glpes
if (cashControlDocument.getGeneralLedgerPendingEntries().isEmpty()) {
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM);
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_GENERATE_BUTTON);
}
Integer totalGLRecordsCreated = cashControlDocument.getGeneralLedgerEntriesPostedCount();
if (totalGLRecordsCreated.intValue() > 0) {
editModes.remove(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_GENERATE_BUTTON);
editModes.remove(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM);
}
}
if (workflowDocument.isApprovalRequested() && ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) {
// if payment medium cash then the ref doc number can be changed
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM);
editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_REF_DOC_NBR);
}
}
return editModes;
}
/**
* @see org.kuali.rice.krad.document.authorization.DocumentPresentationControllerBase#canBlanketApprove(org.kuali.rice.krad.document.Document)
*/
@Override
public boolean canBlanketApprove(Document document) {
return false;
}
/**
* @see org.kuali.rice.krad.document.authorization.DocumentPresentationControllerBase#canDisapprove(org.kuali.rice.krad.document.Document)
*/
@Override
public boolean canDisapprove(Document document) {
return !hasAtLeastOneAppDocApproved((CashControlDocument) document);
}
/**
* @see org.kuali.rice.krad.document.authorization.DocumentPresentationControllerBase#canApprove(org.kuali.rice.krad.document.Document)
*/
@Override
public boolean canApprove(Document document) {
return hasAllAppDocsApproved((CashControlDocument) document);
}
/**
* @see org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase#canErrorCorrect(org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument)
*/
@Override
public boolean canErrorCorrect(FinancialSystemTransactionalDocument document) {
return false;
}
/**
* @see org.kuali.rice.krad.document.DocumentPresentationControllerBase#canCancel(org.kuali.rice.krad.document.Document)
*/
@Override
public boolean canCancel(Document document) {
return !hasAtLeastOneAppDocApproved((CashControlDocument) document);
}
/**
* @param document
* @return
*/
protected boolean containsGLPEs(CashControlDocument document) {
return !document.getGeneralLedgerPendingEntries().isEmpty();
}
/**
* This method checks if the CashControlDocument has at least one application document that has been approved
*
* @param ccDoc the CashControlDocument
* @return true if it has at least one application document approved, false otherwise
*/
protected boolean hasAtLeastOneAppDocApproved(CashControlDocument cashControlDocument) {
boolean result = false;
// check if there is at least one Application Document approved
for (CashControlDetail cashControlDetail : cashControlDocument.getCashControlDetails()) {
PaymentApplicationDocument applicationDocument = cashControlDetail.getReferenceFinancialDocument();
WorkflowDocument workflowDocument = applicationDocument.getDocumentHeader().getWorkflowDocument();
if (workflowDocument != null && workflowDocument.isApproved()) {
result = true;
break;
}
}
return result;
}
/**
* This method chech if all application document have been approved
*
* @param cashControlDocument the CashControlDocument
* @return true if all application documents have been approved, false otherwise
*/
protected boolean hasAllAppDocsApproved(CashControlDocument cashControlDocument) {
boolean result = true;
for (CashControlDetail cashControlDetail : cashControlDocument.getCashControlDetails()) {
PaymentApplicationDocument applicationDocument = cashControlDetail.getReferenceFinancialDocument();
WorkflowDocument workflowDocument = applicationDocument.getDocumentHeader().getWorkflowDocument();
if (!(workflowDocument.isApproved() || workflowDocument.isFinal())) {
result = false;
break;
}
}
return result;
}
}