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 }