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.fp.document.web.struts; 017 018 import static org.kuali.kfs.fp.document.validation.impl.ProcurementCardDocumentRuleConstants.DISPUTE_URL_PARM_NM; 019 020 import java.util.ArrayList; 021 import java.util.Iterator; 022 import java.util.List; 023 import java.util.Map; 024 025 import javax.servlet.http.HttpServletRequest; 026 027 import org.apache.commons.lang.StringUtils; 028 import org.kuali.kfs.fp.businessobject.CapitalAssetInformation; 029 import org.kuali.kfs.fp.businessobject.ProcurementCardTargetAccountingLine; 030 import org.kuali.kfs.fp.businessobject.ProcurementCardTransactionDetail; 031 import org.kuali.kfs.fp.document.CapitalAssetEditable; 032 import org.kuali.kfs.fp.document.ProcurementCardDocument; 033 import org.kuali.kfs.sys.KFSConstants; 034 import org.kuali.kfs.sys.KFSPropertyConstants; 035 import org.kuali.kfs.sys.businessobject.TargetAccountingLine; 036 import org.kuali.kfs.sys.context.SpringContext; 037 import org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizer; 038 import org.kuali.kfs.sys.document.datadictionary.AccountingLineGroupDefinition; 039 import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry; 040 import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase; 041 import org.kuali.rice.kim.bo.Person; 042 import org.kuali.rice.kns.datadictionary.DataDictionary; 043 import org.kuali.rice.kns.service.DataDictionaryService; 044 import org.kuali.rice.kns.service.ParameterService; 045 import org.kuali.rice.kns.util.GlobalVariables; 046 import org.kuali.rice.kns.util.KNSConstants; 047 import org.kuali.rice.kns.util.TypedArrayList; 048 049 /** 050 * This class is the form class for the ProcurementCard document. This method extends the parent KualiTransactionalDocumentFormBase 051 * class which contains all of the common form methods and form attributes needed by the Procurment Card document. 052 */ 053 public class ProcurementCardForm extends KualiAccountingDocumentFormBase implements CapitalAssetEditable{ 054 protected static final long serialVersionUID = 1L; 055 protected List newTargetLines; 056 protected List<Boolean> transactionCreditCardNumbersViewStatus; 057 protected final static String TARGET_ACCOUNTING_LINE_GROUP_NAME = "target"; 058 059 protected CapitalAssetInformation capitalAssetInformation; 060 061 /** 062 * Override to accomodate multiple target lines. 063 * 064 * @see org.kuali.rice.kns.web.struts.pojo.PojoForm#populate(javax.servlet.http.HttpServletRequest) 065 */ 066 @Override 067 public void populate(HttpServletRequest request) { 068 super.populate(request); 069 070 // 071 // now run through all of the accounting lines and make sure they've been uppercased and populated appropriately 072 073 // handle new accountingLine, if one is being added 074 final String methodToCall = this.getMethodToCall(); 075 final Map parameterMap = request.getParameterMap(); 076 if (StringUtils.isNotBlank(methodToCall)) { 077 if (methodToCall.equals(KFSConstants.INSERT_SOURCE_LINE_METHOD)) { 078 populateSourceAccountingLine(getNewSourceLine(), KFSPropertyConstants.NEW_SOURCE_LINE, parameterMap); 079 } 080 081 if (methodToCall.equals(KFSConstants.INSERT_TARGET_LINE_METHOD)) { 082 // This is the addition for the override: Handle multiple accounting lines ... 083 for (Iterator newTargetLinesIter = getNewTargetLines().iterator(); newTargetLinesIter.hasNext();) { 084 TargetAccountingLine targetAccountingLine = (TargetAccountingLine) newTargetLinesIter.next(); 085 populateTargetAccountingLine(targetAccountingLine, KFSPropertyConstants.NEW_TARGET_LINE, parameterMap); 086 } 087 } 088 } 089 090 // don't call populateAccountingLines if you are copying or errorCorrecting a document, 091 // since you want the accountingLines in the copy to be "identical" to those in the original 092 if (!StringUtils.equals(methodToCall, KFSConstants.COPY_METHOD) && !StringUtils.equals(methodToCall, KFSConstants.ERRORCORRECT_METHOD)) { 093 populateAccountingLines(parameterMap); 094 } 095 096 setDocTypeName(discoverDocumentTypeName()); 097 } 098 099 /** 100 * Constructs a ProcurmentCardForm instance and sets up the appropriately casted document. Also, the newSourceLine needs to be 101 * the extended ProcurementCardSourceAccountingLine, for the additional trans line nbr. 102 */ 103 public ProcurementCardForm() { 104 super(); 105 this.newTargetLines = new TypedArrayList(ProcurementCardTargetAccountingLine.class); 106 this.setCapitalAssetInformation(new CapitalAssetInformation()); 107 } 108 109 @Override 110 protected String getDefaultDocumentTypeName() { 111 return "PCDO"; 112 } 113 114 /** 115 * @return The retreived APC string used for the dispute url. 116 */ 117 public String getDisputeURL() { 118 return SpringContext.getBean(ParameterService.class).getParameterValue(ProcurementCardDocument.class, DISPUTE_URL_PARM_NM); 119 } 120 121 122 /** 123 * @return Returns the newTargetLines. 124 */ 125 public List getNewTargetLines() { 126 return newTargetLines; 127 } 128 129 /** 130 * @param newTargetLines The newTargetLines to set. 131 */ 132 public void setNewTargetLines(List newTargetLines) { 133 this.newTargetLines = newTargetLines; 134 } 135 136 /** 137 * @see org.kuali.kfs.fp.document.CapitalAssetEditable#getCapitalAssetInformation() 138 */ 139 public CapitalAssetInformation getCapitalAssetInformation() { 140 return this.capitalAssetInformation; 141 } 142 143 /** 144 * @see org.kuali.kfs.fp.document.CapitalAssetEditable#setCapitalAssetInformation(org.kuali.kfs.fp.businessobject.CapitalAssetInformation) 145 */ 146 public void setCapitalAssetInformation(CapitalAssetInformation capitalAssetInformation) { 147 this.capitalAssetInformation = capitalAssetInformation; 148 } 149 150 /** 151 * @return an array, parallel to the ProcurementCardDocument#getTransactionEntries, which holds whether the 152 * current user can see the credit card number or not 153 */ 154 public List<Boolean> getTransactionCreditCardNumbersViewStatus() { 155 if (this.transactionCreditCardNumbersViewStatus == null) { 156 populateTransactionCreditCardNumbersViewStatuses(); 157 } 158 return transactionCreditCardNumbersViewStatus; 159 } 160 161 /** 162 * populates an array, parallel to the ProcurementCardDocument#getTransactionEntries, which holds whether the 163 * current user can see the credit card number or not - based on if any of the accounting lines are editable to 164 * the user or not... 165 */ 166 protected void populateTransactionCreditCardNumbersViewStatuses() { 167 final AccountingLineAuthorizer accountingLineAuthorizer = getAccountingLineAuthorizerForDocument(); 168 final Person currentUser = GlobalVariables.getUserSession().getPerson(); 169 transactionCreditCardNumbersViewStatus = new ArrayList<Boolean>(); 170 171 for (Object transactionEntryAsObject : ((ProcurementCardDocument)getDocument()).getTransactionEntries()) { 172 final ProcurementCardTransactionDetail transactionDetail = (ProcurementCardTransactionDetail)transactionEntryAsObject; 173 Boolean canEditAnyAccountingLine = Boolean.FALSE; 174 175 int count = 0; 176 while (!canEditAnyAccountingLine.booleanValue() && count < transactionDetail.getTargetAccountingLines().size()) { 177 final TargetAccountingLine accountingLine = (TargetAccountingLine)transactionDetail.getTargetAccountingLines().get(count); 178 if (accountingLineAuthorizer.hasEditPermissionOnAccountingLine(((ProcurementCardDocument)getDocument()), accountingLine, getAccountingLineCollectionName(), currentUser, getDocumentActions().containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT))) { 179 canEditAnyAccountingLine = Boolean.TRUE; 180 } 181 count += 1; 182 } 183 transactionCreditCardNumbersViewStatus.add(canEditAnyAccountingLine); 184 } 185 } 186 187 /** 188 * @return the accounting line authorizer for the target lines of this document 189 */ 190 protected AccountingLineAuthorizer getAccountingLineAuthorizerForDocument() { 191 final DataDictionaryService dataDictionaryService = SpringContext.getBean(DataDictionaryService.class); 192 final DataDictionary dataDictionary = dataDictionaryService.getDataDictionary(); 193 final String documentTypeCode = dataDictionaryService.getDocumentTypeNameByClass(this.getDocument().getClass()); 194 final FinancialSystemTransactionalDocumentEntry documentEntry = (FinancialSystemTransactionalDocumentEntry)dataDictionary.getDocumentEntry(documentTypeCode); 195 final AccountingLineGroupDefinition targetAccountingLineGroupDefinition = documentEntry.getAccountingLineGroups().get(ProcurementCardForm.TARGET_ACCOUNTING_LINE_GROUP_NAME); 196 return targetAccountingLineGroupDefinition.getAccountingLineAuthorizer(); 197 } 198 199 /** 200 * @return the name of the accounting line collection for the permission check 201 */ 202 protected String getAccountingLineCollectionName() { 203 // we'll just cheat... 204 return "targetAccountingLines"; 205 } 206 }