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.math.BigDecimal; 020 import java.text.DecimalFormat; 021 import java.text.NumberFormat; 022 import java.util.Date; 023 import java.util.List; 024 025 import org.kuali.kfs.module.endow.report.util.EndowmentReportFooterDataHolder.BenefittingForFooter; 026 027 import com.lowagie.text.BadElementException; 028 import com.lowagie.text.Document; 029 import com.lowagie.text.Element; 030 import com.lowagie.text.Font; 031 import com.lowagie.text.FontFactory; 032 import com.lowagie.text.PageSize; 033 import com.lowagie.text.Paragraph; 034 import com.lowagie.text.Phrase; 035 import com.lowagie.text.Rectangle; 036 import com.lowagie.text.pdf.PdfPCell; 037 import com.lowagie.text.pdf.PdfPTable; 038 039 public abstract class EndowmentReportPrintBase { 040 041 public final String ZERO_FOR_REPORT = "0.00"; 042 043 public static final int KEMIDS_SELECTED_COLUMN_NUM = 5; 044 public static final int REQUEST_INFO_TABLE_WIDTH = 100; 045 public static final int CRITERIA_TABLE_WIDTH = 80; 046 public static final int MULTIPLE_KEMID_TABLE_WIDTH = 80; 047 public static final int KEMID_SELECTED_TABLE_WIDTH = 80; 048 public static final int FULL_TABLE_WIDTH = 100; 049 050 public static final Font headerShheetTitleFont = FontFactory.getFont(FontFactory.HELVETICA, 10, Font.BOLD); 051 public static final Font headerSheetRegularFont = FontFactory.getFont(FontFactory.HELVETICA, 10, Font.NORMAL, Color.DARK_GRAY); 052 053 public static final Font titleFont = FontFactory.getFont(FontFactory.HELVETICA, 8, Font.BOLD); 054 public static final Font regularFont = FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL, Color.DARK_GRAY); 055 public static final Font headerFont = FontFactory.getFont(FontFactory.HELVETICA, 8, Font.NORMAL, Color.GRAY); 056 057 public static final Font footerTitleFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.BOLD); 058 public static final Font footerRegularFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL, Color.DARK_GRAY); 059 060 protected static final Rectangle LETTER_PORTRAIT = PageSize.LETTER; 061 protected static final Rectangle LETTER_LANDSCAPE = PageSize.LETTER.rotate(); 062 063 protected static final String FORMAT192 = "#,###,###,###,###,###,##0.00"; 064 protected static final String FORMAT195 = "##,###,###,###,##0.00000"; 065 protected static final String FORMAT164 = "###,###,###,##0.0000"; 066 067 /** 068 * Generates the report header sheet 069 * 070 * @param reportRequestHeaderDataHolder 071 * @param document 072 * @return 073 */ 074 public boolean printReportHeaderPage(EndowmentReportHeaderDataHolder reportRequestHeaderDataHolder, Document document, String listKemidsInHeader) { 075 076 try { 077 // report header 078 Phrase header = new Paragraph(new Date().toString()); 079 Paragraph title = new Paragraph(reportRequestHeaderDataHolder.getInstitutionName()); 080 title.setAlignment(Element.ALIGN_CENTER); 081 title.add("\nReport Request Header Sheet\n\n"); 082 document.add(title); 083 084 PdfPTable requestTable = new PdfPTable(2); 085 requestTable.setWidthPercentage(REQUEST_INFO_TABLE_WIDTH); 086 int[] requestWidths = {20, 80}; 087 requestTable.setWidths(requestWidths); 088 requestTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); 089 090 Paragraph reportRequested = new Paragraph(reportRequestHeaderDataHolder.getReportRequested(), headerSheetRegularFont); 091 Paragraph dateRequested = new Paragraph(new Date().toString(), headerSheetRegularFont); 092 Paragraph requestedBy = new Paragraph(reportRequestHeaderDataHolder.getRequestedBy(), headerSheetRegularFont); 093 Paragraph endowmentOption = new Paragraph(reportRequestHeaderDataHolder.getEndowmentOption(), headerSheetRegularFont); 094 Paragraph reportOption = new Paragraph(reportRequestHeaderDataHolder.getReportOption(), headerSheetRegularFont); 095 096 requestTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Report Requested:", Element.ALIGN_RIGHT)); 097 requestTable.addCell(reportRequested); 098 requestTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Date Requested:", Element.ALIGN_RIGHT)); 099 requestTable.addCell(dateRequested); 100 requestTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Reqeusted by:", Element.ALIGN_RIGHT)); 101 requestTable.addCell(requestedBy); 102 requestTable.addCell(""); 103 requestTable.addCell(""); 104 requestTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Endowment Option:", Element.ALIGN_RIGHT)); 105 requestTable.addCell(endowmentOption); 106 requestTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Report Option:", Element.ALIGN_RIGHT)); 107 requestTable.addCell(reportOption); 108 document.add(requestTable); 109 110 // Criteria 111 Paragraph criteria = new Paragraph("\nCriteria:\n\n"); 112 document.add(criteria); 113 114 PdfPTable criteriaTable = new PdfPTable(2); 115 criteriaTable.setWidthPercentage(CRITERIA_TABLE_WIDTH); 116 int[] criteriaWidths = {30, 50}; 117 criteriaTable.setWidths(criteriaWidths); 118 criteriaTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); 119 120 Paragraph benefittingCampus = new Paragraph(reportRequestHeaderDataHolder.getBenefittingCampus(), headerSheetRegularFont); 121 Paragraph benefittingChart = new Paragraph(reportRequestHeaderDataHolder.getBenefittingChart(), headerSheetRegularFont); 122 Paragraph benefittingOrganization = new Paragraph(reportRequestHeaderDataHolder.getBenefittingOrganization(), headerSheetRegularFont); 123 Paragraph kemidTypeCode = new Paragraph(reportRequestHeaderDataHolder.getKemidTypeCode(), headerSheetRegularFont); 124 Paragraph kemidPurposeCode = new Paragraph(reportRequestHeaderDataHolder.getKemidPurposeCode(), headerSheetRegularFont); 125 Paragraph combinationGroupCode = new Paragraph(reportRequestHeaderDataHolder.getCombineGroupCode(), headerSheetRegularFont); 126 127 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Benefitting Campus:", Element.ALIGN_RIGHT)); 128 criteriaTable.addCell(benefittingCampus); 129 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Benefitting Chart:", Element.ALIGN_RIGHT)); 130 criteriaTable.addCell(benefittingChart); 131 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Benefitting Organization:", Element.ALIGN_RIGHT)); 132 criteriaTable.addCell(benefittingOrganization); 133 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("KEMID Type Code:", Element.ALIGN_RIGHT)); 134 criteriaTable.addCell(kemidTypeCode); 135 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("KEMID Purpose Code:", Element.ALIGN_RIGHT)); 136 criteriaTable.addCell(kemidPurposeCode); 137 criteriaTable.addCell(createCellWithDefaultFontAndWithoutBorderLine("Combine Group Code:", Element.ALIGN_RIGHT)); 138 criteriaTable.addCell(combinationGroupCode); 139 document.add(criteriaTable); 140 141 // kemids with multiple benefitting organization 142 Paragraph kemidWithMultipleBenefittingOrganization = new Paragraph("\nKEMIDs with Multiple Benefitting Organizations:\n\n"); 143 document.add(kemidWithMultipleBenefittingOrganization); 144 145 List<KemidsWithMultipleBenefittingOrganizationsDataHolder> kemidsWithMultipleBenefittingOrganizationsDataHolder = reportRequestHeaderDataHolder.getKemidsWithMultipleBenefittingOrganizationsDataHolders(); 146 if (kemidsWithMultipleBenefittingOrganizationsDataHolder != null && !kemidsWithMultipleBenefittingOrganizationsDataHolder.isEmpty()) { 147 PdfPTable kemidWithMultipleBenefittingOrganizationTable = new PdfPTable(5); 148 kemidWithMultipleBenefittingOrganizationTable.setWidthPercentage(MULTIPLE_KEMID_TABLE_WIDTH); 149 kemidWithMultipleBenefittingOrganizationTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); 150 151 Paragraph kemid = new Paragraph("KEMID", titleFont); 152 Paragraph campus = new Paragraph("Campus", titleFont); 153 Paragraph chart = new Paragraph("Chart", titleFont); 154 Paragraph organization = new Paragraph("Organziation", titleFont); 155 Paragraph percent = new Paragraph("Percent", titleFont); 156 kemidWithMultipleBenefittingOrganizationTable.addCell(kemid); 157 kemidWithMultipleBenefittingOrganizationTable.addCell(campus); 158 kemidWithMultipleBenefittingOrganizationTable.addCell(chart); 159 kemidWithMultipleBenefittingOrganizationTable.addCell(organization); 160 kemidWithMultipleBenefittingOrganizationTable.addCell(percent); 161 162 for (KemidsWithMultipleBenefittingOrganizationsDataHolder kmbo : kemidsWithMultipleBenefittingOrganizationsDataHolder) { 163 kemidWithMultipleBenefittingOrganizationTable.addCell(new Paragraph(kmbo.getKemid(), headerSheetRegularFont)); 164 kemidWithMultipleBenefittingOrganizationTable.addCell(new Paragraph(kmbo.getCampus(), headerSheetRegularFont)); 165 kemidWithMultipleBenefittingOrganizationTable.addCell(new Paragraph(kmbo.getChart(), headerSheetRegularFont)); 166 kemidWithMultipleBenefittingOrganizationTable.addCell(new Paragraph(kmbo.getOrganization(), headerSheetRegularFont)); 167 kemidWithMultipleBenefittingOrganizationTable.addCell(new Paragraph(kmbo.getPercent().toString(), headerSheetRegularFont)); 168 } 169 document.add(kemidWithMultipleBenefittingOrganizationTable); 170 } else { 171 Paragraph noneExistMessage = new Paragraph("NONE EXIST\n\n", headerSheetRegularFont); 172 document.add(noneExistMessage); 173 } 174 175 // kemids selected 176 if ("Y".equalsIgnoreCase(listKemidsInHeader)) { 177 List<String> kemidsSelected = reportRequestHeaderDataHolder.getKemidsSelected(); 178 int totalKemidsSelected = reportRequestHeaderDataHolder.getKemidsSelected().size(); 179 Paragraph kemidsSelectedTitle = new Paragraph("\nKEMIDs Selected: " + totalKemidsSelected + "\n\n"); 180 document.add(kemidsSelectedTitle); 181 182 PdfPTable kemidsTable = new PdfPTable(KEMIDS_SELECTED_COLUMN_NUM); 183 kemidsTable.setWidthPercentage(KEMID_SELECTED_TABLE_WIDTH); 184 kemidsTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); 185 186 for (int i = 0; i < totalKemidsSelected ; i++) { 187 kemidsTable.addCell(new Paragraph(kemidsSelected.get(i), headerSheetRegularFont) ); 188 } 189 // to fill out the rest of the empty cells. Otherwise, the row won't be displayed 190 if (totalKemidsSelected % KEMIDS_SELECTED_COLUMN_NUM != 0) { 191 for (int i = 0; i < (KEMIDS_SELECTED_COLUMN_NUM - totalKemidsSelected % KEMIDS_SELECTED_COLUMN_NUM) ; i++) { 192 kemidsTable.addCell(""); 193 } 194 } 195 document.add(kemidsTable); 196 } 197 198 } catch (Exception e) { 199 return false; 200 } 201 202 return true; 203 } 204 205 /** 206 * Generates the footer 207 * 208 * @param footerData 209 * @param document 210 */ 211 public boolean printFooter(EndowmentReportFooterDataHolder footerData, Document document) { 212 213 if (footerData == null) { 214 return false; 215 } 216 217 try { 218 document.add(new Phrase("\n")); 219 220 PdfPTable table = new PdfPTable(2); 221 table.setWidthPercentage(FULL_TABLE_WIDTH); 222 int[] colWidths = {40, 60}; 223 table.setWidths(colWidths); 224 table.getDefaultCell().setPadding(2); 225 226 // left column 227 PdfPTable leftTable = new PdfPTable(2); 228 leftTable.setWidths(colWidths); 229 leftTable.setWidthPercentage(40); 230 231 leftTable.addCell(createCell("Reference: ", footerTitleFont, Element.ALIGN_LEFT, false)); 232 leftTable.addCell(createCell(footerData.getReference(), footerRegularFont, Element.ALIGN_LEFT, false)); 233 leftTable.addCell(createCell("Date Established: ", footerTitleFont, Element.ALIGN_LEFT, false)); 234 leftTable.addCell(createCell(footerData.getEstablishedDate(), footerRegularFont, Element.ALIGN_LEFT, false)); 235 leftTable.addCell(createCell("KEMID Type: ", footerTitleFont, Element.ALIGN_LEFT, false)); 236 leftTable.addCell(createCell(footerData.getKemidType(), footerRegularFont, Element.ALIGN_LEFT, false)); 237 leftTable.addCell(createCell("KEMID Purpose: ", footerTitleFont, Element.ALIGN_LEFT, false)); 238 leftTable.addCell(createCell(footerData.getKemidPurpose(), footerRegularFont, Element.ALIGN_LEFT, false)); 239 leftTable.addCell(createCell("Report Run Date: ", footerTitleFont, Element.ALIGN_LEFT, false)); 240 leftTable.addCell(createCell(footerData.getReportRunDate(), footerRegularFont, Element.ALIGN_LEFT, false)); 241 table.addCell(leftTable); 242 243 // right column 244 PdfPTable rightTable = new PdfPTable(4); 245 rightTable.setWidthPercentage(60); 246 247 PdfPCell cellBenefitting = new PdfPCell(new Paragraph("BENEFITTING\n", titleFont)); 248 cellBenefitting.setColspan(4); 249 cellBenefitting.setBorderWidth(0); 250 rightTable.addCell(cellBenefitting); 251 252 rightTable.addCell(createCell("Campus", footerTitleFont, Element.ALIGN_LEFT, false)); 253 rightTable.addCell(createCell("Chart", footerTitleFont, Element.ALIGN_LEFT, false)); 254 rightTable.addCell(createCell("Organizaztion", footerTitleFont, Element.ALIGN_LEFT, false)); 255 rightTable.addCell(createCell("Percent", footerTitleFont, Element.ALIGN_LEFT, false)); 256 257 List<BenefittingForFooter> benefittingList = footerData.getBenefittingList(); 258 if (benefittingList != null) { 259 for (BenefittingForFooter benefitting : benefittingList) { 260 rightTable.addCell(createCell(benefitting.getCampusName(), footerRegularFont, Element.ALIGN_LEFT, Element.ALIGN_TOP, false)); 261 rightTable.addCell(createCell(benefitting.getChartName(), footerRegularFont, Element.ALIGN_LEFT, Element.ALIGN_TOP, false)); 262 rightTable.addCell(createCell(benefitting.getOrganizationName(), footerRegularFont, Element.ALIGN_LEFT, Element.ALIGN_TOP, false)); 263 rightTable.addCell(createCell(benefitting.getBenefittingPercent(), footerRegularFont, Element.ALIGN_LEFT, Element.ALIGN_TOP, false)); 264 } 265 } 266 267 table.addCell(rightTable); 268 269 document.add(table); 270 271 } catch (Exception e) { 272 return false; 273 } 274 275 return true; 276 } 277 278 /** 279 * Creates a cell 280 * 281 * @param s 282 * @param alignment 283 * @return 284 */ 285 protected PdfPCell createCellWithDefaultFontAndBorderLine(String s, int alignment) throws BadElementException { 286 return createCell(s, regularFont, alignment, true); 287 } 288 289 /** 290 * Creates a cell without borderline 291 * 292 * @param s 293 * @param alignment 294 * @return 295 * @throws BadElementException 296 */ 297 protected PdfPCell createCellWithDefaultFontAndWithoutBorderLine(String s, int alignment) throws BadElementException { 298 return createCell(s, headerSheetRegularFont, alignment, false); 299 } 300 301 /** 302 * Create a cell with the given font, alignment, and borderline option 303 * 304 * @param content 305 * @param font 306 * @param alignment 307 * @param borderLine 308 * @return 309 */ 310 public PdfPCell createCell(String contents, Font font, int horizontalAlignment, boolean borderLine) { 311 return createCell(contents, font, horizontalAlignment, Element.ALIGN_BOTTOM, borderLine); 312 } 313 314 /** 315 * Creates a call with given font, alignments, and borderline 316 * 317 * @param contents 318 * @param font 319 * @param horizontalAlignment 320 * @param verticalAlignment 321 * @param borderLine 322 * @return 323 */ 324 public PdfPCell createCell(String contents, Font font, int horizontalAlignment, int verticalAlignment, boolean borderLine) { 325 if (contents == null) contents = ""; 326 Phrase phr = new Phrase(contents, font); 327 PdfPCell cell = new PdfPCell(phr); 328 cell.setHorizontalAlignment(horizontalAlignment); 329 if (!borderLine) { 330 cell.setBorderWidth(0); 331 } 332 cell.setVerticalAlignment(verticalAlignment); 333 return cell; 334 } 335 336 /** 337 * Created a cell with a specific font 338 * 339 * @param value 340 * @param font 341 * @return 342 */ 343 protected PdfPCell getAmountCell(BigDecimal value, Font font) { 344 String amount = (value == null) ? ZERO_FOR_REPORT : formatAmount(value); 345 return createCell(amount, font, Element.ALIGN_RIGHT, true); 346 } 347 348 /** 349 * Created a cell with a specific font and format 350 * 351 * @param value 352 * @param font 353 * @param format 354 * @return 355 */ 356 protected PdfPCell getAmountCell(BigDecimal value, Font font, String format) { 357 String amount = (value == null) ? ZERO_FOR_REPORT : formatAmount(value, format); 358 return createCell(amount, font, Element.ALIGN_RIGHT, true); 359 } 360 361 /** 362 * Format the dollar amount - 19,2 decimal 363 * 364 * @param amount 365 * @return 366 */ 367 protected String formatAmount(BigDecimal amount) { 368 NumberFormat formatter = new DecimalFormat("#,###,###,###,###,###,##0.00;(#,###,###,###,###,###,##0.00)"); 369 return formatter.format(amount.doubleValue()); 370 } 371 372 /** 373 * Format the dollar amount 374 * 375 * @param amount 376 * @param format 377 * @return 378 */ 379 protected String formatAmount(BigDecimal amount, String format) { 380 NumberFormat formatter = new DecimalFormat(format + ";(" + format + ")"); 381 return formatter.format(amount.doubleValue()); 382 } 383 384 /** 385 * Converts a string to upper case 386 * 387 * @param s 388 * @return 389 */ 390 protected String convertToUpperCase(String s) { 391 if (s == null) { 392 return ""; 393 } else { 394 return s.toUpperCase(); 395 } 396 } 397 }