/*
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.transferencia;
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 java.math.BigDecimal;
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.modelo.Conta;
import badernageral.bgfinancas.modelo.Transferencia;
import badernageral.bgfinancas.modelo.TransferenciaItem;
import badernageral.bgfinancas.modulo.conta.ContaFormularioControlador;
import badernageral.bgfinancas.modulo.transferencia.item.TransferenciaItemFormularioControlador;
import badernageral.bgfinancas.template.botao.BotaoListaItem;
import java.time.LocalDate;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TitledPane;
public final class TransferenciaFormularioControlador implements Initializable, ControladorFormulario {
@FXML private TitledPane formulario;
@FXML private Label labelItem;
@FXML private Label labelContaOrigem;
@FXML private Label labelContaDestino;
@FXML private Label labelDescricao;
@FXML private Label labelValor;
@FXML private Label labelData;
@FXML private BotaoListaItem itemController;
@FXML private ComboBox<Categoria> contaOrigem;
@FXML private ComboBox<Categoria> contaDestino;
@FXML private TextField descricao;
@FXML private TextField valor;
@FXML private Label ajuda;
@FXML private DatePicker data;
@FXML private BotaoFormulario botaoController;
private Transferencia modelo;
private Acao acao;
private TransferenciaControlador controlador = null;
@Override
public void initialize(URL url, ResourceBundle rb) {
formulario.setText(idioma.getMensagem("transferencia"));
Botao.prepararBotaoModal(this, botaoController, itemController);
Calculadora.preparar(valor, ajuda);
labelItem.setText(idioma.getMensagem("item")+":");
labelContaOrigem.setText(idioma.getMensagem("conta_origem")+":");
labelContaDestino.setText(idioma.getMensagem("conta_destino")+":");
labelData.setText(idioma.getMensagem("data")+":");
labelDescricao.setText(idioma.getMensagem("descricao")+":");
labelValor.setText(idioma.getMensagem("valor")+":");
new TransferenciaItem().montarSelectItem(itemController.getComboItem());
new Conta().montarSelectCategoria(contaOrigem);
new Conta().montarSelectCategoria(contaDestino);
}
@Override
public void acaoCancelar() {
Animacao.fadeInOutClose(formulario);
}
@Override
public void acaoCadastrar(int botao) {
if(botao==1){
Animacao.fadeOutInvisivel(itemController.getComboItem(), formulario);
TransferenciaItemFormularioControlador controladorItem = Janela.abrir(TransferenciaItem.FXML_FORMULARIO, idioma.getMensagem("transferencia"));
controladorItem.cadastrar(this, itemController.getComboItem().getEditor().getText());
}else{
Animacao.fadeOutInvisivel(contaOrigem, formulario);
ContaFormularioControlador controladorConta = Janela.abrir(Conta.FXML_FORMULARIO, idioma.getMensagem("transferencia"));
controladorConta.cadastrar(this);
}
}
@Override
public void selecionarComboItem(int combo, Item item) {
if(item!=null){
new TransferenciaItem().montarSelectItem(itemController.getComboItem());
itemController.setItemSelecionado(item);
}
Animacao.fadeInInvisivel(itemController.getComboItem(), formulario);
}
public void cadastrar(TransferenciaControlador controlador){
acao = Acao.CADASTRAR;
this.controlador = controlador;
data.setValue(LocalDate.now());
botaoController.setTextBotaoFinalizar(idioma.getMensagem("cadastrar"));
}
public void alterar(Transferencia modelo){
this.modelo = modelo;
botaoController.setTextBotaoFinalizar(idioma.getMensagem("alterar"));
TransferenciaItem item = new TransferenciaItem().setIdItem(modelo.getIdItem()).consultar();
if(item != null){
itemController.setItemSelecionado(item);
}
Conta contaOri = new Conta().setIdCategoria(modelo.getIdContaOrigem()).consultar();
if(contaOri != null){
contaOrigem.getSelectionModel().select(contaOri);
}
Conta contaDes = new Conta().setIdCategoria(modelo.getIdContaDestino()).consultar();
if(contaDes != null){
contaDestino.getSelectionModel().select(contaDes);
}
itemController.getComboItem().setDisable(true);
itemController.getBotaoCadastrar().setDisable(true);
data.setValue(modelo.getData());
descricao.setText(modelo.getDescricao());
valor.setText(modelo.getValor().toString());
}
@Override
public void acaoFinalizar(){
if(validarFormulario()){
String idContaOrigem = contaOrigem.getSelectionModel().getSelectedItem().getIdCategoria();
String idContaDestino = contaDestino.getSelectionModel().getSelectedItem().getIdCategoria();
if(acao == Acao.CADASTRAR){
Transferencia item = new Transferencia(null, idContaOrigem, idContaDestino, itemController.getIdItem(), descricao.getText(), valor.getText(), data.getValue(), Datas.getHoraAtual());
item.cadastrar();
new Conta().alterarSaldo(Operacao.DECREMENTAR, idContaOrigem, valor.getText());
new Conta().alterarSaldo(Operacao.INCREMENTAR, idContaDestino, valor.getText());
Kernel.principal.acaoTransferencia();
Janela.showTooltip(Status.SUCESSO, idioma.getMensagem("operacao_sucesso"), Duracao.CURTA);
Animacao.fadeInOutClose(formulario);
}else{
Boolean contaOrigemMudou = !(modelo.getIdContaOrigem().equals(idContaOrigem));
if(contaOrigemMudou){
new Conta().alterarSaldo(Operacao.INCREMENTAR, modelo.getIdContaOrigem(), modelo.getValor().toString());
new Conta().alterarSaldo(Operacao.DECREMENTAR, idContaOrigem, modelo.getValor().toString());
}
modelo.setIdContaOrigem(contaOrigem.getValue());
Boolean contaDestinoMudou = !(modelo.getIdContaDestino().equals(idContaDestino));
if(contaDestinoMudou){
new Conta().alterarSaldo(Operacao.DECREMENTAR, modelo.getIdContaDestino(), modelo.getValor().toString());
new Conta().alterarSaldo(Operacao.INCREMENTAR, idContaDestino, modelo.getValor().toString());
}
modelo.setIdContaDestino(contaDestino.getValue());
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.getIdContaOrigem(), valorDiferenca.toString());
new Conta().alterarSaldo(Operacao.DECREMENTAR, modelo.getIdContaDestino(), valorDiferenca.toString());
}
modelo.setValor(valor.getText());
modelo.setDescricao(descricao.getText());
modelo.setData(Datas.toSqlData(data.getValue()));
modelo.alterar();
Kernel.principal.acaoTransferencia();
Janela.showTooltip(Status.SUCESSO, idioma.getMensagem("operacao_sucesso"), Duracao.CURTA);
Animacao.fadeInOutClose(formulario);
}
}
}
private boolean validarFormulario(){
try {
Validar.textFieldDecimal(valor);
Validar.autoFiltro(itemController.getAutoFiltro(), itemController.getComboItem());
Validar.comboBox(contaOrigem);
Validar.comboBox(contaDestino);
Validar.igualdade(contaOrigem, contaDestino);
Validar.datePicker(data);
return true;
} catch (Erro ex) {
return false;
}
}
@Override
public void selecionarComboCategoria(int combo, Categoria categoria) {
System.out.println(idioma.getMensagem("nao_implementado"));
}
}