/*
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.ControladorFormulario;
import badernageral.bgfinancas.biblioteca.utilitario.Animacao;
import badernageral.bgfinancas.biblioteca.sistema.Botao;
import badernageral.bgfinancas.biblioteca.utilitario.Erro;
import badernageral.bgfinancas.biblioteca.utilitario.Validar;
import badernageral.bgfinancas.biblioteca.contrato.Item;
import badernageral.bgfinancas.biblioteca.sistema.Janela;
import badernageral.bgfinancas.biblioteca.sistema.Kernel;
import badernageral.bgfinancas.biblioteca.tipo.Acao;
import badernageral.bgfinancas.biblioteca.tipo.Duracao;
import badernageral.bgfinancas.biblioteca.tipo.Operacao;
import badernageral.bgfinancas.biblioteca.tipo.Status;
import badernageral.bgfinancas.biblioteca.utilitario.Calculadora;
import badernageral.bgfinancas.biblioteca.utilitario.Datas;
import badernageral.bgfinancas.modelo.CartaoCredito;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import badernageral.bgfinancas.template.botao.BotaoFormulario;
import badernageral.bgfinancas.template.botao.BotaoListaCategoria;
import badernageral.bgfinancas.modelo.Conta;
import badernageral.bgfinancas.modelo.Despesa;
import badernageral.bgfinancas.modelo.DespesaItem;
import badernageral.bgfinancas.modulo.cartao_credito.CartaoCreditoFormularioControlador;
import badernageral.bgfinancas.modulo.conta.ContaFormularioControlador;
import badernageral.bgfinancas.modulo.despesa.item.DespesaItemFormularioControlador;
import badernageral.bgfinancas.template.botao.BotaoListaItem;
import java.math.BigDecimal;
import java.time.LocalDate;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
public final class DespesaFormularioControlador implements Initializable, ControladorFormulario {
@FXML private TitledPane formulario;
@FXML private GridPane tabela;
@FXML private Label labelItem;
@FXML private Label labelConta;
@FXML private Label labelData;
@FXML private Label labelQuantidade;
@FXML private Label labelValor;
@FXML private BotaoListaItem itemController;
@FXML private BotaoListaCategoria contaController;
@FXML private DatePicker data;
@FXML private TextField valor;
@FXML private TextField quantidade;
@FXML private Label ajuda1;
@FXML private Label ajuda2;
@FXML private BotaoFormulario botaoController;
private final CheckBox checkAgendar = new CheckBox();
private final CheckBox checkCartaoCredito = new CheckBox();
private final Spinner qtdMeses = new Spinner();
private final Label ajuda = new Label();
private final ComboBox<Categoria> listaCartaoCredito = new ComboBox<>();
private final Button botaoListaCartaoCredito = new Button();
private final Label labelCartaoCredito = new Label(idioma.getMensagem("cartao_credito")+":");
private final HBox grupoCartaoCredito = new HBox();
private Boolean pagar = false;
private Despesa modelo;
private Acao acao;
private DespesasAgendadasControlador controlador = null;
@Override
public void initialize(URL url, ResourceBundle rb) {
formulario.setText(idioma.getMensagem("despesa"));
Botao.prepararBotaoModal(this, botaoController, itemController, contaController);
Calculadora.preparar(valor, ajuda1);
Calculadora.preparar(quantidade, ajuda2);
labelItem.setText(idioma.getMensagem("item")+":");
labelConta.setText(idioma.getMensagem("conta")+":");
labelData.setText(idioma.getMensagem("data")+":");
labelQuantidade.setText(idioma.getMensagem("quantidade")+":");
labelValor.setText(idioma.getMensagem("valor")+":");
new DespesaItem().montarSelectItem(itemController.getComboItem());
new Conta().montarSelectCategoria(contaController.getComboCategoria());
}
@Override
public void acaoCancelar() {
Animacao.fadeInOutClose(formulario);
}
@Override
public void acaoCadastrar(int botao) {
if(botao==1){
Animacao.fadeOutInvisivel(itemController.getComboItem(), formulario);
DespesaItemFormularioControlador controladorItem = Janela.abrir(DespesaItem.FXML_FORMULARIO, idioma.getMensagem("despesa"));
controladorItem.cadastrar(this, null, itemController.getComboItem().getEditor().getText());
}else if(botao==2){
Animacao.fadeOutInvisivel(contaController.getComboCategoria(), formulario);
ContaFormularioControlador controller = Janela.abrir(Conta.FXML_FORMULARIO, idioma.getMensagem("despesa"));
controller.cadastrar(this);
}else{
Animacao.fadeOutInvisivel(listaCartaoCredito, formulario);
CartaoCreditoFormularioControlador controller = Janela.abrir(CartaoCredito.FXML_FORMULARIO, idioma.getMensagem("despesa"));
controller.cadastrar(this);
}
}
@Override
public void selecionarComboItem(int combo, Item item) {
if(item!=null){
new DespesaItem().montarSelectItem(itemController.getComboItem());
itemController.setItemSelecionado(item);
}
Animacao.fadeInInvisivel(itemController.getComboItem(), formulario);
}
@Override
public void selecionarComboCategoria(int combo, Categoria categoria) {
if(categoria!=null){
if(combo==1){
new Conta().montarSelectCategoria(contaController.getComboCategoria());
contaController.setCategoriaSelecionada(categoria);
}else{
new CartaoCredito().montarSelectCategoria(listaCartaoCredito);
listaCartaoCredito.getSelectionModel().select(categoria);
}
}
Animacao.fadeInInvisivel(contaController.getComboCategoria(), formulario);
}
private void prepararCartaoCredito(Boolean checkbox){
new CartaoCredito().montarSelectCategoria(listaCartaoCredito);
listaCartaoCredito.getStyleClass().add("ListaComBotao");
botaoListaCartaoCredito.getStyleClass().add("Botao");
botaoListaCartaoCredito.getStyleClass().add("BotaoFim");
botaoListaCartaoCredito.getStyleClass().add("BotaoCadastrar");
botaoListaCartaoCredito.setMinWidth(40);
botaoListaCartaoCredito.setOnAction(e -> { acaoCadastrar(3); });
if(checkbox){
grupoCartaoCredito.getChildren().addAll(checkCartaoCredito,listaCartaoCredito,botaoListaCartaoCredito);
}else{
grupoCartaoCredito.getChildren().addAll(listaCartaoCredito,botaoListaCartaoCredito);
}
}
public void cadastrar(DespesasAgendadasControlador controlador){
acao = Acao.CADASTRAR;
this.controlador = controlador;
if(controlador!=null){
data.setValue(LocalDate.now().withMonth(controlador.getData().getMonthValue()).withYear(controlador.getData().getYear()));
}else{
data.setValue(LocalDate.now());
}
quantidade.setText("1");
botaoController.setTextBotaoFinalizar(idioma.getMensagem("cadastrar"));
tabela.getChildren().remove(botaoController.getStackPane());
tabela.add(botaoController.getStackPane(), 1, 6);
Label labelAgendada = new Label(idioma.getMensagem("agendar")+":");
tabela.add(labelAgendada, 0, 5);
qtdMeses.setPrefWidth(100);
qtdMeses.getStyleClass().add(Spinner.STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL);
qtdMeses.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(1, 100, 1));
Ajuda.estilizarBotaoDica(qtdMeses, ajuda, idioma.getMensagem("numero_meses"), Duracao.CURTA);
HBox grupoAgendar = new HBox();
grupoAgendar.getChildren().addAll(checkAgendar,qtdMeses,ajuda);
tabela.add(grupoAgendar, 1, 5);
prepararCartaoCredito(true);
if(controlador!=null){
checkAgendar.setSelected(true);
checkAgendar.setDisable(true);
eventoDespesaAgendada();
}else{
qtdMeses.setVisible(false);
ajuda.setVisible(false);
}
checkAgendar.setOnAction(e -> {
eventoDespesaAgendada();
});
checkCartaoCredito.setOnAction(e -> {
if(checkCartaoCredito.isSelected()){
listaCartaoCredito.setVisible(true);
botaoListaCartaoCredito.setVisible(true);
}else{
listaCartaoCredito.setVisible(false);
botaoListaCartaoCredito.setVisible(false);
}
});
listaCartaoCredito.setOnAction(e -> {
CartaoCredito c = new CartaoCredito().setIdCategoria(listaCartaoCredito.getSelectionModel().getSelectedItem().getIdCategoria()).consultar();
data.setValue(data.getValue().withDayOfMonth(c.getVencimento().intValue()));
});
}
private void eventoDespesaAgendada(){
tabela.getChildren().remove(botaoController.getStackPane());
if(checkAgendar.isSelected()){
qtdMeses.setVisible(true);
ajuda.setVisible(true);
listaCartaoCredito.setVisible(false);
botaoListaCartaoCredito.setVisible(false);
tabela.add(labelCartaoCredito, 0, 6);
tabela.add(grupoCartaoCredito, 1, 6);
tabela.add(botaoController.getStackPane(), 1, 7);
}else{
qtdMeses.setVisible(false);
ajuda.setVisible(false);
checkCartaoCredito.setSelected(false);
tabela.getChildren().remove(labelCartaoCredito);
tabela.getChildren().remove(grupoCartaoCredito);
tabela.add(botaoController.getStackPane(), 1, 6);
}
}
public void alterar(Despesa modelo){
this.modelo = modelo;
botaoController.setTextBotaoFinalizar(idioma.getMensagem("alterar"));
DespesaItem item = new DespesaItem().setIdItem(modelo.getIdItem()).consultar();
if(item != null){
itemController.setItemSelecionado(item);
}
Conta conta = new Conta().setIdCategoria(modelo.getIdConta()).consultar();
if(conta != null){
contaController.setCategoriaSelecionada(conta);
}
itemController.getComboItem().setDisable(true);
itemController.getBotaoCadastrar().setDisable(true);
data.setValue(modelo.getData());
quantidade.setText(modelo.getQuantidade().toString());
valor.setText(modelo.getValor().toString());
if(modelo.getAgendada().equals("1")){
Button bPagar = new Button(idioma.getMensagem("pagar"));
botaoController.getGrupoBotao().getChildren().add(0, bPagar);
bPagar.setOnAction(e -> {
pagar = true;
acaoFinalizar();
});
prepararCartaoCredito(false);
tabela.getChildren().remove(botaoController.getStackPane());
tabela.add(labelCartaoCredito, 0, 5);
tabela.add(grupoCartaoCredito, 1, 5);
tabela.add(botaoController.getStackPane(), 1, 6);
if(modelo.getNomeCartaoCredito()!=null){
listaCartaoCredito.getItems().add(0, new CartaoCredito().setNome(idioma.getMensagem("nenhum")));
listaCartaoCredito.getSelectionModel().select(new CartaoCredito().setIdCategoria(modelo.getIdCartaoCredito()).setNome(modelo.getNomeCartaoCredito()));
}
}
}
@Override
public void acaoFinalizar(){
if(validarFormulario()){
if(acao == Acao.CADASTRAR){
if(checkAgendar.isSelected()){
LocalDate dataCadastro = data.getValue();
int j = Integer.parseInt(qtdMeses.getValue().toString());
for(int i=1;i<=j;i++){
String cartaoCredito = null;
if(checkCartaoCredito.isSelected()){
cartaoCredito = listaCartaoCredito.getSelectionModel().getSelectedItem().getIdCategoria();
}
Despesa item = new Despesa(null, contaController.getIdCategoria(), itemController.getIdItem(), quantidade.getText(), valor.getText(), dataCadastro, Datas.getHoraAtual(), "1", cartaoCredito);
if(j>1){ item.setParcela(i+"/"+j); }
item.cadastrar();
dataCadastro = dataCadastro.plusMonths(1);
}
Kernel.principal.acaoDespesasAgendadas(data.getValue().getMonthValue(), data.getValue().getYear());
}else{
Despesa item = new Despesa(null, contaController.getIdCategoria(), itemController.getIdItem(), quantidade.getText(), valor.getText(), data.getValue(), Datas.getHoraAtual(), "0", null);
item.cadastrar();
new Conta().alterarSaldo(Operacao.DECREMENTAR, contaController.getIdCategoria(), valor.getText());
Kernel.controlador.acaoFiltrar(true);
}
Janela.showTooltip(Status.SUCESSO, idioma.getMensagem("operacao_sucesso"), Duracao.CURTA);
Animacao.fadeInOutClose(formulario);
}else{
if(!modelo.getAgendada().equals("1")){
Boolean contaMudou = !(modelo.getIdConta().equals(contaController.getIdCategoria()));
if(contaMudou){
new Conta().alterarSaldo(Operacao.INCREMENTAR, modelo.getIdConta(), modelo.getValor().toString());
new Conta().alterarSaldo(Operacao.DECREMENTAR, contaController.getIdCategoria(), modelo.getValor().toString());
}
Boolean valorMudou = !(modelo.getValor().equals(valor.getText()));
if(valorMudou){
BigDecimal valorDiferenca = modelo.getValor();
valorDiferenca = valorDiferenca.subtract(new BigDecimal(valor.getText()));
new Conta().alterarSaldo(Operacao.INCREMENTAR, modelo.getIdConta(), valorDiferenca.toString());
}
}else{
if(pagar){
modelo.setAgendada("0");
new Conta().alterarSaldo(Operacao.DECREMENTAR, contaController.getIdCategoria(), valor.getText());
}
}
if(listaCartaoCredito.getSelectionModel().getSelectedItem()!=null){
modelo.setIdCartaoCredito(listaCartaoCredito.getSelectionModel().getSelectedItem());
}
modelo.setIdConta(contaController.getComboCategoria().getValue());
modelo.setValor(valor.getText());
modelo.setQuantidade(quantidade.getText());
modelo.setData(Datas.toSqlData(data.getValue()));
modelo.alterar();
Kernel.controlador.acaoFiltrar(true);
Janela.showTooltip(Status.SUCESSO, idioma.getMensagem("operacao_sucesso"), Duracao.CURTA);
Animacao.fadeInOutClose(formulario);
}
}
}
private boolean validarFormulario(){
try {
Validar.textFieldDecimal(valor);
Validar.textFieldDecimal(quantidade);
Validar.autoFiltro(itemController.getAutoFiltro(), itemController.getComboItem());
Validar.comboBox(contaController.getComboCategoria());
Validar.datePicker(data);
if(checkAgendar.isSelected()){
if(checkCartaoCredito.isSelected()){
Validar.comboBox(listaCartaoCredito);
}
}
return true;
} catch (Erro ex) {
return false;
}
}
public void lancamentoGuiado(Item item){
itemController.setItemSelecionado(item);
itemController.getComboItem().setDisable(true);
itemController.getBotaoCadastrar().setDisable(true);
itemController.getBotaoCadastrar().setVisible(false);
}
}