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.bc.document.web.struts; 017 018 import java.io.ByteArrayOutputStream; 019 import java.util.ArrayList; 020 import java.util.Collection; 021 import java.util.HashMap; 022 import java.util.List; 023 import java.util.Locale; 024 import java.util.Map; 025 import java.util.ResourceBundle; 026 027 import javax.servlet.http.HttpServletRequest; 028 import javax.servlet.http.HttpServletResponse; 029 030 import net.sf.jasperreports.engine.JRParameter; 031 032 import org.apache.struts.action.ActionForm; 033 import org.apache.struts.action.ActionForward; 034 import org.apache.struts.action.ActionMapping; 035 import org.kuali.kfs.module.bc.BCConstants; 036 import org.kuali.kfs.module.bc.BudgetConstructionReportMode; 037 import org.kuali.kfs.module.bc.document.service.BudgetConstructionAccountMonthlyDetailReportService; 038 import org.kuali.kfs.module.bc.document.service.BudgetConstructionAccountSalaryDetailReportService; 039 import org.kuali.kfs.module.bc.document.service.BudgetConstructionDocumentAccountObjectDetailReportService; 040 import org.kuali.kfs.module.bc.document.service.BudgetConstructionReportsServiceHelper; 041 import org.kuali.kfs.module.bc.util.BudgetUrlUtil; 042 import org.kuali.kfs.sys.KFSConstants; 043 import org.kuali.kfs.sys.KFSPropertyConstants; 044 import org.kuali.kfs.sys.KFSConstants.ReportGeneration; 045 import org.kuali.kfs.sys.context.SpringContext; 046 import org.kuali.kfs.sys.service.ReportGenerationService; 047 import org.kuali.rice.kns.util.GlobalVariables; 048 import org.kuali.rice.kns.util.WebUtils; 049 050 /** 051 * Action class to display document reports and dumps menu 052 */ 053 public class ReportRunnerAction extends BudgetExpansionAction { 054 055 /** 056 * Handles any special onetime setup when called from another screen action 057 * 058 * @param mapping 059 * @param form 060 * @param request 061 * @param response 062 * @return 063 * @throws Exception 064 */ 065 public ActionForward loadExpansionScreen(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 066 067 ReportRunnerForm reportRunnerForm = (ReportRunnerForm) form; 068 069 return mapping.findForward(KFSConstants.MAPPING_BASIC); 070 } 071 072 /** 073 * Runs the reports or dump selected by the user using the BudgetConstructionDocumentReportMode to help determine the various 074 * objects needed to actually build the report data and render the report. 075 * 076 * @param mapping 077 * @param form 078 * @param request 079 * @param response 080 * @return 081 * @throws Exception 082 */ 083 public ActionForward performReportDump(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 084 085 ReportRunnerForm reportRunnerForm = (ReportRunnerForm) form; 086 String principalName = GlobalVariables.getUserSession().getPerson().getPrincipalId(); 087 088 int selectIndex = this.getSelectedLine(request); 089 String reportModeName = reportRunnerForm.getBudgetConstructionDocumentReportModes().get(selectIndex).getReportModeName(); 090 091 Collection reportSet = new ArrayList(); 092 String jasperFileName = null; 093 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 094 switch (selectIndex) { 095 096 case 0: { 097 jasperFileName = "BudgetAccountObjectDetail"; 098 SpringContext.getBean(BudgetConstructionDocumentAccountObjectDetailReportService.class).updateDocumentAccountObjectDetailReportTable(principalName, reportRunnerForm.getDocumentNumber(), reportRunnerForm.getUniversityFiscalYear(), reportRunnerForm.getChartOfAccountsCode(), reportRunnerForm.getAccountNumber(), reportRunnerForm.getSubAccountNumber()); 099 reportSet = SpringContext.getBean(BudgetConstructionDocumentAccountObjectDetailReportService.class).buildReports(principalName); 100 break; 101 } 102 103 104 case 1: { 105 jasperFileName = "BudgetAccountSalaryDetail"; 106 reportSet = SpringContext.getBean(BudgetConstructionAccountSalaryDetailReportService.class).buildReports(reportRunnerForm.getUniversityFiscalYear(), reportRunnerForm.getChartOfAccountsCode(), reportRunnerForm.getAccountNumber(), reportRunnerForm.getSubAccountNumber()); 107 break; 108 } 109 110 111 case 2: { 112 jasperFileName = "BudgetAccountMonthlyDetail"; 113 reportSet = SpringContext.getBean(BudgetConstructionAccountMonthlyDetailReportService.class).buildReports(reportRunnerForm.getDocumentNumber(), reportRunnerForm.getUniversityFiscalYear(), reportRunnerForm.getChartOfAccountsCode(), reportRunnerForm.getAccountNumber(), reportRunnerForm.getSubAccountNumber()); 114 break; 115 } 116 case 3: { 117 return new ActionForward(buildReportExportForwardURL(reportRunnerForm, mapping, BudgetConstructionReportMode.ACCOUNT_EXPORT.reportModeName), true); 118 } 119 120 case 4: { 121 return new ActionForward(buildReportExportForwardURL(reportRunnerForm, mapping, BudgetConstructionReportMode.FUNDING_EXPORT.reportModeName), true); 122 } 123 124 case 5: { 125 return new ActionForward(buildReportExportForwardURL(reportRunnerForm, mapping, BudgetConstructionReportMode.MONTHLY_EXPORT.reportModeName), true); 126 } 127 128 } 129 130 if (reportSet.isEmpty()) { 131 List<String> messageList = new ArrayList<String>(); 132 messageList.add(BCConstants.Report.MSG_REPORT_NO_DATA); 133 SpringContext.getBean(BudgetConstructionReportsServiceHelper.class).generatePdf(messageList, baos); 134 WebUtils.saveMimeOutputStreamAsFile(response, ReportGeneration.PDF_MIME_TYPE, baos, jasperFileName + ReportGeneration.PDF_FILE_EXTENSION); 135 } 136 else { 137 ResourceBundle resourceBundle = ResourceBundle.getBundle(BCConstants.Report.REPORT_MESSAGES_CLASSPATH, Locale.getDefault()); 138 Map<String, Object> reportData = new HashMap<String, Object>(); 139 reportData.put(JRParameter.REPORT_RESOURCE_BUNDLE, resourceBundle); 140 141 SpringContext.getBean(ReportGenerationService.class).generateReportToOutputStream(reportData, reportSet, BCConstants.Report.REPORT_TEMPLATE_CLASSPATH + jasperFileName, baos); 142 WebUtils.saveMimeOutputStreamAsFile(response, ReportGeneration.PDF_MIME_TYPE, baos, jasperFileName + ReportGeneration.PDF_FILE_EXTENSION); 143 } 144 return null; 145 } 146 147 /** 148 * Builds URL for the report dump url. 149 */ 150 private String buildReportExportForwardURL(ReportRunnerForm reportRunnerForm, ActionMapping mapping, String documentReportMode) { 151 Map<String, String> parameters = new HashMap<String, String>(); 152 153 parameters.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, reportRunnerForm.getChartOfAccountsCode()); 154 parameters.put(KFSPropertyConstants.ACCOUNT_NUMBER, reportRunnerForm.getAccountNumber()); 155 parameters.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, reportRunnerForm.getSubAccountNumber()); 156 parameters.put(BCConstants.Report.REPORT_MODE, documentReportMode); 157 parameters.put(BCConstants.IS_ORG_REPORT_REQUEST_PARAMETER, "false"); 158 159 return BudgetUrlUtil.buildBudgetUrl(mapping, reportRunnerForm, BCConstants.REPORT_EXPORT_ACTION, parameters); 160 } 161 }