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.ar.web.struts;
017    
018    import java.io.ByteArrayOutputStream;
019    import java.io.File;
020    import java.util.ArrayList;
021    import java.util.HashMap;
022    import java.util.List;
023    import java.util.Set;
024    
025    import javax.servlet.ServletOutputStream;
026    import javax.servlet.http.HttpServletRequest;
027    import javax.servlet.http.HttpServletResponse;
028    
029    import org.apache.commons.lang.StringUtils;
030    import org.apache.struts.action.ActionForm;
031    import org.apache.struts.action.ActionForward;
032    import org.apache.struts.action.ActionMapping;
033    import org.kuali.kfs.module.ar.report.service.AccountsReceivableReportService;
034    import org.kuali.kfs.sys.KFSConstants;
035    import org.kuali.kfs.sys.context.SpringContext;
036    import org.kuali.rice.kns.web.struts.action.KualiAction;
037    
038    import com.lowagie.text.Document;
039    import com.lowagie.text.pdf.PdfCopy;
040    import com.lowagie.text.pdf.PdfImportedPage;
041    import com.lowagie.text.pdf.PdfReader;
042    import com.lowagie.text.pdf.SimpleBookmark;
043    
044    /**
045     * This class handles Actions for lookup flow
046     */
047    
048    public class CustomerStatementAction extends KualiAction {
049        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerStatementAction.class);
050    
051        public CustomerStatementAction() {
052            super();
053        }
054    
055        public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
056            return mapping.findForward(KFSConstants.MAPPING_BASIC);
057        }
058    
059        public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
060            CustomerStatementForm csForm = (CustomerStatementForm)form;
061            csForm.clear();
062            return mapping.findForward(KFSConstants.MAPPING_BASIC);
063        }
064    
065        public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
066            return mapping.findForward(KFSConstants.MAPPING_BASIC);
067        }
068    
069        public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
070            String basePath = getBasePath(request);
071            CustomerStatementForm csForm = (CustomerStatementForm) form;
072            String chartCode = csForm.getChartCode();
073            String orgCode = csForm.getOrgCode();
074            String customerNumber = csForm.getCustomerNumber();
075            String accountNumber = csForm.getAccountNumber();
076    
077            HashMap<String, String> params = new HashMap<String, String>();
078            if(!StringUtils.isBlank(chartCode)) {
079                params.put("chartCode", chartCode);
080            }
081            if(!StringUtils.isBlank(orgCode)) {
082                params.put("orgCode", orgCode);
083            }
084            if(!StringUtils.isBlank(customerNumber)) {
085                params.put("customerNumber", customerNumber);
086            }
087            if(!StringUtils.isBlank(accountNumber)) {
088                params.put("accountNumber", accountNumber);
089            }
090            
091            
092            String methodToCallPrintPDF = "printStatementPDF";
093            String methodToCallStart = "start";
094            String printPDFUrl = getUrlForPrintStatement(basePath, methodToCallPrintPDF, params);
095            String displayTabbedPageUrl = getUrlForPrintStatement(basePath, methodToCallStart, params);
096            
097            request.setAttribute("printPDFUrl", printPDFUrl);
098            request.setAttribute("displayTabbedPageUrl", displayTabbedPageUrl);
099            if(!StringUtils.isBlank(chartCode)) {
100                request.setAttribute("chartCode", chartCode);
101            }
102            if(!StringUtils.isBlank(orgCode)) {
103                request.setAttribute("orgCode", orgCode);
104            }
105            if(!StringUtils.isBlank(customerNumber)) {
106                request.setAttribute("customerNumber", customerNumber);
107            }
108            if(!StringUtils.isBlank(accountNumber)) {
109                request.setAttribute("accountNumber", accountNumber);
110            }
111            request.setAttribute("printLabel", "Customer Statement");
112            return mapping.findForward("arPrintPDF");
113            
114        }
115        
116        public ActionForward printStatementPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
117            
118            CustomerStatementForm csForm = (CustomerStatementForm)form;
119            String chartCode = request.getParameter("chartCode");
120            chartCode = chartCode==null?"":chartCode;
121            String orgCode = request.getParameter("orgCode");
122            orgCode = orgCode==null?"":orgCode;
123            String customerNumber = request.getParameter("customerNumber");
124            customerNumber = customerNumber==null?"":customerNumber;
125            String accountNumber = request.getParameter("accountNumber");
126            accountNumber = accountNumber==null?"":accountNumber;
127            AccountsReceivableReportService reportService = SpringContext.getBean(AccountsReceivableReportService.class);
128            List<File> reports = new ArrayList<File>();
129            
130            StringBuilder fileName = new StringBuilder();
131            String contentDisposition = "";
132            
133            if ( !StringUtils.isBlank(chartCode) && !StringUtils.isBlank(orgCode)) {
134                reports = reportService.generateStatementByBillingOrg(chartCode, orgCode); 
135                fileName.append(chartCode);
136                fileName.append(orgCode);
137            } else if (!StringUtils.isBlank(customerNumber)) {
138                reports = reportService.generateStatementByCustomer(customerNumber.toUpperCase());
139                fileName.append(customerNumber);
140            } else if (!StringUtils.isBlank(accountNumber)) {
141                reports = reportService.generateStatementByAccount(accountNumber);
142                fileName.append(accountNumber);
143            }
144            if (reports.size() !=0) {
145                ByteArrayOutputStream baos = new ByteArrayOutputStream();
146                try {
147                    int pageOffset = 0;
148                    ArrayList master = new ArrayList();
149                    int f = 0;
150                    //   File file = new File(fileName);
151                    Document document = null;
152                    PdfCopy  writer = null;
153                    for (File file : reports) {
154                        // we create a reader for a certain document
155                        String reportName = file.getAbsolutePath();
156                        PdfReader reader = new PdfReader(reportName);
157                        reader.consolidateNamedDestinations();
158                        // we retrieve the total number of pages
159                        int n = reader.getNumberOfPages();
160                        List bookmarks = SimpleBookmark.getBookmark(reader);
161                        if (bookmarks != null) {
162                            if (pageOffset != 0) {
163                                SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null);
164                            }
165                            master.addAll(bookmarks);
166                        }
167                        pageOffset += n;
168    
169                        if (f == 0) {
170                            // step 1: creation of a document-object
171                            document = new Document(reader.getPageSizeWithRotation(1));
172                            // step 2: we create a writer that listens to the document
173                            writer = new PdfCopy(document, baos);
174                            // step 3: we open the document
175                            document.open();
176                        }
177                        // step 4: we add content
178                        PdfImportedPage page;
179                        for (int i = 0; i < n; ) {
180                            ++i;
181                            page = writer.getImportedPage(reader, i);
182                            writer.addPage(page);
183                        }
184                        writer.freeReader(reader);
185                        f++;
186                    }
187                    if (!master.isEmpty())
188                        writer.setOutlines(master);
189                    // step 5: we close the document
190    
191                    document.close();
192                    // csForm.setReports(file);
193                    
194                    StringBuffer sbContentDispValue = new StringBuffer();
195                    String useJavascript = request.getParameter("useJavascript");
196                    if (useJavascript == null || useJavascript.equalsIgnoreCase("false")) {
197                        sbContentDispValue.append("attachment");
198                    }
199                    else {
200                        sbContentDispValue.append("inline");
201                    }
202                    sbContentDispValue.append("; filename=");
203                    sbContentDispValue.append(fileName);
204                    
205                    contentDisposition = sbContentDispValue.toString();
206                }
207                catch(Exception e) {
208                    e.printStackTrace();
209                } 
210    
211                fileName.append("-StatementBatchPDFs.pdf");
212    
213                response.setContentType("application/pdf");
214                response.setHeader("Content-disposition", contentDisposition);
215                response.setHeader("Expires", "0");
216                response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
217                response.setHeader("Pragma", "public");
218                response.setContentLength(baos.size());
219    
220                // write to output
221                ServletOutputStream sos = response.getOutputStream();
222                baos.writeTo(sos);
223                sos.flush();
224                sos.close();
225                
226                return null;
227            }
228            csForm.setMessage("No Reports Generated");
229            return mapping.findForward(KFSConstants.MAPPING_BASIC);
230        }
231        /**
232         * Creates a URL to be used in printing the purchase order.
233         * 
234         * @param basePath String: The base path of the current URL
235         * @param methodToCall String: The name of the method that will be invoked to do this particular print
236         * @return The URL
237         */
238        private String getUrlForPrintStatement(String basePath, String methodToCall, HashMap<String, String> params) {
239            StringBuffer result = new StringBuffer(basePath);
240            result.append("/arCustomerStatement.do?methodToCall=").append(methodToCall);
241            Set<String> keys = params.keySet();
242            for(String key : keys) {
243                result.append("&").append(key).append("=").append(params.get(key));
244            }
245    
246            return result.toString();
247        }
248    
249    }