/*
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.modulo.despesa;
import badernageral.bgfinancas.biblioteca.ajuda.Ajuda;
import badernageral.bgfinancas.biblioteca.contrato.Categoria;
import badernageral.bgfinancas.biblioteca.contrato.Controlador;
import badernageral.bgfinancas.biblioteca.sistema.Botao;
import badernageral.bgfinancas.biblioteca.sistema.Janela;
import badernageral.bgfinancas.biblioteca.sistema.Kernel;
import badernageral.bgfinancas.biblioteca.sistema.Tabela;
import badernageral.bgfinancas.biblioteca.tipo.Duracao;
import badernageral.bgfinancas.biblioteca.tipo.Posicao;
import badernageral.bgfinancas.biblioteca.tipo.Status;
import badernageral.bgfinancas.biblioteca.utilitario.Animacao;
import badernageral.bgfinancas.biblioteca.utilitario.AreaTransferencia;
import badernageral.bgfinancas.biblioteca.utilitario.Validar;
import badernageral.bgfinancas.modelo.CartaoCredito;
import badernageral.bgfinancas.modelo.Despesa;
import badernageral.bgfinancas.template.modulo.ListaConta;
import badernageral.bgfinancas.template.modulo.ListaGrupo;
import java.math.BigDecimal;
import java.net.URL;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.StackPane;
import javafx.collections.ObservableList;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.layout.GridPane;
public final class DespesasAgendadasControlador implements Initializable, Controlador {
@FXML
private Button voltar;
@FXML
private Label titulo;
@FXML
private Button anterior;
@FXML
private Button proximo;
@FXML
private Label labelCartaoCredito;
@FXML
private Button cadastrar;
@FXML
private Button alterar;
@FXML
private Button excluir;
@FXML
private Label labelDespesasAgendadasTotal;
@FXML
private GridPane barraSuperior;
@FXML
private GridPane barraInferior;
@FXML
private ListaGrupo listaGrupoController;
@FXML
private ListaConta listaContaController;
@FXML
private ComboBox<Categoria> listaCartaoCredito;
@FXML
private StackPane tabelaPane;
private LocalDate data = LocalDate.now();
private Despesa modelo;
private final String TITULO = idioma.getMensagem("despesas_agendadas");
private ObservableList<Despesa> itens;
private final Tabela<Despesa> tabela = new Tabela<>();
private final TableView<Despesa> tabelaLista = new TableView<>();
private final List<Despesa> itensDespesasAgendadas = new ArrayList<>();
private final AreaTransferencia areaTransferencia = new AreaTransferencia();
@Override
public void initialize(URL url, ResourceBundle rb) {
Kernel.setTitulo(TITULO);
Botao.prepararBotao(new Button[]{cadastrar}, alterar, excluir, voltar);
Botao.prepararBotaoGerenciar(1, anterior, idioma.getMensagem("anterior"));
Botao.prepararBotaoGerenciar(2, proximo, idioma.getMensagem("proximo"));
labelCartaoCredito.setText(idioma.getMensagem("cartao_credito") + ":");
tabelaPane.getChildren().add(tabelaLista);
tabela.prepararTabela(tabelaLista);
tabela.adicionarColuna(tabelaLista, idioma.getMensagem("categoria"), "nomeCategoria");
tabela.adicionarColuna(tabelaLista, idioma.getMensagem("item"), "nomeItem").setMinWidth(120);
tabela.adicionarColunaNumero(tabelaLista, idioma.getMensagem("quantidade"), "quantidade");
tabela.adicionarColunaNumero(tabelaLista, idioma.getMensagem("valor"), "valor");
tabela.adicionarColuna(tabelaLista, idioma.getMensagem("conta"), "nomeConta");
tabela.adicionarColunaData(tabelaLista, idioma.getMensagem("data"), "data");
tabela.adicionarColuna(tabelaLista, idioma.getMensagem("cartao_credito"), "nomeCartaoCredito");
new CartaoCredito().montarSelectCategoria(listaCartaoCredito);
CartaoCredito cartaoSemCartao = new CartaoCredito().setIdCategoria("NULL").setNome(idioma.getMensagem("sem_cartao_credito"));
CartaoCredito cartaoSomenteCartao = new CartaoCredito().setIdCategoria("NOTNULL").setNome(idioma.getMensagem("somente_cartao_credito"));
CartaoCredito cartaoTodos = new CartaoCredito().setNome(idioma.getMensagem("todos"));
listaCartaoCredito.getItems().add(cartaoSemCartao);
listaCartaoCredito.getItems().add(cartaoSomenteCartao);
listaCartaoCredito.getItems().add(cartaoTodos);
listaCartaoCredito.getSelectionModel().select(cartaoTodos);
listaCartaoCredito.setOnAction(e -> {
acaoFiltrar(true);
});
atualizarTitulo(false);
areaTransferencia.criarMenu(this, tabelaLista, true);
}
private void atualizarTitulo(Boolean animacao) {
titulo.setText(TITULO + " - " + idioma.getNomeMes(data.getMonthValue()) + " / " + data.getYear());
acaoFiltrar(animacao);
}
@Override
public void acaoFiltrar(Boolean animacao) {
tabelaLista.setItems(new Despesa().setSomenteAgendamento().setMesAno(data.getMonthValue(), data.getYear()).setIdCartaoCredito(listaCartaoCredito.getSelectionModel().getSelectedItem()).listar());
listaGrupoController.atualizarTabela(animacao);
listaContaController.atualizarTabela(animacao);
calcularSaldo();
if (animacao) {
Animacao.fadeOutIn(tabelaLista);
}
}
private void calcularSaldo() {
BigDecimal valorTotal = tabelaLista.getItems().stream()
.map(d -> d.getValor())
.reduce(BigDecimal.ZERO, BigDecimal::add);
labelDespesasAgendadasTotal.setText(idioma.getMensagem("valor_total") + ": " + idioma.getMensagem("moeda") + " " + valorTotal.toString());
}
@Override
public void acaoCadastrar(int botao) {
if (botao == 1) {
DespesaFormularioControlador Controlador = Janela.abrir(Despesa.FXML_FORMULARIO, TITULO);
Controlador.cadastrar(this);
}
}
@Override
public void acaoAlterar(int tabela) {
switch (tabela) {
case 1:
itens = tabelaLista.getSelectionModel().getSelectedItems();
if (Validar.alteracao(itens, alterar)) {
DespesaFormularioControlador Controlador = Janela.abrir(Despesa.FXML_FORMULARIO, TITULO);
Controlador.alterar(itens.get(0));
} break;
case 2:
listaContaController.alterarConta(TITULO);
break;
case 3:
listaGrupoController.alterarGrupo(TITULO);
break;
default:
break;
}
}
@Override
public void acaoExcluir(int botao) {
itens = tabelaLista.getSelectionModel().getSelectedItems();
if (Validar.exclusao(itens, excluir)) {
itens.forEach((Despesa p) -> p.excluir());
Janela.showTooltip(Status.SUCESSO, idioma.getMensagem("operacao_sucesso"), Duracao.CURTA);
acaoFiltrar(true);
}
}
public LocalDate getData() {
return data;
}
public void setData(int mes, int ano) {
data = data.withMonth(mes);
data = data.withYear(ano);
atualizarTitulo(true);
}
@Override
public void acaoGerenciar(int botao) {
if (botao == 2) {
data = data.minusMonths(1);
atualizarTitulo(true);
} else if (botao == 3) {
data = data.plusMonths(1);
atualizarTitulo(true);
}
areaTransferencia.setData(data);
}
@Override
public void acaoVoltar() {
Kernel.principal.acaoVoltar();
}
@Override
public void acaoAjuda() {
Ajuda.getInstance().setObjetos(voltar, titulo, anterior, proximo, labelCartaoCredito, listaCartaoCredito, cadastrar, alterar, excluir, tabelaLista, barraInferior, listaGrupoController.getGridPane(), listaContaController.getGridPane());
Ajuda.getInstance().capitulo(Posicao.CENTRO, idioma.getMensagem("tuto_desp_agen_1"));
Ajuda.getInstance().capitulo(Posicao.CENTRO, idioma.getMensagem("tuto_desp_agen_2"));
Ajuda.getInstance().capitulo(titulo, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_3"));
Ajuda.getInstance().capitulo(anterior, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_4"));
Ajuda.getInstance().capitulo(proximo, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_5"));
Ajuda.getInstance().capitulo(listaCartaoCredito, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_6"));
Ajuda.getInstance().capitulo(cadastrar, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_7"));
Ajuda.getInstance().capitulo(alterar, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_8"));
Ajuda.getInstance().capitulo(excluir, Posicao.BAIXO, idioma.getMensagem("tuto_desp_agen_9"));
Ajuda.getInstance().capitulo(tabelaLista, Posicao.CENTRO, idioma.getMensagem("tuto_desp_agen_10"));
Ajuda.getInstance().capitulo(barraInferior, Posicao.TOPO, idioma.getMensagem("tuto_desp_agen_11"));
Ajuda.getInstance().capitulo(Arrays.asList(listaContaController.getGridPane(), listaGrupoController.getGridPane()),
Posicao.CENTRO, idioma.getMensagem("tuto_desp_agen_12"));
Ajuda.getInstance().apresentarProximo();
}
}