/*
* 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.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.fp.document.authorization.FinancialProcessingAccountingLineAuthorizer;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.sys.businessobject.AccountingLine;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.AccountingDocument;
import org.kuali.kfs.sys.document.web.AccountingLineRenderingContext;
import org.kuali.kfs.sys.document.web.AccountingLineViewAction;
import org.kuali.rice.core.api.config.property.ConfigurationService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
public class CustomerInvoiceDocumentSourceLinesAuthorizer extends FinancialProcessingAccountingLineAuthorizer {
private static final String RECALCULATE_METHOD_NAME = "recalculateSourceLine";
private static final String RECALCULATE_LABEL = "Recalculate Source Accounting Line";
private static final String RECALCULATE_BUTTON_IMAGE = "tinybutton-recalculate.gif";
private static final String DISCOUNT_METHOD_NAME = "discountSourceLine";
private static final String DISCOUNT_LABEL = "Discount a Source Accounting Line";
private static final String DISCOUNT_BUTTON_IMAGE = "tinybutton-discount.gif";
private static final String REFRESH_METHOD_NAME = "refreshNewSourceLine";
private static final String REFRESH_LABEL = "Refresh New Source Line";
private static final String REFRESH_BUTTON_IMAGE = "tinybutton-refresh.gif";
/**
* @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getActionMap(org.kuali.kfs.sys.businessobject.AccountingLine,
* java.lang.String, java.lang.Integer, java.lang.String)
*/
@Override
protected Map<String, AccountingLineViewAction> getActionMap(AccountingLineRenderingContext accountingLineRenderingContext, String accountingLinePropertyName, Integer accountingLineIndex, String groupTitle) {
Map<String, AccountingLineViewAction> actionMap = super.getActionMap(accountingLineRenderingContext, accountingLinePropertyName, accountingLineIndex, groupTitle);
CustomerInvoiceDetail invoiceLine = (CustomerInvoiceDetail) accountingLineRenderingContext.getAccountingLine();
// get the images base directory
String kfsImagesPath = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString("externalizable.images.url");
// show the Refresh button on the New Line Actions
if (isNewLine(accountingLineIndex)) {
actionMap.put(REFRESH_METHOD_NAME, new AccountingLineViewAction(REFRESH_METHOD_NAME, REFRESH_LABEL, kfsImagesPath + REFRESH_BUTTON_IMAGE));
}
else {
// always add the Recalculate button if its in edit mode
String groupName = super.getActionInfixForExtantAccountingLine(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName);
String methodName = methodName(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName, accountingLineIndex, RECALCULATE_METHOD_NAME);
actionMap.put(methodName, new AccountingLineViewAction(methodName, RECALCULATE_LABEL, kfsImagesPath + RECALCULATE_BUTTON_IMAGE));
// only add the Discount button if its not a Discount Line or a Discount Line Parent
if (showDiscountButton(invoiceLine)) {
methodName = methodName(accountingLineRenderingContext.getAccountingLine(), accountingLinePropertyName, accountingLineIndex, DISCOUNT_METHOD_NAME);
actionMap.put(methodName, new AccountingLineViewAction(methodName, DISCOUNT_LABEL, kfsImagesPath + DISCOUNT_BUTTON_IMAGE));
}
}
return actionMap;
}
private boolean showDiscountButton(CustomerInvoiceDetail invoiceLine) {
return (!invoiceLine.isDiscountLine() && !invoiceLine.isDiscountLineParent());
}
private String methodName(AccountingLine line, String accountingLineProperty, Integer accountingLineIndex, String methodName) {
String infix = super.getActionInfixForExtantAccountingLine(line, accountingLineProperty);
return methodName + ".line" + accountingLineIndex.toString() + ".anchoraccounting" + infix + "Anchor";
}
private boolean isNewLine(Integer accountingLineIndex) {
return (accountingLineIndex == null || accountingLineIndex.intValue() < 0);
}
@Override
public Set<String> getUnviewableBlocks(AccountingDocument accountingDocument, AccountingLine accountingLine, boolean newLine, Person currentUser) {
Set<String> blocks = super.getUnviewableBlocks(accountingDocument, accountingLine, newLine, currentUser);
ParameterService parameterService = SpringContext.getBean(ParameterService.class);
boolean enableTax = parameterService.getParameterValueAsBoolean("KFS-AR", "Document", ArConstants.ENABLE_SALES_TAX_IND);
if (!enableTax) {
blocks.add("invoiceItemTaxAmount");
blocks.add("taxableIndicator");
}
return blocks;
}
/**
* Overridden to make:
* 1. chart and account number read only for discount lines
* 2. invoice item description and amount editable for recurring invoices
*
* @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#determineFieldModifyability(org.kuali.kfs.sys.document.AccountingDocument,
* org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.document.web.AccountingLineViewField, java.util.Map)
*/
@Override
public boolean determineEditPermissionOnField(AccountingDocument accountingDocument, AccountingLine accountingLine, String accountingLineCollectionProperty, String fieldName, boolean editablePage) {
boolean canModify = super.determineEditPermissionOnField(accountingDocument, accountingLine, accountingLineCollectionProperty, fieldName, editablePage);
if (canModify) {
boolean discountLineFlag = ((CustomerInvoiceDetail)accountingLine).isDiscountLine();
if (discountLineFlag) {
if (StringUtils.equals(fieldName, getChartPropertyName()) || StringUtils.equals(fieldName, getAccountNumberPropertyName()))
canModify = false;
}
}
return canModify;
}
/**
* @return the property name of the chart field, which will be set to read only for discount lines
*/
protected String getChartPropertyName() {
return "chartOfAccountsCode";
}
/**
* @return the property name of the account number field, which will be set to read only for discount lines
*/
protected String getAccountNumberPropertyName() {
return "accountNumber";
}
/**
* @return the property name of the invoice item description field, which will be set editable for recurring invoices
*/
protected String getItemDescriptionPropertyName() {
return "invoiceItemDescription";
}
/**
* @return the property name of the amount field, which will be set editable for recurring invoices
*/
protected String getAmountPropertyName() {
return "amount";
}
}