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.io.ByteArrayOutputStream;
019 import java.math.BigDecimal;
020 import java.util.ArrayList;
021 import java.util.Date;
022 import java.util.List;
023
024 import org.kuali.kfs.module.endow.EndowConstants;
025 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportDataHolder.CashTransfersDataHolder;
026 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportDataHolder.ContributionsDataHolder;
027 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportDataHolder.ExpensesDataHolder;
028 import org.kuali.kfs.module.endow.report.util.TransactionSummaryReportDataHolder.SecurityTransfersDataHolder;
029 import org.kuali.rice.kns.util.ObjectUtils;
030
031 import com.lowagie.text.Document;
032 import com.lowagie.text.DocumentException;
033 import com.lowagie.text.Element;
034 import com.lowagie.text.Font;
035 import com.lowagie.text.HeaderFooter;
036 import com.lowagie.text.Paragraph;
037 import com.lowagie.text.Phrase;
038 import com.lowagie.text.Rectangle;
039 import com.lowagie.text.pdf.PdfPTable;
040 import com.lowagie.text.pdf.PdfWriter;
041
042 public class TransactionSummaryReportPrint extends EndowmentReportPrintBase {
043 final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TransactionSummaryReportPrint.class);
044
045 /**
046 * Generates the report in PDF using iText
047 *
048 * @param reportRequestHeaderDataHolder
049 * @param transactionStatementDataReportHolders
050 * @return pdfStream
051 */
052 public ByteArrayOutputStream printTransactionSummaryReport(EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder, List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, String listKemidsInHeader, String reportOption, String summaryTotalsOnly) {
053 Document document = new Document();
054 document.setPageSize(LETTER_PORTRAIT);
055 document.addTitle("Endowment Transaction Summary");
056
057 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
058
059 try {
060 PdfWriter.getInstance(document, pdfStream);
061 document.open();
062
063 // page
064 HeaderFooter header = new HeaderFooter(new Phrase(new Date().toString() + " Page: ", headerFont), true);
065 header.setBorder(Rectangle.NO_BORDER);
066 header.setAlignment(Element.ALIGN_RIGHT);
067 header.setPageNumber(0);
068 document.setHeader(header);
069
070 // print the report header
071 if (printReportHeaderPage(reportRequestHeaderDataHolder, document, listKemidsInHeader)) {
072 if (transactionSummaryDataReportHolders != null && transactionSummaryDataReportHolders.size() > 0) {
073 if ("Y".equalsIgnoreCase(summaryTotalsOnly)) {
074 printReportBodyBySummaryTotals(transactionSummaryDataReportHolders, document, reportOption);
075 }
076 else {
077 printReportBodyByAllTotals(transactionSummaryDataReportHolders, document, reportOption);
078 }
079 }
080 } else {
081 LOG.error("Transaction Summary Report Header Error");
082 }
083
084 document.close();
085
086 } catch (Exception e) {
087 LOG.error("PDF Error: " + e.getMessage());
088 return null;
089 }
090
091 return pdfStream;
092 }
093
094 /**
095 *
096 * Helper method to print body of the transaction summary report, listing only total field.
097 * @param transactionSummaryDataReportHolders
098 * @param document
099 * @param reportOption
100 * @return true if successful else return false
101 */
102 protected boolean printReportBodyBySummaryTotals(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, Document document, String reportOption) {
103 boolean success = true;
104
105 if (EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) {
106 success &= printReportBodyForDetailReportOption(transactionSummaryDataReportHolders, document);
107 }
108
109 if (EndowConstants.EndowmentReport.TOTAL.equalsIgnoreCase(reportOption)) {
110 success &= printReportBodyForSummaryReportOption(transactionSummaryDataReportHolders, document);
111 }
112
113 if (EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(reportOption)) {
114 success &= printReportBodyForDetailReportOption(transactionSummaryDataReportHolders, document);
115 success &= printReportBodyForSummaryReportOption(transactionSummaryDataReportHolders, document);
116 }
117
118 return success;
119 }
120
121 /**
122 * Helper method to print body of the transaction summary report, listing all total fields.
123 * @param transactionSummaryDataReportHolders
124 * @param document
125 * @param reportOption
126 * @return true if successful else false
127 */
128 protected boolean printReportBodyByAllTotals(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, Document document, String reportOption) {
129 boolean sucess = true;
130
131 if (reportOption.equalsIgnoreCase(EndowConstants.EndowmentReport.DETAIL)) {
132 sucess &= printReportBodyByAllTotalsForDetailReportOption(transactionSummaryDataReportHolders, document);
133 }
134 if (reportOption.equalsIgnoreCase(EndowConstants.EndowmentReport.TOTAL)) {
135 sucess &= printReportBodyByAllTotalsForTotalReportOption(transactionSummaryDataReportHolders, document);
136 }
137 if (reportOption.equalsIgnoreCase(EndowConstants.EndowmentReport.BOTH)) {
138 sucess &= printReportBodyByAllTotalsForDetailReportOption(transactionSummaryDataReportHolders, document);
139 sucess &= printReportBodyByAllTotalsForTotalReportOption(transactionSummaryDataReportHolders, document);
140 }
141
142 return true;
143 }
144
145 /**
146 * Generates the Transaction Summary report showing all amounts fields.
147 *
148 * @param transactionSummaryReports
149 * @param document
150 * @return true if document created else return false
151 */
152 public boolean printReportBodyByAllTotalsForDetailReportOption(List<TransactionSummaryReportDataHolder> transactionSummaryReportDataHolders, Document document) {
153
154 document.setPageCount(0);
155
156 // for each kemid
157 try {
158 Font cellFont = regularFont;
159 for (TransactionSummaryReportDataHolder transactionSummaryReport : transactionSummaryReportDataHolders) {
160 // new page
161 document.setPageSize(LETTER_LANDSCAPE);
162 document.newPage();
163
164 // header
165 writeDocumentHeader(document, transactionSummaryReport);
166
167 // report table column headers
168 PdfPTable table = writeDocumentTitleHeadings(EndowConstants.EndowmentReport.DETAIL);
169
170 if (ObjectUtils.isNull(table)) {
171 return false;
172 }
173
174 // write out Beginning Market value row values
175 writeDetailLineRow(table, cellFont, "Beginning Market Value", transactionSummaryReport.getIncomeBeginningMarketValue(), transactionSummaryReport.getPrincipalBeginningMarketValue(), transactionSummaryReport.getTotalBeginningMarketValue());
176
177 // contributions rows
178 writeContributionsRecordsForDetailReportOption(table, cellFont, transactionSummaryReport);
179
180 // expenses rows....
181 writeExpensesRecordsForDetailReportOption(table, cellFont, transactionSummaryReport);
182
183 // cash transfer rows...
184 writeCashTransfersRecordsForDetailReportOption(table, cellFont, transactionSummaryReport);
185
186 // cash transfer rows...
187 writeSecurityTransfersRecordsForDetailReportOption(table, cellFont, transactionSummaryReport);
188
189 //write change in market value row....
190 writeDetailLineRow(table, cellFont, "Change in Market Value", transactionSummaryReport.getIncomeChangeInMarketValue(), transactionSummaryReport.getPrincipalChangeInMarketValue(), transactionSummaryReport.getTotalChangeInMarketValue());
191
192 //write period end total market value record....
193 writeDetailLineRow(table, cellFont, "Period End total Market Value (Include Cash)", transactionSummaryReport.getIncomeEndingMarketValue(), transactionSummaryReport.getPrincipalEndingMarketValue(), transactionSummaryReport.getTotalEndingMarketValue());
194
195 // write out estimate income row
196 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Next 12 Months Estimated Income", transactionSummaryReport.getNext12MonthsEstimatedIncome(), EndowConstants.EndowmentReport.DETAIL);
197
198 //write out the remainder FY estimated row...
199 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Remainder of Fiscal Year Estimated Income", transactionSummaryReport.getRemainderOfFYEstimatedIncome(), EndowConstants.EndowmentReport.DETAIL);
200
201 //write out the next FY estimated row...
202 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Next Fiscal Year Estimated Income", transactionSummaryReport.getNextFYEstimatedIncome(), EndowConstants.EndowmentReport.DETAIL);
203
204 document.add(table);
205
206 //print the footer...
207 if (ObjectUtils.isNotNull(transactionSummaryReport.getFooter())) {
208 printFooter(transactionSummaryReport.getFooter(), document);
209 }
210 }
211
212 } catch (Exception e) {
213 return false;
214 }
215
216 return true;
217 }
218
219 /**
220 * Generates the Transaction Summary report showing only summary amount field.
221 * This report will only show the total amount field for each kemid
222 * @param transactionSummaryReports
223 * @param document
224 * @return true if document created else return false
225 */
226 public boolean printReportBodyForDetailReportOption(List<TransactionSummaryReportDataHolder> transactionSummaryReportDataHolders, Document document) {
227
228 document.setPageCount(0);
229
230 try {
231 Font cellFont = regularFont;
232 for (TransactionSummaryReportDataHolder transactionSummaryReport : transactionSummaryReportDataHolders) {
233 // new page
234 document.setPageSize(LETTER_LANDSCAPE);
235 document.newPage();
236
237 // header
238 writeDocumentHeader(document, transactionSummaryReport);
239
240 // report table column headers
241 PdfPTable table = writeDocumentTitleHeadings(EndowConstants.EndowmentReport.TOTAL);
242
243 if (ObjectUtils.isNull(table)) {
244 return false;
245 }
246
247 // write out Beginning Market value row values
248 writeDetailLineRow(table, cellFont, "Beginning Market Value", transactionSummaryReport.getTotalBeginningMarketValue());
249
250 // contributions rows
251 writeContributionsRecordsForSummaryReportOption(table, cellFont, transactionSummaryReport);
252
253 // expenses rows....
254 writeExpensesRecordsForSummaryReportOption(table, cellFont, transactionSummaryReport);
255
256 //cash transfers rows..
257 writeCashTransfersRecordsForSummaryReportOption(table, cellFont, transactionSummaryReport);
258
259 // security transfer rows...
260 writeSecurityTransfersRecordsForSummaryReportOption(table, cellFont, transactionSummaryReport);
261
262 //write change in market value row....
263 writeDetailLineRow(table, cellFont, "Change in Market Value", transactionSummaryReport.getTotalChangeInMarketValue());
264
265 //write period end total market value record....
266 writeDetailLineRow(table, cellFont, "Period End total Market Value (Include Cash)", transactionSummaryReport.getTotalEndingMarketValue());
267
268 // write out estimate income row
269 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Next 12 Months Estimated Income", transactionSummaryReport.getNext12MonthsEstimatedIncome(), EndowConstants.EndowmentReport.TOTAL);
270
271 //write out the remainder FY estimated row...
272 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Remainder of Fiscal Year Estimated Income", transactionSummaryReport.getRemainderOfFYEstimatedIncome(), EndowConstants.EndowmentReport.TOTAL);
273
274 //write out the next FY estimated row...
275 writeDetailsLineWithTotalAmountOnly(table, cellFont, "Next Fiscal Year Estimated Income", transactionSummaryReport.getNextFYEstimatedIncome(), EndowConstants.EndowmentReport.TOTAL);
276
277 document.add(table);
278
279 //print the footer...
280 if (ObjectUtils.isNotNull(transactionSummaryReport.getFooter())) {
281 printFooter(transactionSummaryReport.getFooter(), document);
282 }
283 }
284
285 } catch (Exception e) {
286 return false;
287 }
288
289 return true;
290 }
291
292 /**
293 * Method to combine the kemid totals into one data record and print all fields.
294 * @param transactionSummaryDataReportHolders
295 * @param document
296 * @return true if successful else return false
297 */
298
299 protected boolean printReportBodyByAllTotalsForTotalReportOption(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, Document document) {
300 List<TransactionSummaryReportDataHolder> summaryReportDataHolder = combineKemidTotals(transactionSummaryDataReportHolders);
301
302 return printReportBodyByAllTotalsForDetailReportOption(summaryReportDataHolder, document);
303 }
304
305 /**
306 * Method to combine the kemid totals into one data record and print only summary field.
307 * @param transactionSummaryDataReportHolders
308 * @param document
309 * @return true if successful else return false
310 */
311
312 protected boolean printReportBodyForSummaryReportOption(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, Document document) {
313 List<TransactionSummaryReportDataHolder> summaryReportDataHolder = combineKemidTotals(transactionSummaryDataReportHolders);
314
315 return printReportBodyForDetailReportOption(summaryReportDataHolder, document);
316 }
317
318 protected List<TransactionSummaryReportDataHolder> combineKemidTotals(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders) {
319 List<TransactionSummaryReportDataHolder> summaryReportDataHolder = new ArrayList<TransactionSummaryReportDataHolder>();
320
321 TransactionSummaryReportDataHolder transactionSummaryReportDataHolder = new TransactionSummaryReportDataHolder();
322
323 for (TransactionSummaryReportDataHolder reportDataHolder : transactionSummaryDataReportHolders) {
324 transactionSummaryReportDataHolder.setIncomeBeginningMarketValue(transactionSummaryReportDataHolder.getIncomeBeginningMarketValue().add(reportDataHolder.getIncomeBeginningMarketValue()));
325 transactionSummaryReportDataHolder.setPrincipalBeginningMarketValue(transactionSummaryReportDataHolder.getPrincipalBeginningMarketValue().add(reportDataHolder.getPrincipalBeginningMarketValue()));
326 transactionSummaryReportDataHolder.setIncomeChangeInMarketValue(transactionSummaryReportDataHolder.getIncomeChangeInMarketValue().add(reportDataHolder.getIncomeChangeInMarketValue()));
327 transactionSummaryReportDataHolder.setPrincipalChangeInMarketValue(transactionSummaryReportDataHolder.getPrincipalChangeInMarketValue().add(reportDataHolder.getPrincipalChangeInMarketValue()));
328 transactionSummaryReportDataHolder.setIncomeEndingMarketValue(transactionSummaryReportDataHolder.getIncomeEndingMarketValue().add(reportDataHolder.getIncomeEndingMarketValue()));
329 transactionSummaryReportDataHolder.setPrincipalEndingMarketValue(transactionSummaryReportDataHolder.getPrincipalEndingMarketValue().add(reportDataHolder.getPrincipalEndingMarketValue()));
330 transactionSummaryReportDataHolder.setNext12MonthsEstimatedIncome(transactionSummaryReportDataHolder.getNext12MonthsEstimatedIncome().add(reportDataHolder.getNext12MonthsEstimatedIncome()));
331 transactionSummaryReportDataHolder.setRemainderOfFYEstimatedIncome(transactionSummaryReportDataHolder.getRemainderOfFYEstimatedIncome().add(reportDataHolder.getRemainderOfFYEstimatedIncome()));
332 transactionSummaryReportDataHolder.setNextFYEstimatedIncome(transactionSummaryReportDataHolder.getNextFYEstimatedIncome().add(reportDataHolder.getNextFYEstimatedIncome()));
333 transactionSummaryReportDataHolder.setInstitution(reportDataHolder.getInstitution());
334 transactionSummaryReportDataHolder.setBeginningDate(reportDataHolder.getBeginningDate());
335 transactionSummaryReportDataHolder.setEndingDate(reportDataHolder.getEndingDate());
336 }
337
338 transactionSummaryReportDataHolder.setKemid("All Kemids");
339 transactionSummaryReportDataHolder.setKemidLongTitle("");
340
341 getSummaryTotalsForContributions(transactionSummaryDataReportHolders, transactionSummaryReportDataHolder);
342 getSummaryTotalsForExpenses(transactionSummaryDataReportHolders, transactionSummaryReportDataHolder);
343 getSummaryTotalsForCashTransfers(transactionSummaryDataReportHolders, transactionSummaryReportDataHolder);
344 getSummaryTotalsForSecurityTransfers(transactionSummaryDataReportHolders, transactionSummaryReportDataHolder);
345
346 summaryReportDataHolder.add(transactionSummaryReportDataHolder);
347
348 return summaryReportDataHolder;
349 }
350
351 /**
352 * Method to summarize the expenses list records for the summary totals report.
353 * @param transactionSummaryDataReportHolders
354 * @param transactionSummaryReportDataHolder
355 */
356 protected void getSummaryTotalsForContributions(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, TransactionSummaryReportDataHolder transactionSummaryReportDataHolder) {
357
358 ExpensesDataHolder expensesDataHolder = transactionSummaryReportDataHolder.new ExpensesDataHolder();
359
360 ExpensesDataHolder summaryExpensesData = transactionSummaryReportDataHolder.new ExpensesDataHolder();
361 summaryExpensesData.setExpensesDescription("Summary Totals for Expenses");
362
363 for (TransactionSummaryReportDataHolder reportDataHolder : transactionSummaryDataReportHolders) {
364 List<ExpensesDataHolder> expensesDataHolders = reportDataHolder.getReportGroupsForExpenses();
365 for (ExpensesDataHolder expenseData : expensesDataHolders) {
366 summaryExpensesData.setIncomeExpenses(summaryExpensesData.getIncomeExpenses().add(expenseData.getIncomeExpenses()));
367 summaryExpensesData.setPrincipalExpenses(summaryExpensesData.getPrincipalExpenses().add(expenseData.getPrincipalExpenses()));
368 }
369 }
370
371 transactionSummaryReportDataHolder.getReportGroupsForExpenses().add(summaryExpensesData);
372 }
373
374 /**
375 * Method to summarize the expenses list records for the summary totals report.
376 * @param transactionSummaryDataReportHolders
377 * @param transactionSummaryReportDataHolder
378 */
379 protected void getSummaryTotalsForExpenses(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, TransactionSummaryReportDataHolder transactionSummaryReportDataHolder) {
380 ContributionsDataHolder summaryContributionsData = transactionSummaryReportDataHolder.new ContributionsDataHolder();
381 summaryContributionsData.setContributionsDescription("Summary Totals for Contibutions and Other Income");
382
383 for (TransactionSummaryReportDataHolder reportDataHolder : transactionSummaryDataReportHolders) {
384 List<ContributionsDataHolder> contributionDataHolders = reportDataHolder.getReportGroupsForContributions();
385 for (ContributionsDataHolder contributionData : contributionDataHolders) {
386 summaryContributionsData.setIncomeContributions(summaryContributionsData.getIncomeContributions().add(contributionData.getIncomeContributions()));
387 summaryContributionsData.setPrincipalContributions(summaryContributionsData.getPrincipalContributions().add(contributionData.getPrincipalContributions()));
388 }
389 }
390
391 transactionSummaryReportDataHolder.getReportGroupsForContributions().add(summaryContributionsData);
392 }
393
394 /**
395 * Method to summarize the cash transfers list records for the summary totals report.
396 * @param transactionSummaryDataReportHolders
397 * @param transactionSummaryReportDataHolder
398 */
399 protected void getSummaryTotalsForCashTransfers(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, TransactionSummaryReportDataHolder transactionSummaryReportDataHolder) {
400 CashTransfersDataHolder summaryCashTransferData = transactionSummaryReportDataHolder.new CashTransfersDataHolder();
401 summaryCashTransferData.setCashTransfersDescription("Summary Totals for Cash Transactions");
402
403 for (TransactionSummaryReportDataHolder reportDataHolder : transactionSummaryDataReportHolders) {
404 List<CashTransfersDataHolder> cashTransfersDataHolders = reportDataHolder.getReportGroupsForCashTransfers();
405 for (CashTransfersDataHolder cashTransferData : cashTransfersDataHolders) {
406 summaryCashTransferData.setIncomeCashTransfers(summaryCashTransferData.getIncomeCashTransfers().add(cashTransferData.getIncomeCashTransfers()));
407 summaryCashTransferData.setPrincipalCashTransfers(summaryCashTransferData.getPrincipalCashTransfers().add(cashTransferData.getPrincipalCashTransfers()));
408 }
409 }
410
411 transactionSummaryReportDataHolder.getReportGroupsForCashTransfers().add(summaryCashTransferData);
412 }
413
414 /**
415 * Method to summarize the Security transfers list records for the summary totals report.
416 * @param transactionSummaryDataReportHolders
417 * @param transactionSummaryReportDataHolder
418 */
419 protected void getSummaryTotalsForSecurityTransfers(List<TransactionSummaryReportDataHolder> transactionSummaryDataReportHolders, TransactionSummaryReportDataHolder transactionSummaryReportDataHolder) {
420 SecurityTransfersDataHolder summarySecurityTransferData = transactionSummaryReportDataHolder.new SecurityTransfersDataHolder();
421 summarySecurityTransferData.setSecurityTransfersDescription("Summary Totals for Security Transactions");
422
423 for (TransactionSummaryReportDataHolder reportDataHolder : transactionSummaryDataReportHolders) {
424 List<SecurityTransfersDataHolder> securityTransfersDataHolders = reportDataHolder.getReportGroupsForSecurityTransfers();
425 for (SecurityTransfersDataHolder securityTransferData : securityTransfersDataHolders) {
426 summarySecurityTransferData.setIncomeSecurityTransfers(summarySecurityTransferData.getIncomeSecurityTransfers().add(securityTransferData.getIncomeSecurityTransfers()));
427 summarySecurityTransferData.setPrincipalSecurityTransfers(summarySecurityTransferData.getPrincipalSecurityTransfers().add(securityTransferData.getPrincipalSecurityTransfers()));
428 }
429 }
430
431 transactionSummaryReportDataHolder.getReportGroupsForSecurityTransfers().add(summarySecurityTransferData);
432 }
433
434 /**
435 * Helper method to write the details line.
436 *
437 * @param table
438 * @param cellFont
439 * @param description
440 * @param incomeAmount
441 * @param principalAmount
442 * @param totalAmount
443 */
444 protected void writeDetailLineRow(PdfPTable table, Font cellFont, String description, BigDecimal incomeAmount, BigDecimal principalAmount, BigDecimal totalAmount) {
445 table.addCell("\t\t".concat(description));
446 table.addCell(createCell(formatAmount(incomeAmount), cellFont, Element.ALIGN_RIGHT, true));
447 table.addCell(createCell(formatAmount(principalAmount), cellFont, Element.ALIGN_RIGHT, true));
448 table.addCell(createCell(formatAmount(totalAmount), cellFont, Element.ALIGN_RIGHT, true));
449 }
450
451 /**
452 * Helper method to write the details line.
453 *
454 * @param table
455 * @param cellFont
456 * @param description
457 * @param incomeAmount
458 * @param principalAmount
459 * @param totalAmount
460 */
461 protected void writeDetailLineRow(PdfPTable table, Font cellFont, String description, BigDecimal totalAmount) {
462 table.addCell("\t\t".concat(description));
463 table.addCell(createCell(formatAmount(totalAmount), cellFont, Element.ALIGN_RIGHT, true));
464 }
465
466 /**
467 * Helper method to go through the contributions list and write the lines..
468 * @param table
469 * @param cellFont
470 * @param transactionSummaryReport
471 */
472 protected void writeContributionsRecordsForDetailReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
473 String amount;
474 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
475 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
476
477 //write Contributions header....
478 writeSubHeader(table, "Contibutions and Other Income", EndowConstants.EndowmentReport.DETAIL);
479
480 //now write out the records....
481 List<ContributionsDataHolder> contributionsData = transactionSummaryReport.getReportGroupsForContributions();
482
483 if (contributionsData != null) {
484 for (ContributionsDataHolder contribution : contributionsData) {
485 table.addCell(createCell("\t\t\t\t\t\t\t".concat(contribution.getContributionsDescription()), cellFont, Element.ALIGN_LEFT, true));
486 totalIncomeAmounts = totalIncomeAmounts.add(contribution.getIncomeContributions());
487 amount = formatAmount(contribution.getIncomeContributions());
488 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
489 totalPrincipalAmounts = totalPrincipalAmounts.add(contribution.getPrincipalContributions());
490 amount = formatAmount(contribution.getPrincipalContributions());
491 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
492 amount = formatAmount(contribution.getTotalContributions());
493 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
494 }
495 }
496
497 //now write out the sub-total line....amount
498 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
499 amount = formatAmount(totalIncomeAmounts);
500 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
501 amount = formatAmount(totalPrincipalAmounts);
502 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
503 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
504 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
505 }
506
507 /**
508 * Helper method to go through the contributions list and write the lines..For summary report
509 * @param table
510 * @param cellFont
511 * @param transactionSummaryReport
512 */
513 protected void writeContributionsRecordsForSummaryReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
514 String amount;
515 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
516 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
517
518 //write Contributions header....
519 writeSubHeader(table, "Contibutions and Other Income", EndowConstants.EndowmentReport.TOTAL);
520
521 //now write out the records....
522 List<ContributionsDataHolder> contributionsData = transactionSummaryReport.getReportGroupsForContributions();
523
524 if (contributionsData != null) {
525 for (ContributionsDataHolder contribution : contributionsData) {
526 table.addCell(createCell("\t\t\t\t\t\t\t".concat(contribution.getContributionsDescription()), cellFont, Element.ALIGN_LEFT, true));
527 totalIncomeAmounts = totalIncomeAmounts.add(contribution.getIncomeContributions());
528 totalPrincipalAmounts = totalPrincipalAmounts.add(contribution.getPrincipalContributions());
529 amount = formatAmount(contribution.getTotalContributions());
530 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
531 }
532 }
533
534 //now write out the sub-total line....amount
535 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
536 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
537 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
538 }
539
540 /**
541 * Helper method to go through the expenses list and write the lines..
542 * @param table
543 * @param cellFont
544 * @param transactionSummaryReport
545 */
546 protected void writeExpensesRecordsForDetailReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
547 String amount;
548 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
549 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
550
551 //write Contributions header....
552 writeSubHeader(table, "Expenses", EndowConstants.EndowmentReport.DETAIL);
553
554 //now write out the records....
555 List<ExpensesDataHolder> expensesData = transactionSummaryReport.getReportGroupsForExpenses();
556
557 if (expensesData != null) {
558 for (ExpensesDataHolder expenses : expensesData) {
559 table.addCell(createCell("\t\t\t\t\t\t\t".concat(expenses.getExpensesDescription()), cellFont, Element.ALIGN_LEFT, true));
560 totalIncomeAmounts = totalIncomeAmounts.add(expenses.getIncomeExpenses());
561 amount = formatAmount(expenses.getIncomeExpenses());
562 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
563 totalPrincipalAmounts = totalPrincipalAmounts.add(expenses.getPrincipalExpenses());
564 amount = formatAmount(expenses.getPrincipalExpenses());
565 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
566 amount = formatAmount(expenses.getTotalExpenses());
567 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
568 }
569 }
570
571 //now write out the sub-total line....amount
572 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
573 amount = formatAmount(totalIncomeAmounts);
574 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
575 amount = formatAmount(totalPrincipalAmounts);
576 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
577 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
578 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
579 }
580
581 /**
582 * Helper method to go through the expenses list and write the lines..
583 * @param table
584 * @param cellFont
585 * @param transactionSummaryReport
586 */
587 protected void writeExpensesRecordsForSummaryReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
588 String amount;
589 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
590 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
591
592 //write Contributions header....
593 writeSubHeader(table, "Expenses", EndowConstants.EndowmentReport.TOTAL);
594
595 //now write out the records....
596 List<ExpensesDataHolder> expensesData = transactionSummaryReport.getReportGroupsForExpenses();
597
598 if (expensesData != null) {
599 for (ExpensesDataHolder expenses : expensesData) {
600 table.addCell(createCell("\t\t\t\t\t\t\t".concat(expenses.getExpensesDescription()), cellFont, Element.ALIGN_LEFT, true));
601 totalIncomeAmounts = totalIncomeAmounts.add(expenses.getIncomeExpenses());
602 totalPrincipalAmounts = totalPrincipalAmounts.add(expenses.getPrincipalExpenses());
603 amount = formatAmount(expenses.getTotalExpenses());
604 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
605 }
606 }
607
608 //now write out the sub-total line....amount
609 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
610 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
611 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
612 }
613
614 /**
615 * Helper method to go through the cash transfers list and write the lines..
616 * @param table
617 * @param cellFont
618 * @param transactionSummaryReport
619 */
620 protected void writeCashTransfersRecordsForDetailReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
621 String amount;
622 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
623 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
624
625 //write Contributions header....
626 writeSubHeader(table, "Cash Transfers", EndowConstants.EndowmentReport.DETAIL);
627
628 //now write out the records....
629 List<CashTransfersDataHolder> cashTransfersData = transactionSummaryReport.getReportGroupsForCashTransfers();
630
631 if (cashTransfersData != null) {
632 for (CashTransfersDataHolder cashTransfer : cashTransfersData) {
633 table.addCell(createCell("\t\t\t\t\t\t\t".concat(cashTransfer.getCashTransfersDescription()), cellFont, Element.ALIGN_LEFT, true));
634 totalIncomeAmounts = totalIncomeAmounts.add(cashTransfer.getIncomeCashTransfers());
635 amount = formatAmount(cashTransfer.getIncomeCashTransfers());
636 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
637 totalPrincipalAmounts = totalPrincipalAmounts.add(cashTransfer.getPrincipalCashTransfers());
638 amount = formatAmount(cashTransfer.getPrincipalCashTransfers());
639 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
640 amount = formatAmount(cashTransfer.getTotalCashTransfers());
641 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
642 }
643 }
644
645 //now write out the sub-total line....amount
646 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
647 amount = formatAmount(totalIncomeAmounts);
648 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
649 amount = formatAmount(totalPrincipalAmounts);
650 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
651 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
652 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
653 }
654
655 /**
656 * Helper method to go through the expenses list and write the lines..
657 * @param table
658 * @param cellFont
659 * @param transactionSummaryReport
660 */
661 protected void writeCashTransfersRecordsForSummaryReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
662 String amount;
663 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
664 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
665
666 //write Contributions header....
667 writeSubHeader(table, "Cash Transfers", EndowConstants.EndowmentReport.TOTAL);
668
669 //now write out the records....
670 List<CashTransfersDataHolder> cashTransfersData = transactionSummaryReport.getReportGroupsForCashTransfers();
671
672 if (cashTransfersData != null) {
673 for (CashTransfersDataHolder cashTransfer : cashTransfersData) {
674 table.addCell(createCell("\t\t\t\t\t\t\t".concat(cashTransfer.getCashTransfersDescription()), cellFont, Element.ALIGN_LEFT, true));
675 totalIncomeAmounts = totalIncomeAmounts.add(cashTransfer.getIncomeCashTransfers());
676 totalPrincipalAmounts = totalPrincipalAmounts.add(cashTransfer.getPrincipalCashTransfers());
677 amount = formatAmount(cashTransfer.getTotalCashTransfers());
678 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
679 }
680 }
681
682 //now write out the sub-total line....amount
683 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
684 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
685 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
686 }
687
688 /**
689 * Helper method to go through the security list and write the lines..
690 * @param table
691 * @param cellFont
692 * @param transactionSummaryReport
693 */
694 protected void writeSecurityTransfersRecordsForSummaryReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
695 String amount;
696 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
697 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
698
699 //write Contributions header....
700 writeSubHeader(table, "Security Transfers", EndowConstants.EndowmentReport.TOTAL);
701
702 //now write out the records....
703 List<SecurityTransfersDataHolder> securityTransfersData = transactionSummaryReport.getReportGroupsForSecurityTransfers();
704
705 if (securityTransfersData != null) {
706 for (SecurityTransfersDataHolder securityTransfer : securityTransfersData) {
707 table.addCell(createCell("\t\t\t\t\t\t\t".concat(securityTransfer.getSecurityTransfersDescription()), cellFont, Element.ALIGN_LEFT, true));
708 totalIncomeAmounts = totalIncomeAmounts.add(securityTransfer.getIncomeSecurityTransfers());
709 totalPrincipalAmounts = totalPrincipalAmounts.add(securityTransfer.getPrincipalSecurityTransfers());
710 amount = formatAmount(securityTransfer.getTotalSecurityTransfers());
711 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
712 }
713 }
714
715 //now write out the sub-total line....amount
716 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
717 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
718 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
719 }
720
721 /**
722 * Helper method to go through the cash transfers list and write the lines..
723 * @param table
724 * @param cellFont
725 * @param transactionSummaryReport
726 */
727 protected void writeSecurityTransfersRecordsForDetailReportOption(PdfPTable table, Font cellFont, TransactionSummaryReportDataHolder transactionSummaryReport) {
728 String amount;
729 BigDecimal totalIncomeAmounts = BigDecimal.ZERO;
730 BigDecimal totalPrincipalAmounts = BigDecimal.ZERO;
731
732 //write Contributions header....
733 writeSubHeader(table, "Security Transfers", EndowConstants.EndowmentReport.DETAIL);
734
735 //now write out the records....
736 List<SecurityTransfersDataHolder> SecurityTransfersData = transactionSummaryReport.getReportGroupsForSecurityTransfers();
737
738 if (SecurityTransfersData != null) {
739 for (SecurityTransfersDataHolder securityTransfer : SecurityTransfersData) {
740 table.addCell(createCell("\t\t\t\t\t\t\t".concat(securityTransfer.getSecurityTransfersDescription()), cellFont, Element.ALIGN_LEFT, true));
741 totalIncomeAmounts = totalIncomeAmounts.add(securityTransfer.getIncomeSecurityTransfers());
742 amount = formatAmount(securityTransfer.getIncomeSecurityTransfers());
743 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
744 totalPrincipalAmounts = totalPrincipalAmounts.add(securityTransfer.getPrincipalSecurityTransfers());
745 amount = formatAmount(securityTransfer.getPrincipalSecurityTransfers());
746 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
747 amount = formatAmount(securityTransfer.getTotalSecurityTransfers());
748 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
749 }
750 }
751
752 //now write out the sub-total line....amount
753 table.addCell("\t\t\t\t\t\t\t\tActivity Sub-Total");
754 amount = formatAmount(totalIncomeAmounts);
755 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
756 amount = formatAmount(totalPrincipalAmounts);
757 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
758 amount = formatAmount(totalIncomeAmounts.add(totalPrincipalAmounts));
759 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true));
760 }
761
762 /**
763 * Helper method to write the document header
764 *
765 * @param document
766 * @param transactionSummaryReport
767 */
768 protected void writeDocumentHeader(Document document, TransactionSummaryReportDataHolder transactionSummaryReport) {
769 // header
770 StringBuffer title = new StringBuffer();
771 title.append(transactionSummaryReport.getInstitution()).append("\n");
772 title.append("SUMMARY OF ACTIVITY FROM ");
773 title.append(transactionSummaryReport.getBeginningDate()).append(" TO ").append(transactionSummaryReport.getEndingDate()).append("\n");
774 title.append(transactionSummaryReport.getKemid()).append(" ").append(transactionSummaryReport.getKemidLongTitle()).append("\n\n");
775 try {
776 Paragraph header = new Paragraph(title.toString());
777 header.setAlignment(Element.ALIGN_CENTER);
778 document.add(header);
779 } catch (DocumentException de) {
780 LOG.info("writeDocumentHeader(): Unable to create the header for the report");
781 }
782 }
783
784 /**
785 * Helper method to write a line containing the column headings for the report
786 *
787 * @return table
788 */
789 protected PdfPTable writeDocumentTitleHeadings(String reportOption) {
790 // report table
791 int pdfPTableColumns;
792 int[] relativeWidthsForDetails = {140, 25, 25, 25};
793 int[] relativeWidthsForSummary = {140, 25};
794
795 if (EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) {
796 pdfPTableColumns = 4;
797 }
798 else {
799 pdfPTableColumns = 2;
800 }
801
802 try {
803 PdfPTable table = new PdfPTable(pdfPTableColumns);
804 table.setWidthPercentage(FULL_TABLE_WIDTH);
805 table.setWidths((EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) ? relativeWidthsForDetails : relativeWidthsForSummary);
806 table.getDefaultCell().setPadding(5);
807
808 // table titles
809 table.addCell(new Phrase("", titleFont));
810
811 if(EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) {
812 table.addCell(createCell("INCOME", titleFont, Element.ALIGN_CENTER, true));
813 table.addCell(createCell("PRINCIPAL", titleFont, Element.ALIGN_CENTER, true));
814 }
815
816 table.addCell(createCell("TOTAL", titleFont, Element.ALIGN_CENTER, true));
817 return table;
818 }
819 catch (DocumentException ex) {
820 LOG.info("Unable to write column headers.");
821 return null;
822 }
823 }
824
825 /**
826 * helper method to write out a sub-heading into the report.
827 */
828 protected void writeSubHeader(PdfPTable table, String subHeading, String reportOption) {
829 table.addCell("\t\t".concat(subHeading));
830 if (reportOption.equalsIgnoreCase(EndowConstants.EndowmentReport.DETAIL)) {
831 table.addCell("");
832 table.addCell("");
833 }
834 table.addCell("");
835 }
836
837 /**
838 * helper method to write the details lines where only the last column exists for amounts..
839 * @param description
840 * @param amount
841 */
842 protected void writeDetailsLineWithTotalAmountOnly(PdfPTable table, Font cellFont, String description, BigDecimal amount, String reportOption) {
843 table.addCell("\t\t".concat(description));
844 if (reportOption.equalsIgnoreCase(EndowConstants.EndowmentReport.DETAIL)) {
845 table.addCell("");
846 table.addCell("");
847 }
848 table.addCell(createCell(formatAmount(amount), cellFont, Element.ALIGN_RIGHT, true));
849 }
850 }
851