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.ArrayList; 022 import java.util.Iterator; 023 import java.util.List; 024 import java.util.Set; 025 import java.util.TreeMap; 026 027 import org.kuali.kfs.module.endow.EndowConstants; 028 import org.kuali.kfs.module.endow.EndowConstants.IncomePrincipalIndicator; 029 import org.kuali.kfs.module.endow.report.util.AssetStatementReportDataHolder.ReportGroupData; 030 import org.kuali.kfs.sys.KFSConstants; 031 032 import com.lowagie.text.Document; 033 import com.lowagie.text.Element; 034 import com.lowagie.text.Font; 035 import com.lowagie.text.Paragraph; 036 import com.lowagie.text.pdf.PdfPCell; 037 import com.lowagie.text.pdf.PdfPTable; 038 import com.lowagie.text.pdf.PdfWriter; 039 040 public class AssetStatementReportPrint extends EndowmentReportPrintBase { 041 042 private final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AssetStatementReportPrint.class); 043 044 /** 045 * Generates all reports into one PDF file 046 * 047 * @param reportHeaderDataHolderForEndowment 048 * @param reportHeaderDataHolderForNonEndowed 049 * @param endowmentAssetStatementReportDataHolders 050 * @param nonEndowedAssetStatementReportDataHolders 051 * @param endowmentOption 052 * @param reportOption 053 * @param listKemidsOnHeader 054 * @return 055 */ 056 public ByteArrayOutputStream printAssetStatementReport( 057 EndowmentReportHeaderDataHolder reportHeaderDataHolderForEndowment, 058 EndowmentReportHeaderDataHolder reportHeaderDataHolderForNonEndowed, 059 List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, 060 List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, 061 String endowmentOption, 062 String reportOption, 063 String listKemidsInHeader) { 064 065 // prepare iText document 066 Document document = new Document(); 067 document.addTitle("Endowment Asset Statement"); 068 069 // this output stream will be returned to the user in PDF 070 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 071 072 try { 073 PdfWriter.getInstance(document, pdfStream); 074 document.open(); 075 076 // generates a PDF based on the options and data 077 if (KFSConstants.ParameterValues.YES.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) { 078 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 079 // endowment detail 080 generateEndowmentDetailReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 081 } 082 } 083 else if (KFSConstants.ParameterValues.YES.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.TOTAL.equalsIgnoreCase(reportOption)) { 084 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 085 // endowment total 086 generateEndowmentTotalReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, true); 087 } 088 } 089 else if (KFSConstants.ParameterValues.YES.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(reportOption)) { 090 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 091 // endowment detail 092 generateEndowmentDetailReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 093 // endowment total 094 generateEndowmentTotalReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, true); 095 } 096 } 097 else if (KFSConstants.ParameterValues.NO.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) { 098 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 099 // non-endowed detail 100 generateNonEndowedDetailReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, false); 101 } 102 } 103 else if (KFSConstants.ParameterValues.NO.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.TOTAL.equalsIgnoreCase(reportOption)) { 104 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 105 // non-endowed total 106 generateNonEndowedTotalReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, false); 107 } 108 } 109 else if (KFSConstants.ParameterValues.NO.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(reportOption)) { 110 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 111 // non-endowed detail 112 generateNonEndowedDetailReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, false); 113 // non-endowed total 114 generateNonEndowedTotalReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, true); 115 } 116 } 117 else if (EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.DETAIL.equalsIgnoreCase(reportOption)) { 118 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 119 // endowment detail 120 generateEndowmentDetailReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 121 } 122 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 123 // non-endowed detail 124 generateNonEndowedDetailReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, true); 125 } 126 } 127 else if (EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.TOTAL.equalsIgnoreCase(reportOption)) { 128 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 129 // endowment total 130 generateEndowmentTotalReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 131 } 132 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 133 // non-endowed total 134 generateNonEndowedTotalReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, true); 135 } 136 } 137 else if (EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(endowmentOption) && EndowConstants.EndowmentReport.BOTH.equalsIgnoreCase(reportOption)) { 138 if (endowmentAssetStatementReportDataHolders != null && endowmentAssetStatementReportDataHolders.size() > 0) { 139 // endowment detail 140 generateEndowmentDetailReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 141 // endowment total 142 generateEndowmentTotalReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, true); 143 } 144 if (nonEndowedAssetStatementReportDataHolders != null && nonEndowedAssetStatementReportDataHolders.size() > 0) { 145 // non-endowed detail 146 generateNonEndowedDetailReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, true); 147 // non-endowed total 148 generateNonEndowedTotalReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, true); 149 } 150 } 151 152 document.close(); 153 154 } catch (Exception e) { 155 LOG.error("Error in AssetStatementReportPrint:printAssetStatementReport(): " + e.getMessage()); 156 return null; 157 } 158 159 return pdfStream; 160 } 161 162 /** 163 * Creates an endowment detail report in PDF 164 * 165 * @param endowmentAssetStatementReportDataHolders 166 * @param reportHeaderDataHolderForEndowment 167 * @param listKemidsInHeader 168 * @return 169 */ 170 public ByteArrayOutputStream generateEndowmentDetailReport(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForEndowment, String listKemidsInHeader) { 171 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 172 try { 173 Document document = new Document(); 174 PdfWriter.getInstance(document, pdfStream); 175 document.open(); 176 generateEndowmentDetailReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 177 document.close(); 178 return pdfStream; 179 } catch (Exception e) { 180 LOG.error("Error in generateEndowmentDetailReport(): " + e.getMessage()); 181 return null; 182 } 183 } 184 185 /** 186 * Creates an endowment total report in PDF 187 * 188 * @param endowmentAssetStatementReportDataHolders 189 * @param reportHeaderDataHolderForEndowment 190 * @param listKemidsInHeader 191 * @return 192 */ 193 public ByteArrayOutputStream generateEndowmentTotalReport(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForEndowment, String listKemidsInHeader) { 194 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 195 try { 196 Document document = new Document(); 197 PdfWriter.getInstance(document, pdfStream); 198 document.open(); 199 generateEndowmentTotalReport(endowmentAssetStatementReportDataHolders, reportHeaderDataHolderForEndowment, document, listKemidsInHeader, false); 200 document.close(); 201 return pdfStream; 202 } catch (Exception e) { 203 LOG.error("Error in generateEndowmentDetailReport(): " + e.getMessage()); 204 return null; 205 } 206 } 207 208 /** 209 * Creates a non-endowed detail report in PDF 210 * 211 * @param endowmentAssetStatementReportDataHolders 212 * @param reportHeaderDataHolderForEndowment 213 * @param listKemidsInHeader 214 * @return 215 */ 216 public ByteArrayOutputStream generateNonEndowedDetailReport(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForNonEndowed, String listKemidsInHeader) { 217 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 218 try { 219 Document document = new Document(); 220 PdfWriter.getInstance(document, pdfStream); 221 document.open(); 222 generateNonEndowedDetailReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, false); 223 document.close(); 224 return pdfStream; 225 } catch (Exception e) { 226 LOG.error("Error in generateEndowmentDetailReport(): " + e.getMessage()); 227 return null; 228 } 229 } 230 231 /** 232 * Creates a non-endowed total report in PDF 233 * 234 * @param endowmentAssetStatementReportDataHolders 235 * @param reportHeaderDataHolderForEndowment 236 * @param listKemidsInHeader 237 * @return 238 */ 239 public ByteArrayOutputStream generateNonEndowedTotalReport(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForNonEndowed, String listKemidsInHeader) { 240 ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); 241 try { 242 Document document = new Document(); 243 PdfWriter.getInstance(document, pdfStream); 244 document.open(); 245 generateNonEndowedTotalReport(nonEndowedAssetStatementReportDataHolders, reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader, false); 246 document.close(); 247 return pdfStream; 248 } catch (Exception e) { 249 LOG.error("Error in generateEndowmentDetailReport(): " + e.getMessage()); 250 return null; 251 } 252 } 253 254 /** 255 * Creates an endowment total report 256 * 257 * @param endowmentAssetStatementReportDataHolders 258 * @param reportHeaderDataHolderForEndowment 259 * @param document 260 * @param listKemidsInHeader 261 * @param beginWithNewpage 262 */ 263 protected void generateEndowmentDetailReport(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForEndowment, Document document, String listKemidsInHeader, boolean beginWithNewpage) { 264 document.setPageSize(LETTER_PORTRAIT); 265 if (beginWithNewpage) setNewPage(document); 266 reportHeaderDataHolderForEndowment.setEndowmentOption(EndowConstants.EndowmentReport.ENDOWMENT); 267 reportHeaderDataHolderForEndowment.setReportOption(EndowConstants.EndowmentReport.DETAIL_REPORT); 268 printReportHeaderPage(reportHeaderDataHolderForEndowment, document, listKemidsInHeader); 269 270 document.setPageSize(LETTER_LANDSCAPE); 271 printAssetStatementReportBodyForEndowmentDetail(endowmentAssetStatementReportDataHolders, document); 272 } 273 274 /** 275 * Creates an endowment detail report 276 * 277 * @param endowmentAssetStatementReportDataHolders 278 * @param reportHeaderDataHolderForEndowment 279 * @param document 280 * @param listKemidsInHeader 281 * @param beginWithNewpage 282 */ 283 protected void generateEndowmentTotalReport(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForEndowment, Document document, String listKemidsInHeader, boolean beginWithNewpage) { 284 document.setPageSize(LETTER_PORTRAIT); 285 if (beginWithNewpage) setNewPage(document); 286 reportHeaderDataHolderForEndowment.setEndowmentOption(EndowConstants.EndowmentReport.ENDOWMENT); 287 reportHeaderDataHolderForEndowment.setReportOption(EndowConstants.EndowmentReport.TOTAL_REPORT); 288 printReportHeaderPage(reportHeaderDataHolderForEndowment, document, listKemidsInHeader); 289 290 document.setPageSize(LETTER_LANDSCAPE); 291 printAssetStatementReportBodyForEndowmentTotal(endowmentAssetStatementReportDataHolders, document); 292 } 293 294 /** 295 * Creates a non-endowed detail report 296 * 297 * @param nonEndowedAssetStatementReportDataHolders 298 * @param reportHeaderDataHolderForNonEndowed 299 * @param document 300 * @param listKemidsInHeader 301 * @param beginWithNewpage 302 */ 303 protected void generateNonEndowedDetailReport(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForNonEndowed, Document document, String listKemidsInHeader, boolean beginWithNewpage) { 304 document.setPageSize(LETTER_PORTRAIT); 305 if (beginWithNewpage) setNewPage(document); 306 reportHeaderDataHolderForNonEndowed.setEndowmentOption(EndowConstants.EndowmentReport.NON_ENDOWED); 307 reportHeaderDataHolderForNonEndowed.setReportOption(EndowConstants.EndowmentReport.DETAIL_REPORT); 308 printReportHeaderPage(reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader); 309 310 document.setPageSize(LETTER_LANDSCAPE); 311 printAssetStatementReportBodyForNonEndowedDetail(nonEndowedAssetStatementReportDataHolders, document); 312 } 313 314 /** 315 * Creates a non-endowed total report 316 * 317 * @param nonEndowedAssetStatementReportDataHolders 318 * @param reportHeaderDataHolderForNonEndowed 319 * @param document 320 * @param listKemidsInHeader 321 * @param beginWithNewpage 322 */ 323 protected void generateNonEndowedTotalReport(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, EndowmentReportHeaderDataHolder reportHeaderDataHolderForNonEndowed, Document document, String listKemidsInHeader, boolean beginWithNewpage) { 324 document.setPageSize(LETTER_PORTRAIT); 325 if (beginWithNewpage) setNewPage(document); 326 reportHeaderDataHolderForNonEndowed.setEndowmentOption(EndowConstants.EndowmentReport.NON_ENDOWED); 327 reportHeaderDataHolderForNonEndowed.setReportOption(EndowConstants.EndowmentReport.TOTAL_REPORT); 328 printReportHeaderPage(reportHeaderDataHolderForNonEndowed, document, listKemidsInHeader); 329 330 document.setPageSize(LETTER_LANDSCAPE); 331 printAssetStatementReportBodyForNonEndowedTotal(nonEndowedAssetStatementReportDataHolders, document); 332 } 333 334 /** 335 * Sets the page break 336 * 337 * @param document 338 */ 339 protected void setNewPage(Document document) { 340 try { 341 document.newPage(); 342 } catch (Exception e) { 343 LOG.error("New Page Error: " + e.getMessage()); 344 return; 345 } 346 } 347 348 /** 349 * Prints report body for endowment detail 350 * 351 * @param endowmentAssetStatementReportDataHolders 352 * @param document 353 * @return 354 */ 355 public boolean printAssetStatementReportBodyForEndowmentTotal(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, Document document) { 356 357 BigDecimal totalHistoryIncomeCash = BigDecimal.ZERO; 358 BigDecimal totalHistoryPrincipalCash = BigDecimal.ZERO; 359 TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForIncomeTotal = null; 360 TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForPrincipalTotal = null; 361 362 // get the cash totals 363 for (AssetStatementReportDataHolder data : endowmentAssetStatementReportDataHolders) { 364 totalHistoryIncomeCash = totalHistoryIncomeCash.add(data.getHistoryIncomeCash()); 365 totalHistoryPrincipalCash = totalHistoryPrincipalCash.add(data.getHistoryPrincipalCash()); 366 } 367 368 // for income 369 reportGroupsForIncomeTotal = createReportGroupsForTotal(endowmentAssetStatementReportDataHolders, IncomePrincipalIndicator.INCOME); 370 371 // for principal 372 reportGroupsForPrincipalTotal = createReportGroupsForTotal(endowmentAssetStatementReportDataHolders, IncomePrincipalIndicator.PRINCIPAL); 373 374 // for each kemid 375 try { 376 Font cellFont = regularFont; 377 378 // for the common info 379 AssetStatementReportDataHolder reportData = endowmentAssetStatementReportDataHolders.get(0); 380 381 document.newPage(); 382 383 // header 384 StringBuffer title = new StringBuffer(); 385 title.append(reportData.getInstitution()).append("\n"); 386 title.append("STATEMENT OF ASSETS FOR PERIOD ENDING").append("\n"); 387 title.append(reportData.getMonthEndDate()).append("\n\n"); 388 Paragraph header = new Paragraph(title.toString()); 389 header.setAlignment(Element.ALIGN_CENTER); 390 document.add(header); 391 392 // report table 393 float[] colsWidth = {15f, 17f, 17f, 17f, 17f, 17f}; 394 PdfPTable table = new PdfPTable(colsWidth); 395 table.setWidthPercentage(FULL_TABLE_WIDTH); 396 table.getDefaultCell().setPadding(5); 397 398 // column titles 399 table.addCell(""); 400 table.addCell(createCell("UNITS HELD", titleFont, Element.ALIGN_RIGHT, true)); 401 table.addCell(createCell("MARKET VALUE", titleFont, Element.ALIGN_RIGHT, true)); 402 table.addCell(createCell("ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 403 table.addCell(createCell("FY REMAINDER ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 404 table.addCell(createCell("NEXT FY ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 405 406 // 1. Expendable funds 407 408 PdfPCell cellExpendableFunds = new PdfPCell(new Paragraph("EXPENDABLE FUNDS", titleFont)); 409 cellExpendableFunds.setColspan(6); 410 table.addCell(cellExpendableFunds); 411 412 PdfPCell cellCashEquivalnets = new PdfPCell(new Paragraph("CASH AND EQUIVALENTS", titleFont)); 413 cellCashEquivalnets.setColspan(6); 414 table.addCell(cellCashEquivalnets); 415 416 // report groups for income 417 printReportGroupForIncomeEndowmentTotal(reportGroupsForIncomeTotal, totalHistoryIncomeCash, document, table, cellFont); 418 419 // 2. Endowed funds 420 421 PdfPCell cellEndowedFunds = new PdfPCell(new Paragraph("ENDOWED FUNDS", titleFont)); 422 cellEndowedFunds.setColspan(6); 423 table.addCell(cellEndowedFunds); 424 425 table.addCell(cellCashEquivalnets); 426 427 // report groups for principal 428 printReportGroupForPrincipalEndowmentTotal(reportGroupsForPrincipalTotal, totalHistoryPrincipalCash, document, table, cellFont); 429 430 // 3. total (endowment + non-endowed) 431 PdfPCell blank = new PdfPCell(new Paragraph("", cellFont)); 432 blank.setColspan(6); 433 blank.setBackgroundColor(Color.LIGHT_GRAY); 434 table.addCell(blank); 435 436 BigDecimal totalKemidMarketValue = BigDecimal.ZERO; 437 BigDecimal totalKemidEstimatedAnnualIncome = BigDecimal.ZERO; 438 BigDecimal totalKemidFYRemainderEstimatedAnnualIncome = BigDecimal.ZERO; 439 BigDecimal totalKemidNextFYEstimayedAnnualIncome = BigDecimal.ZERO; 440 for (AssetStatementReportDataHolder data : endowmentAssetStatementReportDataHolders) { 441 totalKemidMarketValue = totalKemidMarketValue.add(data.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME).add(data.getTotalSumOfMarketValue(IncomePrincipalIndicator.PRINCIPAL))); 442 totalKemidEstimatedAnnualIncome = totalKemidEstimatedAnnualIncome.add(data.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.INCOME).add(data.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL))); 443 totalKemidFYRemainderEstimatedAnnualIncome = totalKemidFYRemainderEstimatedAnnualIncome.add(data.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.INCOME).add(data.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.PRINCIPAL))); 444 totalKemidNextFYEstimayedAnnualIncome = totalKemidNextFYEstimayedAnnualIncome.add(data.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.INCOME).add(data.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL))); 445 } 446 447 table.addCell(new Paragraph("TOTAL KEMID VALUE", titleFont)); 448 table.addCell(""); 449 table.addCell(getAmountCell(totalKemidMarketValue.add(totalHistoryIncomeCash).add(totalHistoryPrincipalCash), titleFont)); 450 table.addCell(getAmountCell(totalKemidEstimatedAnnualIncome, titleFont)); 451 table.addCell(getAmountCell(totalKemidFYRemainderEstimatedAnnualIncome, titleFont)); 452 table.addCell(getAmountCell(totalKemidNextFYEstimayedAnnualIncome, titleFont)); 453 454 document.add(table); 455 456 } catch (Exception e) { 457 LOG.error(e.getMessage()); 458 return false; 459 } 460 461 return true; 462 463 } 464 465 /** 466 * Generates the Asset Statement report for Non-Endowed total 467 * 468 * @param transactionStatementReports 469 * @param document 470 * @return 471 */ 472 public boolean printAssetStatementReportBodyForNonEndowedTotal(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, Document document) { 473 474 BigDecimal totalHistoryIncomeCash = BigDecimal.ZERO; 475 BigDecimal totalHistoryPrincipalCash = BigDecimal.ZERO; 476 TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForTotal = null; 477 478 // get the cash totals 479 for (AssetStatementReportDataHolder data : nonEndowedAssetStatementReportDataHolders) { 480 totalHistoryIncomeCash = totalHistoryIncomeCash.add(data.getHistoryIncomeCash()); 481 totalHistoryPrincipalCash = totalHistoryPrincipalCash.add(data.getHistoryPrincipalCash()); 482 } 483 484 reportGroupsForTotal = createReportGroupsForTotal(nonEndowedAssetStatementReportDataHolders, IncomePrincipalIndicator.INCOME); 485 486 // for each kemid 487 try { 488 Font cellFont = regularFont; 489 490 // for the common info 491 AssetStatementReportDataHolder reportData = nonEndowedAssetStatementReportDataHolders.get(0); 492 493 document.newPage(); 494 495 // header 496 StringBuffer title = new StringBuffer(); 497 title.append(reportData.getInstitution()).append("\n"); 498 title.append("STATEMENT OF ASSETS FOR PERIOD ENDING").append("\n"); 499 title.append(reportData.getMonthEndDate()).append("\n\n"); 500 Paragraph header = new Paragraph(title.toString()); 501 header.setAlignment(Element.ALIGN_CENTER); 502 document.add(header); 503 504 // report table 505 float[] colsWidth = {15f, 17f, 17f, 17f, 17f, 17f}; 506 PdfPTable table = new PdfPTable(colsWidth); 507 table.setWidthPercentage(FULL_TABLE_WIDTH); 508 table.getDefaultCell().setPadding(5); 509 510 // column titles 511 table.addCell(""); 512 table.addCell(createCell("UNITS HELD", titleFont, Element.ALIGN_RIGHT, true)); 513 table.addCell(createCell("MARKET VALUE", titleFont, Element.ALIGN_RIGHT, true)); 514 table.addCell(createCell("ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 515 table.addCell(createCell("FY REMAINDER ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 516 table.addCell(createCell("NEXT FY ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 517 518 PdfPCell cellCashEquivalnets = new PdfPCell(new Paragraph("CASH AND EQUIVALENTS", titleFont)); 519 cellCashEquivalnets.setColspan(6); 520 table.addCell(cellCashEquivalnets); 521 522 // report groups 523 printReportGroupForNonEndowedTotal(reportGroupsForTotal, totalHistoryIncomeCash, totalHistoryPrincipalCash, document, table, cellFont); 524 525 // total 526 PdfPCell blank = new PdfPCell(new Paragraph("", cellFont)); 527 blank.setColspan(6); 528 blank.setBackgroundColor(Color.LIGHT_GRAY); 529 table.addCell(blank); 530 531 BigDecimal totalKemidMarketValue = BigDecimal.ZERO; 532 BigDecimal totalKemidEstimatedAnnualIncome = BigDecimal.ZERO; 533 BigDecimal totalKemidFYRemainderEstimatedAnnualIncome = BigDecimal.ZERO; 534 BigDecimal totalKemidNextFYEstimayedAnnualIncome = BigDecimal.ZERO; 535 for (AssetStatementReportDataHolder data : nonEndowedAssetStatementReportDataHolders) { 536 totalKemidMarketValue = totalKemidMarketValue.add(data.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME)); 537 totalKemidEstimatedAnnualIncome = totalKemidEstimatedAnnualIncome.add(data.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.INCOME)); 538 totalKemidFYRemainderEstimatedAnnualIncome = totalKemidFYRemainderEstimatedAnnualIncome.add(totalKemidFYRemainderEstimatedAnnualIncome.add(data.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.INCOME))); 539 totalKemidNextFYEstimayedAnnualIncome = totalKemidNextFYEstimayedAnnualIncome.add(data.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.INCOME)); 540 } 541 542 table.addCell(new Paragraph("TOTAL KEMID VALUE", titleFont)); 543 table.addCell(""); 544 table.addCell(getAmountCell(totalKemidMarketValue.add(totalHistoryIncomeCash).add(totalHistoryPrincipalCash), titleFont)); 545 table.addCell(getAmountCell(totalKemidEstimatedAnnualIncome, titleFont)); 546 table.addCell(getAmountCell(totalKemidFYRemainderEstimatedAnnualIncome, titleFont)); 547 table.addCell(getAmountCell(totalKemidNextFYEstimayedAnnualIncome, titleFont)); 548 549 document.add(table); 550 551 } catch (Exception e) { 552 LOG.error(e.getMessage()); 553 return false; 554 } 555 556 return true; 557 } 558 559 /** 560 * Generates the Asset Statement report for Endowment detail 561 * 562 * @param transactionStatementReports 563 * @param document 564 * @return 565 */ 566 public boolean printAssetStatementReportBodyForEndowmentDetail(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, Document document) { 567 568 // for each kemid 569 try { 570 Font cellFont = regularFont; 571 for (AssetStatementReportDataHolder reportData : endowmentAssetStatementReportDataHolders) { 572 573 document.newPage(); 574 575 // header 576 StringBuffer title = new StringBuffer(); 577 title.append(reportData.getInstitution()).append("\n"); 578 title.append("STATEMENT OF ASSETS FOR PERIOD ENDING").append("\n"); 579 title.append(reportData.getMonthEndDate()).append("\n"); 580 title.append(reportData.getKemid()).append(" ").append(reportData.getKemidLongTitle()).append("\n\n"); 581 Paragraph header = new Paragraph(title.toString()); 582 header.setAlignment(Element.ALIGN_CENTER); 583 document.add(header); 584 585 // report table 586 float[] colsWidth = {15f, 17f, 17f, 17f, 17f, 17f}; 587 PdfPTable table = new PdfPTable(colsWidth); 588 table.setWidthPercentage(FULL_TABLE_WIDTH); 589 table.getDefaultCell().setPadding(5); 590 591 // column titles 592 table.addCell(""); 593 table.addCell(createCell("UNITS HELD", titleFont, Element.ALIGN_RIGHT, true)); 594 table.addCell(createCell("MARKET VALUE", titleFont, Element.ALIGN_RIGHT, true)); 595 table.addCell(createCell("ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 596 table.addCell(createCell("FY REMAINDER ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 597 table.addCell(createCell("NEXT FY ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 598 599 // 1. Expendable funds 600 601 PdfPCell cellExpendableFunds = new PdfPCell(new Paragraph("EXPENDABLE FUNDS", titleFont)); 602 cellExpendableFunds.setColspan(6); 603 //cellExpendableFunds.setBackgroundColor(Color.LIGHT_GRAY); 604 table.addCell(cellExpendableFunds); 605 606 PdfPCell cellCashEquivalnets = new PdfPCell(new Paragraph("CASH AND EQUIVALENTS", cellFont)); 607 cellCashEquivalnets.setColspan(6); 608 table.addCell(cellCashEquivalnets); 609 610 // report groups 611 printReportGroupForIncomeEndowmentDetail(reportData, document, table, cellFont); 612 613 // 2. Endowed funds 614 615 PdfPCell cellEndowedFunds = new PdfPCell(new Paragraph("ENDOWED FUNDS", titleFont)); 616 cellEndowedFunds.setColspan(6); 617 //cellEndowedFunds.setBackgroundColor(Color.LIGHT_GRAY); 618 table.addCell(cellEndowedFunds); 619 620 table.addCell(cellCashEquivalnets); 621 622 printReportGroupForPrincipalEndowmentDetail(reportData, document, table, cellFont); 623 624 // 3. total (endowment + non-endowed) 625 PdfPCell blank = new PdfPCell(new Paragraph("", cellFont)); 626 blank.setColspan(6); 627 blank.setBackgroundColor(Color.LIGHT_GRAY); 628 table.addCell(blank); 629 630 BigDecimal totalKemidMarketValue = reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME).add(reportData.getHistoryIncomeCash()) 631 .add(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.PRINCIPAL).add(reportData.getHistoryPrincipalCash())); 632 BigDecimal totalKemidEstimatedAnnualIncome = reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL)); 633 BigDecimal totalKemidFYRemainderEstimatedAnnualIncome = reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.PRINCIPAL)); 634 BigDecimal totalKemidNextFYEstimayedAnnualIncome = reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL)); 635 636 table.addCell(new Paragraph("TOTAL KEMID VALUE", titleFont)); 637 table.addCell(""); 638 table.addCell(getAmountCell(totalKemidMarketValue, titleFont)); 639 table.addCell(getAmountCell(totalKemidEstimatedAnnualIncome, titleFont)); 640 table.addCell(getAmountCell(totalKemidFYRemainderEstimatedAnnualIncome, titleFont)); 641 table.addCell(getAmountCell(totalKemidNextFYEstimayedAnnualIncome, titleFont)); 642 643 document.add(table); 644 645 // footer 646 printFooter(reportData.getFooter(), document); 647 } 648 } catch (Exception e) { 649 LOG.error(e.getMessage()); 650 return false; 651 } 652 653 return true; 654 } 655 656 /** 657 * Generates the Asset Statement report for Non-Endowed 658 * 659 * @param transactionStatementReports 660 * @param document 661 * @return 662 */ 663 public boolean printAssetStatementReportBodyForNonEndowedDetail(List<AssetStatementReportDataHolder> nonEndowedAssetStatementReportDataHolders, Document document) { 664 665 // for each kemid 666 try { 667 Font cellFont = regularFont; 668 for (AssetStatementReportDataHolder reportData : nonEndowedAssetStatementReportDataHolders) { 669 670 document.newPage(); 671 672 // header 673 StringBuffer title = new StringBuffer(); 674 title.append(reportData.getInstitution()).append("\n"); 675 title.append("STATEMENT OF ASSETS FOR PERIOD ENDING").append("\n"); 676 title.append(reportData.getMonthEndDate()).append("\n"); 677 title.append(reportData.getKemid()).append(" ").append(reportData.getKemidLongTitle()).append("\n\n"); 678 Paragraph header = new Paragraph(title.toString()); 679 header.setAlignment(Element.ALIGN_CENTER); 680 document.add(header); 681 682 // report table 683 float[] colsWidth = {15f, 17f, 17f, 17f, 17f, 17f}; 684 PdfPTable table = new PdfPTable(colsWidth); 685 table.setWidthPercentage(FULL_TABLE_WIDTH); 686 table.getDefaultCell().setPadding(5); 687 688 // column titles 689 table.addCell(""); 690 table.addCell(createCell("UNITS HELD", titleFont, Element.ALIGN_RIGHT, true)); 691 table.addCell(createCell("MARKET VALUE", titleFont, Element.ALIGN_RIGHT, true)); 692 table.addCell(createCell("ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 693 table.addCell(createCell("FY REMAINDER ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 694 table.addCell(createCell("NEXT FY ESTIMATED\nANNUAL INCOME", titleFont, Element.ALIGN_RIGHT, true)); 695 696 PdfPCell cellCashEquivalnets = new PdfPCell(new Paragraph("CASH AND EQUIVALENTS", cellFont)); 697 cellCashEquivalnets.setColspan(6); 698 table.addCell(cellCashEquivalnets); 699 700 // report groups 701 printReportGroupForNonEndowedDetail(reportData, document, table, cellFont); 702 703 // total 704 PdfPCell blank = new PdfPCell(new Paragraph("", cellFont)); 705 blank.setColspan(6); 706 blank.setBackgroundColor(Color.LIGHT_GRAY); 707 table.addCell(blank); 708 709 BigDecimal totalKemidMarketValue = reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME).add(reportData.getHistoryIncomeCash()).add(reportData.getHistoryPrincipalCash()); 710 BigDecimal totalKemidEstimatedAnnualIncome = reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL)); 711 BigDecimal totalKemidFYRemainderEstimatedAnnualIncome = reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.PRINCIPAL)); 712 BigDecimal totalKemidNextFYEstimayedAnnualIncome = reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.INCOME).add(reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL)); 713 714 table.addCell(new Paragraph("TOTAL KEMID VALUE", titleFont)); 715 table.addCell(""); 716 table.addCell(getAmountCell(totalKemidMarketValue, titleFont)); 717 table.addCell(getAmountCell(totalKemidEstimatedAnnualIncome, titleFont)); 718 table.addCell(getAmountCell(totalKemidFYRemainderEstimatedAnnualIncome, titleFont)); 719 table.addCell(getAmountCell(totalKemidNextFYEstimayedAnnualIncome, titleFont)); 720 721 document.add(table); 722 723 // footer 724 printFooter(reportData.getFooter(), document); 725 } 726 } catch (Exception e) { 727 LOG.error(e.getMessage()); 728 return false; 729 } 730 731 return true; 732 } 733 734 /** 735 * Generates report group for income endowment detail 736 * 737 * @param reportData 738 * @param docuement 739 * @param table 740 * @param cellFont 741 * @throws Exception 742 */ 743 protected void printReportGroupForIncomeEndowmentDetail(AssetStatementReportDataHolder reportData, Document docuement, PdfPTable table, Font cellFont) throws Exception { 744 745 table.addCell(new Paragraph("Income Cash", cellFont)); 746 table.addCell(""); 747 table.addCell(getAmountCell(reportData.getHistoryIncomeCash(), cellFont)); 748 table.addCell(""); 749 table.addCell(""); 750 table.addCell(""); 751 752 TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroups = reportData.getReportGroupsForIncome(); 753 754 if (reportGroups == null || reportGroups.isEmpty()) { 755 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 756 table.addCell(""); 757 table.addCell(getAmountCell(reportData.getHistoryIncomeCash(), cellFont)); 758 table.addCell(""); 759 table.addCell(""); 760 table.addCell(""); 761 return; 762 } 763 764 // Cash and equivalents first 765 TreeMap<String, ReportGroupData> cashEquivalentsData = reportData.getReportGroupsForIncome().get(1); 766 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 767 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 768 while (secirutyIdSet.hasNext()) { 769 // get securityId 770 String securityId = secirutyIdSet.next(); 771 ReportGroupData data = cashEquivalentsData.get(securityId); 772 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 773 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 774 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 775 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 776 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 777 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 778 } 779 } 780 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 781 table.addCell(""); 782 table.addCell(getAmountCell(reportData.getTotalMarketValueForCashEquivalents(IncomePrincipalIndicator.INCOME).add(reportData.getHistoryIncomeCash()), cellFont)); 783 table.addCell(""); 784 table.addCell(""); 785 table.addCell(""); 786 787 // Other report group 788 Iterator<Integer> reportGroupOrderSet = reportGroups.keySet().iterator(); 789 while (reportGroupOrderSet.hasNext()) { 790 791 Integer reportGroupOrder = reportGroupOrderSet.next(); 792 if (reportGroupOrder.intValue() > 1) { 793 TreeMap<String, ReportGroupData> reportGroupData = reportData.getReportGroupsForIncome().get(reportGroupOrder); 794 if (reportGroupData == null || reportGroupData.isEmpty()) { 795 continue; 796 } 797 // print report group description 798 String reportGroupDesc = reportGroupData.firstEntry().getValue().getReportGroupDesc(); 799 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, cellFont)); 800 groupDescCell.setColspan(6); 801 table.addCell(groupDescCell); 802 803 // print info per security 804 Iterator<String> secirutyIdSet = reportGroupData.keySet().iterator(); 805 while (secirutyIdSet.hasNext()) { 806 String securityId = secirutyIdSet.next(); 807 ReportGroupData data = reportGroupData.get(securityId); 808 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 809 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 810 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 811 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 812 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 813 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 814 } 815 816 // report group totals 817 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 818 table.addCell(""); 819 table.addCell(getAmountCell(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME, reportGroupOrder), cellFont)); 820 table.addCell(""); 821 table.addCell(""); 822 table.addCell(""); 823 } 824 } 825 826 // total expendable funds 827 table.addCell(new Paragraph("TOTAL EXPENDABLE FUNDS", titleFont)); 828 table.addCell(""); 829 table.addCell(getAmountCell(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME).add(reportData.getHistoryIncomeCash()), cellFont)); 830 table.addCell(getAmountCell(reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.INCOME), cellFont)); 831 table.addCell(getAmountCell(reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.INCOME), cellFont)); 832 table.addCell(getAmountCell(reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.INCOME), cellFont)); 833 } 834 835 /** 836 * Generates report group for principal endowment detail 837 * 838 * @param reportData 839 * @param docuement 840 * @param table 841 * @param cellFont 842 */ 843 protected void printReportGroupForPrincipalEndowmentDetail(AssetStatementReportDataHolder reportData, Document docuement, PdfPTable table, Font cellFont) { 844 845 table.addCell(new Paragraph("Principal Cash", cellFont)); 846 table.addCell(""); 847 table.addCell(getAmountCell(reportData.getHistoryPrincipalCash(), cellFont)); 848 table.addCell(""); 849 table.addCell(""); 850 table.addCell(""); 851 852 TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroups = reportData.getReportGroupsForPrincipal(); 853 if (reportGroups == null || reportGroups.isEmpty()) { 854 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 855 table.addCell(""); 856 table.addCell(getAmountCell(reportData.getHistoryPrincipalCash(), cellFont)); 857 table.addCell(""); 858 table.addCell(""); 859 table.addCell(""); 860 return; 861 } 862 863 // Cash and equivalents first 864 TreeMap<String, ReportGroupData> cashEquivalentsData = reportData.getReportGroupsForPrincipal().get(1); 865 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 866 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 867 while (secirutyIdSet.hasNext()) { 868 // get securityId 869 String securityId = secirutyIdSet.next(); 870 ReportGroupData data = cashEquivalentsData.get(securityId); 871 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 872 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 873 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 874 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 875 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 876 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 877 } 878 } 879 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 880 table.addCell(""); 881 table.addCell(getAmountCell(reportData.getTotalMarketValueForCashEquivalents(IncomePrincipalIndicator.PRINCIPAL).add(reportData.getHistoryPrincipalCash()), cellFont)); 882 table.addCell(""); 883 table.addCell(""); 884 table.addCell(""); 885 886 // other report groups 887 Iterator<Integer> reportGroupOrderSet = reportGroups.keySet().iterator(); 888 while (reportGroupOrderSet.hasNext()) { 889 890 Integer reportGroupOrder = reportGroupOrderSet.next(); 891 if (reportGroupOrder.intValue() > 1) { 892 TreeMap<String, ReportGroupData> reportGroupData = reportData.getReportGroupsForPrincipal().get(reportGroupOrder); 893 if (reportGroupData == null || reportGroupData.isEmpty()) { 894 continue; 895 } 896 // print report group description 897 String reportGroupDesc = reportGroupData.firstEntry().getValue().getReportGroupDesc(); 898 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, cellFont)); 899 groupDescCell.setColspan(6); 900 table.addCell(groupDescCell); 901 902 // print info per security 903 Iterator<String> secirutyIdSet = reportGroupData.keySet().iterator(); 904 while (secirutyIdSet.hasNext()) { 905 String securityId = secirutyIdSet.next(); 906 ReportGroupData data = reportGroupData.get(securityId); 907 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 908 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 909 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 910 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 911 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 912 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 913 } 914 915 // report group totals 916 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 917 table.addCell(""); 918 table.addCell(getAmountCell(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.PRINCIPAL, reportGroupOrder), cellFont)); 919 table.addCell(""); 920 table.addCell(""); 921 table.addCell(""); 922 } 923 } 924 925 // total expendable funds 926 table.addCell(new Paragraph("TOTAL ENDOWED FUNDS", titleFont)); 927 table.addCell(""); 928 table.addCell(getAmountCell(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.PRINCIPAL).add(reportData.getHistoryPrincipalCash()), cellFont)); 929 table.addCell(getAmountCell(reportData.getTotalSumOfEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL), cellFont)); 930 table.addCell(getAmountCell(reportData.getTotalSumOfRemainderOfFYEstimated(IncomePrincipalIndicator.PRINCIPAL), cellFont)); 931 table.addCell(getAmountCell(reportData.getTotalSumOfNextFYEstimatedIncome(IncomePrincipalIndicator.PRINCIPAL), cellFont)); 932 } 933 934 /** 935 * Generates report group non-endowed detail 936 * 937 * @param reportData 938 * @param docuement 939 * @param table 940 * @param cellFont 941 * @throws Exception 942 */ 943 protected void printReportGroupForNonEndowedDetail(AssetStatementReportDataHolder reportData, Document docuement, PdfPTable table, Font cellFont) throws Exception { 944 945 table.addCell(new Paragraph("Income Cash", cellFont)); 946 table.addCell(""); 947 table.addCell(getAmountCell(reportData.getHistoryIncomeCash(), cellFont)); 948 table.addCell(""); 949 table.addCell(""); 950 table.addCell(""); 951 952 table.addCell(new Paragraph("Principal Cash", cellFont)); 953 table.addCell(""); 954 table.addCell(getAmountCell(reportData.getHistoryPrincipalCash(), cellFont)); 955 table.addCell(""); 956 table.addCell(""); 957 table.addCell(""); 958 959 TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroups = reportData.getReportGroupsForIncome(); 960 if (reportGroups == null || reportGroups.isEmpty()) { 961 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 962 table.addCell(""); 963 table.addCell(getAmountCell(reportData.getHistoryIncomeCash().add(reportData.getHistoryPrincipalCash()), cellFont)); 964 table.addCell(""); 965 table.addCell(""); 966 table.addCell(""); 967 return; 968 } 969 970 // print cash equivalents 971 TreeMap<String, ReportGroupData> cashEquivalentsData = reportData.getReportGroupsForIncome().get(1); 972 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 973 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 974 while (secirutyIdSet.hasNext()) { 975 // get securityId 976 String securityId = secirutyIdSet.next(); 977 ReportGroupData data = cashEquivalentsData.get(securityId); 978 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 979 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 980 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 981 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 982 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 983 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 984 } 985 } 986 BigDecimal totalCashEquivalents = reportData.getTotalMarketValueForCashEquivalents(IncomePrincipalIndicator.INCOME).add(reportData.getTotalMarketValueForCashEquivalents(IncomePrincipalIndicator.PRINCIPAL)).add(reportData.getHistoryIncomeCash()).add(reportData.getHistoryPrincipalCash()); 987 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", cellFont)); 988 table.addCell(""); 989 table.addCell(getAmountCell(totalCashEquivalents, cellFont)); 990 table.addCell(""); 991 table.addCell(""); 992 table.addCell(""); 993 994 // print other report groups 995 Iterator<Integer> reportGroupOrderSet = reportGroups.keySet().iterator(); 996 while (reportGroupOrderSet.hasNext()) { 997 998 Integer reportGroupOrder = reportGroupOrderSet.next(); 999 if (reportGroupOrder.intValue() > 1) { 1000 TreeMap<String, ReportGroupData> reportGroupData = reportData.getReportGroupsForIncome().get(reportGroupOrder); 1001 if (reportGroupData == null || reportGroupData.isEmpty()) { 1002 continue; 1003 } 1004 // print report group description 1005 String reportGroupDesc = reportGroupData.firstEntry().getValue().getReportGroupDesc(); 1006 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, cellFont)); 1007 groupDescCell.setColspan(6); 1008 table.addCell(groupDescCell); 1009 1010 // print info per security 1011 Iterator<String> secirutyIdSet = reportGroupData.keySet().iterator(); 1012 while (secirutyIdSet.hasNext()) { 1013 String securityId = secirutyIdSet.next(); 1014 if (reportGroupOrder.intValue() > 1) { 1015 ReportGroupData data = reportGroupData.get(securityId); 1016 1017 table.addCell(new Paragraph(data.getSecurityDesc(), cellFont)); 1018 table.addCell(getAmountCell(data.getSumOfUnits(), cellFont, FORMAT164)); 1019 table.addCell(getAmountCell(data.getSumOfMarketValue(), cellFont)); 1020 table.addCell(getAmountCell(data.getSumOfEstimatedIncome(), cellFont)); 1021 table.addCell(getAmountCell(data.getSumOfRemainderOfFYEstimated(), cellFont)); 1022 table.addCell(getAmountCell(data.getSumOfNextFYEstimatedIncome(), cellFont)); 1023 } 1024 } 1025 1026 // report group total 1027 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 1028 table.addCell(""); 1029 table.addCell(getAmountCell(reportData.getTotalSumOfMarketValue(IncomePrincipalIndicator.INCOME, reportGroupOrder), cellFont)); 1030 table.addCell(""); 1031 table.addCell(""); 1032 table.addCell(""); 1033 } 1034 } 1035 } 1036 1037 /** 1038 * Generates report group income non-endowed total 1039 * 1040 * @param reportGroupsForIncomeTotal 1041 * @param totalHistoryIncomeCash 1042 * @param docuement 1043 * @param table 1044 * @param cellFont 1045 * @throws Exception 1046 */ 1047 protected void printReportGroupForIncomeEndowmentTotal(TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForIncomeTotal, BigDecimal totalHistoryIncomeCash, Document docuement, PdfPTable table, Font cellFont) throws Exception { 1048 1049 table.addCell(new Paragraph("Income Cash", cellFont)); 1050 table.addCell(""); 1051 table.addCell(getAmountCell(totalHistoryIncomeCash, cellFont)); 1052 table.addCell(""); 1053 table.addCell(""); 1054 table.addCell(""); 1055 1056 if (reportGroupsForIncomeTotal == null || reportGroupsForIncomeTotal.isEmpty()) { 1057 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1058 table.addCell(""); 1059 table.addCell(getAmountCell(totalHistoryIncomeCash, cellFont)); 1060 table.addCell(""); 1061 table.addCell(""); 1062 table.addCell(""); 1063 return; 1064 } 1065 1066 // Cash and equivalents 1067 BigDecimal grandTotalMarketValue1 = BigDecimal.ZERO; 1068 BigDecimal grandTotalEstimatedAnnualIncome1 = BigDecimal.ZERO; 1069 BigDecimal grandTotalFyRemainderEAI1 = BigDecimal.ZERO; 1070 BigDecimal grandTotalNextFyEAI1 = BigDecimal.ZERO; 1071 1072 TreeMap<String, List<ReportGroupData>> cashEquivalentsData = reportGroupsForIncomeTotal.get(1); 1073 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 1074 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 1075 while (secirutyIdSet.hasNext()) { 1076 // get securityId 1077 String securityId = secirutyIdSet.next(); 1078 List<ReportGroupData> dataList = cashEquivalentsData.get(securityId); 1079 BigDecimal totalUnits = BigDecimal.ZERO; 1080 BigDecimal totalMarketValue = BigDecimal.ZERO; 1081 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1082 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1083 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1084 1085 for (ReportGroupData data : dataList) { 1086 totalUnits = totalUnits.add(data.getSumOfUnits()); 1087 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1088 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1089 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1090 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1091 } 1092 1093 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1094 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1095 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1096 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1097 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1098 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1099 1100 grandTotalMarketValue1 = grandTotalMarketValue1.add(totalMarketValue); 1101 grandTotalEstimatedAnnualIncome1 = grandTotalEstimatedAnnualIncome1.add(totalEstimatedAnnualIncome); 1102 grandTotalFyRemainderEAI1 = grandTotalFyRemainderEAI1.add(totalFyRemainderEAI); 1103 grandTotalNextFyEAI1 = grandTotalNextFyEAI1.add(totalNextFyEAI); 1104 } 1105 } 1106 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1107 table.addCell(""); 1108 table.addCell(getAmountCell(grandTotalMarketValue1.add(totalHistoryIncomeCash), cellFont)); 1109 table.addCell(""); 1110 table.addCell(""); 1111 table.addCell(""); 1112 1113 // Other report groups 1114 BigDecimal grandTotalMarketValueN = BigDecimal.ZERO; 1115 BigDecimal grandTotalEstimatedAnnualIncomeN = BigDecimal.ZERO; 1116 BigDecimal grandTotalFyRemainderEAIN = BigDecimal.ZERO; 1117 BigDecimal grandTotalNextFyEAIN = BigDecimal.ZERO; 1118 1119 Iterator<Integer> reportGroupOrderSet = reportGroupsForIncomeTotal.keySet().iterator(); 1120 while (reportGroupOrderSet.hasNext()) { 1121 1122 Integer reportGroupOrder = reportGroupOrderSet.next(); 1123 if (reportGroupOrder.intValue() > 1) { 1124 TreeMap<String, List<ReportGroupData>> reportGroupDataBySecurity = reportGroupsForIncomeTotal.get(reportGroupOrder); 1125 1126 // print report group description 1127 String reportGroupDesc = reportGroupDataBySecurity.firstEntry().getValue().get(0).getReportGroupDesc(); 1128 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, titleFont)); 1129 groupDescCell.setColspan(6); 1130 table.addCell(groupDescCell); 1131 1132 // print totals per security id 1133 BigDecimal totalGroupMarketValue = BigDecimal.ZERO; 1134 Iterator<String> securityIdSet = reportGroupDataBySecurity.keySet().iterator(); 1135 while (securityIdSet.hasNext()) { 1136 String securityId = securityIdSet.next(); 1137 List<ReportGroupData> dataList = reportGroupDataBySecurity.get(securityId); 1138 BigDecimal totalUnits = BigDecimal.ZERO; 1139 BigDecimal totalMarketValue = BigDecimal.ZERO; 1140 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1141 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1142 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1143 1144 for (ReportGroupData data : dataList) { 1145 totalUnits = totalUnits.add(data.getSumOfUnits()); 1146 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1147 totalGroupMarketValue = totalGroupMarketValue.add(data.getSumOfMarketValue()); 1148 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1149 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1150 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1151 } 1152 1153 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1154 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1155 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1156 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1157 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1158 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1159 1160 grandTotalMarketValueN = grandTotalMarketValueN.add(totalMarketValue); 1161 grandTotalEstimatedAnnualIncomeN = grandTotalEstimatedAnnualIncomeN.add(totalEstimatedAnnualIncome); 1162 grandTotalFyRemainderEAIN = grandTotalFyRemainderEAIN.add(totalFyRemainderEAI); 1163 grandTotalNextFyEAIN = grandTotalNextFyEAIN.add(totalNextFyEAI); 1164 } 1165 // totals 1166 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 1167 table.addCell(""); 1168 table.addCell(getAmountCell(totalGroupMarketValue, cellFont)); 1169 table.addCell(""); 1170 table.addCell(""); 1171 table.addCell(""); 1172 } 1173 } 1174 1175 // total expendable funds 1176 table.addCell(new Paragraph("TOTAL EXPENDABLE FUNDS", titleFont)); 1177 table.addCell(""); 1178 table.addCell(getAmountCell(grandTotalMarketValue1.add(grandTotalMarketValueN).add(totalHistoryIncomeCash), cellFont)); 1179 table.addCell(getAmountCell(grandTotalEstimatedAnnualIncome1.add(grandTotalEstimatedAnnualIncomeN), cellFont)); 1180 table.addCell(getAmountCell(grandTotalFyRemainderEAI1.add(grandTotalFyRemainderEAIN), cellFont)); 1181 table.addCell(getAmountCell(grandTotalNextFyEAI1.add(grandTotalNextFyEAIN), cellFont)); 1182 } 1183 1184 /** 1185 * Generates report group principal non-endowed total 1186 * 1187 * @param reportGroupsForPrincipalTotal 1188 * @param totalHistoryPrincipalCash 1189 * @param docuement 1190 * @param table 1191 * @param cellFont 1192 */ 1193 protected void printReportGroupForPrincipalEndowmentTotal(TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForPrincipalTotal, BigDecimal totalHistoryPrincipalCash, Document docuement, PdfPTable table, Font cellFont) { 1194 1195 table.addCell(new Paragraph("Principal Cash", cellFont)); 1196 table.addCell(""); 1197 table.addCell(getAmountCell(totalHistoryPrincipalCash, cellFont)); 1198 table.addCell(""); 1199 table.addCell(""); 1200 table.addCell(""); 1201 1202 if (reportGroupsForPrincipalTotal == null || reportGroupsForPrincipalTotal.isEmpty()) { 1203 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1204 table.addCell(""); 1205 table.addCell(getAmountCell(totalHistoryPrincipalCash, cellFont)); 1206 table.addCell(""); 1207 table.addCell(""); 1208 table.addCell(""); 1209 return; 1210 } 1211 1212 // Cash and equivalents 1213 BigDecimal grandTotalMarketValue1 = BigDecimal.ZERO; 1214 BigDecimal grandTotalEstimatedAnnualIncome1 = BigDecimal.ZERO; 1215 BigDecimal grandTotalFyRemainderEAI1 = BigDecimal.ZERO; 1216 BigDecimal grandTotalNextFyEAI1 = BigDecimal.ZERO; 1217 1218 TreeMap<String, List<ReportGroupData>> cashEquivalentsData = reportGroupsForPrincipalTotal.get(1); 1219 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 1220 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 1221 while (secirutyIdSet.hasNext()) { 1222 // get securityId 1223 String securityId = secirutyIdSet.next(); 1224 List<ReportGroupData> dataList = cashEquivalentsData.get(securityId); 1225 BigDecimal totalUnits = BigDecimal.ZERO; 1226 BigDecimal totalMarketValue = BigDecimal.ZERO; 1227 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1228 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1229 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1230 //getTotals(dataList, totalUnits, totalMarketValue, totalEstimatedAnnualIncome, totalFyRemainderEAI, totalNextFyEAI); 1231 for (ReportGroupData data : dataList) { 1232 totalUnits = totalUnits.add(data.getSumOfUnits()); 1233 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1234 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1235 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1236 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1237 } 1238 1239 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1240 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1241 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1242 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1243 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1244 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1245 1246 grandTotalMarketValue1 = grandTotalMarketValue1.add(totalMarketValue); 1247 grandTotalEstimatedAnnualIncome1 = grandTotalEstimatedAnnualIncome1.add(totalEstimatedAnnualIncome); 1248 grandTotalFyRemainderEAI1 = grandTotalFyRemainderEAI1.add(totalFyRemainderEAI); 1249 grandTotalNextFyEAI1 = grandTotalNextFyEAI1.add(totalNextFyEAI); 1250 } 1251 } 1252 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1253 table.addCell(""); 1254 table.addCell(getAmountCell(grandTotalMarketValue1.add(totalHistoryPrincipalCash), cellFont)); 1255 table.addCell(""); 1256 table.addCell(""); 1257 table.addCell(""); 1258 1259 // Other report groups 1260 BigDecimal grandTotalMarketValueN = BigDecimal.ZERO; 1261 BigDecimal grandTotalEstimatedAnnualIncomeN = BigDecimal.ZERO; 1262 BigDecimal grandTotalFyRemainderEAIN = BigDecimal.ZERO; 1263 BigDecimal grandTotalNextFyEAIN = BigDecimal.ZERO; 1264 1265 Iterator<Integer> reportGroupOrderSet = reportGroupsForPrincipalTotal.keySet().iterator(); 1266 while (reportGroupOrderSet.hasNext()) { 1267 1268 Integer reportGroupOrder = reportGroupOrderSet.next(); 1269 if (reportGroupOrder.intValue() > 1) { 1270 TreeMap<String, List<ReportGroupData>> reportGroupDataBySecurity = reportGroupsForPrincipalTotal.get(reportGroupOrder); 1271 1272 // print report group description 1273 String reportGroupDesc = reportGroupDataBySecurity.firstEntry().getValue().get(0).getReportGroupDesc(); 1274 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, titleFont)); 1275 groupDescCell.setColspan(6); 1276 table.addCell(groupDescCell); 1277 1278 // print totals per security id 1279 BigDecimal totalGroupMarketValue = BigDecimal.ZERO; 1280 Iterator<String> securityIdSet = reportGroupDataBySecurity.keySet().iterator(); 1281 while (securityIdSet.hasNext()) { 1282 String securityId = securityIdSet.next(); 1283 List<ReportGroupData> dataList = reportGroupDataBySecurity.get(securityId); 1284 BigDecimal totalUnits = BigDecimal.ZERO; 1285 BigDecimal totalMarketValue = BigDecimal.ZERO; 1286 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1287 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1288 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1289 //getTotals(dataList, totalUnits, totalMarketValue, totalEstimatedAnnualIncome, totalFyRemainderEAI, totalNextFyEAI); 1290 for (ReportGroupData data : dataList) { 1291 totalUnits = totalUnits.add(data.getSumOfUnits()); 1292 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1293 totalGroupMarketValue = totalGroupMarketValue.add(data.getSumOfMarketValue()); 1294 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1295 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1296 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1297 } 1298 1299 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1300 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1301 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1302 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1303 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1304 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1305 1306 grandTotalMarketValueN = grandTotalMarketValueN.add(totalMarketValue); 1307 grandTotalEstimatedAnnualIncomeN = grandTotalEstimatedAnnualIncomeN.add(totalEstimatedAnnualIncome); 1308 grandTotalFyRemainderEAIN = grandTotalFyRemainderEAIN.add(totalFyRemainderEAI); 1309 grandTotalNextFyEAIN = grandTotalNextFyEAIN.add(totalNextFyEAI); 1310 } 1311 1312 // report group total 1313 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 1314 table.addCell(""); 1315 table.addCell(getAmountCell(totalGroupMarketValue, cellFont)); 1316 table.addCell(""); 1317 table.addCell(""); 1318 table.addCell(""); 1319 1320 } 1321 } 1322 1323 // total expendable funds 1324 table.addCell(new Paragraph("TOTAL ENDOWED FUNDS", titleFont)); 1325 table.addCell(""); 1326 table.addCell(getAmountCell(grandTotalMarketValue1.add(grandTotalMarketValueN).add(totalHistoryPrincipalCash), cellFont)); 1327 table.addCell(getAmountCell(grandTotalEstimatedAnnualIncome1.add(grandTotalEstimatedAnnualIncomeN), cellFont)); 1328 table.addCell(getAmountCell(grandTotalFyRemainderEAI1.add(grandTotalFyRemainderEAIN), cellFont)); 1329 table.addCell(getAmountCell(grandTotalNextFyEAI1.add(grandTotalNextFyEAIN), cellFont)); 1330 1331 } 1332 1333 /** 1334 * Generates report group non-endowed total 1335 * 1336 * @param reportGroupsForTotal 1337 * @param totalHistoryIncomeCash 1338 * @param totalHistoryPrincipalCash 1339 * @param docuement 1340 * @param table 1341 * @param cellFont 1342 * @throws Exception 1343 */ 1344 protected void printReportGroupForNonEndowedTotal(TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForTotal, BigDecimal totalHistoryIncomeCash, BigDecimal totalHistoryPrincipalCash, Document docuement, PdfPTable table, Font cellFont) throws Exception { 1345 1346 table.addCell(new Paragraph("Income Cash", cellFont)); 1347 table.addCell(""); 1348 table.addCell(getAmountCell(totalHistoryIncomeCash, cellFont)); 1349 table.addCell(""); 1350 table.addCell(""); 1351 table.addCell(""); 1352 1353 table.addCell(new Paragraph("Principal Cash", cellFont)); 1354 table.addCell(""); 1355 table.addCell(getAmountCell(totalHistoryPrincipalCash, cellFont)); 1356 table.addCell(""); 1357 table.addCell(""); 1358 table.addCell(""); 1359 1360 if (reportGroupsForTotal == null || reportGroupsForTotal.isEmpty()) { 1361 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1362 table.addCell(""); 1363 table.addCell(getAmountCell(totalHistoryIncomeCash, cellFont)); 1364 table.addCell(""); 1365 table.addCell(""); 1366 table.addCell(""); 1367 return; 1368 } 1369 1370 // Cash and equivalents 1371 BigDecimal grandTotalMarketValue1 = BigDecimal.ZERO; 1372 BigDecimal grandTotalEstimatedAnnualIncome1 = BigDecimal.ZERO; 1373 BigDecimal grandTotalFyRemainderEAI1 = BigDecimal.ZERO; 1374 BigDecimal grandTotalNextFyEAI1 = BigDecimal.ZERO; 1375 1376 // get the cash equivalents group 1377 TreeMap<String, List<ReportGroupData>> cashEquivalentsData = reportGroupsForTotal.get(1); 1378 if (cashEquivalentsData != null && !cashEquivalentsData.isEmpty()) { 1379 Iterator<String> secirutyIdSet = cashEquivalentsData.keySet().iterator(); 1380 while (secirutyIdSet.hasNext()) { 1381 // get securityId 1382 String securityId = secirutyIdSet.next(); 1383 List<ReportGroupData> dataList = cashEquivalentsData.get(securityId); 1384 BigDecimal totalUnits = BigDecimal.ZERO; 1385 BigDecimal totalMarketValue = BigDecimal.ZERO; 1386 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1387 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1388 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1389 //getTotals(dataList, totalUnits, totalMarketValue, totalEstimatedAnnualIncome, totalFyRemainderEAI, totalNextFyEAI); 1390 for (ReportGroupData data : dataList) { 1391 totalUnits = totalUnits.add(data.getSumOfUnits()); 1392 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1393 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1394 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1395 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1396 } 1397 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1398 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1399 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1400 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1401 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1402 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1403 1404 grandTotalMarketValue1 = grandTotalMarketValue1.add(totalMarketValue); 1405 grandTotalEstimatedAnnualIncome1 = grandTotalEstimatedAnnualIncome1.add(totalEstimatedAnnualIncome); 1406 grandTotalFyRemainderEAI1 = grandTotalFyRemainderEAI1.add(totalFyRemainderEAI); 1407 grandTotalNextFyEAI1 = grandTotalNextFyEAI1.add(totalNextFyEAI); 1408 } 1409 } 1410 table.addCell(new Paragraph("TOTAL CASH AND\nEQUIVALENTS", titleFont)); 1411 table.addCell(""); 1412 table.addCell(getAmountCell(grandTotalMarketValue1.add(totalHistoryIncomeCash).add(totalHistoryPrincipalCash), cellFont)); 1413 table.addCell(""); 1414 table.addCell(""); 1415 table.addCell(""); 1416 1417 // print other report groups 1418 BigDecimal grandTotalMarketValueN = BigDecimal.ZERO; 1419 BigDecimal grandTotalEstimatedAnnualIncomeN = BigDecimal.ZERO; 1420 BigDecimal grandTotalFyRemainderEAIN = BigDecimal.ZERO; 1421 BigDecimal grandTotalNextFyEAIN = BigDecimal.ZERO; 1422 1423 Iterator<Integer> reportGroupOrderSet = reportGroupsForTotal.keySet().iterator(); 1424 while (reportGroupOrderSet.hasNext()) { 1425 1426 Integer reportGroupOrder = reportGroupOrderSet.next(); 1427 if (reportGroupOrder.intValue() > 1) { 1428 TreeMap<String, List<ReportGroupData>> reportGroupDataBySecurity = reportGroupsForTotal.get(reportGroupOrder); 1429 1430 // print report group description 1431 String reportGroupDesc = reportGroupDataBySecurity.firstEntry().getValue().get(0).getReportGroupDesc(); 1432 PdfPCell groupDescCell = new PdfPCell(new Paragraph(reportGroupDesc, titleFont)); 1433 groupDescCell.setColspan(6); 1434 table.addCell(groupDescCell); 1435 1436 // print totals per security id 1437 BigDecimal totalGroupMarketValue = BigDecimal.ZERO; 1438 Iterator<String> securityIdSet = reportGroupDataBySecurity.keySet().iterator(); 1439 while (securityIdSet.hasNext()) { 1440 String securityId = securityIdSet.next(); 1441 List<ReportGroupData> dataList = reportGroupDataBySecurity.get(securityId); 1442 BigDecimal totalUnits = BigDecimal.ZERO; 1443 BigDecimal totalMarketValue = BigDecimal.ZERO; 1444 BigDecimal totalEstimatedAnnualIncome = BigDecimal.ZERO; 1445 BigDecimal totalFyRemainderEAI = BigDecimal.ZERO; 1446 BigDecimal totalNextFyEAI = BigDecimal.ZERO; 1447 for (ReportGroupData data : dataList) { 1448 totalUnits = totalUnits.add(data.getSumOfUnits()); 1449 totalMarketValue = totalMarketValue.add(data.getSumOfMarketValue()); 1450 totalGroupMarketValue = totalGroupMarketValue.add(data.getSumOfMarketValue()); 1451 totalEstimatedAnnualIncome = totalEstimatedAnnualIncome.add(data.getSumOfEstimatedIncome()); 1452 totalFyRemainderEAI = totalFyRemainderEAI.add(data.getSumOfRemainderOfFYEstimated()); 1453 totalNextFyEAI = totalNextFyEAI.add(data.getSumOfNextFYEstimatedIncome()); 1454 } 1455 1456 table.addCell(new Paragraph(dataList.get(0).getSecurityDesc(), cellFont)); 1457 table.addCell(getAmountCell(totalUnits, cellFont, FORMAT164)); 1458 table.addCell(getAmountCell(totalMarketValue, cellFont)); 1459 table.addCell(getAmountCell(totalEstimatedAnnualIncome, cellFont)); 1460 table.addCell(getAmountCell(totalFyRemainderEAI, cellFont)); 1461 table.addCell(getAmountCell(totalNextFyEAI, cellFont)); 1462 1463 grandTotalMarketValueN = grandTotalMarketValueN.add(totalMarketValue); 1464 grandTotalEstimatedAnnualIncomeN = grandTotalEstimatedAnnualIncomeN.add(totalEstimatedAnnualIncome); 1465 grandTotalFyRemainderEAIN = grandTotalFyRemainderEAIN.add(totalFyRemainderEAI); 1466 grandTotalNextFyEAIN = grandTotalNextFyEAIN.add(totalNextFyEAI); 1467 } 1468 1469 // report group total 1470 table.addCell(new Paragraph("TOTAL " + convertToUpperCase(reportGroupDesc), cellFont)); 1471 table.addCell(""); 1472 table.addCell(getAmountCell(totalGroupMarketValue, cellFont)); 1473 table.addCell(""); 1474 table.addCell(""); 1475 table.addCell(""); 1476 } 1477 } 1478 } 1479 1480 /** 1481 * Constructs the report group data for grouping by security 1482 * 1483 * @param endowmentAssetStatementReportDataHolders 1484 * @param ipInd 1485 * @return 1486 */ 1487 protected TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> createReportGroupsForTotal(List<AssetStatementReportDataHolder> endowmentAssetStatementReportDataHolders, String ipInd) { 1488 1489 TreeMap<Integer, TreeMap<String, List<ReportGroupData>>> reportGroupsForTotal = new TreeMap<Integer, TreeMap<String, List<ReportGroupData>>>(); 1490 for (AssetStatementReportDataHolder reportDataHolder : endowmentAssetStatementReportDataHolders) { 1491 1492 TreeMap<Integer, TreeMap<String, ReportGroupData>> reportGroupsData = IncomePrincipalIndicator.INCOME.equalsIgnoreCase(ipInd) ? reportDataHolder.getReportGroupsForIncome() : reportDataHolder.getReportGroupsForPrincipal(); 1493 1494 if (reportGroupsData != null) { 1495 1496 Set<Integer> reportGroupOrders = reportGroupsData.keySet(); 1497 // per report group order 1498 for (Integer reportGroupOrder : reportGroupOrders) { 1499 // ReportGroupData with securityId 1500 TreeMap<String,ReportGroupData> reportGroupOrderData = reportGroupsData.get(reportGroupOrder); 1501 Set<String> securityIds = reportGroupOrderData.keySet(); 1502 // per security Id 1503 for (String securityId : securityIds) { 1504 ReportGroupData reportGroupDataBySecurityId = reportGroupOrderData.get(securityId); 1505 // add the ReportGroupData to reportGroupsForAllIncomes 1506 if (reportGroupsForTotal.containsKey(reportGroupOrder)) { 1507 // the report group order exists 1508 if (reportGroupsForTotal.get(reportGroupOrder).containsKey(securityId)) { 1509 // the security id exists 1510 reportGroupsForTotal.get(reportGroupOrder).get(securityId).add(reportGroupDataBySecurityId); 1511 } else { 1512 List<ReportGroupData> reportGroupDataList = new ArrayList<ReportGroupData>(); 1513 reportGroupDataList.add(reportGroupDataBySecurityId); 1514 reportGroupsForTotal.get(reportGroupOrder).put(securityId, reportGroupDataList); 1515 } 1516 } else { 1517 TreeMap<String, List<ReportGroupData>> newReportGroupOrderData = new TreeMap<String,List<ReportGroupData>>(); 1518 List<ReportGroupData> reportGroupDataList = new ArrayList<ReportGroupData>(); 1519 reportGroupDataList.add(reportGroupDataBySecurityId); 1520 newReportGroupOrderData.put(securityId, reportGroupDataList); 1521 reportGroupsForTotal.put(reportGroupOrder, newReportGroupOrderData); 1522 } 1523 } 1524 } 1525 } 1526 } 1527 1528 return reportGroupsForTotal; 1529 } 1530 1531 }