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.sql.Date; 021 import java.util.ArrayList; 022 import java.util.Iterator; 023 import java.util.List; 024 025 import javax.servlet.http.HttpServletRequest; 026 import javax.servlet.http.HttpServletResponse; 027 028 import org.apache.struts.action.ActionForm; 029 import org.apache.struts.action.ActionForward; 030 import org.apache.struts.action.ActionMapping; 031 import org.kuali.kfs.module.ar.report.service.AccountsReceivableReportService; 032 import org.kuali.kfs.sys.KFSConstants; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.rice.kns.util.WebUtils; 035 import org.kuali.rice.kns.web.struts.action.KualiAction; 036 037 import com.lowagie.text.Document; 038 import com.lowagie.text.pdf.PdfCopy; 039 import com.lowagie.text.pdf.PdfImportedPage; 040 import com.lowagie.text.pdf.PdfReader; 041 import com.lowagie.text.pdf.SimpleBookmark; 042 043 /** 044 * This class handles Actions for lookup flow 045 */ 046 047 public class CustomerInvoiceAction extends KualiAction { 048 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerInvoiceAction.class); 049 050 /** 051 * 052 * Constructs a CustomerInvoiceAction.java. 053 */ 054 public CustomerInvoiceAction() { 055 super(); 056 } 057 058 /** 059 * 060 * This method... 061 * @param mapping 062 * @param form 063 * @param request 064 * @param response 065 * @return 066 * @throws Exception 067 */ 068 public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 069 return mapping.findForward(KFSConstants.MAPPING_BASIC); 070 } 071 072 /** 073 * 074 * This method... 075 * @param mapping 076 * @param form 077 * @param request 078 * @param response 079 * @return 080 * @throws Exception 081 */ 082 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 083 084 return mapping.findForward(KFSConstants.MAPPING_BASIC); 085 } 086 087 /** 088 * 089 * This method... 090 * @param mapping 091 * @param form 092 * @param request 093 * @param response 094 * @return 095 * @throws Exception 096 */ 097 public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 098 CustomerInvoiceForm ciForm = (CustomerInvoiceForm)form; 099 ciForm.setChartCode(null); 100 ciForm.setOrgCode(null); 101 ciForm.setOrgType(null); 102 ciForm.setRunDate(null); 103 ciForm.setMessage(null); 104 return mapping.findForward(KFSConstants.MAPPING_BASIC); 105 } 106 107 /** 108 * 109 * This method... 110 * @param mapping 111 * @param form 112 * @param request 113 * @param response 114 * @return 115 * @throws Exception 116 */ 117 public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 118 CustomerInvoiceForm ciForm = (CustomerInvoiceForm)form; 119 120 String org = ciForm.getOrgCode(); 121 String chart = ciForm.getChartCode(); 122 Date date = ciForm.getRunDate(); 123 124 StringBuilder fileName = new StringBuilder(); 125 126 AccountsReceivableReportService reportService = SpringContext.getBean(AccountsReceivableReportService.class); 127 List<File> reports = new ArrayList<File>(); 128 if (ciForm.getOrgType() != null && chart != null && org != null) { 129 if (ciForm.getOrgType().equals("B")) { 130 reports = reportService.generateInvoicesByBillingOrg(chart, org, date); 131 } 132 else if (ciForm.getOrgType().equals("P")) { 133 reports = reportService.generateInvoicesByProcessingOrg(chart, org, date); 134 } 135 fileName.append(chart); 136 fileName.append(org); 137 if (date != null) { 138 fileName.append(date); 139 } 140 } else if (ciForm.getUserId() != null) { 141 reports = reportService.generateInvoicesByInitiator(ciForm.getUserId(), date); 142 fileName.append(ciForm.getUserId()); 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 Document document = null; 151 PdfCopy writer = null; 152 for (Iterator<File> itr = reports.iterator(); itr.hasNext();) { 153 // we create a reader for a certain document 154 String reportName = itr.next().getAbsolutePath(); 155 PdfReader reader = new PdfReader(reportName); 156 reader.consolidateNamedDestinations(); 157 // we retrieve the total number of pages 158 int n = reader.getNumberOfPages(); 159 List bookmarks = SimpleBookmark.getBookmark(reader); 160 if (bookmarks != null) { 161 if (pageOffset != 0) { 162 SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null); 163 } 164 master.addAll(bookmarks); 165 } 166 pageOffset += n; 167 168 if (f == 0) { 169 // step 1: creation of a document-object 170 document = new Document(reader.getPageSizeWithRotation(1)); 171 // step 2: we create a writer that listens to the document 172 writer = new PdfCopy(document, baos); 173 // step 3: we open the document 174 document.open(); 175 } 176 // step 4: we add content 177 PdfImportedPage page; 178 for (int i = 0; i < n; ) { 179 ++i; 180 page = writer.getImportedPage(reader, i); 181 writer.addPage(page); 182 } 183 writer.freeReader(reader); 184 f++; 185 } 186 if (!master.isEmpty()) 187 writer.setOutlines(master); 188 // step 5: we close the document 189 190 document.close(); 191 // csForm.setReports(file); 192 } 193 catch(Exception e) { 194 e.printStackTrace(); 195 } 196 fileName.append("-InvoiceBatchPDFs.pdf"); 197 198 199 WebUtils.saveMimeOutputStreamAsFile(response, "application/pdf", baos, fileName.toString()); 200 ciForm.setMessage(reports.size()+" Reports Generated"); 201 return null; 202 } 203 ciForm.setMessage("No Reports Generated"); 204 return mapping.findForward(KFSConstants.MAPPING_BASIC); 205 } 206 207 }