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.gl.report;
017    
018    import java.text.MessageFormat;
019    import java.util.ArrayList;
020    import java.util.Collections;
021    import java.util.LinkedHashMap;
022    import java.util.List;
023    import java.util.Map;
024    
025    import org.kuali.kfs.gl.businessobject.OriginEntryInformation;
026    import org.kuali.kfs.gl.businessobject.PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal;
027    import org.kuali.kfs.gl.businessobject.PosterOutputSummaryBalanceTypeFiscalYearTotal;
028    import org.kuali.kfs.gl.businessobject.PosterOutputSummaryBalanceTypeTotal;
029    import org.kuali.kfs.gl.businessobject.PosterOutputSummaryEntry;
030    import org.kuali.kfs.gl.businessobject.PosterOutputSummaryTotal;
031    import org.kuali.kfs.gl.businessobject.Transaction;
032    import org.kuali.kfs.gl.service.PosterOutputSummaryService;
033    import org.kuali.kfs.sys.KFSKeyConstants;
034    import org.kuali.kfs.sys.context.SpringContext;
035    import org.kuali.kfs.sys.service.ReportWriterService;
036    import org.kuali.rice.kns.service.KualiConfigurationService;
037    
038    /**
039     * A class which builds up the data and then reports the PosterOutputSummary report
040     */
041    public class PosterOutputSummaryReport {
042        private Map<String, PosterOutputSummaryEntry> posterOutputSummaryEntries;
043        private PosterOutputSummaryTotal posterOutputSummaryTotal;
044        private PosterOutputSummaryService posterOutputSummaryService;
045        
046        /**
047         * Constructs a PosterOutputSummaryReport
048         */
049        public PosterOutputSummaryReport() {
050            posterOutputSummaryTotal = new PosterOutputSummaryTotal();
051            posterOutputSummaryEntries = new LinkedHashMap<String, PosterOutputSummaryEntry>();
052        }
053        
054        /**
055         * Summarizes a transaction for this report
056         * @param transaction the transaction to summarize
057         */
058        public void summarize(Transaction transaction) {
059            getPosterOutputSummaryService().summarize(transaction, posterOutputSummaryEntries);
060        }
061        
062        /**
063         * Summarizes an origin entry for this report
064         * @param originEntry the origin entry to summarize
065         */
066        public void summarize(OriginEntryInformation originEntry) {
067            getPosterOutputSummaryService().summarize(originEntry, posterOutputSummaryEntries);
068        }
069        
070        /**
071         * Writes the report to the given reportWriterService
072         * @param reportWriterService the reportWriterService to write the report to
073         */
074        public void writeReport(ReportWriterService reportWriterService) {
075            List<PosterOutputSummaryEntry> entries = new ArrayList<PosterOutputSummaryEntry>(posterOutputSummaryEntries.values());
076            
077            if (entries.size() > 0) {
078                Collections.sort(entries, getPosterOutputSummaryService().getEntryComparator());
079                final KualiConfigurationService configurationService = SpringContext.getBean(KualiConfigurationService.class);
080                
081                String currentBalanceTypeCode = entries.get(0).getBalanceTypeCode();
082                PosterOutputSummaryBalanceTypeTotal balanceTypeTotal = new PosterOutputSummaryBalanceTypeTotal(currentBalanceTypeCode);
083                Integer currentFiscalYear = entries.get(0).getUniversityFiscalYear();
084                PosterOutputSummaryBalanceTypeFiscalYearTotal balanceTypeFiscalYearTotal = new PosterOutputSummaryBalanceTypeFiscalYearTotal(currentBalanceTypeCode, currentFiscalYear);
085                String currentFiscalPeriod = entries.get(0).getFiscalPeriodCode();
086                PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal balanceTypeFiscalYearAndPeriodTotal = new PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal(currentBalanceTypeCode, currentFiscalYear, currentFiscalPeriod);
087            
088                final String titleMessage = configurationService.getPropertyString(KFSKeyConstants.MESSAGE_REPORT_POSTER_OUTPUT_SUMMARY_TITLE_LINE);
089                String formattedTitle = MessageFormat.format(titleMessage, entries.get(0).getUniversityFiscalYear().toString(), entries.get(0).getBalanceTypeCode());
090                
091                reportWriterService.writeFormattedMessageLine(formattedTitle);
092                reportWriterService.writeTableHeader(entries.get(0));
093                
094                for (PosterOutputSummaryEntry entry : entries) {
095                    if (!entry.getBalanceTypeCode().equals(currentBalanceTypeCode)) {
096                        reportWriterService.writeTableRow(balanceTypeFiscalYearAndPeriodTotal);
097                        reportWriterService.writeTableRow(balanceTypeFiscalYearTotal);
098                        reportWriterService.writeTableRow(balanceTypeTotal);
099                        
100                        balanceTypeFiscalYearAndPeriodTotal = new PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal(entry.getBalanceTypeCode(), entry.getUniversityFiscalYear(), entry.getFiscalPeriodCode());
101                        balanceTypeFiscalYearTotal = new PosterOutputSummaryBalanceTypeFiscalYearTotal(entry.getBalanceTypeCode(), entry.getUniversityFiscalYear());
102                        balanceTypeTotal = new PosterOutputSummaryBalanceTypeTotal(entry.getBalanceTypeCode());
103                        currentBalanceTypeCode = entry.getBalanceTypeCode();
104                        currentFiscalYear = entry.getUniversityFiscalYear();
105                        currentFiscalPeriod = entry.getFiscalPeriodCode();
106                        
107                        // new top-level header for balance types
108                        reportWriterService.pageBreak();
109                        formattedTitle = MessageFormat.format(titleMessage, currentFiscalYear.toString(), currentBalanceTypeCode);
110                        reportWriterService.writeFormattedMessageLine(formattedTitle);
111                        reportWriterService.writeTableHeader(entry);
112                    } else if (!entry.getUniversityFiscalYear().equals(currentFiscalYear)) {
113                        reportWriterService.writeTableRow(balanceTypeFiscalYearAndPeriodTotal);
114                        reportWriterService.writeTableRow(balanceTypeFiscalYearTotal);
115                        
116                        balanceTypeFiscalYearAndPeriodTotal = new PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal(entry.getBalanceTypeCode(), entry.getUniversityFiscalYear(), entry.getFiscalPeriodCode());
117                        balanceTypeFiscalYearTotal = new PosterOutputSummaryBalanceTypeFiscalYearTotal(entry.getBalanceTypeCode(), entry.getUniversityFiscalYear());
118                        currentFiscalYear = entry.getUniversityFiscalYear();
119                        currentFiscalPeriod = entry.getFiscalPeriodCode();
120                    } else if (!entry.getFiscalPeriodCode().equals(currentFiscalPeriod)) {
121                        reportWriterService.writeTableRow(balanceTypeFiscalYearAndPeriodTotal);
122                        
123                        balanceTypeFiscalYearAndPeriodTotal = new PosterOutputSummaryBalanceTypeFiscalYearAndPeriodTotal(entry.getBalanceTypeCode(), entry.getUniversityFiscalYear(), entry.getFiscalPeriodCode());
124                        currentFiscalPeriod = entry.getFiscalPeriodCode();
125                    }
126                    
127                    reportWriterService.writeTableRow(entry);
128                    balanceTypeFiscalYearAndPeriodTotal.addAmount(entry);
129                    balanceTypeFiscalYearTotal.addAmount(entry);
130                    balanceTypeTotal.addAmount(entry);
131                    posterOutputSummaryTotal.addAmount(entry);
132                }
133                
134                reportWriterService.writeTableRow(balanceTypeFiscalYearAndPeriodTotal);
135                reportWriterService.writeTableRow(balanceTypeFiscalYearTotal);
136                reportWriterService.writeTableRow(balanceTypeTotal);
137                reportWriterService.writeNewLines(1);
138                reportWriterService.writeTableRow(posterOutputSummaryTotal);
139            }
140        }
141        
142        /**
143         * @return an implementation of the PosterOutputSummaryService
144         */
145        public PosterOutputSummaryService getPosterOutputSummaryService() {
146            if (posterOutputSummaryService == null) {
147                posterOutputSummaryService = SpringContext.getBean(PosterOutputSummaryService.class);
148            }
149            
150            return posterOutputSummaryService;
151        }
152    }