/* Copyright 2012-2017 Jose Robson Mariano Alves This file is part of bgfinancas. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package badernageral.bgfinancas.principal; import badernageral.bgfinancas.biblioteca.ajuda.Ajuda; import badernageral.bgfinancas.biblioteca.contrato.Controlador; import badernageral.bgfinancas.biblioteca.sistema.Janela; import badernageral.bgfinancas.biblioteca.sistema.Kernel; import badernageral.bgfinancas.biblioteca.sistema.Tabela; import badernageral.bgfinancas.biblioteca.tipo.Posicao; import badernageral.bgfinancas.biblioteca.utilitario.Animacao; import badernageral.bgfinancas.idioma.Linguagem; import badernageral.bgfinancas.modelo.Agenda; import badernageral.bgfinancas.modelo.Conta; import badernageral.bgfinancas.modelo.Despesa; import badernageral.bgfinancas.modelo.Grupo; import badernageral.bgfinancas.modelo.Receita; import badernageral.bgfinancas.modelo.Transferencia; import badernageral.bgfinancas.modulo.agenda.AgendaFormularioControlador; import badernageral.bgfinancas.modulo.conta.ContaFormularioControlador; import badernageral.bgfinancas.modulo.despesa.DespesaFormularioControlador; import java.math.BigDecimal; import java.net.URL; import java.time.LocalDate; import java.util.ResourceBundle; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TableView; import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; public final class HomeControlador implements Initializable, Controlador { @FXML private GridPane home; @FXML private GridPane gridContas; @FXML private GridPane gridRelatorio; @FXML private GridPane gridDespesasAgendadas; @FXML private GridPane gridAgenda; // Contas @FXML private Label labelContas; @FXML private Label labelCreditoTotal; @FXML private Label labelPoupancaTotal; @FXML private TableView<Conta> tabelaListaConta; private final Tabela<Conta> tabelaConta = new Tabela<>(); // Relatório @FXML private Label labelRelatorio; @FXML private Label labelRelatorioData; @FXML private Label labelValorTotalRelatorio; @FXML private TabPane painelRelatorio; @FXML private Tab tabRelatorioDespesas; @FXML private Tab tabRelatorioReceitas; @FXML private Tab tabRelatorioTransferencias; @FXML private Tab tabRelatorioGrupos; @FXML private Tab tabRelatorioDespesasAgendadas; @FXML private TableView<Despesa> tabelaListaRelatorioDespesas; @FXML private TableView<Receita> tabelaListaRelatorioReceitas; @FXML private TableView<Transferencia> tabelaListaRelatorioTransferencias; @FXML private TableView<Grupo> tabelaListaRelatorioGrupos; @FXML private TableView<Despesa> tabelaListaRelatorioDespesasAgendadas; private final Tabela<Despesa> tabelaRelatorioDespesas = new Tabela<>(); private final Tabela<Receita> tabelaRelatorioReceitas = new Tabela<>(); private final Tabela<Transferencia> tabelaRelatorioTransferencias = new Tabela<>(); private final Tabela<Grupo> tabelaGrupos = new Tabela<>(); private final Tabela<Despesa> tabelaRelatorioDespesasAgendadas = new Tabela<>(); private LocalDate dataRelatorio = LocalDate.now(); private BigDecimal valorTotalRelatorio = BigDecimal.ZERO; // Despesas Agendadas @FXML private Label labelDespesasAgendadas; @FXML private Label labelDespesasAgendadasData; @FXML private Label labelDespesasAgendadasTotal; @FXML private Label labelDespesasAgendadasCredito; @FXML private TableView<Despesa> tabelaListaDespesasAgendadas; private final Tabela<Despesa> tabelaDespesasAgendadas = new Tabela<>(); // Agenda @FXML private Label labelAgenda; @FXML private Label labelValorTotalAgenda; @FXML private TableView<Agenda> tabelaListaAgenda; private BigDecimal valorTotalAgenda; private final Tabela<Agenda> tabelaAgenda = new Tabela<>(); // Outros private LocalDate data = LocalDate.now(); private BigDecimal valorCredito; private BigDecimal valorPoupanca; @Override public void initialize(URL url, ResourceBundle rb) { Kernel.setTitulo(Linguagem.getInstance().getMensagem("principal")); inicializarContas(); inicializarRelatorio(); inicializarDespesasAgendadas(); inicializarAgenda(); atualizarTabela(true); } private void inicializarContas(){ tabelaConta.prepararTabela(tabelaListaConta, 1); prepararColunaTipoConta(tabelaConta.adicionarColuna(tabelaListaConta, "", "saldoTotal")); tabelaConta.adicionarColuna(tabelaListaConta, idioma.getMensagem("nome"), "nome"); tabelaConta.setColunaColorida(tabelaConta.adicionarColunaNumero(tabelaListaConta, idioma.getMensagem("saldo"), "valor")); labelContas.setText(idioma.getMensagem("contas")); } private void prepararColunaTipoConta(TableColumn colunaTipoConta){ colunaTipoConta.setMinWidth(35); colunaTipoConta.setMaxWidth(35); colunaTipoConta.setCellFactory(coluna -> { return new TableCell<Conta, String>() { @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { if(item.equals(idioma.getMensagem("credito"))){ setStyle("-fx-background-image: url(\"badernageral/bgfinancas/recursos/imagem/outros/credito.png\");-fx-background-repeat: no-repeat;-fx-background-position: center center"); }else{ setStyle("-fx-background-image: url(\"badernageral/bgfinancas/recursos/imagem/outros/poupanca.png\");-fx-background-repeat: no-repeat;-fx-background-position: center center"); } } } }; }); } private void inicializarDespesasAgendadas(){ labelDespesasAgendadas.setText(idioma.getMensagem("despesas_agendadas")); tabelaDespesasAgendadas.prepararTabela(tabelaListaDespesasAgendadas, 2); tabelaDespesasAgendadas.adicionarColuna(tabelaListaDespesasAgendadas, idioma.getMensagem("nome"), "nomeItem").setMinWidth(150); tabelaDespesasAgendadas.adicionarColunaNumero(tabelaListaDespesasAgendadas, idioma.getMensagem("valor"), "valor"); tabelaDespesasAgendadas.adicionarColunaData(tabelaListaDespesasAgendadas, idioma.getMensagem("data"), "data"); } private void inicializarAgenda(){ tabelaAgenda.prepararTabela(tabelaListaAgenda, 6); tabelaAgenda.adicionarColuna(tabelaListaAgenda, idioma.getMensagem("tipo"), "nomeCategoria"); tabelaAgenda.adicionarColuna(tabelaListaAgenda, idioma.getMensagem("descricao"), "nome"); tabelaAgenda.adicionarColunaData(tabelaListaAgenda, idioma.getMensagem("data"), "data"); tabelaAgenda.setColunaColorida(tabelaAgenda.adicionarColunaNumero(tabelaListaAgenda, idioma.getMensagem("valor"), "valor")); labelAgenda.setText(idioma.getMensagem("lembretes")); } private void inicializarRelatorio(){ painelRelatorio.getSelectionModel().selectedIndexProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> { atualizarValorTotalRelatorio(newValue); }); labelRelatorio.setText(idioma.getMensagem("mini_relatorio_mensal")); tabRelatorioDespesas.setText(idioma.getMensagem("despesas")); Image imagemDespesas = new Image("/badernageral/bgfinancas/recursos/imagem/modulo/icon/despesas.png"); ImageView iconeDespesas = new ImageView(imagemDespesas); tabRelatorioDespesas.setGraphic(iconeDespesas); tabRelatorioReceitas.setText(idioma.getMensagem("receitas")); Image imagemReceitas = new Image("/badernageral/bgfinancas/recursos/imagem/modulo/icon/receitas.png"); ImageView iconeReceitas = new ImageView(imagemReceitas); tabRelatorioReceitas.setGraphic(iconeReceitas); tabRelatorioTransferencias.setText(idioma.getMensagem("transferencias")); Image imagemTransferencias = new Image("/badernageral/bgfinancas/recursos/imagem/modulo/icon/transferencias.png"); ImageView iconeTransferencias = new ImageView(imagemTransferencias); tabRelatorioTransferencias.setGraphic(iconeTransferencias); tabRelatorioGrupos.setText(idioma.getMensagem("cotas_despesas")); Image imagemGrupos = new Image("/badernageral/bgfinancas/recursos/imagem/modulo/icon/grupos.png"); ImageView iconeGrupos = new ImageView(imagemGrupos); tabRelatorioGrupos.setGraphic(iconeGrupos); tabRelatorioDespesasAgendadas.setText(idioma.getMensagem("despesas_agendadas")); Image imagemDespesasAgendadas = new Image("/badernageral/bgfinancas/recursos/imagem/modulo/icon/despesa_agendada.png"); ImageView iconeDespesasAgendadas = new ImageView(imagemDespesasAgendadas); tabRelatorioDespesasAgendadas.setGraphic(iconeDespesasAgendadas); tabelaRelatorioDespesas.prepararTabela(tabelaListaRelatorioDespesas, 3); tabelaRelatorioDespesas.adicionarColuna(tabelaListaRelatorioDespesas, idioma.getMensagem("categoria"), "nomeCategoria"); tabelaRelatorioDespesas.setColunaColorida(tabelaRelatorioDespesas.adicionarColunaNumero(tabelaListaRelatorioDespesas, idioma.getMensagem("valor"), "valor")); tabelaRelatorioReceitas.prepararTabela(tabelaListaRelatorioReceitas, 3); tabelaRelatorioReceitas.adicionarColuna(tabelaListaRelatorioReceitas, idioma.getMensagem("categoria"), "nomeCategoria"); tabelaRelatorioReceitas.setColunaColorida(tabelaRelatorioReceitas.adicionarColunaNumero(tabelaListaRelatorioReceitas, idioma.getMensagem("valor"), "valor")); tabelaRelatorioTransferencias.prepararTabela(tabelaListaRelatorioTransferencias, 3); tabelaRelatorioTransferencias.adicionarColuna(tabelaListaRelatorioTransferencias, idioma.getMensagem("categoria"), "nomeCategoria"); tabelaRelatorioTransferencias.setColunaColorida(tabelaRelatorioTransferencias.adicionarColunaNumero(tabelaListaRelatorioTransferencias, idioma.getMensagem("valor"), "valor")); tabelaGrupos.prepararTabela(tabelaListaRelatorioGrupos, 3); tabelaGrupos.adicionarColuna(tabelaListaRelatorioGrupos, idioma.getMensagem("cota"), "nome"); tabelaGrupos.adicionarColunaNumero(tabelaListaRelatorioGrupos, idioma.getMensagem("valor"), "valor"); tabelaGrupos.setColunaColorida(tabelaGrupos.adicionarColunaNumero(tabelaListaRelatorioGrupos, idioma.getMensagem("saldo"), "saldo")); tabelaRelatorioDespesasAgendadas.prepararTabela(tabelaListaRelatorioDespesasAgendadas, 3); tabelaRelatorioDespesasAgendadas.adicionarColuna(tabelaListaRelatorioDespesasAgendadas, idioma.getMensagem("categoria"), "nomeCategoria"); tabelaRelatorioDespesasAgendadas.setColunaColorida(tabelaRelatorioDespesasAgendadas.adicionarColunaNumero(tabelaListaRelatorioDespesasAgendadas, idioma.getMensagem("valor"), "valor")); } private void calcularSaldoContas(){ valorPoupanca = tabelaListaConta.getItems().stream() .filter(c -> c.getSaldoTotal().equals(idioma.getMensagem("poupanca"))) .map(c -> c.getValor()) .reduce(BigDecimal.ZERO, BigDecimal::add); valorCredito = tabelaListaConta.getItems().stream() .filter(c -> c.getSaldoTotal().equals(idioma.getMensagem("credito"))) .map(c -> c.getValor()) .reduce(BigDecimal.ZERO, BigDecimal::add); labelPoupancaTotal.setText(idioma.getMensagem("total_poupanca")+": "+idioma.getMensagem("moeda")+" "+valorPoupanca); labelCreditoTotal.setText(idioma.getMensagem("total_credito")+": "+idioma.getMensagem("moeda")+" "+valorCredito); } private void calcularValorDespesasAgendadas(){ BigDecimal valorTotal = tabelaListaDespesasAgendadas.getItems().stream() .map(d -> d.getValor()) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal creditoRestante = valorCredito.subtract(valorTotal); labelDespesasAgendadasTotal.setText(idioma.getMensagem("despesas")+": "+idioma.getMensagem("moeda")+" "+valorTotal.toString()); labelDespesasAgendadasCredito.setText(idioma.getMensagem("credito_restante")+": "+idioma.getMensagem("moeda")+" "+creditoRestante.toString()); } public void atualizarTabela(boolean animacao){ atualizarContas(); atualizarRelatorio(); atualizarDespesasAgendadas(); atualizarAgenda(); if(animacao){ Animacao.fadeOutIn(home); } } private void atualizarContas(){ tabelaListaConta.setItems(new Conta().setAtivada("1").listar()); calcularSaldoContas(); } private void atualizarRelatorio(){ labelRelatorioData.setText(idioma.getNomeMes(dataRelatorio.getMonthValue()).substring(0,3)+" / "+dataRelatorio.getYear()); tabelaListaRelatorioDespesas.setItems(new Despesa().getRelatorioMensal(dataRelatorio)); tabelaListaRelatorioReceitas.setItems(new Receita().getRelatorioMensal(dataRelatorio)); tabelaListaRelatorioTransferencias.setItems(new Transferencia().getRelatorioMensal(dataRelatorio)); tabelaListaRelatorioGrupos.setItems(new Grupo().getRelatorio(dataRelatorio, null)); tabelaListaRelatorioDespesasAgendadas.setItems(new Despesa().getRelatorioMensal(dataRelatorio,true)); atualizarValorTotalRelatorio(painelRelatorio.getSelectionModel().getSelectedIndex()); } private void atualizarValorTotalRelatorio(Number aba){ labelValorTotalRelatorio.setVisible(true); valorTotalRelatorio = BigDecimal.ZERO; switch(aba.intValue()){ case 0: tabelaListaRelatorioDespesas.getItems().stream().forEach(item -> { valorTotalRelatorio = valorTotalRelatorio.add(item.getValor()); }); break; case 1: tabelaListaRelatorioReceitas.getItems().stream().forEach(item -> { valorTotalRelatorio = valorTotalRelatorio.add(item.getValor()); }); break; case 2: tabelaListaRelatorioTransferencias.getItems().stream().forEach(item -> { valorTotalRelatorio = valorTotalRelatorio.add(item.getValor()); }); break; default: labelValorTotalRelatorio.setVisible(false); break; } labelValorTotalRelatorio.setText(idioma.getMensagem("moeda")+" "+valorTotalRelatorio.toString()); } public void atualizarDespesasAgendadas(){ tabelaListaDespesasAgendadas.setItems(new Despesa().setSomenteAgendamento().setMesAno(data.getMonthValue(), data.getYear()).listar()); labelDespesasAgendadasData.setText(idioma.getNomeMes(data.getMonthValue()).substring(0,3)+" / "+data.getYear()); calcularValorDespesasAgendadas(); } private void atualizarAgenda(){ valorTotalAgenda = BigDecimal.ZERO; tabelaListaAgenda.setItems(new Agenda().listar()); tabelaListaAgenda.getItems().stream().forEach(item -> { valorTotalAgenda = valorTotalAgenda.add(item.getValor()); }); labelValorTotalAgenda.setText(idioma.getMensagem("moeda")+" "+valorTotalAgenda.toString()); } public void proximoMesRelatorio(){ dataRelatorio = dataRelatorio.plusMonths(1); atualizarRelatorio(); } public void anteriorMesRelatorio(){ dataRelatorio = dataRelatorio.minusMonths(1); atualizarRelatorio(); } public void proximoMesDespesas(){ data = data.plusMonths(1); atualizarDespesasAgendadas(); } public void anteriorMesDespesas(){ data = data.minusMonths(1); atualizarDespesasAgendadas(); } public void acaoContas(){ Kernel.principal.acaoConta(); } public void acaoRelatorios(){ Kernel.principal.acaoRelatorios(); } public void acaoDespesasAgendadas(){ Kernel.principal.acaoDespesasAgendadas(); } public void acaoAgenda(){ Kernel.principal.acaoAgenda(); } @Override public void acaoCadastrar(int botao) { System.out.println(idioma.getMensagem("nao_implementado")); } @Override public void acaoAlterar(int tabela) { if(tabela==1){ ObservableList<Conta> itens = tabelaListaConta.getSelectionModel().getSelectedItems(); ContaFormularioControlador Controlador = Janela.abrir(Conta.FXML_FORMULARIO, idioma.getMensagem("contas")); Controlador.alterar(itens.get(0)); }else if(tabela==6){ ObservableList<Agenda> itens = tabelaListaAgenda.getSelectionModel().getSelectedItems(); AgendaFormularioControlador Controlador = Janela.abrir(Agenda.FXML_FORMULARIO, idioma.getMensagem("lembretes")); Controlador.alterar(itens.get(0)); }else if(tabela==2){ ObservableList<Despesa> itens = tabelaListaDespesasAgendadas.getSelectionModel().getSelectedItems(); DespesaFormularioControlador Controlador = Janela.abrir(Despesa.FXML_FORMULARIO, idioma.getMensagem("despesas_agendadas")); Controlador.alterar(itens.get(0)); }else{ System.out.println(idioma.getMensagem("nao_implementado")+tabela); } } @Override public void acaoExcluir(int botao) { System.out.println(idioma.getMensagem("nao_implementado")); } @Override public void acaoGerenciar(int botao) { System.out.println(idioma.getMensagem("nao_implementado")); } @Override public void acaoVoltar() { System.out.println(idioma.getMensagem("nao_implementado")); } @Override public void acaoFiltrar(Boolean animacao) { atualizarTabela(true); } @Override public void acaoAjuda() { Ajuda.getInstance().setObjetos(gridContas, gridRelatorio, gridDespesasAgendadas, gridAgenda); Ajuda.getInstance().capitulo(Posicao.CENTRO, idioma.getMensagem("tuto_home_1")); Ajuda.getInstance().capitulo(Posicao.CENTRO, idioma.getMensagem("tuto_home_2")); Ajuda.getInstance().capitulo(Posicao.TOPO, idioma.getMensagem("tuto_home_3")); Ajuda.getInstance().capitulo(gridContas, Posicao.BAIXO, idioma.getMensagem("tuto_home_4")); Ajuda.getInstance().capitulo(gridRelatorio, Posicao.BAIXO, idioma.getMensagem("tuto_home_5")); Ajuda.getInstance().capitulo(gridDespesasAgendadas, Posicao.TOPO, idioma.getMensagem("tuto_home_6")); Ajuda.getInstance().capitulo(gridAgenda, Posicao.TOPO, idioma.getMensagem("tuto_home_7")); Ajuda.getInstance().apresentarProximo(); } }