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.TransactionStatementReportService;
032    import org.kuali.kfs.module.endow.report.util.EndowmentReportHeaderDataHolder;
033    import org.kuali.kfs.module.endow.report.util.TransactionStatementReportDataHolder;
034    import org.kuali.kfs.module.endow.report.util.TransactionStatementReportPrint;
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 TransactionStatementAction extends EndowmentReportBaseAction {
040    
041        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TransactionStatementAction.class);
042        
043        private final String REPORT_NAME = "Transaction Statement";
044        private final String REPORT_FILE_NAME = "TransactionStatementReport.pdf";
045        
046        public TransactionStatementAction() {
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            TransactionStatementForm transactionStatementForm = (TransactionStatementForm)form;
062            return mapping.findForward(KFSConstants.MAPPING_BASIC);
063        }
064    
065        /**
066         * Clears the form when the "clear" button is pressed
067         * 
068         * @param mapping
069         * @param form
070         * @param request
071         * @param response
072         * @return
073         * @throws Exception
074         */
075        public ActionForward clear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
076            TransactionStatementForm transactionStatementForm = (TransactionStatementForm) form;
077            transactionStatementForm.clear();
078            return mapping.findForward(KFSConstants.MAPPING_BASIC);
079        }
080    
081        /**
082         * Cancels the current page and goes to the start page
083         * 
084         * @param mapping
085         * @param form
086         * @param request
087         * @param response
088         * @return
089         * @throws Exception
090         */
091        public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
092            return mapping.findForward(KFSConstants.MAPPING_BASIC);
093        }
094    
095        /**
096         * Generates Transaction Statement in the PDF form
097         * 
098         * @param mapping
099         * @param form
100         * @param request
101         * @param response
102         * @return
103         * @throws Exception
104         */
105        public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
106            
107            TransactionStatementReportService transactionStatementReportService = SpringContext.getBean(TransactionStatementReportService.class);
108            
109            // get all the value strings from the form
110            TransactionStatementForm transactionStatementForm = (TransactionStatementForm) form;
111            String kemids = transactionStatementForm.getKemid();
112            String benefittingOrganziationCampuses = transactionStatementForm.getBenefittingOrganziationCampus();
113            String benefittingOrganziationCharts = transactionStatementForm.getBenefittingOrganziationChart();
114            String benefittingOrganziations = transactionStatementForm.getBenefittingOrganziation();
115            String typeCodes = transactionStatementForm.getTypeCode();
116            String purposeCodes = transactionStatementForm.getPurposeCode();
117            String combineGroupCodes = transactionStatementForm.getCombineGroupCode();
118            String beginningDate = transactionStatementForm.getBeginningDate();
119            String endingDate = transactionStatementForm.getEndingDate();
120            String endowmentOption = transactionStatementForm.getEndowmentOption();
121            String listKemidsInHeader = transactionStatementForm.getListKemidsInHeader();
122            String closedIndicator = transactionStatementForm.getClosedIndicator();
123            String message = transactionStatementForm.getMessage();
124    
125            List<TransactionStatementReportDataHolder> transactionStatementReportDataHolders = null;
126            
127            // check to see if the ending date is greater than the beginning date
128            SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
129            try {
130                java.util.Date beginDate = df.parse(beginningDate);
131                java.util.Date endDate = df.parse(endingDate);
132    
133                if (beginDate.compareTo(endDate) >= 0) {
134                    transactionStatementForm.setMessage(ERROR_REPORT_ENDING_DATE_NOT_GREATER_THAN_BEGINNING_DATE);
135                    return mapping.findForward(KFSConstants.MAPPING_BASIC);
136                }
137            } catch (ParseException e) {
138                transactionStatementForm.setMessage(e.getMessage());
139                return mapping.findForward(KFSConstants.MAPPING_BASIC);
140            }
141            
142            /*
143             * Creates the report data based on the selected criteria.
144             * The criteria are selected as follows.
145             * 1. Kemid and the other criteria cannot be selected at the same time.
146             * 2. If none of them are selected, all kemids will be selected.
147             * 3. The other criteria other than kemid are "OR" combined.
148             * 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) 
149             * 5. Beginning Date and Ending Date are required.
150             */
151            
152            if (StringUtils.isNotBlank(beginningDate) && StringUtils.isNotBlank(endingDate)) {
153                if (StringUtils.isNotBlank(kemids)) {
154                    
155                    if (( StringUtils.isNotBlank(benefittingOrganziationCampuses) 
156                        || StringUtils.isNotBlank(benefittingOrganziationCharts)
157                        || StringUtils.isNotBlank(benefittingOrganziations)
158                        || StringUtils.isNotBlank(typeCodes)
159                        || StringUtils.isNotBlank(purposeCodes) 
160                        || StringUtils.isNotBlank(combineGroupCodes) )) {
161                    
162                        // kemid and the other criteria cannot be selected at the same time 
163                        transactionStatementForm.setMessage(ERROR_REPORT_KEMID_WITH_OTHER_CRITERIA);
164                        return mapping.findForward(KFSConstants.MAPPING_BASIC);
165                        
166                    } else {
167                        // by kemid only
168                        List<String> kemidList = parseValueString(kemids, KEMID_SEPERATOR);                
169                        transactionStatementReportDataHolders = transactionStatementReportService.getTransactionStatementReportsByKemidByIds(kemidList, beginningDate, endingDate, endowmentOption, closedIndicator);
170                    }
171                } else {
172                    if (( StringUtils.isBlank(benefittingOrganziationCampuses) 
173                            && StringUtils.isBlank(benefittingOrganziationCharts)
174                            && StringUtils.isBlank(benefittingOrganziations)
175                            && StringUtils.isBlank(typeCodes)
176                            && StringUtils.isBlank(purposeCodes) 
177                            && StringUtils.isBlank(combineGroupCodes) )) {
178        
179                        // for all kemids
180                        transactionStatementReportDataHolders = transactionStatementReportService.getTransactionStatementReportForAllKemids(beginningDate, endingDate, endowmentOption, closedIndicator);
181                        
182                    } else {
183                        // by other criteria
184                        transactionStatementReportDataHolders = transactionStatementReportService.getTransactionStatementReportsByOtherCriteria(
185                            parseValueString(benefittingOrganziationCampuses, OTHER_CRITERIA_SEPERATOR), 
186                            parseValueString(benefittingOrganziationCharts, OTHER_CRITERIA_SEPERATOR), 
187                            parseValueString(benefittingOrganziations, OTHER_CRITERIA_SEPERATOR), 
188                            parseValueString(typeCodes, OTHER_CRITERIA_SEPERATOR), 
189                            parseValueString(purposeCodes, OTHER_CRITERIA_SEPERATOR), 
190                            parseValueString(combineGroupCodes, OTHER_CRITERIA_SEPERATOR), 
191                            beginningDate,
192                            endingDate,
193                            endowmentOption,
194                            closedIndicator);
195                    }
196                }
197            } else {
198                transactionStatementForm.setMessage(ERROR_BOTH_BEGINNING_AND_ENDING_DATE_REQUIRED);
199                return mapping.findForward(KFSConstants.MAPPING_BASIC);
200    
201            }
202                   
203            // See to see if you have something to print        
204            if (transactionStatementReportDataHolders != null && !transactionStatementReportDataHolders.isEmpty()) {
205                // prepare the header sheet data
206                EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder = transactionStatementReportService.createReportHeaderSheetData(
207                        getKemidsSelected(transactionStatementReportDataHolders),
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 TransactionStatementReportPrint().printTransactionStatementReport(reportRequestHeaderDataHolder, transactionStatementReportDataHolders, listKemidsInHeader);            
220                if (pdfStream != null) {
221                    transactionStatementForm.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            if (StringUtils.isBlank(kemids)) { 
229                transactionStatementForm.setMessage("Report was not generated.");
230            } else {
231                transactionStatementForm.setMessage("Report was not generated for " + kemids + ".");
232            }
233            
234            return mapping.findForward(KFSConstants.MAPPING_BASIC);        
235        }
236        
237        /**
238         * Retrieves all the kemids used for the report 
239         * 
240         * @param transactionStatementReportDataHolder
241         * @return
242         */
243        protected List<String> getKemidsSelected(List<TransactionStatementReportDataHolder> transactionStatementReportDataHolder) {
244            
245            List<String> kemids = new ArrayList<String>();
246            for (TransactionStatementReportDataHolder dataHolder : transactionStatementReportDataHolder) {
247                kemids.add(dataHolder.getKemid());
248            }
249            
250            return kemids;        
251        }
252        
253    }