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.Set; 019 020 import org.apache.commons.lang.StringUtils; 021 import org.kuali.kfs.module.ar.ArAuthorizationConstants; 022 import org.kuali.kfs.module.ar.ArConstants; 023 import org.kuali.kfs.module.ar.ArPropertyConstants; 024 import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail; 025 import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument; 026 import org.kuali.kfs.module.ar.document.service.InvoicePaidAppliedService; 027 import org.kuali.kfs.sys.context.SpringContext; 028 import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument; 029 import org.kuali.kfs.sys.document.authorization.FinancialSystemTransactionalDocumentPresentationControllerBase; 030 import org.kuali.rice.kns.document.Document; 031 import org.kuali.rice.kns.service.ParameterService; 032 import org.kuali.rice.kns.util.ObjectUtils; 033 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument; 034 035 public class CustomerInvoiceDocumentPresentationController extends FinancialSystemTransactionalDocumentPresentationControllerBase { 036 037 @Override 038 public Set<String> getEditModes(Document document) { 039 Set<String> editModes = super.getEditModes(document); 040 041 ParameterService paramService = SpringContext.getBean(ParameterService.class); 042 String receivableOffsetOption = paramService.getParameterValue(CustomerInvoiceDocument.class, ArConstants.GLPE_RECEIVABLE_OFFSET_GENERATION_METHOD); 043 044 if( ArConstants.GLPE_RECEIVABLE_OFFSET_GENERATION_METHOD_FAU.equals( receivableOffsetOption ) ){ 045 editModes.add(ArAuthorizationConstants.CustomerInvoiceDocumentEditMode.SHOW_RECEIVABLE_FAU); 046 } 047 048 KualiWorkflowDocument workflowDocument = document.getDocumentHeader().getWorkflowDocument(); 049 if (ObjectUtils.isNotNull(workflowDocument) && (workflowDocument.stateIsApproved() || workflowDocument.stateIsProcessed() || workflowDocument.stateIsFinal())) { 050 editModes.add(ArAuthorizationConstants.CustomerInvoiceDocumentEditMode.DISPLAY_PRINT_BUTTON); 051 } 052 else { 053 if (editModes.contains(ArAuthorizationConstants.CustomerInvoiceDocumentEditMode.DISPLAY_PRINT_BUTTON)) { 054 editModes.remove(ArAuthorizationConstants.CustomerInvoiceDocumentEditMode.DISPLAY_PRINT_BUTTON); 055 } 056 } 057 058 if (ObjectUtils.isNotNull(workflowDocument) && workflowDocument.stateIsEnroute()) { 059 editModes.add(ArPropertyConstants.CustomerInvoiceDocumentFields.INVOICE_ITEM_DESCRIPTION); 060 } 061 062 return editModes; 063 } 064 065 @Override 066 public boolean canCopy(Document document) { 067 boolean copyable = true; 068 CustomerInvoiceDocument ciDoc = (CustomerInvoiceDocument)document; 069 070 // Confirm doc is in a saved and copyable state. 071 copyable &= !ciDoc.getDocumentHeader().getWorkflowDocument().stateIsInitiated(); 072 copyable &= !ciDoc.getDocumentHeader().getWorkflowDocument().stateIsCanceled(); 073 074 // Confirm doc is reversible. 075 copyable &= !((CustomerInvoiceDocument)document).isInvoiceReversal(); 076 return copyable; 077 } 078 079 @Override 080 public boolean canErrorCorrect(FinancialSystemTransactionalDocument document) { 081 // check if this document has been error corrected 082 if (StringUtils.isNotBlank(document.getDocumentHeader().getCorrectedByDocumentId())) { 083 return false; 084 } 085 086 if(((CustomerInvoiceDocument)document).isInvoiceReversal()){ 087 return false; 088 } else { 089 // a normal invoice can only be error corrected if document is in a final state 090 // and no amounts have been applied (excluding discounts) 091 return isDocFinalWithNoAppliedAmountsExceptDiscounts((CustomerInvoiceDocument) document); 092 } 093 } 094 095 // if this isnt self-explanatory, I dont know what is 096 protected boolean isDocFinalWithNoAppliedAmountsExceptDiscounts(CustomerInvoiceDocument document) { 097 boolean isFinal = document.getDocumentHeader().getWorkflowDocument().stateIsFinal(); 098 099 InvoicePaidAppliedService<CustomerInvoiceDetail> paidAppliedService = SpringContext.getBean(InvoicePaidAppliedService.class); 100 boolean hasAppliedAmountsExcludingDiscounts = paidAppliedService.doesInvoiceHaveAppliedAmounts(document); 101 102 return isFinal && !hasAppliedAmountsExcludingDiscounts; 103 } 104 105 }