/* * 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.fp.document.authorization; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.fp.businessobject.ProcurementCardTargetAccountingLine; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSConstants.RouteLevelNames; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.document.AccountingDocument; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.krad.util.KRADConstants; public class ProcurementCardAccountingLineAuthorizer extends CapitalAccountingLinesAuthorizerBase { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ProcurementCardAccountingLineAuthorizer.class); /** * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getKimHappyPropertyNameForField(java.lang.String) */ @Override protected String getKimHappyPropertyNameForField(String convertedName) { String name = stripDocumentPrefixFromName(convertedName); name = name.replaceAll("\\[\\d+\\]", StringUtils.EMPTY); name = name.replaceFirst("(.)*transactionEntries\\.", StringUtils.EMPTY); return name; } /** * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getDeleteLineMethod(org.kuali.kfs.sys.businessobject.AccountingLine, * java.lang.String, java.lang.Integer) */ @Override protected String getDeleteLineMethod(AccountingLine accountingLine, String accountingLineProperty, Integer accountingLineIndex) { final String infix = getActionInfixForExtantAccountingLine(accountingLine, accountingLineProperty); String lineIndex = this.getLineContainerIndex(accountingLineProperty); String lineContainer = this.getLineContainer(accountingLineProperty) + "."; return KRADConstants.DELETE_METHOD + infix + "Line." + lineContainer + "line" + accountingLineIndex + ".anchoraccounting" + infix + "Anchor"; } /** * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getAddMethod(org.kuali.kfs.sys.businessobject.AccountingLine, * java.lang.String, java.lang.Integer) */ @Override protected String getAddMethod(AccountingLine accountingLine, String accountingLineProperty) { Integer lineIndex = ((ProcurementCardTargetAccountingLine) accountingLine).getTransactionContainerIndex(); String lineIndexString = lineIndex.toString(); String infix = getActionInfixForNewAccountingLine(accountingLine, accountingLineProperty); return KFSConstants.INSERT_METHOD + infix + "Line" + ".transactionEntries[" + lineIndex + "]"; } /** * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#getBalanceInquiryMethod(org.kuali.kfs.sys.businessobject.AccountingLine, * java.lang.String, java.lang.Integer) */ @Override protected String getBalanceInquiryMethod(AccountingLine accountingLine, String accountingLineProperty, Integer accountingLineIndex) { String infix = getActionInfixForExtantAccountingLine(accountingLine, accountingLineProperty); String lineContainer = this.getLineContainer(accountingLineProperty) + "."; return KFSConstants.PERFORMANCE_BALANCE_INQUIRY_FOR_METHOD + infix + "Line." + lineContainer + "line" + accountingLineIndex + ".anchoraccounting" + infix + "existingLineLineAnchor" + accountingLineIndex; } protected String getLineContainer(String accountingLineProperty) { String lineContainer = stripDocumentPrefixFromName(accountingLineProperty); return StringUtils.substringBeforeLast(lineContainer, "."); } protected String getLineContainerIndex(String accountingLineProperty) { String lineContainer = this.getLineContainer(accountingLineProperty); return StringUtils.substringBetween(lineContainer, "[", "]"); } /** * Overrides to handle the special case for PCDO routed to AccountFullEdit node, at which point the FO (and the delegates) should * be able to add new accounts or change any existing account to any other account even if s/he is not the FO of the new account. * Note: This method is called by hasEditPermissionOnField and hasEditPermissionOnAccountingLine. The best place to override with * the above logic would have been these two methods; but both of them are definded as final for some reason, so we put the logic here. * * @see org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizerBase#determineEditPermissionByFieldName(AccountingDocument,AccountingLine,String,Person) */ @Override protected boolean determineEditPermissionByFieldName(AccountingDocument accountingDocument, AccountingLine accountingLine, String fieldName, Person currentUser) { // 1. If this method is called, we know it's a PCDO document here. // 2. Check that the document is at AccountFullEdit route node if (accountingDocument.getDocumentHeader() != null && accountingDocument.getDocumentHeader().getWorkflowDocument() != null) { Set<String> currentNodes = accountingDocument.getDocumentHeader().getWorkflowDocument().getCurrentNodeNames(); if (currentNodes != null && currentNodes.contains(RouteLevelNames.ACCOUNT_REVIEW_FULL_EDIT)) { // 3. Check that the current user has the permission to edit the document, which means in this case he can edit the accounting line if (getDocumentAuthorizer(accountingDocument).canEdit(accountingDocument, currentUser)) { // if above conditions satisfy, then we can skip further validation on permission checking, // since any user that can edit the accounting lines will be able to add/change it to any other account return true; } } } return super.determineEditPermissionByFieldName(accountingDocument, accountingLine, fieldName, currentUser); } }