private List buildRows()

in service/src/main/java/org/apache/fineract/cn/reporting/service/internal/specification/IncomeStatementReportSpecification.java [152:250]


    private List<Row> buildRows(ReportRequest reportRequest, List<?> accountResultList) {
        final ArrayList<Row> rows = new ArrayList<>();
        
        final Row totalRevenueRow = new Row();
        totalRevenueRow.setValues(new ArrayList<>());

        final Value subRevenueTotal = new Value();

        final BigDecimal[] revenueSubTotal = {new BigDecimal("0.000")};

        accountResultList.forEach(result -> {

            final Row row = new Row();
            row.setValues(new ArrayList<>());

            if (result instanceof Object[]) {
                final Object[] resultValues;
                resultValues = (Object[]) result;

                for (int i = 0; i < resultValues.length; i++){
                    final Value revValue = new Value();
                    if (resultValues[i] != null){
                        revValue.setValues(new String[]{resultValues[i].toString()});
                    }else revValue.setValues(new String[]{});

                    row.getValues().add(revValue);

                    revenueSubTotal[0] = revenueSubTotal[0].add((BigDecimal)resultValues[3]);

                }
            } else {
                final Value value = new Value();
                value.setValues(new String[]{result.toString()});
                row.getValues().add(value);
            }

            rows.add(row);
        });

        subRevenueTotal.setValues(new String[]{new StringBuilder().append("TOTAL REVENUES ").append(revenueSubTotal[0]).toString()});
        totalRevenueRow.getValues().add(subRevenueTotal);

        rows.add(totalRevenueRow);


        final String expenseQueryString = this.buildExpenseQuery(reportRequest);
        final Query expenseQuery = this.entityManager.createNativeQuery(expenseQueryString);
        final List<?> expenseResultList = expenseQuery.getResultList();

        final Row totalExpenseRow = new Row();
        totalExpenseRow.setValues(new ArrayList<>());
        final Value subExpenseTotal = new Value();

        final Row netIncomeRow = new Row();
        netIncomeRow.setValues(new ArrayList<>());
        final Value netIncomeTotal = new Value();

        final BigDecimal[] expenseSubTotal = {new BigDecimal("0.000")};

        expenseResultList.forEach(result -> {

            final Row row = new Row();
            row.setValues(new ArrayList<>());

            if (result instanceof Object[]) {
                final Object[] resultValues;
                resultValues = (Object[]) result;

                for (int i = 0; i < resultValues.length; i++){
                    final Value expValue = new Value();
                    if (resultValues[i] != null) expValue.setValues(new String[]{resultValues[i].toString()});
                    else expValue.setValues(new String[]{});

                    row.getValues().add(expValue);

                    expenseSubTotal[0] = expenseSubTotal[0].add((BigDecimal)resultValues[3]);

                }
            } else {
                final Value value;
                value = new Value();
                value.setValues(new String[]{result.toString()});
                row.getValues().add(value);
            }

            rows.add(row);
        });

        subExpenseTotal.setValues(new String[]{new StringBuilder().append("TOTAL EXPENSES ").append(expenseSubTotal[0]).toString()});
        totalExpenseRow.getValues().add(subExpenseTotal);
        rows.add(totalExpenseRow);

        final BigDecimal netIncome = revenueSubTotal[0].subtract(expenseSubTotal[0]);
        netIncomeTotal.setValues(new String[]{new StringBuilder().append("NET INCOME ").append(netIncome).toString()});
        netIncomeRow.getValues().add(netIncomeTotal);
        rows.add(netIncomeRow);

        return rows;
    }