@Override
  public JasperReportBuilder build(Rpt_Configurator config) throws Exception {
    this.config = config;
    this.dataSources = config.getDataSource();

    return build();
  }
  private JasperReportBuilder build() {
    List ds1 = (List) dataSources.get(0);
    List<RowModel> rowModels = populateMonths();
    Collections.sort(
        rowModels,
        new Comparator<RowModel>() {
          @Override
          public int compare(RowModel o1, RowModel o2) {
            return o1.getId().compareTo(o2.getId());
          }
        });

    TextColumnBuilder<String> tcbMonth = col.column("Month", "key", type.stringType());
    TextColumnBuilder<Double> tcbTotal = BRG.columnDb("Total", "value");

    Bar3DChartBuilder monthChart =
        cht.bar3DChart()
            .setTitle(config.getReportTitle())
            .setCategory(tcbMonth)
            .addSerie(cht.serie(tcbTotal));

    TextColumnBuilder<String> tcbDescription =
        col.column("Airlane", new WordSimpleExpression("AIR_NAME"))
            .setDataType(type.stringType())
            .addProperty(JasperProperty.EXPORT_XLS_FIT_WIDTH, "true")
            .addProperty(JasperProperty.EXPORT_XLS_WRAP_TEXT, "false");
    // Column Table
    TextColumnBuilder<Double> tcbJanAmt = BRG.columnDb("Jan", "JAN");
    TextColumnBuilder<Double> tcbFebAmt = BRG.columnDb("Feb", "FEB");
    TextColumnBuilder<Double> tcbMarAmt = BRG.columnDb("Mar", "MAR");
    TextColumnBuilder<Double> tcbAprAmt = BRG.columnDb("Apr", "APR");
    TextColumnBuilder<Double> tcbMeiAmt = BRG.columnDb("Mei", "MEI");
    TextColumnBuilder<Double> tcbJunAmt = BRG.columnDb("Jun", "JUN");
    TextColumnBuilder<Double> tcbJulAmt = BRG.columnDb("Jul", "JUL");
    TextColumnBuilder<Double> tcbAgsAmt = BRG.columnDb("Agus", "AGUS");
    TextColumnBuilder<Double> tcbSepAmt = BRG.columnDb("Sep", "SEP");
    TextColumnBuilder<Double> tcbOktAmt = BRG.columnDb("Okt", "OKT");
    TextColumnBuilder<Double> tcbNovAmt = BRG.columnDb("Nop", "NOV");
    TextColumnBuilder<Double> tcbDecAmt = BRG.columnDb("Des", "DES");
    TextColumnBuilder<Double> tcbQ1Amt = BRG.columnDb("Q1", "Q1");
    TextColumnBuilder<Double> tcbQ2Amt = BRG.columnDb("Q2", "Q2");
    TextColumnBuilder<Double> tcbQ3Amt = BRG.columnDb("Q3", "Q3");
    TextColumnBuilder<Double> tcbQ4Amt = BRG.columnDb("Q4", "Q4");

    JasperExpression<Double> sms1Expression = exp.jasperSyntax("$F{Q1} + $F{Q2}", Double.class);
    JasperExpression<Double> sms2Expression = exp.jasperSyntax("$F{Q3} + $F{Q4}", Double.class);

    TextColumnBuilder<Double> tcbSms1Amt =
        BRG.columnDb("Semester 1", sms1Expression).setDataType(Rpt_Templates.currencyTypeDb);
    TextColumnBuilder<Double> tcbSms2Amt =
        BRG.columnDb("Semester 2", sms2Expression).setDataType(Rpt_Templates.currencyTypeDb);

    JasperReportBuilder jrb1 = BRG.report2();
    jrb1.fields(field("AIR_NAME", type.stringType()));
    jrb1.setTemplate(Rpt_Templates.reportTemplate);
    jrb1.setPageFormat(PageType.LEGAL, PageOrientation.LANDSCAPE);
    jrb1.setDataSource(ds1);
    jrb1.columns(
        tcbDescription,
        tcbJanAmt,
        tcbFebAmt,
        tcbMarAmt,
        tcbAprAmt,
        tcbMeiAmt,
        tcbJunAmt,
        tcbJulAmt,
        tcbAgsAmt,
        tcbSepAmt,
        tcbOktAmt,
        tcbNovAmt,
        tcbDecAmt);
    jrb1.subtotalsAtSummary(
        sbt.text("Total", tcbDescription),
        sbt.sum(tcbJanAmt),
        sbt.sum(tcbFebAmt),
        sbt.sum(tcbMarAmt),
        sbt.sum(tcbAprAmt),
        sbt.sum(tcbMeiAmt),
        sbt.sum(tcbJunAmt),
        sbt.sum(tcbJulAmt),
        sbt.sum(tcbAgsAmt),
        sbt.sum(tcbSepAmt),
        sbt.sum(tcbOktAmt),
        sbt.sum(tcbNovAmt),
        sbt.sum(tcbDecAmt));

    JasperReportBuilder jrb2 = BRG.report2();
    jrb2.setDataSource(rowModels);
    jrb2.title(
        cmp.verticalList(
            cmp.verticalGap(5),
            cmp.horizontalFlowList(monthChart, commentBox(config.getComment()))
                .setPositionType(ComponentPositionType.FIX_RELATIVE_TO_TOP),
            cmp.verticalGap(5)));

    JasperReportBuilder jrb3 = BRG.report2();
    jrb3.fields(field("AIR_NAME", type.stringType()));
    jrb3.setTemplate(Rpt_Templates.reportTemplate);
    jrb3.setDataSource(ds1);
    jrb3.columns(tcbDescription, tcbQ1Amt, tcbQ2Amt, tcbQ3Amt, tcbQ4Amt);
    jrb3.subtotalsAtSummary(
        sbt.text("Total", tcbDescription),
        sbt.sum(tcbQ1Amt),
        sbt.sum(tcbQ2Amt),
        sbt.sum(tcbQ3Amt),
        sbt.sum(tcbQ4Amt));

    JasperReportBuilder jrb4 = BRG.report2();
    jrb4.fields(field("AIR_NAME", type.stringType()));
    jrb4.setTemplate(Rpt_Templates.reportTemplate);
    jrb4.setDataSource(ds1);
    jrb4.fields(field("Q1", type.doubleType()));
    jrb4.fields(field("Q2", type.doubleType()));
    jrb4.fields(field("Q3", type.doubleType()));
    jrb4.fields(field("Q4", type.doubleType()));
    jrb4.columns(tcbDescription, tcbSms1Amt, tcbSms2Amt);
    jrb4.subtotalsAtSummary(
        sbt.text("Total", tcbDescription), sbt.sum(tcbSms1Amt), sbt.sum(tcbSms2Amt));

    JasperReportBuilder jrb0 = BRG.report2();
    jrb0.setTemplate(Rpt_Templates.reportTemplate);
    jrb0.setPageFormat(PageType.A4, PageOrientation.LANDSCAPE);
    jrb0.title(
        Rpt_Templates.createTitleComponent(config.getReportTitle()),
        cmp.verticalList(
            cmp.subreport(jrb2),
            cmp.subreport(jrb1),
            cmp.pageBreak(),
            cmp.subreport(jrb3),
            cmp.pageBreak(),
            cmp.subreport(jrb4)));

    return jrb0;
  }