/*
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.modelo;
import badernageral.bgfinancas.biblioteca.banco.Banco;
import badernageral.bgfinancas.biblioteca.contrato.Modelo;
import badernageral.bgfinancas.biblioteca.banco.Coluna;
import badernageral.bgfinancas.biblioteca.contrato.Categoria;
import badernageral.bgfinancas.biblioteca.contrato.Grafico;
import badernageral.bgfinancas.biblioteca.sistema.Janela;
import badernageral.bgfinancas.biblioteca.tipo.Funcao;
import badernageral.bgfinancas.biblioteca.utilitario.Datas;
import badernageral.bgfinancas.biblioteca.utilitario.Erro;
import badernageral.bgfinancas.biblioteca.utilitario.Validar;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.FormatStyle;
import java.util.ArrayList;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.XYChart;
public final class Transferencia extends Banco<Transferencia> implements Modelo, Grafico {
private static final String MODULO = RAIZ+"/modulo/transferencia";
public static final String FXML = MODULO+"/Transferencia.fxml";
public static final String FXML_FORMULARIO = MODULO+"/TransferenciaFormulario.fxml";
public static final String TABELA = "transferencias";
private final Coluna idTransferencia = new Coluna(TABELA, "id_transferencia");
private final Coluna idContaOrigem = new Coluna(TABELA, "id_conta1");
private final Coluna idContaDestino = new Coluna(TABELA, "id_conta2");
private final Coluna idItem = new Coluna(TABELA, "id_item");
private final Coluna descricao = new Coluna(TABELA, "descricao");
private final Coluna valor = new Coluna(TABELA, "valor");
private final Coluna data = new Coluna(TABELA, "data");
private final Coluna hora = new Coluna(TABELA, "hora");
private final Coluna idContaOrigemInner = new Coluna(Conta.TABELA, "id_conta", null, null, "conta_origem");
private final Coluna nomeOrigemConta = new Coluna(Conta.TABELA, "nome", "", "nome_conta_origem", "conta_origem");
private final Coluna idContaDestinoInner = new Coluna(Conta.TABELA, "id_conta", null, null, "conta_destino");
private final Coluna nomeDestinoConta = new Coluna(Conta.TABELA, "nome", "", "nome_conta_destino", "conta_destino");
private final Coluna idItemInner = new Coluna(TransferenciaItem.TABELA, "id_item");
private final Coluna idCategoria = new Coluna(TransferenciaItem.TABELA, "id_categoria");
private final Coluna nomeItem = new Coluna(TransferenciaItem.TABELA, "nome", "", "nome_item");
private final Coluna idCategoriaInner = new Coluna(TransferenciaCategoria.TABELA, "id_categoria");
private final Coluna nomeCategoria = new Coluna(TransferenciaCategoria.TABELA, "nome", "", "nome_categoria");
private final Coluna sumValor = new Coluna(TABELA, "valor", "sum_valor", Funcao.SOMAR);
public Transferencia(){ }
public Transferencia(String idItem, String nomeItem, String nomeCategoria, String descricao, String valor){
this.idItem.setValor(idItem);
this.nomeItem.setValor(nomeItem);
this.nomeCategoria.setValor(nomeCategoria);
this.descricao.setValor(descricao);
this.valor.setValor(valor);
}
public Transferencia(String idTransferencia, String idContaOrigem, String idContaDestino, String idItem, String descricao, String valor, LocalDate data, String hora){
this.idTransferencia.setValor(idTransferencia);
this.idContaOrigem.setValor(idContaOrigem);
this.idContaDestino.setValor(idContaDestino);
this.idItem.setValor(idItem);
this.descricao.setValor(descricao);
this.valor.setValor(valor);
this.data.setValor(Datas.toSqlData(data));
this.hora.setValor(hora);
}
@Override
protected Transferencia instanciar(ResultSet rs) throws SQLException{
Transferencia d = new Transferencia(
rs.getString(idTransferencia.getColuna()),
rs.getString(idContaOrigem.getColuna()),
rs.getString(idContaDestino.getColuna()),
rs.getString(idItem.getColuna()),
rs.getString(descricao.getColuna()),
rs.getString(valor.getColuna()),
rs.getDate(data.getColuna()).toLocalDate(),
rs.getString(hora.getColuna())
);
d.setNomeContaOrigem(rs.getString(nomeOrigemConta.getAliasColuna()));
d.setNomeContaDestino(rs.getString(nomeDestinoConta.getAliasColuna()));
d.setNomeItem(rs.getString(nomeItem.getAliasColuna()));
d.setNomeCategoria(rs.getString(nomeCategoria.getAliasColuna()));
return d;
}
@Override
public boolean cadastrar(){
return this.insert(idContaOrigem, idContaDestino, idItem, descricao, valor, data, hora).commit();
}
@Override
public boolean alterar(){
return this.update(idContaOrigem, idContaDestino, descricao, valor, data).where(idTransferencia, "=").commit();
}
@Override
public boolean excluir(){
return this.delete(idTransferencia, "=").commit();
}
@Override
public Transferencia consultar() {
System.out.println(idioma.getMensagem("nao_implementado"));
return null;
}
@Override
public ObservableList<Transferencia> listar(){
try{
this.select(idTransferencia, idContaOrigem, idContaDestino, idItem, descricao, valor, data, hora, nomeOrigemConta, nomeDestinoConta, nomeItem, nomeCategoria);
this.inner(idContaOrigem, idContaOrigemInner);
this.inner(idContaDestino, idContaDestinoInner);
this.inner(idItem, idItemInner);
this.inner(idCategoria, idCategoriaInner);
this.where(nomeOrigemConta, "LIKE", "(");
this.or(nomeDestinoConta, "LIKE");
this.or(nomeItem, "LIKE");
this.or(descricao, "LIKE");
this.or(data, "=");
this.or(valor, "=");
this.or(nomeCategoria, "LIKE", ")");
if(idItem.getValor() != null){
this.and(idItem, "=");
}
if(idCategoria.getValor() != null){
this.and(idCategoria, "=");
}
if(idContaOrigem.getValor() != null){
this.and(idContaOrigem, "=");
}
if(idContaDestino.getValor() != null){
this.and(idContaDestino, "=");
}
this.orderByDesc(data, hora);
ResultSet rs = this.query();
if(rs != null){
List<Transferencia> Linhas = new ArrayList<>();
while(rs.next()){
Linhas.add(instanciar(rs));
}
ObservableList<Transferencia> Resultado = FXCollections.observableList(Linhas);
return Resultado;
}else{
return null;
}
}catch(SQLException ex){
Janela.showException(ex);
return null;
}
}
public String getIdTransferencia() {
return idTransferencia.getValor();
}
public String getIdContaOrigem() {
return idContaOrigem.getValor();
}
public String getIdContaDestino() {
return idContaDestino.getValor();
}
public String getIdItem() {
return idItem.getValor();
}
public String getDescricao() {
return descricao.getValor();
}
public BigDecimal getValor() {
return new BigDecimal(valor.getValor());
}
public LocalDate getData() {
return Datas.getLocalDate(data.getValor());
}
public LocalTime getHora() {
return Datas.getLocalTime(hora.getValor());
}
public LocalDateTime getDataHora() {
return Datas.getLocalDateTime(getData(), getHora());
}
public String getNomeContaOrigem() {
return nomeOrigemConta.getValor();
}
public String getNomeContaDestino() {
return nomeDestinoConta.getValor();
}
public String getNomeItem() {
return nomeItem.getValor();
}
public String getNomeCategoria() {
return nomeCategoria.getValor();
}
public Transferencia setIdItem(String id_item) {
this.idItem.setValor(id_item);
return getThis();
}
public void setValor(String valor) {
this.valor.setValor(valor);
}
public void setDescricao(String descricao) {
this.descricao.setValor(descricao);
}
public Transferencia setIdContaOrigem(Categoria conta) {
this.idContaOrigem.setValor(conta.getIdCategoria());
return getThis();
}
public Transferencia setIdContaDestino(Categoria conta) {
this.idContaDestino.setValor(conta.getIdCategoria());
return getThis();
}
public void setData(String data) {
this.data.setValor(data);
}
public void setHora(String hora) {
this.hora.setValor(hora);
}
public void setNomeContaOrigem(String conta) {
this.nomeOrigemConta.setValor(conta);
}
public void setNomeContaDestino(String conta) {
this.nomeDestinoConta.setValor(conta);
}
public void setNomeItem(String item) {
this.nomeItem.setValor(item);
}
public void setNomeCategoria(String categoria) {
this.nomeCategoria.setValor(categoria);
}
public Transferencia setIdCategoria(String idCategoria) {
this.idCategoria.setValor(idCategoria);
return this;
}
public Transferencia setFiltro(String filtro){
nomeOrigemConta.setValor(filtro);
nomeDestinoConta.setValor(filtro);
nomeItem.setValor(filtro);
nomeCategoria.setValor(filtro);
descricao.setValor(filtro);
try{
LocalDate filtroData = LocalDate.parse(filtro, DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT));
data.setValor(Datas.toSqlData(filtroData));
}catch(DateTimeParseException e){}
try{
Validar.decimal(filtro, null);
valor.setValor(filtro);
}catch(Erro e){}
return this;
}
public ObservableList<Transferencia> getRelatorioMensal(LocalDate hoje){
try{
LocalDate inicio = hoje.withDayOfMonth(1);
LocalDate fim = hoje.withDayOfMonth(hoje.lengthOfMonth());
this.select(sumValor, nomeCategoria);
this.inner(idItem, idItemInner);
this.inner(idCategoria, idCategoriaInner);
data.setValor(Datas.toSqlData(inicio));
this.and(data, ">=");
data.setValor(Datas.toSqlData(fim));
this.and(data, "<=");
this.groupBy(nomeCategoria);
this.orderByAsc(nomeCategoria);
ResultSet rs = this.query();
if(rs != null){
List<Transferencia> linhas = new ArrayList<>();
while(rs.next()){
Transferencia t = new Transferencia();
t.setValor(rs.getString(sumValor.getAliasColuna()));
t.setNomeCategoria(rs.getString(nomeCategoria.getAliasColuna()));
linhas.add(t);
}
ObservableList<Transferencia> resultado = FXCollections.observableList(linhas);
return resultado;
}else{
return null;
}
}catch(SQLException ex){
Janela.showException(ex);
return null;
}
}
@Override
public List<XYChart.Series<String,Number>> getRelatorioMensalBarras(LocalDate inicio, LocalDate fim, String nome_categoria, String id_categoria, Integer tipo_categoria){
try{
Coluna coluna = nomeCategoria;
if(nome_categoria != null){
coluna = nomeItem;
nomeCategoria.setValor(nome_categoria);
}
if(id_categoria != null){
idContaOrigem.setValor(id_categoria);
idContaDestino.setValor(id_categoria);
}
this.select(sumValor, coluna);
this.inner(idItem, idItemInner);
this.inner(idCategoria, idCategoriaInner);
data.setValor(Datas.toSqlData(inicio));
this.and(data, ">=");
data.setValor(Datas.toSqlData(fim));
this.and(data, "<=");
if(nome_categoria != null){
this.and(nomeCategoria, "=");
}
if(id_categoria != null){
this.and(idContaOrigem, "=", "(");
this.or(idContaDestino, "=", ")");
}
this.groupBy(coluna);
this.orderByAsc(coluna);
ResultSet rs = this.query();
if(rs != null){
List<XYChart.Series<String,Number>> categorias = new ArrayList<>();
while(rs.next()){
XYChart.Series<String,Number> categoria = new XYChart.Series<>();
categoria.setName(rs.getString(coluna.getAliasColuna()));
categoria.getData().add(new XYChart.Data<>("",rs.getDouble(sumValor.getAliasColuna())));
categorias.add(categoria);
}
return categorias;
}else{
return null;
}
}catch(SQLException ex){
Janela.showException(ex);
return null;
}
}
@Override
protected Transferencia getThis() {
return this;
}
}