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.Map; 019 import java.util.Set; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.kfs.fp.document.authorization.FinancialProcessingAccountingLineAuthorizer; 023 import org.kuali.kfs.module.ar.ArConstants; 024 import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail; 025 import org.kuali.kfs.sys.businessobject.AccountingLine; 026 import org.kuali.kfs.sys.context.SpringContext; 027 import org.kuali.kfs.sys.document.AccountingDocument; 028 import org.kuali.kfs.sys.document.web.AccountingLineRenderingContext; 029 import org.kuali.kfs.sys.document.web.AccountingLineViewAction; 030 import org.kuali.rice.kim.bo.Person; 031 import org.kuali.rice.kns.document.Document; 032 import org.kuali.rice.kns.service.KualiConfigurationService; 033 import org.kuali.rice.kns.service.ParameterService; 034 035 public class CustomerInvoiceDocumentSourceLinesAuthorizer extends FinancialProcessingAccountingLineAuthorizer { 036 037 private static final String RECALCULATE_METHOD_NAME = "recalculateSourceLine"; 038 private static final String RECALCULATE_LABEL = "Recalculate Source Accounting Line"; 039 private static final String RECALCULATE_BUTTON_IMAGE = "tinybutton-recalculate.gif"; 040 private static final String DISCOUNT_METHOD_NAME = "discountSourceLine"; 041 private static final String DISCOUNT_LABEL = "Discount a Source Accounting Line"; 042 private static final String DISCOUNT_BUTTON_IMAGE = "tinybutton-discount.gif"; 043 private static final String REFRESH_METHOD_NAME = "refreshNewSourceLine"; 044 private static final String REFRESH_LABEL = "Refresh New Source Line"; 045 private static final String REFRESH_BUTTON_IMAGE = "tinybutton-refresh.gif"; 046 047 /** 048 * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getActionMap(org.kuali.kfs.sys.businessobject.AccountingLine, 049 * java.lang.String, java.lang.Integer, java.lang.String) 050 */ 051 @Override 052 protected Map<String, AccountingLineViewAction> getActionMap(AccountingLineRenderingContext accountingLineRenderingContext, String accountingLinePropertyName, Integer accountingLineIndex, String groupTitle) { 053 Map<String, AccountingLineViewAction> actionMap = super.getActionMap(accountingLineRenderingContext, accountingLinePropertyName, accountingLineIndex, groupTitle); 054 055 CustomerInvoiceDetail invoiceLine = (CustomerInvoiceDetail) accountingLineRenderingContext.getAccountingLine(); 056 057 // get the images base directory 058 String kfsImagesPath = SpringContext.getBean(KualiConfigurationService.class).getPropertyString("externalizable.images.url"); 059 060 // show the Refresh button on the New Line Actions 061 if (isNewLine(accountingLineIndex)) { 062 actionMap.put(REFRESH_METHOD_NAME, new AccountingLineViewAction(REFRESH_METHOD_NAME, REFRESH_LABEL, kfsImagesPath + REFRESH_BUTTON_IMAGE)); 063 } 064 else { 065 // always add the Recalculate button if its in edit mode 066 String groupName = super.getActionInfixForExtantAccountingLine(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName); 067 String methodName = methodName(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName, accountingLineIndex, RECALCULATE_METHOD_NAME); 068 actionMap.put(methodName, new AccountingLineViewAction(methodName, RECALCULATE_LABEL, kfsImagesPath + RECALCULATE_BUTTON_IMAGE)); 069 070 // only add the Discount button if its not a Discount Line or a Discount Line Parent 071 if (showDiscountButton(invoiceLine)) { 072 methodName = methodName(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName, accountingLineIndex, DISCOUNT_METHOD_NAME); 073 actionMap.put(methodName, new AccountingLineViewAction(methodName, DISCOUNT_LABEL, kfsImagesPath + DISCOUNT_BUTTON_IMAGE)); 074 } 075 } 076 077 return actionMap; 078 } 079 080 private boolean showDiscountButton(CustomerInvoiceDetail invoiceLine) { 081 return (!invoiceLine.isDiscountLine() && !invoiceLine.isDiscountLineParent()); 082 } 083 084 private String methodName(AccountingLine line, String accountingLineProperty, Integer accountingLineIndex, String methodName) { 085 String infix = super.getActionInfixForExtantAccountingLine(line, accountingLineProperty); 086 return methodName + ".line" + accountingLineIndex.toString() + ".anchoraccounting" + infix + "Anchor"; 087 } 088 089 private boolean isNewLine(Integer accountingLineIndex) { 090 return (accountingLineIndex == null || accountingLineIndex.intValue() < 0); 091 } 092 093 @Override 094 public Set<String> getUnviewableBlocks(AccountingDocument accountingDocument, AccountingLine accountingLine, boolean newLine, Person currentUser) { 095 Set<String> blocks = super.getUnviewableBlocks(accountingDocument, accountingLine, newLine, currentUser); 096 ParameterService parameterService = SpringContext.getBean(ParameterService.class); 097 boolean enableTax = parameterService.getIndicatorParameter("KFS-AR", "Document", ArConstants.ENABLE_SALES_TAX_IND); 098 if (!enableTax) { 099 blocks.add("invoiceItemTaxAmount"); 100 blocks.add("taxableIndicator"); 101 } 102 return blocks; 103 } 104 105 /** 106 * Overridden to make: 107 * 1. chart and account number read only for discount lines 108 * 2. invoice item description and amount editable for recurring invoices 109 * 110 * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#determineFieldModifyability(org.kuali.kfs.sys.document.AccountingDocument, 111 * org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.document.web.AccountingLineViewField, java.util.Map) 112 */ 113 @Override 114 public boolean determineEditPermissionOnField(AccountingDocument accountingDocument, AccountingLine accountingLine, String accountingLineCollectionProperty, String fieldName, boolean editablePage) { 115 boolean canModify = super.determineEditPermissionOnField(accountingDocument, accountingLine, accountingLineCollectionProperty, fieldName, editablePage); 116 117 if (canModify) { 118 boolean discountLineFlag = ((CustomerInvoiceDetail)accountingLine).isDiscountLine(); 119 if (discountLineFlag) { 120 if (StringUtils.equals(fieldName, getChartPropertyName()) || StringUtils.equals(fieldName, getAccountNumberPropertyName())) 121 canModify = false; 122 } 123 } 124 125 return canModify; 126 } 127 128 /** 129 * @return the property name of the chart field, which will be set to read only for discount lines 130 */ 131 protected String getChartPropertyName() { 132 return "chartOfAccountsCode"; 133 } 134 135 /** 136 * @return the property name of the account number field, which will be set to read only for discount lines 137 */ 138 protected String getAccountNumberPropertyName() { 139 return "accountNumber"; 140 } 141 142 /** 143 * @return the property name of the invoice item description field, which will be set editable for recurring invoices 144 */ 145 protected String getItemDescriptionPropertyName() { 146 return "invoiceItemDescription"; 147 } 148 149 /** 150 * @return the property name of the amount field, which will be set editable for recurring invoices 151 */ 152 protected String getAmountPropertyName() { 153 return "amount"; 154 } 155 }