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.module.ar.document.authorization; 017 018 import java.util.HashMap; 019 import java.util.Map; 020 import java.util.Set; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.module.ar.ArAuthorizationConstants; 024 import org.kuali.kfs.module.ar.ArConstants; 025 import org.kuali.kfs.module.ar.businessobject.CashControlDetail; 026 import org.kuali.kfs.module.ar.document.CashControlDocument; 027 import org.kuali.kfs.module.ar.document.PaymentApplicationDocument; 028 import org.kuali.kfs.sys.context.SpringContext; 029 import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument; 030 import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase; 031 import org.kuali.kfs.sys.service.BankService; 032 import org.kuali.rice.kns.document.Document; 033 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument; 034 import org.kuali.kfs.gl.service.EntryService; 035 import org.kuali.kfs.sys.KFSConstants; 036 037 public class CashControlDocumentPresentationController extends FinancialSystemTransactionalDocumentPresentationControllerBase { 038 039 @Override 040 public Set<String> getEditModes(Document document) { 041 Set<String> editModes = super.getEditModes(document); 042 043 CashControlDocument cashControlDocument = (CashControlDocument) document; 044 KualiWorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); 045 046 if ((workflowDocument.stateIsInitiated() || workflowDocument.stateIsSaved()) && !(cashControlDocument.getElectronicPaymentClaims().size() > 0)) { 047 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM); 048 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_DETAILS); 049 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_REF_DOC_NBR); 050 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_BANK_CODE); 051 if (SpringContext.getBean(BankService.class).isBankSpecificationEnabled()) { 052 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_BANK_CODE); 053 } 054 } 055 else { 056 if (StringUtils.isNotBlank(cashControlDocument.getBankCode())) { 057 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_BANK_CODE); 058 } 059 } 060 061 // if the document is in routing, then we have some special rules 062 if (workflowDocument.stateIsEnroute()) { 063 064 // if doc is cash-type then payment app link always shows, once its in routing 065 if (ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) { 066 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_APP_DOC); 067 } 068 // if not cash, then payapp link only shows once the GLPE's have been generated 069 else if (!cashControlDocument.getGeneralLedgerPendingEntries().isEmpty()) { 070 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_APP_DOC); 071 } 072 073 // the person who has the approval request in their Action List 074 // should be able to modify the document 075 if (workflowDocument.isApprovalRequested() && !ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) { 076 // if glpes have not been generated yet the user can change payment medium and generate glpes 077 if (cashControlDocument.getGeneralLedgerPendingEntries().isEmpty()) { 078 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM); 079 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_GENERATE_BUTTON); 080 } 081 Integer totalGLRecordsCreated = cashControlDocument.getGeneralLedgerEntriesPostedCount(); 082 083 if (totalGLRecordsCreated.intValue() > 0) { 084 editModes.remove(ArAuthorizationConstants.CashControlDocumentEditMode.SHOW_GENERATE_BUTTON); 085 editModes.remove(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM); 086 } 087 } 088 if (workflowDocument.isApprovalRequested() && ArConstants.PaymentMediumCode.CASH.equalsIgnoreCase(cashControlDocument.getCustomerPaymentMediumCode())) { 089 // if payment medium cash then the ref doc number can be changed 090 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_PAYMENT_MEDIUM); 091 editModes.add(ArAuthorizationConstants.CashControlDocumentEditMode.EDIT_REF_DOC_NBR); 092 } 093 094 } 095 096 return editModes; 097 } 098 099 @Override 100 public boolean canBlanketApprove(Document document) { 101 return false; 102 } 103 104 @Override 105 public boolean canDisapprove(Document document) { 106 return !hasAtLeastOneAppDocApproved((CashControlDocument) document); 107 } 108 109 @Override 110 public boolean canApprove(Document document) { 111 return hasAllAppDocsApproved((CashControlDocument) document); 112 } 113 114 @Override 115 public boolean canErrorCorrect(FinancialSystemTransactionalDocument document) { 116 return false; 117 } 118 119 @Override 120 public boolean canCancel(Document document) { 121 return !hasAtLeastOneAppDocApproved((CashControlDocument) document); 122 } 123 124 protected boolean containsGLPEs(CashControlDocument document) { 125 return !document.getGeneralLedgerPendingEntries().isEmpty(); 126 } 127 128 /** 129 * This method checks if the CashControlDocument has at least one application document that has been approved 130 * 131 * @param ccDoc the CashControlDocument 132 * @return true if it has at least one application document approved, false otherwise 133 */ 134 protected boolean hasAtLeastOneAppDocApproved(CashControlDocument cashControlDocument) { 135 boolean result = false; 136 // check if there is at least one Application Document approved 137 for (CashControlDetail cashControlDetail : cashControlDocument.getCashControlDetails()) { 138 PaymentApplicationDocument applicationDocument = cashControlDetail.getReferenceFinancialDocument(); 139 KualiWorkflowDocument workflowDocument = applicationDocument.getDocumentHeader().getWorkflowDocument(); 140 141 if (workflowDocument != null && workflowDocument.stateIsApproved()) { 142 result = true; 143 break; 144 } 145 } 146 return result; 147 } 148 149 /** 150 * This method chech if all application document have been approved 151 * 152 * @param cashControlDocument the CashControlDocument 153 * @return true if all application documents have been approved, false otherwise 154 */ 155 protected boolean hasAllAppDocsApproved(CashControlDocument cashControlDocument) { 156 boolean result = true; 157 for (CashControlDetail cashControlDetail : cashControlDocument.getCashControlDetails()) { 158 159 PaymentApplicationDocument applicationDocument = cashControlDetail.getReferenceFinancialDocument(); 160 KualiWorkflowDocument workflowDocument = applicationDocument.getDocumentHeader().getWorkflowDocument(); 161 162 if (!(workflowDocument.stateIsApproved() || workflowDocument.stateIsFinal())) { 163 result = false; 164 break; 165 } 166 167 } 168 return result; 169 } 170 171 }