/*
* 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.web.struts;
import static org.kuali.kfs.fp.document.validation.impl.ProcurementCardDocumentRuleConstants.DISPUTE_URL_PARM_NM;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.fp.businessobject.CapitalAssetInformation;
import org.kuali.kfs.fp.businessobject.ProcurementCardTargetAccountingLine;
import org.kuali.kfs.fp.businessobject.ProcurementCardTransactionDetail;
import org.kuali.kfs.fp.document.CapitalAssetEditable;
import org.kuali.kfs.fp.document.ProcurementCardDocument;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.TargetAccountingLine;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizer;
import org.kuali.kfs.sys.document.datadictionary.AccountingLineGroupDefinition;
import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.datadictionary.DataDictionary;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
/**
* This class is the form class for the ProcurementCard document. This method extends the parent KualiTransactionalDocumentFormBase
* class which contains all of the common form methods and form attributes needed by the Procurment Card document.
*/
public class ProcurementCardForm extends CapitalAccountingLinesFormBase implements CapitalAssetEditable{
protected static final long serialVersionUID = 1L;
protected List<ProcurementCardTargetAccountingLine> newTargetLines;
protected List<Boolean> transactionCreditCardNumbersViewStatus;
protected final static String TARGET_ACCOUNTING_LINE_GROUP_NAME = "target";
protected List<CapitalAssetInformation> capitalAssetInformation;
/**
* Override to accomodate multiple target lines.
*
* @see org.kuali.rice.kns.web.struts.pojo.PojoForm#populate(javax.servlet.http.HttpServletRequest)
*/
@Override
public void populate(HttpServletRequest request) {
super.populate(request);
//
// now run through all of the accounting lines and make sure they've been uppercased and populated appropriately
// handle new accountingLine, if one is being added
final String methodToCall = this.getMethodToCall();
final Map parameterMap = request.getParameterMap();
if (StringUtils.isNotBlank(methodToCall)) {
if (methodToCall.equals(KFSConstants.INSERT_SOURCE_LINE_METHOD)) {
populateSourceAccountingLine(getNewSourceLine(), KFSPropertyConstants.NEW_SOURCE_LINE, parameterMap);
}
if (methodToCall.equals(KFSConstants.INSERT_TARGET_LINE_METHOD)) {
// This is the addition for the override: Handle multiple accounting lines ...
for (Iterator newTargetLinesIter = getNewTargetLines().iterator(); newTargetLinesIter.hasNext();) {
TargetAccountingLine targetAccountingLine = (TargetAccountingLine) newTargetLinesIter.next();
populateTargetAccountingLine(targetAccountingLine, KFSPropertyConstants.NEW_TARGET_LINE, parameterMap);
}
}
}
// don't call populateAccountingLines if you are copying or errorCorrecting a document,
// since you want the accountingLines in the copy to be "identical" to those in the original
if (!StringUtils.equals(methodToCall, KFSConstants.COPY_METHOD) && !StringUtils.equals(methodToCall, KFSConstants.ERRORCORRECT_METHOD)) {
populateAccountingLines(parameterMap);
}
setDocTypeName(discoverDocumentTypeName());
}
/**
* Constructs a ProcurmentCardForm instance and sets up the appropriately casted document. Also, the newSourceLine needs to be
* the extended ProcurementCardSourceAccountingLine, for the additional trans line nbr.
*/
public ProcurementCardForm() {
super();
this.newTargetLines = new ArrayList<ProcurementCardTargetAccountingLine>();
// buildNewTargetAccountingLines();
capitalAssetInformation = new ArrayList<CapitalAssetInformation>();
}
public void buildNewTargetAccountingLines(int transactionsCount) {
for (int i=0; i < transactionsCount; i++) {
ProcurementCardTargetAccountingLine newLine = new ProcurementCardTargetAccountingLine();
newLine.setTransactionContainerIndex(i);
this.newTargetLines.add(i, newLine);
}
}
@Override
protected String getDefaultDocumentTypeName() {
return "PCDO";
}
/**
* @return The retreived APC string used for the dispute url.
*/
public String getDisputeURL() {
return SpringContext.getBean(ParameterService.class).getParameterValueAsString(ProcurementCardDocument.class, DISPUTE_URL_PARM_NM);
}
/**
* @return Returns the newTargetLines.
*/
public List getNewTargetLines() {
return newTargetLines;
}
/**
* @param newTargetLines The newTargetLines to set.
*/
public void setNewTargetLines(List newTargetLines) {
this.newTargetLines = newTargetLines;
}
/**
* @see org.kuali.kfs.fp.document.CapitalAssetEditable#getCapitalAssetInformation()
*/
public List<CapitalAssetInformation> getCapitalAssetInformation() {
return this.capitalAssetInformation;
}
/**
* @see org.kuali.kfs.fp.document.CapitalAssetEditable#setCapitalAssetInformation(org.kuali.kfs.fp.businessobject.CapitalAssetInformation)
*/
public void setCapitalAssetInformation(List<CapitalAssetInformation> capitalAssetInformation) {
this.capitalAssetInformation = capitalAssetInformation;
}
/**
* @return an array, parallel to the ProcurementCardDocument#getTransactionEntries, which holds whether the
* current user can see the credit card number or not
*/
public List<Boolean> getTransactionCreditCardNumbersViewStatus() {
if (this.transactionCreditCardNumbersViewStatus == null) {
populateTransactionCreditCardNumbersViewStatuses();
}
return transactionCreditCardNumbersViewStatus;
}
/**
* populates an array, parallel to the ProcurementCardDocument#getTransactionEntries, which holds whether the
* current user can see the credit card number or not - based on if any of the accounting lines are editable to
* the user or not...
*/
protected void populateTransactionCreditCardNumbersViewStatuses() {
final AccountingLineAuthorizer accountingLineAuthorizer = getAccountingLineAuthorizerForDocument();
final Person currentUser = GlobalVariables.getUserSession().getPerson();
transactionCreditCardNumbersViewStatus = new ArrayList<Boolean>();
for (Object transactionEntryAsObject : ((ProcurementCardDocument)getDocument()).getTransactionEntries()) {
final ProcurementCardTransactionDetail transactionDetail = (ProcurementCardTransactionDetail)transactionEntryAsObject;
Boolean canEditAnyAccountingLine = Boolean.FALSE;
int count = 0;
while (!canEditAnyAccountingLine.booleanValue() && count < transactionDetail.getTargetAccountingLines().size()) {
final TargetAccountingLine accountingLine = (TargetAccountingLine)transactionDetail.getTargetAccountingLines().get(count);
if (accountingLineAuthorizer.hasEditPermissionOnAccountingLine(((ProcurementCardDocument)getDocument()), accountingLine, getAccountingLineCollectionName(), currentUser, getDocumentActions().containsKey(KRADConstants.KUALI_ACTION_CAN_EDIT))) {
canEditAnyAccountingLine = Boolean.TRUE;
}
count += 1;
}
transactionCreditCardNumbersViewStatus.add(canEditAnyAccountingLine);
}
}
/**
* @return the accounting line authorizer for the target lines of this document
*/
protected AccountingLineAuthorizer getAccountingLineAuthorizerForDocument() {
final DataDictionaryService dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
final DataDictionary dataDictionary = dataDictionaryService.getDataDictionary();
final String documentTypeCode = dataDictionaryService.getDocumentTypeNameByClass(this.getDocument().getClass());
final FinancialSystemTransactionalDocumentEntry documentEntry = (FinancialSystemTransactionalDocumentEntry)dataDictionary.getDocumentEntry(documentTypeCode);
final AccountingLineGroupDefinition targetAccountingLineGroupDefinition = documentEntry.getAccountingLineGroups().get(ProcurementCardForm.TARGET_ACCOUNTING_LINE_GROUP_NAME);
return targetAccountingLineGroupDefinition.getAccountingLineAuthorizer();
}
/**
* @return the name of the accounting line collection for the permission check
*/
protected String getAccountingLineCollectionName() {
// we'll just cheat...
return "targetAccountingLines";
}
}