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.BufferedInputStream;
019 import java.io.ByteArrayOutputStream;
020 import java.io.FileOutputStream;
021 import java.io.OutputStream;
022 import java.util.ArrayList;
023 import java.util.List;
024 import java.util.zip.ZipEntry;
025 import java.util.zip.ZipOutputStream;
026
027 import javax.servlet.ServletOutputStream;
028 import javax.servlet.http.HttpServletRequest;
029 import javax.servlet.http.HttpServletResponse;
030
031 import org.apache.commons.lang.StringUtils;
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.endow.report.service.TrialBalanceReportService;
036 import org.kuali.kfs.module.endow.report.util.EndowmentReportHeaderDataHolder;
037 import org.kuali.kfs.module.endow.report.util.TrialBalanceReportDataHolder;
038 import org.kuali.kfs.module.endow.report.util.TrialBalanceReportPrint;
039 import org.kuali.kfs.sys.KFSConstants;
040 import org.kuali.kfs.sys.context.SpringContext;
041 import org.kuali.rice.kns.util.WebUtils;
042
043 public class TrialBalanceAction extends EndowmentReportBaseAction {
044
045 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TrialBalanceAction.class);
046
047 private final String REPORT_NAME = "Trial Balance";
048 private final String REPORT_FILE_NAME = "TrialBalanceReport.pdf";
049
050 public TrialBalanceAction() {
051 super();
052 }
053
054 /**
055 * Directs to the start page
056 *
057 * @param mapping
058 * @param form
059 * @param request
060 * @param response
061 * @return
062 * @throws Exception
063 */
064 public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
065 return mapping.findForward(KFSConstants.MAPPING_BASIC);
066 }
067
068 /**
069 * Clears the form when the "clear" button is pressed
070 *
071 * @param mapping
072 * @param form
073 * @param request
074 * @param response
075 * @return
076 * @throws Exception
077 */
078 public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
079 TrialBalanceForm trialBalanceForm = (TrialBalanceForm) form;
080 trialBalanceForm.clear();
081 return mapping.findForward(KFSConstants.MAPPING_BASIC);
082 }
083
084 /**
085 * Cancels the current page and goes to the start page
086 *
087 * @param mapping
088 * @param form
089 * @param request
090 * @param response
091 * @return
092 * @throws Exception
093 */
094 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
095 return mapping.findForward(KFSConstants.MAPPING_BASIC);
096 }
097
098 /**
099 * Generates Trial Balance in the PDF form
100 *
101 * @param mapping
102 * @param form
103 * @param request
104 * @param response
105 * @return
106 * @throws Exception
107 */
108 public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
109
110 TrialBalanceReportService trialBalanceReportService = SpringContext.getBean(TrialBalanceReportService.class);
111
112 // get all the value strings from the form
113 TrialBalanceForm trialBalanceForm = (TrialBalanceForm) form;
114 String kemids = trialBalanceForm.getKemid();
115 String benefittingOrganziationCampuses = trialBalanceForm.getBenefittingOrganziationCampus();
116 String benefittingOrganziationCharts = trialBalanceForm.getBenefittingOrganziationChart();
117 String benefittingOrganziations = trialBalanceForm.getBenefittingOrganziation();
118 String typeCodes = trialBalanceForm.getTypeCode();
119 String purposeCodes = trialBalanceForm.getPurposeCode();
120 String combineGroupCodes = trialBalanceForm.getCombineGroupCode();
121 String asOfDate = trialBalanceForm.getAsOfDate();
122 String endowmentOption = trialBalanceForm.getEndowmentOption();
123 String listKemidsInHeader = trialBalanceForm.getListKemidsInHeader();
124 String closedIndicator = trialBalanceForm.getClosedIndicator();
125 String message = trialBalanceForm.getMessage();
126
127 List<TrialBalanceReportDataHolder> trialBalanceReportDataHolders = null;
128
129 /*
130 * Creates the report data based on the selected criteria.
131 * The criteria are selected as follows.
132 * 1. Kemid and the other criteria cannot be selected at the same time.
133 * 2. If none of them are selected, all kemids will be selected.
134 * 3. The other criteria other than kemid are AND-combined.
135 * 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)
136 */
137 if (StringUtils.isNotBlank(kemids)) {
138
139 if (( StringUtils.isNotBlank(benefittingOrganziationCampuses)
140 || StringUtils.isNotBlank(benefittingOrganziationCharts)
141 || StringUtils.isNotBlank(benefittingOrganziations)
142 || StringUtils.isNotBlank(typeCodes)
143 || StringUtils.isNotBlank(purposeCodes)
144 || StringUtils.isNotBlank(combineGroupCodes) )) {
145
146 // kemid and the other criteria cannot be selected at the same time
147 trialBalanceForm.setMessage(ERROR_REPORT_KEMID_WITH_OTHER_CRITERIA);
148 return mapping.findForward(KFSConstants.MAPPING_BASIC);
149
150 } else {
151 // by kemid only
152 List<String> kemidList = parseValueString(kemids, KEMID_SEPERATOR);
153 trialBalanceReportDataHolders = trialBalanceReportService.getTrialBalanceReportsByKemidByIds(kemidList, endowmentOption, closedIndicator);
154 }
155 } else {
156 if (( StringUtils.isBlank(benefittingOrganziationCampuses)
157 && StringUtils.isBlank(benefittingOrganziationCharts)
158 && StringUtils.isBlank(benefittingOrganziations)
159 && StringUtils.isBlank(typeCodes)
160 && StringUtils.isBlank(purposeCodes)
161 && StringUtils.isBlank(combineGroupCodes) )) {
162
163 // for all kemids
164 trialBalanceReportDataHolders = trialBalanceReportService.getTrialBalanceReportForAllKemids(endowmentOption, closedIndicator);
165
166 } else {
167 // by other criteria
168 trialBalanceReportDataHolders = trialBalanceReportService.getTrialBalanceReportsByOtherCriteria(
169 parseValueString(benefittingOrganziationCampuses, OTHER_CRITERIA_SEPERATOR),
170 parseValueString(benefittingOrganziationCharts, OTHER_CRITERIA_SEPERATOR),
171 parseValueString(benefittingOrganziations, OTHER_CRITERIA_SEPERATOR),
172 parseValueString(typeCodes, OTHER_CRITERIA_SEPERATOR),
173 parseValueString(purposeCodes, OTHER_CRITERIA_SEPERATOR),
174 parseValueString(combineGroupCodes, OTHER_CRITERIA_SEPERATOR),
175 endowmentOption,
176 closedIndicator);
177 }
178 }
179
180 // Check to see if you have something to print
181 if (trialBalanceReportDataHolders != null && !trialBalanceReportDataHolders.isEmpty()) {
182
183 // prepare the header sheet data
184 EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder = trialBalanceReportService.createReportHeaderSheetData(
185 getKemidsSelected(trialBalanceReportDataHolders),
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 REPORT_NAME,
193 endowmentOption,
194 null);
195
196 // generate the report in PDF
197 ByteArrayOutputStream pdfStream = new TrialBalanceReportPrint().printTrialBalanceReport(reportRequestHeaderDataHolder, trialBalanceReportDataHolders, listKemidsInHeader);
198 if (pdfStream != null) {
199 trialBalanceForm.setMessage("Reports Generated");
200 WebUtils.saveMimeOutputStreamAsFile(response, "application/pdf", pdfStream, REPORT_FILE_NAME);
201 return null;
202 }
203 }
204
205 // No report was generated
206 if (StringUtils.isBlank(kemids)) {
207 trialBalanceForm.setMessage("Report was not generated.");
208 } else {
209 trialBalanceForm.setMessage("Report was not generated for " + kemids + ".");
210 }
211
212 return mapping.findForward(KFSConstants.MAPPING_BASIC);
213 }
214
215 /**
216 * Retrieves all the kemids used for the report
217 *
218 * @param trialBalanceReportDataHolder
219 * @return
220 */
221 protected List<String> getKemidsSelected(List<TrialBalanceReportDataHolder> trialBalanceReportDataHolder) {
222 List<String> kemids = new ArrayList<String>();
223 for (TrialBalanceReportDataHolder dataHolder : trialBalanceReportDataHolder) {
224 kemids.add(dataHolder.getKemid());
225 }
226 return kemids;
227 }
228
229 }