/*
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 Receita extends Banco<Receita> implements Modelo, Grafico {
private static final String MODULO = RAIZ+"/modulo/receita";
public static final String FXML = MODULO+"/Receita.fxml";
public static final String FXML_FORMULARIO = MODULO+"/ReceitaFormulario.fxml";
public static final String TABELA = "receitas";
private final Coluna idReceita = new Coluna(TABELA, "id_receita");
private final Coluna idConta = new Coluna(TABELA, "id_conta");
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 idContaInner = new Coluna(Conta.TABELA, "id_conta");
private final Coluna nomeConta = new Coluna(Conta.TABELA, "nome", "", "nome_conta");
private final Coluna idItemInner = new Coluna(ReceitaItem.TABELA, "id_item");
private final Coluna idCategoria = new Coluna(ReceitaItem.TABELA, "id_categoria");
private final Coluna nomeItem = new Coluna(ReceitaItem.TABELA, "nome", "", "nome_item");
private final Coluna idCategoriaInner = new Coluna(ReceitaCategoria.TABELA, "id_categoria");
private final Coluna nomeCategoria = new Coluna(ReceitaCategoria.TABELA, "nome", "", "nome_categoria");
private final Coluna sumValor = new Coluna(TABELA, "valor", "sum_valor", Funcao.SOMAR);
private String tipo = idioma.getMensagem("receita");
private String status = idioma.getMensagem("efetuado");
public Receita(){ }
public Receita(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 Receita(String idReceita, String idConta, String idItem, String descricao, String valor, LocalDate data, String hora){
this.idReceita.setValor(idReceita);
this.idConta.setValor(idConta);
this.idItem.setValor(idItem);
this.descricao.setValor(descricao);
this.valor.setValor(valor);
this.data.setValor(Datas.toSqlData(data));
this.hora.setValor(hora);
}
@Override
protected Receita instanciar(ResultSet rs) throws SQLException{
Receita d = new Receita(
rs.getString(idReceita.getColuna()),
rs.getString(idConta.getColuna()),
rs.getString(idItem.getColuna()),
rs.getString(descricao.getColuna()),
rs.getString(valor.getColuna()),
rs.getDate(data.getColuna()).toLocalDate(),
rs.getString(hora.getColuna())
);
d.setNomeConta(rs.getString(nomeConta.getAliasColuna()));
d.setNomeItem(rs.getString(nomeItem.getAliasColuna()));
d.setNomeCategoria(rs.getString(nomeCategoria.getAliasColuna()));
return d;
}
@Override
public boolean cadastrar(){
return this.insert(idConta, idItem, descricao, valor, data, hora).commit();
}
@Override
public boolean alterar(){
return this.update(idConta, descricao, valor, data).where(idReceita, "=").commit();
}
@Override
public boolean excluir(){
return this.delete(idReceita, "=").commit();
}
@Override
public Usuario consultar() {
System.out.println(idioma.getMensagem("nao_implementado"));
return null;
}
@Override
public ObservableList<Receita> listar(){
try{
this.select(idReceita, idConta, idItem, descricao, valor, data, hora, nomeConta, nomeItem, nomeCategoria);
this.inner(idConta, idContaInner);
this.inner(idItem, idItemInner);
this.inner(idCategoria, idCategoriaInner);
this.where(descricao, "LIKE", "(");
this.or(nomeConta, "LIKE");
this.or(nomeItem, "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(idConta.getValor() != null){
this.and(idConta, "=");
}
this.orderByDesc(data, hora);
ResultSet rs = this.query();
if(rs != null){
List<Receita> Linhas = new ArrayList<>();
while(rs.next()){
Linhas.add(instanciar(rs));
}
ObservableList<Receita> Resultado = FXCollections.observableList(Linhas);
return Resultado;
}else{
return null;
}
}catch(SQLException ex){
Janela.showException(ex);
return null;
}
}
public String getIdReceita() {
return idReceita.getValor();
}
public String getIdConta() {
return idConta.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 getNomeConta() {
return nomeConta.getValor();
}
public String getNomeItem() {
return nomeItem.getValor();
}
public String getNomeCategoria() {
return nomeCategoria.getValor();
}
public Receita 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 Receita setIdConta(Categoria conta) {
this.idConta.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 setNomeConta(String conta) {
this.nomeConta.setValor(conta);
}
public void setNomeItem(String item) {
this.nomeItem.setValor(item);
}
public void setNomeCategoria(String categoria) {
this.nomeCategoria.setValor(categoria);
}
public Receita setIdCategoria(String idCategoria) {
this.idCategoria.setValor(idCategoria);
return this;
}
public Receita setFiltro(String filtro){
descricao.setValor(filtro);
nomeConta.setValor(filtro);
nomeItem.setValor(filtro);
nomeCategoria.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<Receita> 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<Receita> linhas = new ArrayList<>();
while(rs.next()){
Receita r = new Receita();
r.setValor(rs.getString(sumValor.getAliasColuna()));
r.setNomeCategoria(rs.getString(nomeCategoria.getAliasColuna()));
linhas.add(r);
}
ObservableList<Receita> 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){
idConta.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(idConta, "=");
}
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 Receita getThis() {
return this;
}
public ObservableList<Extrato> getExtrato(LocalDate inicio, LocalDate fim) {
try {
this.select(idItem, data, hora, nomeCategoria, nomeItem, valor);
this.inner(idItem, idItemInner);
this.inner(idCategoria, idCategoriaInner);
data.setValor(Datas.toSqlData(inicio));
this.where(data, ">=");
data.setValor(Datas.toSqlData(fim));
this.and(data, "<=");
this.orderByAsc(data,hora);
ResultSet rs = this.query();
if (rs != null) {
List<Extrato> objetos = new ArrayList<>();
while (rs.next()) {
Extrato e = new Extrato(
idioma.getMensagem("receita"),
rs.getString(data.getColuna()),
rs.getString(hora.getColuna()),
rs.getString(nomeCategoria.getAliasColuna()),
rs.getString(nomeItem.getAliasColuna()),
rs.getString(valor.getColuna())
);
objetos.add(e);
}
ObservableList<Extrato> resultado = FXCollections.observableList(objetos);
return resultado;
} else {
return null;
}
} catch (SQLException ex) {
Janela.showException(ex);
return null;
}
}
}