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;
}