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.List; 021 022 import org.kuali.kfs.module.endow.report.util.TransactionStatementReportDataHolder.TransactionArchiveInfo; 023 024 import com.lowagie.text.Document; 025 import com.lowagie.text.Element; 026 import com.lowagie.text.Font; 027 import com.lowagie.text.Paragraph; 028 import com.lowagie.text.Phrase; 029 import com.lowagie.text.pdf.PdfPTable; 030 import com.lowagie.text.pdf.PdfWriter; 031 032 public class TransactionStatementReportPrint extends EndowmentReportPrintBase { 033 034 private final String ZERO_FOR_REPORT = "0.00"; 035 036 /** 037 * Generates the report in PDF using iText 038 * 039 * @param reportRequestHeaderDataHolder 040 * @param transactionStatementDataReportHolders 041 * @return 042 */ 043 public ByteArrayOutputStream printTransactionStatementReport(EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder, List<TransactionStatementReportDataHolder> transactionStatementDataReportHolders, String listKemidsInHeader) { 044 045 final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TransactionStatementReportPrint.class); 046 047 Document document = new Document(); 048 document.setPageSize(LETTER_PORTRAIT); 049 document.addTitle("Endowment Transaction Statement"); 050 051 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 052 053 try { 054 PdfWriter.getInstance(document, pdfStream); 055 document.open(); 056 057 // print the report header 058 if (printReportHeaderPage(reportRequestHeaderDataHolder, document, listKemidsInHeader)) { 059 // and then the body 060 if (transactionStatementDataReportHolders != null && transactionStatementDataReportHolders.size() > 0) { 061 printTransactionStatementReportBody(transactionStatementDataReportHolders, document); 062 } 063 } else { 064 LOG.error("Transaction Statement Report Header Error"); 065 } 066 067 document.close(); 068 069 } catch (Exception e) { 070 LOG.error("PDF Error: " + e.getMessage()); 071 return null; 072 } 073 074 return pdfStream; 075 } 076 077 /** 078 * Generates the Transaction Statement report 079 * 080 * @param transactionStatementReports 081 * @param document 082 * @return 083 */ 084 public boolean printTransactionStatementReportBody(List<TransactionStatementReportDataHolder> transactionStatementReportDataHolders, Document document) { 085 086 // for each kemid 087 try { 088 Font cellFont = regularFont; 089 for (TransactionStatementReportDataHolder transactionStatementReport : transactionStatementReportDataHolders) { 090 091 // new page 092 document.newPage(); 093 094 // header 095 StringBuffer title = new StringBuffer(); 096 title.append(transactionStatementReport.getInstitution()).append("\n"); 097 title.append("STATEMENT OF TRANSACTIONS FROM").append("\n"); 098 title.append(transactionStatementReport.getBeginningDate()).append(" to ").append(transactionStatementReport.getEndingDate()).append("\n"); 099 title.append(transactionStatementReport.getKemid()).append(" ").append(transactionStatementReport.getKemidLongTitle()).append("\n\n"); 100 Paragraph header = new Paragraph(title.toString()); 101 header.setAlignment(Element.ALIGN_CENTER); 102 document.add(header); 103 104 // report table 105 PdfPTable table = new PdfPTable(4); 106 table.setWidthPercentage(FULL_TABLE_WIDTH); 107 int[] relativeWidths = {10, 40, 25, 25}; 108 table.setWidths(relativeWidths); 109 table.getDefaultCell().setPadding(5); 110 111 // table titles 112 table.addCell(new Phrase("DATE", titleFont)); 113 table.addCell(new Phrase("DESCRIPTION", titleFont)); 114 table.addCell(createCell("INCOME AMOUNT", titleFont, Element.ALIGN_RIGHT, Element.ALIGN_MIDDLE, true)); 115 table.addCell(createCell("PRINCIPAL AMOUNT", titleFont, Element.ALIGN_RIGHT, Element.ALIGN_MIDDLE, true)); 116 117 // beginning cash balance 118 table.addCell(new Phrase(transactionStatementReport.getBeginningDate(), cellFont)); 119 table.addCell(new Phrase("Beginning Cash Balance", cellFont)); 120 String amount = ""; 121 amount = formatAmount(transactionStatementReport.getBeginningIncomeCash()); 122 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 123 amount = formatAmount(transactionStatementReport.getBeginningPrincipalCash()); 124 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 125 126 // transactions 127 List<TransactionArchiveInfo> TransactionArchiveInfoList = transactionStatementReport.getTransactionArchiveInfoList(); 128 for (TransactionArchiveInfo transactionArchiveInfo : TransactionArchiveInfoList) { 129 table.addCell(new Phrase(transactionArchiveInfo.getPostedDate(), cellFont)); 130 table.addCell(new Phrase(getDescription(transactionArchiveInfo), cellFont)); 131 amount = formatAmount(transactionArchiveInfo.getTransactionIncomeCash()); 132 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 133 amount = formatAmount(transactionArchiveInfo.getTransactionPrincipalCash()); 134 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 135 } 136 137 // ending cash balance 138 table.addCell(new Phrase(transactionStatementReport.getEndingDate(), cellFont)); 139 table.addCell(new Phrase("Ending Cash Balance", cellFont)); 140 amount = formatAmount(transactionStatementReport.getEndingIncomeCash()); 141 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 142 amount = formatAmount(transactionStatementReport.getEndingPrincipalCash()); 143 table.addCell(createCell(amount, cellFont, Element.ALIGN_RIGHT, true)); 144 145 document.add(table); 146 147 // footer 148 printFooter(transactionStatementReport.getFooter(), document); 149 } 150 151 } catch (Exception e) { 152 return false; 153 } 154 155 return true; 156 } 157 158 /** 159 * Gets the transaction info 160 * 161 * @param transactionArchiveInfo 162 * @return 163 */ 164 protected String getDescription(TransactionArchiveInfo transactionArchiveInfo) { 165 166 StringBuffer description = new StringBuffer(); 167 168 description.append(transactionArchiveInfo.getDocumentName()).append("\n"); 169 if (transactionArchiveInfo.getEtranCode() != null) { 170 description.append(transactionArchiveInfo.getEtranCode()) 171 .append(" - ") 172 .append(transactionArchiveInfo.getEtranCodeDesc()).append("\n"); 173 } 174 175 description.append(transactionArchiveInfo.getTransactionDesc()).append("\n"); 176 177 if (transactionArchiveInfo.getTransactionSecurity() != null && !transactionArchiveInfo.getTransactionSecurity().isEmpty()) { 178 description.append(transactionArchiveInfo.getTransactionSecurity()).append("\n"); 179 } 180 if (transactionArchiveInfo.getTransactionSecurityUnits() != null && transactionArchiveInfo.getTransactionSecurityUnits() != BigDecimal.ZERO) { 181 description.append(formatAmount(transactionArchiveInfo.getTransactionSecurityUnits(), FORMAT164)) 182 .append(" at ") 183 .append(formatAmount(transactionArchiveInfo.getTransactionSecurityUnitValue(), FORMAT195)) 184 .append(" per unit"); 185 } 186 187 return description.toString(); 188 } 189 190 } 191