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    }