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.endow.web.struts; 017 018 import java.io.ByteArrayOutputStream; 019 import java.text.ParseException; 020 import java.text.SimpleDateFormat; 021 import java.util.ArrayList; 022 import java.util.List; 023 024 import javax.servlet.http.HttpServletRequest; 025 import javax.servlet.http.HttpServletResponse; 026 027 import org.apache.commons.lang.StringUtils; 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.endow.report.service.TransactionSummaryReportService; 032 import org.kuali.kfs.module.endow.report.util.EndowmentReportHeaderDataHolder; 033 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportDataHolder; 034 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportPrint; 035 import org.kuali.kfs.sys.KFSConstants; 036 import org.kuali.kfs.sys.context.SpringContext; 037 import org.kuali.rice.kns.util.WebUtils; 038 039 public class TransactionSummaryAction extends EndowmentReportBaseAction { 040 041 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TransactionSummaryAction.class); 042 043 private final String REPORT_NAME = "Transaction Summary"; 044 private final String REPORT_FILE_NAME = "TransactionSummaryReport.pdf"; 045 046 public TransactionSummaryAction() { 047 super(); 048 } 049 050 /** 051 * Directs to the start page 052 * 053 * @param mapping 054 * @param form 055 * @param request 056 * @param response 057 * @return 058 * @throws Exception 059 */ 060 public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 061 return mapping.findForward(KFSConstants.MAPPING_BASIC); 062 } 063 064 /** 065 * Clears the form when the "clear" button is pressed 066 * 067 * @param mapping 068 * @param form 069 * @param request 070 * @param response 071 * @return 072 * @throws Exception 073 */ 074 public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 075 TransactionSummaryForm transactionStatementForm = (TransactionSummaryForm) form; 076 transactionStatementForm.clear(); 077 return mapping.findForward(KFSConstants.MAPPING_BASIC); 078 } 079 080 /** 081 * Cancels the current page and goes to the start page 082 * 083 * @param mapping 084 * @param form 085 * @param request 086 * @param response 087 * @return 088 * @throws Exception 089 */ 090 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 091 return mapping.findForward(KFSConstants.MAPPING_BASIC); 092 } 093 094 /** 095 * Generates Transaction Statement in the PDF form 096 * 097 * @param mapping 098 * @param form 099 * @param request 100 * @param response 101 * @return 102 * @throws Exception 103 */ 104 public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 105 106 TransactionSummaryReportService transactionSummaryReportService = SpringContext.getBean(TransactionSummaryReportService.class); 107 108 // get all the value strings from the form 109 TransactionSummaryForm transactionSummaryForm = (TransactionSummaryForm) form; 110 String kemids = transactionSummaryForm.getKemid(); 111 String benefittingOrganziationCampuses = transactionSummaryForm.getBenefittingOrganziationCampus(); 112 String benefittingOrganziationCharts = transactionSummaryForm.getBenefittingOrganziationChart(); 113 String benefittingOrganziations = transactionSummaryForm.getBenefittingOrganziation(); 114 String typeCodes = transactionSummaryForm.getTypeCode(); 115 String purposeCodes = transactionSummaryForm.getPurposeCode(); 116 String combineGroupCodes = transactionSummaryForm.getCombineGroupCode(); 117 String beginningDate = transactionSummaryForm.getBeginningDate(); 118 String endingDate = transactionSummaryForm.getEndingDate(); 119 String endowmentOption = transactionSummaryForm.getEndowmentOption(); 120 String reportOption = transactionSummaryForm.getReportOption(); 121 String listKemidsOnHeader = transactionSummaryForm.getListKemidsInHeader(); 122 String summaryTotalsOnly = transactionSummaryForm.getSummaryTotalsOnly(); 123 String closedIndicator = transactionSummaryForm.getClosedIndicator(); 124 String message = transactionSummaryForm.getMessage(); 125 126 // check to see if the ending date is greater than the beginning date 127 SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 128 try { 129 java.util.Date beginDate = df.parse(beginningDate); 130 java.util.Date endDate = df.parse(endingDate); 131 132 if (beginDate.compareTo(endDate) >= 0) { 133 transactionSummaryForm.setMessage(ERROR_REPORT_ENDING_DATE_NOT_GREATER_THAN_BEGINNING_DATE); 134 return mapping.findForward(KFSConstants.MAPPING_BASIC); 135 } 136 } catch (ParseException e) { 137 transactionSummaryForm.setMessage(e.getMessage()); 138 return mapping.findForward(KFSConstants.MAPPING_BASIC); 139 } 140 141 List<TransactionSummaryReportDataHolder> transactionSummaryReportList = null; 142 143 /* 144 * Creates the report data based on the selected criteria. 145 * The criteria are selected as follows. 146 * 1. Kemid and the other criteria cannot be selected at the same time. 147 * 2. If none of them are selected, all kemids will be selected. 148 * 3. The other criteria other than kemid are "OR" combined. 149 * 4. All the criteria in the text input can be multiple by the use of wild card or the separator ('&' for kemid, ',' for the others) 150 * 5. Beginning Date and Ending Date are required. 151 */ 152 153 if (StringUtils.isNotBlank(beginningDate) && StringUtils.isNotBlank(endingDate)) { 154 if (StringUtils.isNotBlank(kemids)) { 155 156 if (( StringUtils.isNotBlank(benefittingOrganziationCampuses) 157 || StringUtils.isNotBlank(benefittingOrganziationCharts) 158 || StringUtils.isNotBlank(benefittingOrganziations) 159 || StringUtils.isNotBlank(typeCodes) 160 || StringUtils.isNotBlank(purposeCodes) 161 || StringUtils.isNotBlank(combineGroupCodes) )) { 162 163 // kemid and the other criteria cannot be selected at the same time 164 transactionSummaryForm.setMessage(ERROR_REPORT_KEMID_WITH_OTHER_CRITERIA); 165 return mapping.findForward(KFSConstants.MAPPING_BASIC); 166 167 } else { 168 // by kemid only 169 List<String> kemidList = parseValueString(kemids, KEMID_SEPERATOR); 170 transactionSummaryReportList = transactionSummaryReportService.getTransactionSummaryReportsByKemidByIds(kemidList, beginningDate, endingDate, endowmentOption, closedIndicator, reportOption); 171 } 172 } else { 173 if (( StringUtils.isBlank(benefittingOrganziationCampuses) 174 && StringUtils.isBlank(benefittingOrganziationCharts) 175 && StringUtils.isBlank(benefittingOrganziations) 176 && StringUtils.isBlank(typeCodes) 177 && StringUtils.isBlank(purposeCodes) 178 && StringUtils.isBlank(combineGroupCodes) )) { 179 180 // for all kemids 181 transactionSummaryReportList = transactionSummaryReportService.getTransactionSummaryReportForAllKemids(beginningDate, endingDate, endowmentOption, closedIndicator, reportOption); 182 183 } else { 184 // by other criteria 185 transactionSummaryReportList = transactionSummaryReportService.getTransactionSummaryReportsByOtherCriteria( 186 parseValueString(benefittingOrganziationCampuses, OTHER_CRITERIA_SEPERATOR), 187 parseValueString(benefittingOrganziationCharts, OTHER_CRITERIA_SEPERATOR), 188 parseValueString(benefittingOrganziations, OTHER_CRITERIA_SEPERATOR), 189 parseValueString(typeCodes, OTHER_CRITERIA_SEPERATOR), 190 parseValueString(purposeCodes, OTHER_CRITERIA_SEPERATOR), 191 parseValueString(combineGroupCodes, OTHER_CRITERIA_SEPERATOR), 192 beginningDate, 193 endingDate, 194 endowmentOption, 195 closedIndicator, reportOption); 196 } 197 } 198 } else { 199 transactionSummaryForm.setMessage(ERROR_BOTH_BEGINNING_AND_ENDING_DATE_REQUIRED); 200 return mapping.findForward(KFSConstants.MAPPING_BASIC); 201 } 202 203 // see if you have something to print 204 if (transactionSummaryReportList != null && !transactionSummaryReportList.isEmpty()) { 205 // prepare the header sheet data 206 EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder = transactionSummaryReportService.createReportHeaderSheetData( 207 getKemidsSelected(transactionSummaryReportList), 208 parseValueString(benefittingOrganziationCampuses, OTHER_CRITERIA_SEPERATOR), 209 parseValueString(benefittingOrganziationCharts, OTHER_CRITERIA_SEPERATOR), 210 parseValueString(benefittingOrganziations, OTHER_CRITERIA_SEPERATOR), 211 parseValueString(typeCodes, OTHER_CRITERIA_SEPERATOR), 212 parseValueString(purposeCodes, OTHER_CRITERIA_SEPERATOR), 213 parseValueString(combineGroupCodes, OTHER_CRITERIA_SEPERATOR), 214 REPORT_NAME, 215 endowmentOption, 216 null); 217 218 // generate the report in PDF 219 ByteArrayOutputStream pdfStream = new TransactionSummaryReportPrint().printTransactionSummaryReport(reportRequestHeaderDataHolder, transactionSummaryReportList, listKemidsOnHeader, reportOption, summaryTotalsOnly); 220 if (pdfStream != null) { 221 transactionSummaryForm.setMessage("Reports Generated"); 222 WebUtils.saveMimeOutputStreamAsFile(response, "application/pdf", pdfStream, REPORT_FILE_NAME); 223 return null; 224 } 225 } 226 227 // No report was generated 228 transactionSummaryForm.setMessage("Report was not generated for " + kemids + "."); 229 230 return mapping.findForward(KFSConstants.MAPPING_BASIC); 231 232 } 233 234 /** 235 * Retrieves all the kemids used for the report 236 * 237 * @param transactionStatementReportDataHolder 238 * @return 239 */ 240 protected List<String> getKemidsSelected(List<TransactionSummaryReportDataHolder> transactionSummaryReportList) { 241 242 List<String> kemids = new ArrayList<String>(); 243 for (TransactionSummaryReportDataHolder dataHolder : transactionSummaryReportList) { 244 kemids.add(dataHolder.getKemid()); 245 } 246 247 return kemids; 248 } 249 250 }