private static ComponentBuilder<?, ?> createTitle(String lastName, String firstName) {
    final VerticalListBuilder list = cmp.verticalList();
    list.add(
        cmp.text("Statement of Giving")
            .setStyle(stl.style().bold())
            .setHorizontalAlignment(HorizontalAlignment.CENTER));
    list.add(
        cmp.horizontalList()
            .setStyle(stl.style(10).setHorizontalAlignment(HorizontalAlignment.LEFT))
            .setGap(50)
            .add(cmp.hListCell(createNameComponent(lastName, firstName)).heightFixedOnTop())
            .add(cmp.hListCell(createChurchAddressComponent()).heightFixedOnTop()),
        cmp.verticalGap(10));

    return list;
  }
  public static JasperReportBuilder createGivingStatement(String lastName, String firstName) {
    final StyleBuilder boldStyle = stl.style().bold();
    final StyleBuilder boldStyleSmall = stl.style().bold().setFontSize(8);
    final StyleBuilder boldCenteredStyle =
        stl.style(boldStyle).setHorizontalAlignment(HorizontalAlignment.CENTER);
    final StyleBuilder columnTitleStyle =
        stl.style(boldCenteredStyle)
            .setBorder(stl.pen1Point())
            .setBackgroundColor(Color.LIGHT_GRAY);

    final TextColumnBuilder<String> dateColumn = col.column("Date", "date", type.stringType());
    final TextColumnBuilder<String> fundTypeColumn =
        col.column("Fund Type", "fundType", type.stringType());
    final TextColumnBuilder<Short> checkNumberColumn =
        col.column("Check #", "checkNumber", type.shortType());

    final List<TextColumnBuilder<?>> columnList = new ArrayList<TextColumnBuilder<?>>();
    columnList.add(dateColumn);
    columnList.add(fundTypeColumn);
    columnList.add(checkNumberColumn);

    final List<AggregationSubtotalBuilder<BigDecimal>> subtotalBuilders =
        new ArrayList<AggregationSubtotalBuilder<BigDecimal>>();
    final List<String> categories = Settings.getInstance().getCategories();
    for (String category : categories) {
      final TextColumnBuilder<BigDecimal> categoryColumn =
          col.column(category, category, type.bigDecimalType());
      columnList.add(categoryColumn);
      subtotalBuilders.add(sbt.sum(categoryColumn));
    }
    final TextColumnBuilder<BigDecimal> totalsColumn =
        col.column("Total", "total", type.bigDecimalType());
    columnList.add(totalsColumn);
    subtotalBuilders.add(sbt.sum(totalsColumn));

    final AggregationSubtotalBuilder<?>[] sbtBuilders =
        new AggregationSubtotalBuilder<?>[subtotalBuilders.size()];
    subtotalBuilders.toArray(sbtBuilders);

    final TextColumnBuilder<?>[] columns = new TextColumnBuilder<?>[columnList.size()];
    columnList.toArray(columns);

    final VerticalListBuilder summary = cmp.verticalList();
    summary.add(cmp.verticalGap(5));
    summary.add(
        cmp.text(
                "Donor did not receive any goods or services in connection with the donations listed.")
            .setStyle(boldStyleSmall));
    summary.add(cmp.verticalGap(15));
    summary.add(cmp.text("Authorized Signature: ").setStyle(boldStyle));
    summary.add(cmp.verticalGap(10));
    summary.add(
        cmp.text("                                            ").setStyle(stl.style().underline()));

    return report() // create new report design
        .setTemplate(Templates.reportTemplate)
        .setColumnTitleStyle(columnTitleStyle)
        .highlightDetailEvenRows()
        .columns(columns)
        .title(createTitle(lastName, firstName))
        .pageFooter(cmp.pageXofY().setStyle(boldCenteredStyle))
        .setDataSource(createDataSource(lastName, firstName))
        .subtotalsAtSummary(sbtBuilders)
        .setPageMargin(DynamicReports.margin(40))
        .summary(summary);
  }