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.purap.document.web.struts; 017 018 import java.math.BigDecimal; 019 import java.util.ArrayList; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.apache.struts.upload.FormFile; 024 import org.kuali.kfs.integration.purap.CapitalAssetLocation; 025 import org.kuali.kfs.module.purap.PurapConstants; 026 import org.kuali.kfs.module.purap.PurapParameterConstants; 027 import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine; 028 import org.kuali.kfs.module.purap.businessobject.PurApAccountingLineBase; 029 import org.kuali.kfs.module.purap.businessobject.PurApItem; 030 import org.kuali.kfs.module.purap.document.PurchasingDocument; 031 import org.kuali.kfs.sys.KFSConstants; 032 import org.kuali.kfs.sys.businessobject.AccountingLine; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.kfs.sys.service.impl.KfsParameterConstants; 035 import org.kuali.rice.kns.service.KualiConfigurationService; 036 import org.kuali.rice.kns.service.ParameterService; 037 import org.kuali.rice.kns.util.KNSConstants; 038 import org.kuali.rice.kns.web.ui.ExtraButton; 039 040 /** 041 * Struts Action Form for Purchasing documents. 042 */ 043 public abstract class PurchasingFormBase extends PurchasingAccountsPayableFormBase { 044 045 protected Boolean notOtherDeliveryBuilding = true; 046 protected Boolean hideDistributeAccounts = true; 047 protected PurApItem newPurchasingItemLine; 048 protected FormFile itemImportFile; // file from which items can be imported 049 protected String distributePurchasingCommodityCode; 050 protected String distributePurchasingCommodityDescription; 051 protected boolean calculated; 052 053 protected String initialZipCode; 054 055 // *** Note that the following variables do not use camel caps ON PURPOSE, because of how the accounting lines tag uses the 056 // accountPrefix 057 protected Integer accountDistributionnextSourceLineNumber; 058 protected List<PurApAccountingLine> accountDistributionsourceAccountingLines; 059 protected PurApAccountingLine accountDistributionnewSourceLine; 060 061 protected CapitalAssetLocation newPurchasingCapitalAssetLocationLine; 062 063 protected BigDecimal totalPercentageOfAccountDistributionsourceAccountingLines; 064 065 protected String locationBuildingFromLookup; 066 protected String locationCampusFromLookup; 067 068 /** 069 * Constructs a PurchasingFormBase instance and sets up the appropriately casted document. 070 */ 071 public PurchasingFormBase() { 072 super(); 073 this.setNewPurchasingItemLine(setupNewPurchasingItemLine()); 074 newPurchasingItemLine.setItemTypeCode("ITEM"); 075 076 this.accountDistributionnextSourceLineNumber = new Integer(1); 077 setAccountDistributionsourceAccountingLines(new ArrayList()); 078 this.setAccountDistributionnewSourceLine(setupNewAccountDistributionAccountingLine()); 079 080 this.setNewPurchasingCapitalAssetLocationLine(this.setupNewPurchasingCapitalAssetLocationLine()); 081 082 calculated = false; 083 } 084 085 086 087 public Boolean getNotOtherDeliveryBuilding() { 088 return notOtherDeliveryBuilding; 089 } 090 091 public void setNotOtherDeliveryBuilding(Boolean notOtherDeliveryBuilding) { 092 this.notOtherDeliveryBuilding = notOtherDeliveryBuilding; 093 } 094 095 public Boolean getHideDistributeAccounts() { 096 return hideDistributeAccounts; 097 } 098 099 public void setHideDistributeAccounts(Boolean hideDistributeAccounts) { 100 this.hideDistributeAccounts = hideDistributeAccounts; 101 } 102 103 public Integer getAccountDistributionnextSourceLineNumber() { 104 return accountDistributionnextSourceLineNumber; 105 } 106 107 public void setAccountDistributionnextSourceLineNumber(Integer accountDistributionnextSourceLineNumber) { 108 this.accountDistributionnextSourceLineNumber = accountDistributionnextSourceLineNumber; 109 } 110 111 public List<PurApAccountingLine> getAccountDistributionsourceAccountingLines() { 112 return accountDistributionsourceAccountingLines; 113 } 114 115 public void setAccountDistributionsourceAccountingLines(List<PurApAccountingLine> accountDistributionAccountingLines) { 116 this.accountDistributionsourceAccountingLines = accountDistributionAccountingLines; 117 } 118 119 public BigDecimal getTotalPercentageOfAccountDistributionsourceAccountingLines() { 120 this.totalPercentageOfAccountDistributionsourceAccountingLines = new BigDecimal(0); 121 for (PurApAccountingLine line : this.getAccountDistributionsourceAccountingLines()) { 122 if (line.getAccountLinePercent() != null) { 123 setTotalPercentageOfAccountDistributionsourceAccountingLines(this.totalPercentageOfAccountDistributionsourceAccountingLines.add(line.getAccountLinePercent())); 124 } 125 } 126 return this.totalPercentageOfAccountDistributionsourceAccountingLines; 127 } 128 129 public void setTotalPercentageOfAccountDistributionsourceAccountingLines(BigDecimal total) { 130 this.totalPercentageOfAccountDistributionsourceAccountingLines = total; 131 } 132 133 public PurApAccountingLine getAccountDistributionnewSourceLine() { 134 return accountDistributionnewSourceLine; 135 } 136 137 public void setAccountDistributionnewSourceLine(PurApAccountingLine accountDistributionnewSourceLine) { 138 this.accountDistributionnewSourceLine = accountDistributionnewSourceLine; 139 } 140 141 public PurApItem getNewPurchasingItemLine() { 142 return newPurchasingItemLine; 143 } 144 145 public void setNewPurchasingItemLine(PurApItem newPurchasingItemLine) { 146 this.newPurchasingItemLine = newPurchasingItemLine; 147 } 148 149 public FormFile getItemImportFile() { 150 return itemImportFile; 151 } 152 153 public void setItemImportFile(FormFile itemImportFile) { 154 this.itemImportFile = itemImportFile; 155 } 156 157 /** 158 * Returns the Account Distribution Source Accounting Line at the specified index. 159 * 160 * @param index the index of the Account Distribution Source Accounting Line. 161 * @return the specified Account Distribution Source Accounting Line. 162 */ 163 public PurApAccountingLine getAccountDistributionsourceAccountingLine(int index) { 164 while (accountDistributionsourceAccountingLines.size() <= index) { 165 accountDistributionsourceAccountingLines.add(setupNewAccountDistributionAccountingLine()); 166 } 167 return accountDistributionsourceAccountingLines.get(index); 168 } 169 170 /** 171 * Returns the new Purchasing Item Line and resets it to null. 172 * 173 * @return the new Purchasing Item Line. 174 */ 175 public PurApItem getAndResetNewPurchasingItemLine() { 176 PurApItem aPurchasingItemLine = getNewPurchasingItemLine(); 177 setNewPurchasingItemLine(setupNewPurchasingItemLine()); 178 return aPurchasingItemLine; 179 } 180 181 /** 182 * This method should be overriden (or see accountingLines for an alternate way of doing this with newInstance) 183 */ 184 public PurApItem setupNewPurchasingItemLine() { 185 return null; 186 } 187 188 /** 189 * This method should be overriden (or see accountingLines for an alternate way of doing this with newInstance) 190 */ 191 public PurApAccountingLineBase setupNewPurchasingAccountingLine() { 192 return null; 193 } 194 195 /** 196 * This method should be overriden. 197 */ 198 public PurApAccountingLineBase setupNewAccountDistributionAccountingLine() { 199 return null; 200 } 201 202 /** 203 * Sets the sequence number appropriately for the passed in source accounting line using the value that has been stored in the 204 * nextSourceLineNumber variable, adds the accounting line to the list that is aggregated by this object, and then handles 205 * incrementing the nextSourceLineNumber variable. 206 * 207 * @param line the accounting line to add to the list. 208 * @see org.kuali.kfs.sys.document.AccountingDocument#addSourceAccountingLine(SourceAccountingLine) 209 */ 210 public void addAccountDistributionsourceAccountingLine(PurApAccountingLine line) { 211 line.setSequenceNumber(this.getAccountDistributionnextSourceLineNumber()); 212 this.accountDistributionsourceAccountingLines.add(line); 213 this.accountDistributionnextSourceLineNumber = new Integer(this.getAccountDistributionnextSourceLineNumber().intValue() + 1); 214 this.setAccountDistributionnewSourceLine(setupNewAccountDistributionAccountingLine()); 215 } 216 217 public String getDistributePurchasingCommodityCode() { 218 return distributePurchasingCommodityCode; 219 } 220 221 public void setDistributePurchasingCommodityCode(String distributePurchasingCommodityCode) { 222 this.distributePurchasingCommodityCode = distributePurchasingCommodityCode; 223 } 224 225 public String getDistributePurchasingCommodityDescription() { 226 return distributePurchasingCommodityDescription; 227 } 228 229 public void setDistributePurchasingCommodityDescription(String distributePurchasingCommodityDescription) { 230 this.distributePurchasingCommodityDescription = distributePurchasingCommodityDescription; 231 } 232 233 public Class getItemCapitalAssetClass(){ 234 return null; 235 } 236 237 public Class getCapitalAssetLocationClass(){ 238 return null; 239 } 240 241 242 //CAMS LOCATION 243 //Must be overridden 244 public CapitalAssetLocation setupNewPurchasingCapitalAssetLocationLine() { 245 CapitalAssetLocation location = null; 246 try{ 247 location = (CapitalAssetLocation)getCapitalAssetLocationClass().newInstance(); 248 } 249 catch (InstantiationException e) { 250 throw new RuntimeException("Unable to get class"); 251 } 252 catch (IllegalAccessException e) { 253 throw new RuntimeException("Unable to get class"); 254 } 255 catch (NullPointerException e) { 256 throw new RuntimeException("Can't instantiate Purchasing Account from base"); 257 } 258 259 return location; 260 } 261 262 public void setNewPurchasingCapitalAssetLocationLine(CapitalAssetLocation newCapitalAssetLocationLine) { 263 this.newPurchasingCapitalAssetLocationLine = newCapitalAssetLocationLine; 264 } 265 266 public CapitalAssetLocation getNewPurchasingCapitalAssetLocationLine() { 267 return newPurchasingCapitalAssetLocationLine; 268 } 269 270 public CapitalAssetLocation getAndResetNewPurchasingCapitalAssetLocationLine() { 271 CapitalAssetLocation assetLocation = getNewPurchasingCapitalAssetLocationLine(); 272 setNewPurchasingCapitalAssetLocationLine(setupNewPurchasingCapitalAssetLocationLine()); 273 return assetLocation; 274 } 275 276 public void resetNewPurchasingCapitalAssetLocationLine() { 277 setNewPurchasingCapitalAssetLocationLine(setupNewPurchasingCapitalAssetLocationLine()); 278 } 279 280 //Availability once 281 public String getPurchasingItemCapitalAssetAvailability(){ 282 String availability = PurapConstants.CapitalAssetAvailability.NONE; 283 PurchasingDocument pd = (PurchasingDocument)this.getDocument(); 284 285 if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode())) || 286 (PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode())) ){ 287 288 availability = PurapConstants.CapitalAssetAvailability.ONCE; 289 290 }else if((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.MODIFY.equals(pd.getCapitalAssetSystemStateCode()))){ 291 292 availability = PurapConstants.CapitalAssetAvailability.EACH; 293 294 } 295 296 return availability; 297 } 298 299 public String getPurchasingCapitalAssetSystemAvailability(){ 300 String availability = PurapConstants.CapitalAssetAvailability.NONE; 301 PurchasingDocument pd = (PurchasingDocument)this.getDocument(); 302 303 if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) ){ 304 305 availability = PurapConstants.CapitalAssetAvailability.ONCE; 306 307 }else if((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))){ 308 309 availability = PurapConstants.CapitalAssetAvailability.EACH; 310 311 } 312 313 return availability; 314 } 315 316 public String getPurchasingCapitalAssetSystemCommentsAvailability(){ 317 String availability = PurapConstants.CapitalAssetAvailability.NONE; 318 PurchasingDocument pd = (PurchasingDocument)this.getDocument(); 319 320 if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) || PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode())) ){ 321 322 availability = PurapConstants.CapitalAssetAvailability.ONCE; 323 324 }else if(PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) ){ 325 326 availability = PurapConstants.CapitalAssetAvailability.EACH; 327 328 } 329 330 return availability; 331 } 332 333 public String getPurchasingCapitalAssetSystemDescriptionAvailability(){ 334 String availability = PurapConstants.CapitalAssetAvailability.NONE; 335 PurchasingDocument pd = (PurchasingDocument)this.getDocument(); 336 337 if( (PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) || 338 (PurapConstants.CapitalAssetSystemTypes.MULTIPLE.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode())) ){ 339 340 availability = PurapConstants.CapitalAssetAvailability.ONCE; 341 342 } 343 344 return availability; 345 } 346 347 public String getPurchasingCapitalAssetLocationAvailability() { 348 String availability = PurapConstants.CapitalAssetAvailability.NONE; 349 PurchasingDocument pd = (PurchasingDocument) this.getDocument(); 350 351 if ((PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) { 352 availability = PurapConstants.CapitalAssetAvailability.ONCE; 353 } 354 else if ((PurapConstants.CapitalAssetSystemTypes.INDIVIDUAL.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) { 355 availability = PurapConstants.CapitalAssetAvailability.EACH; 356 } 357 358 return availability; 359 } 360 361 public String getPurchasingCapitalAssetCountAssetNumberAvailability() { 362 String availability = PurapConstants.CapitalAssetAvailability.NONE; 363 PurchasingDocument pd = (PurchasingDocument) this.getDocument(); 364 365 if ((PurapConstants.CapitalAssetSystemTypes.ONE_SYSTEM.equals(pd.getCapitalAssetSystemTypeCode()) && PurapConstants.CapitalAssetSystemStates.NEW.equals(pd.getCapitalAssetSystemStateCode()))) { 366 availability = PurapConstants.CapitalAssetAvailability.ONCE; 367 } 368 369 return availability; 370 } 371 372 @Override 373 public List<ExtraButton> getExtraButtons() { 374 extraButtons.clear(); 375 376 String appExternalImageURL = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.EXTERNALIZABLE_IMAGES_URL_KEY); 377 378 // add the calculate button if the user can edit 379 if (canUserCalculate()) { 380 addExtraButton("methodToCall.calculate", appExternalImageURL + "buttonsmall_calculate.gif", "Calculate"); 381 } 382 383 return extraButtons; 384 } 385 386 public String getLocationBuildingFromLookup() { 387 return locationBuildingFromLookup; 388 } 389 390 public void setLocationBuildingFromLookup(String locationBuildingFromLookup) { 391 this.locationBuildingFromLookup = locationBuildingFromLookup; 392 } 393 394 public String getLocationCampusFromLookup() { 395 return locationCampusFromLookup; 396 } 397 398 public void setLocationCampusFromLookup(String locationCampusFromLookup) { 399 this.locationCampusFromLookup = locationCampusFromLookup; 400 } 401 402 public String getInitialZipCode() { 403 return initialZipCode; 404 } 405 406 public void setInitialZipCode(String initialZipCode) { 407 this.initialZipCode = initialZipCode; 408 } 409 410 public boolean isCalculated() { 411 return calculated; 412 } 413 414 public void setCalculated(boolean calculated) { 415 this.calculated = calculated; 416 } 417 418 public boolean canUserCalculate(){ 419 return documentActions != null && documentActions.containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT); 420 } 421 422 423 /** 424 * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#repopulateOverrides(org.kuali.kfs.sys.businessobject.AccountingLine, java.lang.String, java.util.Map) 425 */ 426 @Override 427 protected void repopulateOverrides(AccountingLine line, String accountingLinePropertyName, Map parameterMap) { 428 // do nothing; purchasing documents do not have overrides 429 } 430 431 /** 432 * @return the URL to the line item import instructions 433 */ 434 public String getLineItemImportInstructionsUrl() { 435 return SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.EXTERNALIZABLE_HELP_URL_KEY) + SpringContext.getBean(ParameterService.class).getParameterValue(KfsParameterConstants.PURCHASING_DOCUMENT.class, PurapParameterConstants.LINE_ITEM_IMPORT); 436 } 437 }