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.report.util;
017
018 import java.awt.Color;
019 import java.io.ByteArrayOutputStream;
020 import java.math.BigDecimal;
021 import java.util.Date;
022 import java.util.List;
023
024 import org.kuali.kfs.module.endow.document.service.KEMService;
025 import org.kuali.kfs.sys.context.SpringContext;
026 import org.kuali.rice.kns.service.DateTimeService;
027
028 import com.lowagie.text.Document;
029 import com.lowagie.text.Element;
030 import com.lowagie.text.Font;
031 import com.lowagie.text.HeaderFooter;
032 import com.lowagie.text.Paragraph;
033 import com.lowagie.text.Phrase;
034 import com.lowagie.text.Rectangle;
035 import com.lowagie.text.pdf.PdfPCell;
036 import com.lowagie.text.pdf.PdfPTable;
037 import com.lowagie.text.pdf.PdfWriter;
038
039 /**
040 * Helper to print the report in PDF
041 */
042 public class TrialBalanceReportPrint extends EndowmentReportPrintBase {
043
044 private final String ZERO_FOR_REPORT = "0.00";
045
046 /**
047 * Generates the report in PDF using iText
048 *
049 * @param reportRequestHeaderDataHolder
050 * @param trialBalanceDataReportHolders
051 * @return ByteArrayOutputStream
052 */
053 public ByteArrayOutputStream printTrialBalanceReport(EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder, List<TrialBalanceReportDataHolder> trialBalanceDataReportHolders, String listKemidsInHeader) {
054
055 final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TrialBalanceReportPrint.class);
056
057 Document document = new Document();
058 document.setPageSize(LETTER_PORTRAIT);
059 document.addTitle("Endowment Trial Balance");
060
061 // get the stream for PDF
062 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
063
064 try {
065 PdfWriter.getInstance(document, pdfStream);
066 document.open();
067
068 // page
069 HeaderFooter header = new HeaderFooter(new Phrase(new Date().toString() + " Page: ", headerFont), true);
070 header.setBorder(Rectangle.NO_BORDER);
071 header.setAlignment(Element.ALIGN_RIGHT);
072 header.setPageNumber(0);
073 document.setHeader(header);
074
075 // print the report header
076 if (printReportHeaderPage(reportRequestHeaderDataHolder, document, listKemidsInHeader)) {
077
078 if (trialBalanceDataReportHolders != null && trialBalanceDataReportHolders.size() > 0) {
079 document.setPageSize(LETTER_LANDSCAPE);
080 document.resetPageCount();
081 header.setPageNumber(1);
082 document.newPage();
083 printTrialBalanceReportBody(trialBalanceDataReportHolders, document);
084 } else {
085 LOG.error("Trial Balance Report Header Error");
086 }
087 }
088
089 document.close();
090
091 } catch (Exception e) {
092 LOG.error("PDF Error: " + e.getMessage());
093 return null;
094 }
095
096 return pdfStream;
097 }
098
099 /**
100 * Generates the Trial Balance report
101 *
102 * @param trialBalanceReports
103 * @param document
104 * @return
105 */
106 public boolean printTrialBalanceReportBody(List<TrialBalanceReportDataHolder> trialBalanceReports, Document document) {
107
108 try {
109 // title
110 Paragraph title = new Paragraph("KEMID Trial Balance");
111 title.setAlignment(Element.ALIGN_CENTER);
112 Date currentDate = SpringContext.getBean(KEMService.class).getCurrentDate();
113 DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class);
114 String asOfDate = dateTimeService.toDateString(currentDate);
115 title.add("\nAs of " + asOfDate + "\n\n");
116 document.add(title);
117
118 // report table
119 PdfPTable table = new PdfPTable(7);
120 table.setWidthPercentage(FULL_TABLE_WIDTH);
121 int[] relativeWidths = {10, 15, 15, 15, 15, 15, 15};
122 table.setWidths(relativeWidths);
123 table.getDefaultCell().setPadding(2);
124
125 // table titles
126 table.addCell(new Phrase("KEMID", titleFont));
127 table.addCell(new Phrase("KEMID Name", titleFont));
128 table.addCell(new Phrase("Income Cash Balance", titleFont));
129 table.addCell(new Phrase("Principal Cash Balance", titleFont));
130 table.addCell(new Phrase("KEMID Total Market Value", titleFont));
131 table.addCell(new Phrase("Available Expendable Funds", titleFont));
132 table.addCell(new Phrase("FY Remainder Estimated Income", titleFont));
133
134 // table body
135 Font cellFont = regularFont;
136 BigDecimal totalIncomeCashBalance = BigDecimal.ZERO;
137 BigDecimal totalPrincipalCashBalance = BigDecimal.ZERO;
138 BigDecimal totalMarketValueBalance = BigDecimal.ZERO;
139 BigDecimal totalAvailableExpendableFundsBalance = BigDecimal.ZERO;
140 BigDecimal totalFyRemainderEstimatedIncome = BigDecimal.ZERO;
141
142 for (TrialBalanceReportDataHolder trialBalanceReport : trialBalanceReports) {
143
144 // totals, which is the last row
145 if (trialBalanceReport.getKemid().equalsIgnoreCase("TOTALS")) {
146 cellFont = titleFont;
147 }
148
149 table.addCell(new Phrase(trialBalanceReport.getKemid(), cellFont));
150 table.addCell(new Phrase(trialBalanceReport.getKemidName(), cellFont));
151 if (trialBalanceReport.getInocmeCashBalance() != null) {
152 String amount = formatAmount(trialBalanceReport.getInocmeCashBalance().bigDecimalValue());
153 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
154 totalIncomeCashBalance = totalIncomeCashBalance.add(trialBalanceReport.getInocmeCashBalance().bigDecimalValue());
155 } else {
156 table.addCell(createCell(ZERO_FOR_REPORT, cellFont, Element.ALIGN_RIGHT, true));
157 }
158 if (trialBalanceReport.getPrincipalcashBalance() != null) {
159 String amount = formatAmount(trialBalanceReport.getPrincipalcashBalance().bigDecimalValue());
160 totalPrincipalCashBalance = totalPrincipalCashBalance.add(trialBalanceReport.getPrincipalcashBalance().bigDecimalValue());
161 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
162 } else {
163 table.addCell(createCell(ZERO_FOR_REPORT, cellFont, Element.ALIGN_RIGHT, true));
164 }
165 if (trialBalanceReport.getKemidTotalMarketValue() != null) {
166 String amount = formatAmount(trialBalanceReport.getKemidTotalMarketValue());
167 totalMarketValueBalance = totalMarketValueBalance.add(trialBalanceReport.getKemidTotalMarketValue());
168 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
169 } else {
170 table.addCell(createCell(ZERO_FOR_REPORT, cellFont, Element.ALIGN_RIGHT, true));
171 }
172 if (trialBalanceReport.getAvailableExpendableFunds() != null) {
173 String amount = formatAmount(trialBalanceReport.getAvailableExpendableFunds());
174 totalAvailableExpendableFundsBalance = totalAvailableExpendableFundsBalance.add(trialBalanceReport.getAvailableExpendableFunds());
175 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
176 } else {
177 table.addCell(createCell(ZERO_FOR_REPORT, cellFont, Element.ALIGN_RIGHT, true));
178 }
179 if (trialBalanceReport.getFyRemainderEstimatedIncome() != null) {
180 String amount = formatAmount(trialBalanceReport.getFyRemainderEstimatedIncome());
181 totalFyRemainderEstimatedIncome = totalFyRemainderEstimatedIncome.add(trialBalanceReport.getFyRemainderEstimatedIncome());
182 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
183 } else {
184 table.addCell(createCell(ZERO_FOR_REPORT, cellFont, Element.ALIGN_RIGHT, true));
185 }
186 }
187
188 // totals
189 PdfPCell blank = new PdfPCell(new Paragraph("", cellFont));
190 blank.setColspan(7);
191 blank.setBackgroundColor(Color.LIGHT_GRAY);
192 table.addCell(blank);
193
194 table.addCell(createCell("TOTALS", titleFont, Element.ALIGN_LEFT, true));
195 table.addCell(createCell("", cellFont, Element.ALIGN_RIGHT, true));
196 table.addCell(createCell(formatAmount(totalIncomeCashBalance), cellFont, Element.ALIGN_RIGHT, true));
197 table.addCell(createCell(formatAmount(totalPrincipalCashBalance), cellFont, Element.ALIGN_RIGHT, true));
198 table.addCell(createCell(formatAmount(totalMarketValueBalance), cellFont, Element.ALIGN_RIGHT, true));
199 table.addCell(createCell(formatAmount(totalAvailableExpendableFundsBalance), cellFont, Element.ALIGN_RIGHT, true));
200 table.addCell(createCell(formatAmount(totalFyRemainderEstimatedIncome), cellFont, Element.ALIGN_RIGHT, true));
201
202 document.add(table);
203
204 } catch (Exception e) {
205 return false;
206 }
207
208 return true;
209 }
210
211 }