br.com.hslife.orcamento.controller.OrcamentoController.java Source code

Java tutorial

Introduction

Here is the source code for br.com.hslife.orcamento.controller.OrcamentoController.java

Source

/***
      
 Copyright (c) 2012 - 2020 Hrcules S. S. Jos
    
Este arquivo  parte do programa Oramento Domstico.
    
    
Oramento Domstico  um software livre; voc pode redistribui-lo e/ou 
    
modific-lo dentro dos termos da Licena Pblica Geral Menor GNU como 
    
publicada pela Fundao do Software Livre (FSF); na verso 2.1 da 
    
Licena.
    
    
Este programa  distribudo na esperana que possa ser til, 
    
mas SEM NENHUMA GARANTIA; sem uma garantia implcita de ADEQUAO a 
    
qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica 
    
Geral Menor GNU em portugus para maiores detalhes.
    
    
Voc deve ter recebido uma cpia da Licena Pblica Geral Menor GNU sob o 
    
nome de "LICENSE.TXT" junto com este programa, se no, acesse o site do
    
projeto no endereco https://github.com/herculeshssj/orcamento ou escreva 
    
para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, 
    
Boston, MA  02110-1301, USA.
    
    
Para mais informaes sobre o programa Oramento Domstico e seu autor entre  
    
em contato pelo e-mail herculeshssj@outlook.com, ou ainda escreva para 
    
Hrcules S. S. Jos, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, 
    
Marco II - Nova Iguau, RJ, Brasil.
      
***/

package br.com.hslife.orcamento.controller;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.hslife.orcamento.entity.Categoria;
import br.com.hslife.orcamento.entity.Conta;
import br.com.hslife.orcamento.entity.DetalheOrcamento;
import br.com.hslife.orcamento.entity.Favorecido;
import br.com.hslife.orcamento.entity.MeioPagamento;
import br.com.hslife.orcamento.entity.Moeda;
import br.com.hslife.orcamento.entity.Orcamento;
import br.com.hslife.orcamento.enumeration.AbrangenciaOrcamento;
import br.com.hslife.orcamento.enumeration.PeriodoLancamento;
import br.com.hslife.orcamento.enumeration.TipoCategoria;
import br.com.hslife.orcamento.enumeration.TipoConta;
import br.com.hslife.orcamento.enumeration.TipoOrcamento;
import br.com.hslife.orcamento.exception.BusinessException;
import br.com.hslife.orcamento.exception.ValidationException;
import br.com.hslife.orcamento.facade.ICategoria;
import br.com.hslife.orcamento.facade.IConta;
import br.com.hslife.orcamento.facade.IFavorecido;
import br.com.hslife.orcamento.facade.IMeioPagamento;
import br.com.hslife.orcamento.facade.IMoeda;
import br.com.hslife.orcamento.facade.IOrcamento;
import br.com.hslife.orcamento.util.DetalheOrcamentoComparator;
import br.com.hslife.orcamento.util.Util;

@Component("orcamentoMB")
@Scope("session")
public class OrcamentoController extends AbstractCRUDController<Orcamento> {

    /**
     * 
     */
    private static final long serialVersionUID = 5508989331062227746L;

    @Autowired
    private IOrcamento service;

    @Autowired
    private IConta contaService;

    @Autowired
    private ICategoria categoriaService;

    @Autowired
    private IFavorecido favorecidoService;

    @Autowired
    private IMeioPagamento meioPagamentoService;

    @Autowired
    private IMoeda moedaService;

    private Orcamento orcamentoSelecionado;
    private DetalheOrcamento detalheOrcamento;
    private List<DetalheOrcamento> listaDetalheOrcamento = new ArrayList<DetalheOrcamento>();
    private List<DetalheOrcamento> listaItemDetalheOrcamento = new ArrayList<DetalheOrcamento>();

    private double previsao;
    private double previsaoCredito;
    private double previsaoDebito;

    private boolean mostrarInformacao;

    private boolean exibirAtivos = true;

    public OrcamentoController() {
        super(new Orcamento());
        moduleTitle = "Oramento do Perodo";
    }

    @Override
    protected void initializeEntity() {
        entity = new Orcamento();
        orcamentoSelecionado = null;
        listEntity = new ArrayList<Orcamento>();
        listaDetalheOrcamento = new ArrayList<DetalheOrcamento>();
        listaItemDetalheOrcamento = new ArrayList<DetalheOrcamento>();
    }

    @Override
    public void find() {
        if (orcamentoSelecionado != null) {
            listaDetalheOrcamento.clear();
            listaDetalheOrcamento.addAll(orcamentoSelecionado.getDetalhes());
            Collections.sort(listaDetalheOrcamento, new DetalheOrcamentoComparator());
            mostrarInformacao = true;
        }
    }

    @Override
    public List<Orcamento> getListEntity() {
        try {
            return getService().buscarTodosAtivosInativosPorUsuario(exibirAtivos, getUsuarioLogado());
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        mostrarInformacao = false;
        return new ArrayList<Orcamento>();
    }

    @Override
    public String create() {
        initializeEntity();
        return super.create();
    }

    @Override
    public String edit() {
        if (idEntity == null) {
            warnMessage("Selecione um oramento!");
            return "";
        }
        super.edit();
        listaItemDetalheOrcamento.clear();
        listaItemDetalheOrcamento.addAll(entity.getDetalhes());
        Collections.sort(listaItemDetalheOrcamento, new DetalheOrcamentoComparator());
        return goToFormPage;
    }

    @Override
    public String view() {
        if (idEntity == null) {
            warnMessage("Selecione um oramento!");
            return "";
        }
        super.view();
        listaItemDetalheOrcamento.clear();
        listaItemDetalheOrcamento.addAll(entity.getDetalhes());
        Collections.sort(listaItemDetalheOrcamento, new DetalheOrcamentoComparator());
        return goToViewPage;
    }

    @Override
    public String cancel() {
        mostrarInformacao = false;
        return super.cancel();
    }

    @Override
    public String save() {
        // Preenche a data de fim do perodo
        if (!entity.getPeriodoLancamento().equals(PeriodoLancamento.FIXO)) {
            Calendar temp = Calendar.getInstance();
            temp.setTime(entity.getInicio());

            switch (entity.getPeriodoLancamento()) {
            case MENSAL:
                temp.add(Calendar.MONTH, 1);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            case BIMESTRAL:
                temp.add(Calendar.MONTH, 2);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            case TRIMESTRAL:
                temp.add(Calendar.MONTH, 3);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            case QUADRIMESTRAL:
                temp.add(Calendar.MONTH, 4);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            case SEMESTRAL:
                temp.add(Calendar.MONTH, 6);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            case ANUAL:
                temp.add(Calendar.YEAR, 1);
                temp.add(Calendar.DAY_OF_YEAR, -1);
                break;
            default:
                errorMessage("Opo invlida!");
                return "";
            }

            entity.setFim(temp.getTime());
        }
        entity.setDetalhes(listaItemDetalheOrcamento);
        entity.setUsuario(getUsuarioLogado());
        return super.save();
    }

    public void salvarOrcamentoGerado(Orcamento orcamentoGerado) {
        this.entity = orcamentoGerado;
        super.save();
    }

    public void atualizarValores() {
        try {
            // No permite atualizar os valores caso o oramento esteja
            // arquivado
            if (!orcamentoSelecionado.isAtivo()) {
                warnMessage("Oramento arquivado! No  possvel atualizar os valores!");
                return;
            }

            getService().atualizarValores(orcamentoSelecionado);
            infoMessage("Valores do oramento atualizados com sucesso!");

            if (getOpcoesSistema().getExibirBuscasRealizadas()) {
                find();
            } else {
                initializeEntity();
            }

        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
    }

    public String gerarNovoOrcamento() {
        try {
            getService().gerarOrcamento(entity);
            infoMessage("Oramento gerado com sucesso!");

            if (getOpcoesSistema().getExibirBuscasRealizadas()) {
                find();
            } else {
                initializeEntity();
            }

            return goToListPage;
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }

        return "";
    }

    public String arquivar() {
        try {
            entity.setAtivo(false);
            getService().alterar(entity);
            infoMessage("Oramento arquivado com sucesso!");

            if (getOpcoesSistema().getExibirBuscasRealizadas()) {
                find();
            } else {
                initializeEntity();
            }
            return goToListPage;
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        return "";
    }

    public String desarquivar() {
        try {
            entity.setAtivo(true);
            getService().alterar(entity);
            infoMessage("Oramento desarquivado com sucesso!");

            if (getOpcoesSistema().getExibirBuscasRealizadas()) {
                find();
            } else {
                initializeEntity();
            }
            return goToListPage;
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        return "";
    }

    public void atualizaCampoContaTipoConta() {
        entity.setTipoConta(null);
        entity.setConta(null);
    }

    public void atualizaListaItens() {
        listaItemDetalheOrcamento.clear();
        this.getListaItensDetalheOrcamento();
    }

    public void atualizaListaOrcamento() {
        this.getListEntity();
    }

    public void adicionarItem() {
        if (detalheOrcamento != null) {
            detalheOrcamento.setPrevisao(previsao);
            detalheOrcamento.setPrevisaoCredito(previsaoCredito);
            detalheOrcamento.setPrevisaoDebito(previsaoDebito);
            listaItemDetalheOrcamento.add(detalheOrcamento);
            Collections.sort(listaItemDetalheOrcamento, new DetalheOrcamentoComparator());
        }
    }

    public void removerItem() {
        for (Iterator<DetalheOrcamento> i = listaItemDetalheOrcamento.iterator(); i.hasNext();) {
            if ((i.next()).isSelecionado()) {
                i.remove();
            }
        }
        Collections.sort(listaItemDetalheOrcamento, new DetalheOrcamentoComparator());
    }

    public List<DetalheOrcamento> getListaItensDetalheOrcamento() {
        List<DetalheOrcamento> resultado = new ArrayList<DetalheOrcamento>();
        if (entity.getAbrangenciaOrcamento() != null) {
            try {
                switch (entity.getAbrangenciaOrcamento()) {
                case CATEGORIA:
                    for (Categoria c : categoriaService.buscarAtivosPorUsuario(getUsuarioLogado())) {
                        boolean encontrado = false;
                        for (DetalheOrcamento detalhe : listaItemDetalheOrcamento) {
                            if (detalhe.getIdEntity().equals(c.getId())) {
                                encontrado = true;
                                break;
                            }
                        }
                        if (!encontrado)
                            resultado.add(new DetalheOrcamento(c.getId(), c.getDescricao(), c.getTipoCategoria()));
                    }
                    break;
                case FAVORECIDO:
                    for (Favorecido f : favorecidoService.buscarAtivosPorUsuario(getUsuarioLogado())) {
                        boolean encontrado = false;
                        for (DetalheOrcamento detalhe : listaItemDetalheOrcamento) {
                            if (detalhe.getIdEntity().equals(f.getId())) {
                                encontrado = true;
                                break;
                            }
                        }
                        if (!encontrado)
                            resultado.add(new DetalheOrcamento(f.getId(), f.getNome()));
                    }
                    break;
                case MEIOPAGAMENTO:
                    for (MeioPagamento m : meioPagamentoService.buscarAtivosPorUsuario(getUsuarioLogado())) {
                        boolean encontrado = false;
                        for (DetalheOrcamento detalhe : listaItemDetalheOrcamento) {
                            if (detalhe.getIdEntity().equals(m.getId())) {
                                encontrado = true;
                                break;
                            }
                        }
                        if (!encontrado)
                            resultado.add(new DetalheOrcamento(m.getId(), m.getDescricao()));
                    }
                    break;
                }
            } catch (ValidationException | BusinessException be) {
                errorMessage(be.getMessage());
            }
        }

        Collections.sort(resultado, new DetalheOrcamentoComparator());
        return resultado;
    }

    private enum TipoSaldoDetalheOrcamento {
        PREVISAO, REALIZADO, PREVISAO_DEBITO, REALIZADO_DEBITO, PREVISAO_CREDITO, REALIZADO_CREDITO;
    }

    private double getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento tipoSaldo) {
        double resultado = 0.0;

        for (DetalheOrcamento detalhe : listaDetalheOrcamento) {
            switch (tipoSaldo) {
            case PREVISAO:
                if (detalhe.getTipoCategoria().equals(TipoCategoria.CREDITO)) {
                    resultado += detalhe.getPrevisao();
                } else {
                    resultado -= detalhe.getPrevisao();
                }
                break;
            case REALIZADO:
                if (detalhe.getTipoCategoria().equals(TipoCategoria.CREDITO)) {
                    resultado += detalhe.getRealizado();
                } else {
                    resultado -= detalhe.getRealizado();
                }
                break;
            case PREVISAO_CREDITO:
                resultado += detalhe.getPrevisaoCredito();
                break;
            case PREVISAO_DEBITO:
                resultado += detalhe.getPrevisaoDebito();
                break;
            case REALIZADO_CREDITO:
                resultado += detalhe.getRealizadoCredito();
                break;
            case REALIZADO_DEBITO:
                resultado += detalhe.getRealizadoDebito();
                break;
            }
        }

        return Util.arredondar(resultado);
    }

    public String getSaldoPrevistoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO));
    }

    public String getSaldoRealizadoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO));
    }

    public String getPorcentagemSaldoDetalheOrcamento() {
        return NumberFormat.getNumberInstance()
                .format(Math.abs(Util.arredondar((getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO)
                        / getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO)) * 100)))
                + " %";
    }

    public String getSaldoCreditoPrevistoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO_CREDITO));
    }

    public String getSaldoCreditoRealizadoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO_CREDITO));
    }

    public String getPorcentagemSaldoCreditoDetalheOrcamento() {
        return NumberFormat.getNumberInstance().format(
                Math.abs(Util.arredondar((getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO_CREDITO)
                        / getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO_CREDITO)) * 100)))
                + " %";
    }

    public String getSaldoDebitoPrevistoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO_DEBITO));
    }

    public String getSaldoDebitoRealizadoDetalheOrcamento() {
        return this.getMoedaPadrao().getSimboloMonetario() + " " + new DecimalFormat("#,##0.##")
                .format(getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO_DEBITO));
    }

    public String getPorcentagemSaldoDebitoDetalheOrcamento() {
        return NumberFormat.getNumberInstance().format(
                Math.abs(Util.arredondar((getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.REALIZADO_DEBITO)
                        / getSaldoDetalheOrcamento(TipoSaldoDetalheOrcamento.PREVISAO_DEBITO)) * 100)))
                + " %";
    }

    public Moeda getMoedaPadrao() {
        try {
            return moedaService.buscarPadraoPorUsuario(getUsuarioLogado());
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        return null;
    }

    public List<Conta> getListaConta() {
        try {
            return contaService.buscarPorUsuario(getUsuarioLogado());
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        return new ArrayList<>();
    }

    public List<Orcamento> getListaOrcamentoCategoria() {
        try {
            return getService().buscarAbrangeciaPorUsuario(AbrangenciaOrcamento.CATEGORIA, getUsuarioLogado());
        } catch (ValidationException | BusinessException be) {
            errorMessage(be.getMessage());
        }
        return new ArrayList<Orcamento>();
    }

    public List<SelectItem> getListaTipoOrcamento() {
        List<SelectItem> listaSelectItem = new ArrayList<SelectItem>();
        for (TipoOrcamento orcamento : TipoOrcamento.values()) {
            listaSelectItem.add(new SelectItem(orcamento, orcamento.toString()));
        }
        return listaSelectItem;
    }

    public List<SelectItem> getListaTipoConta() {
        List<SelectItem> listaSelectItem = new ArrayList<SelectItem>();
        for (TipoConta tipo : TipoConta.values()) {
            listaSelectItem.add(new SelectItem(tipo, tipo.toString()));
        }
        return listaSelectItem;
    }

    public List<SelectItem> getListaPeriodoLancamento() {
        List<SelectItem> listaSelectItem = new ArrayList<SelectItem>();
        for (PeriodoLancamento periodo : PeriodoLancamento.values()) {
            listaSelectItem.add(new SelectItem(periodo, periodo.toString()));
        }
        return listaSelectItem;
    }

    public List<SelectItem> getListaAbrangenciaOrcamento() {
        List<SelectItem> listaSelectItem = new ArrayList<SelectItem>();
        for (AbrangenciaOrcamento abrangencia : AbrangenciaOrcamento.values()) {
            listaSelectItem.add(new SelectItem(abrangencia, abrangencia.toString()));
        }
        return listaSelectItem;
    }

    public IOrcamento getService() {
        return service;
    }

    public void setService(IOrcamento service) {
        this.service = service;
    }

    public DetalheOrcamento getDetalheOrcamento() {
        return detalheOrcamento;
    }

    public void setDetalheOrcamento(DetalheOrcamento detalheOrcamento) {
        this.detalheOrcamento = detalheOrcamento;
    }

    public List<DetalheOrcamento> getListaDetalheOrcamento() {
        return listaDetalheOrcamento;
    }

    public void setListaDetalheOrcamento(List<DetalheOrcamento> listaDetalheOrcamento) {
        this.listaDetalheOrcamento = listaDetalheOrcamento;
    }

    public double getPrevisao() {
        return previsao;
    }

    public void setPrevisao(double previsao) {
        this.previsao = previsao;
    }

    public double getPrevisaoCredito() {
        return previsaoCredito;
    }

    public void setPrevisaoCredito(double previsaoCredito) {
        this.previsaoCredito = previsaoCredito;
    }

    public double getPrevisaoDebito() {
        return previsaoDebito;
    }

    public void setPrevisaoDebito(double previsaoDebito) {
        this.previsaoDebito = previsaoDebito;
    }

    public List<DetalheOrcamento> getListaItemDetalheOrcamento() {
        return listaItemDetalheOrcamento;
    }

    public void setListaItemDetalheOrcamento(List<DetalheOrcamento> listaItemDetalheOrcamento) {
        this.listaItemDetalheOrcamento = listaItemDetalheOrcamento;
    }

    public boolean isMostrarInformacao() {
        return mostrarInformacao;
    }

    public void setMostrarInformacao(boolean mostrarInformacao) {
        this.mostrarInformacao = mostrarInformacao;
    }

    public Orcamento getOrcamentoSelecionado() {
        return orcamentoSelecionado;
    }

    public void setOrcamentoSelecionado(Orcamento orcamentoSelecionado) {
        this.orcamentoSelecionado = orcamentoSelecionado;
    }

    public boolean isExibirAtivos() {
        return exibirAtivos;
    }

    public void setExibirAtivos(boolean exibirAtivos) {
        this.exibirAtivos = exibirAtivos;
    }
}