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.util.ArrayList;
019    import java.util.List;
020    import java.util.Map;
021    import java.util.Properties;
022    
023    import javax.servlet.http.HttpServletRequest;
024    
025    import org.kuali.kfs.module.purap.businessobject.PurApAccountingLine;
026    import org.kuali.kfs.module.purap.businessobject.PurApItem;
027    import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
028    import org.kuali.kfs.module.purap.service.PurapAccountingService;
029    import org.kuali.kfs.module.purap.util.SummaryAccount;
030    import org.kuali.kfs.pdp.PdpPropertyConstants;
031    import org.kuali.kfs.pdp.businessobject.PurchasingPaymentDetail;
032    import org.kuali.kfs.sys.KFSConstants;
033    import org.kuali.kfs.sys.KFSParameterKeyConstants;
034    import org.kuali.kfs.sys.KFSPropertyConstants;
035    import org.kuali.kfs.sys.businessobject.AccountingLine;
036    import org.kuali.kfs.sys.context.SpringContext;
037    import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
038    import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase;
039    import org.kuali.rice.kns.service.DataDictionaryService;
040    import org.kuali.rice.kns.service.KualiConfigurationService;
041    import org.kuali.rice.kns.service.ParameterService;
042    import org.kuali.rice.kns.util.KNSConstants;
043    import org.kuali.rice.kns.util.ObjectUtils;
044    import org.kuali.rice.kns.util.TypedArrayList;
045    import org.kuali.rice.kns.util.UrlFactory;
046    import org.kuali.rice.kns.web.ui.ExtraButton;
047    
048    /**
049     * Struts Action Form for Purchasing and Accounts Payable documents.
050     */
051    public class PurchasingAccountsPayableFormBase extends KualiAccountingDocumentFormBase {
052    
053        protected transient List<SummaryAccount> summaryAccounts;
054    
055        /**
056         * Constructs a PurchasingAccountsPayableFormBase instance and initializes summary accounts.
057         */
058        public PurchasingAccountsPayableFormBase() {
059            super();
060            clearSummaryAccounts();
061        }
062    
063        /**
064         * Updates the summaryAccounts that are contained in the form. Currently we are only calling this on load and when
065         * refreshAccountSummary is called.
066         */
067        public void refreshAccountSummmary() {
068            clearSummaryAccounts();
069            PurchasingAccountsPayableDocument purapDocument = (PurchasingAccountsPayableDocument) getDocument();
070            summaryAccounts.addAll(SpringContext.getBean(PurapAccountingService.class).generateSummaryAccounts(purapDocument));
071        }
072    
073        /**
074         * Initializes summary accounts.
075         */
076        public void clearSummaryAccounts() {
077            summaryAccounts = new TypedArrayList(SummaryAccount.class);
078        }
079    
080        /**
081         * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#getBaselineSourceAccountingLines()
082         */
083        public List getBaselineSourceAccountingLines() {
084            List<AccountingLine> accounts = new ArrayList<AccountingLine>();
085            if (ObjectUtils.isNull(accounts) || accounts.isEmpty()) {
086                accounts = new ArrayList<AccountingLine>();
087                for (PurApItem item : ((PurchasingAccountsPayableDocument) getDocument()).getItems()) {
088                    List<PurApAccountingLine> lines = item.getBaselineSourceAccountingLines();
089                    for (PurApAccountingLine line : lines) {
090                        accounts.add(line);
091                    }
092    
093                }
094            }
095            return accounts;
096        }
097    
098        @Override
099        public void populate(HttpServletRequest request) {
100            super.populate(request);
101            PurchasingAccountsPayableDocument purapDoc = (PurchasingAccountsPayableDocument)this.getDocument();
102    
103            //fix document item/account references if necessary
104            purapDoc.fixItemReferences();
105        }
106    
107        public List<SummaryAccount> getSummaryAccounts() {
108            if (summaryAccounts == null) {
109                refreshAccountSummmary();
110            }
111            return summaryAccounts;
112        }
113    
114        public void setSummaryAccounts(List<SummaryAccount> summaryAccounts) {
115            this.summaryAccounts = summaryAccounts;
116        }
117    
118        protected void addExtraButton(String property, String source, String altText) {
119        
120            ExtraButton newButton = new ExtraButton();
121        
122            newButton.setExtraButtonProperty(property);
123            newButton.setExtraButtonSource(source);
124            newButton.setExtraButtonAltText(altText);
125        
126            extraButtons.add(newButton);
127        }
128        
129        /**
130         * This method builds the url for the disbursement info on the purap documents.
131         * @return the disbursement info url
132         */
133        public String getDisbursementInfoUrl() {
134            String basePath = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.APPLICATION_URL_KEY);
135            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
136    
137            String orgCode = parameterService.getParameterValue(KfsParameterConstants.PURCHASING_BATCH.class, KFSParameterKeyConstants.PurapPdpParameterConstants.PURAP_PDP_ORG_CODE);
138            String subUnitCode = parameterService.getParameterValue(KfsParameterConstants.PURCHASING_BATCH.class, KFSParameterKeyConstants.PurapPdpParameterConstants.PURAP_PDP_SUB_UNIT_CODE);
139    
140            Properties parameters = new Properties();
141            parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.SEARCH_METHOD);
142            parameters.put(KFSConstants.BACK_LOCATION, basePath + "/" + KFSConstants.MAPPING_PORTAL + ".do");
143            parameters.put(KNSConstants.DOC_FORM_KEY, "88888888");
144            parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, PurchasingPaymentDetail.class.getName());
145            parameters.put(KFSConstants.HIDE_LOOKUP_RETURN_LINK, "true");
146            parameters.put(KFSConstants.SUPPRESS_ACTIONS, "false");
147            parameters.put(PdpPropertyConstants.PaymentDetail.PAYMENT_UNIT_CODE, orgCode);
148            parameters.put(PdpPropertyConstants.PaymentDetail.PAYMENT_SUBUNIT_CODE, subUnitCode);
149    
150            String lookupUrl = UrlFactory.parameterizeUrl(basePath + "/" + KFSConstants.LOOKUP_ACTION, parameters);
151    
152            return lookupUrl;
153        }
154      
155        /**
156         * overridden to make sure accounting lines on items are repopulated
157         * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase#populateAccountingLinesForResponse(java.lang.String, java.util.Map)
158         */
159        @Override
160        protected void populateAccountingLinesForResponse(String methodToCall, Map parameterMap) {
161            super.populateAccountingLinesForResponse(methodToCall, parameterMap);
162            
163            populateItemAccountingLines(parameterMap);
164        }
165        
166        /**
167         * Populates accounting lines for each item on the Purchasing AP document
168         * @param parameterMap the map of parameters
169         */
170        protected void populateItemAccountingLines(Map parameterMap) {
171           int itemCount = 0;
172           for (PurApItem item : ((PurchasingAccountsPayableDocument)getDocument()).getItems()) {
173               populateAccountingLine(item.getNewSourceLine(), KFSPropertyConstants.DOCUMENT+"."+KFSPropertyConstants.ITEM+"["+itemCount+"]."+KFSPropertyConstants.NEW_SOURCE_LINE, parameterMap);
174               
175               int sourceLineCount = 0;
176               for (PurApAccountingLine purApLine : item.getSourceAccountingLines()) {
177                   populateAccountingLine(purApLine, KFSPropertyConstants.DOCUMENT+"."+KFSPropertyConstants.ITEM+"["+itemCount+"]."+KFSPropertyConstants.SOURCE_ACCOUNTING_LINE+"["+sourceLineCount+"]", parameterMap);
178                   sourceLineCount += 1;
179               }
180           }
181        }
182    }