/** * Metodo que monta o modelo do grafico de consumo por dia no periodo * * @param period o periodo * @return o model para a view */ public LineChartModel bulidDailyChart(FinancialPeriod period) { // lista receitas e despesas do periodo final List<Movement> revenues = this.getRevenuesFor(period); final List<Movement> expenses = this.getExpensesFor(period); // agrupamos pelas datas das despesas e receitas final List<LocalDate> payDates = this.groupPaymentDates(ListUtils.union(revenues, expenses)); // monta o grafico de linhas final LineChartModel model = new LineChartModel(); // dados de despesas final LineChartDatasetBuilder<BigDecimal> expensesBuilder = new LineChartDatasetBuilder<>() .filledByColor("rgba(255,153,153,0.2)") .withStrokeColor("rgba(255,77,77,1)") .withPointColor("rgba(204,0,0,1)") .withPointStrokeColor("#fff") .withPointHighlightFillColor("#fff") .withPointHighlightStroke("rgba(204,0,0,1)"); // dados de receitas final LineChartDatasetBuilder<BigDecimal> revenuesBuilder = new LineChartDatasetBuilder<>() .filledByColor("rgba(140,217,140,0.2)") .withStrokeColor("rgba(51,153,51,1)") .withPointColor("rgba(45,134,45,1)") .withPointStrokeColor("#fff") .withPointHighlightFillColor("#fff") .withPointHighlightStroke("rgba(45,134,45,1)"); // para cada data de pagamento, printa o valor no dataset payDates .stream() .forEach( payDate -> { model.addLabel(DateTimeFormatter.ofPattern("dd/MM").format(payDate)); final BigDecimal expensesTotal = expenses .stream() .filter(movement -> movement.getPaymentDate().equals(payDate)) .map(Movement::getValue) .reduce(BigDecimal.ZERO, BigDecimal::add); final BigDecimal revenuesTotal = revenues .stream() .filter(movement -> movement.getPaymentDate().equals(payDate)) .map(Movement::getValue) .reduce(BigDecimal.ZERO, BigDecimal::add); expensesBuilder.andData(expensesTotal); revenuesBuilder.andData(revenuesTotal); }); // joga os datasets no model model.addDataset(revenuesBuilder.build()); model.addDataset(expensesBuilder.build()); return model; }