Subversion Repositories Integrator Subversion

Rev

Rev 164 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

package br.com.ec.controller.managedbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.chart.MeterGaugeChartModel;
import org.springframework.context.annotation.Scope;

import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.ParametrosConsultaVendasDTO;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.service.avaliacaoloja.AvaliacaoLojaService;
import br.com.ec.domain.service.loja.LojaService;
import br.com.ec.domain.service.venda.VendaService;

@Named
@Scope("view")
public class MetasBean implements Serializable {

        private static final long serialVersionUID = 1L;
       
        private VendaService vendaService;
        private LojaService lojaService;
        private AvaliacaoLojaService avaliacaoLojaService;
       
        private List<Loja> listaLojasAtivasComMetas;
        private Double percentualMetaDiariaLiquida = null;
        private Double metaDiariaLiquida = null;
       
        @Inject
        public MetasBean(VendaService vendaService, LojaService lojaService, AvaliacaoLojaService avaliacaoLojaService) {
                this.vendaService = vendaService;
                this.lojaService = lojaService;
                this.avaliacaoLojaService = avaliacaoLojaService;
        }
       
        public List<Loja> getListaLojasAtivasComMetas() {
                if (VerificadorUtil.estaNulo(listaLojasAtivasComMetas)) {
                        List<Loja> lojasComMetas = new ArrayList<Loja>();
                        List<Loja> lojasAtivas = lojaService.listarLojasAtivas();
                        for (Loja loja : lojasAtivas) {
                                loja.setMetaMensal(consultarMetaMensal(loja));
                                loja.setMetaDiariaLiquida(consultarMetaDiariaLiquidaDaLoja(loja));
                                loja.setTotalVendasNoMes(consultarTotalVendasNoMes(loja));
                                loja.setColorComissao(colorComissao(loja));
                                lojasComMetas.add(loja);
                        }
                        setListaLojasAtivasComMetas(lojasComMetas);
                }
                return listaLojasAtivasComMetas;
        }
        public void setListaLojasAtivasComMetas(List<Loja> listaLojasAtivasComMetas) {
                this.listaLojasAtivasComMetas = listaLojasAtivasComMetas;
        }
       
        public Double getPercentualMetaDiariaLiquida() {
                return percentualMetaDiariaLiquida;
        }
        public void setPercentualMetaDiariaLiquida(Double percentualMetaDiariaLiquida) {
                this.percentualMetaDiariaLiquida = percentualMetaDiariaLiquida;
        }
        public Double percentualMetaDiariaLiquida(final Loja loja) {
        try {
                if (VerificadorUtil.estaNulo(getPercentualMetaDiariaLiquida())) {
                        Double valorMetaMensal = consultarMetaMensal(loja);
                        Integer quantidadeDiasNoMesAtual = DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()), DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual())) + 1;
                        Double totalVendasAnterioresDoMesAtual = consultarTotalVendasAnterioresDoMes(loja);
                        Double valorTotal = (valorMetaMensal - totalVendasAnterioresDoMesAtual) / quantidadeDiasNoMesAtual;
                        if (valorTotal < 0.0) {
                                setPercentualMetaDiariaLiquida(100.0);
                                return getPercentualMetaDiariaLiquida();
                        }
                        Double percentual = (consultarTotalVendasNoDia(loja) * 100)/valorTotal;
                        if (percentual > 100) {
                                setPercentualMetaDiariaLiquida(100.0);
                                return getPercentualMetaDiariaLiquida();
                        }
                        setPercentualMetaDiariaLiquida(percentual);
                }
                return getPercentualMetaDiariaLiquida();
        } catch (Exception e) {
                        return 0.0;
                }
    }
       
    public MeterGaugeChartModel consultarMeta(final Loja loja, boolean apresentarLabels) {
        Double valorTotalVendas = consultarTotalVendasNoMes(loja);
        Double valorMetaMensal = consularValorComissaoTotal(loja);
       
        List<Number> metaComissao = new ArrayList<Number>();
        metaComissao.add(valorMetaMensal/1.5);
        metaComissao.add(valorMetaMensal);
        if (valorTotalVendas > valorMetaMensal) {
                metaComissao.add(valorTotalVendas*1.5);
        } else {
                metaComissao.add(valorMetaMensal*1.5);
        }
       
        MeterGaugeChartModel graficoMeta = new MeterGaugeChartModel();
        graficoMeta = new MeterGaugeChartModel(valorTotalVendas.intValue(), metaComissao);
        graficoMeta.setSeriesColors("cc6666,E7E658,66cc66");
        graficoMeta.setShowTickLabels(apresentarLabels);
        return graficoMeta;
    }
   
    public String estiloComissao(final Loja loja) {
        Double valorRestante = consultarTotalVendasNoMes(loja) - consularValorComissaoTotal(loja);
        if (valorRestante < new Double(0.0)) {
                return "pink";
        }
        return "turquoise";
    }
   
    public String colorComissao(final Loja loja) {
        Double valorRestante = consultarTotalVendasNoMes(loja) - consularValorComissaoTotal(loja);
        if (valorRestante < new Double(0.0)) {
                return "#e35b5a";
        }
        return "#44b6ae";
    }
   
    public Double consultarTotalVendasNoMes(final Loja loja) {
        if (VerificadorUtil.naoEstaNulo(loja)) {
                if (VerificadorUtil.naoEstaNulo(loja.getTotalVendasNoMes())) {
                        return loja.getTotalVendasNoMes();
                }
        }
        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
        parametrosConsultaVendas.setLoja(loja);
        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getPrimeiroDiaDoMesAtual()));
        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()));
        return vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
                        - vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas);
    }
   
    public Double consultarTotalVendasAnterioresDoMes(final Loja loja) {
        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
        parametrosConsultaVendas.setLoja(loja);
        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getPrimeiroDiaDoMesAtual()));
        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.acrescentarDias(DataUtils.getDataAtual(), -1)));
        return vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
                        - vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas);
    }
   
    public Double consultarTotalVendasNoDia(final Loja loja) {
        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
        parametrosConsultaVendas.setLoja(loja);
        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()));
        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getDataAtual()));
        return vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
                        - vendaService.obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas);
    }
   
    public Double consultarMetaDiariaBruta(final Loja loja) {
        Integer quantidadeDiasNoMesAtual = DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()), DataUtils.getDataComHorarioMinimo(DataUtils.getPrimeiroDiaDoMesAtual())) + 1;
        Double valorMetaMensal = consultarMetaMensal(loja);
                return valorMetaMensal > 0? valorMetaMensal / quantidadeDiasNoMesAtual : null;
    }
   
    @Deprecated
    public Double consultarMetaDiariaLiquidaComVendasDoDia(final Loja loja) {
        Integer quantidadeDiasNoMesAtual = DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()), DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual())) + 1;
        Double totalVendasAnterioresDoMesAtual = consultarTotalVendasAnterioresDoMes(loja);
        Double valorMetaMensal = consultarMetaMensal(loja);
                return valorMetaMensal > 0? ((valorMetaMensal - totalVendasAnterioresDoMesAtual) / quantidadeDiasNoMesAtual) : null;
    }
   
    public Double getMetaDiariaLiquida() {
                return metaDiariaLiquida;
        }
    public void setMetaDiariaLiquida(Double metaDiariaLiquida) {
                this.metaDiariaLiquida = metaDiariaLiquida;
        }
    public Double consultarMetaDiariaLiquida(final Loja loja) {
        if (VerificadorUtil.estaNulo(getMetaDiariaLiquida())) {
                setMetaDiariaLiquida(consultarMetaDiariaLiquidaDaLoja(loja));
        }
        return getMetaDiariaLiquida();
    }
   
    public Double consultarMetaDiariaLiquidaDaLoja(final Loja loja) {
        Integer quantidadeDiasNoMesAtual = DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()), DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual())) + 1;
        Double totalVendasAnterioresDoMesAtual = consultarTotalVendasAnterioresDoMes(loja);
        Double valorMetaMensal = null;
        if (VerificadorUtil.naoEstaNulo(loja.getMetaMensal())) {
                valorMetaMensal = loja.getMetaMensal();
        } else {
                valorMetaMensal = consultarMetaMensal(loja);
        }
        return valorMetaMensal > 0? ((valorMetaMensal - totalVendasAnterioresDoMesAtual) / quantidadeDiasNoMesAtual) - consultarTotalVendasNoDia(loja) : 0.0;
    }
   
    public Double consultarMetaDiariaGeral() {
        Double metaGeral = consultarMetaGeral();
        Integer quantidadeDiasNoMesAtual = DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataComHorarioMaximo(DataUtils.getUltimoDiaDoMesAtual()), DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual())) + 1;
        Double totalVendasNoMesAtual = consultarTotalVendasNoMes(null);
        return metaGeral > 0? (metaGeral - totalVendasNoMesAtual) / quantidadeDiasNoMesAtual : null;
    }
   
    private Double consularValorComissaoTotal(Loja loja) {
        if (VerificadorUtil.naoEstaNulo(loja)) {
                if (VerificadorUtil.estaNulo(loja.getMetaMensal())) {
                        return consultarMetaMensal(loja);
                }
                return loja.getMetaMensal();
        }
                Double valorComissaoTotal = new Double(0.0);
                for (Loja lojaAtiva : getListaLojasAtivasComMetas()) {
                        if (VerificadorUtil.estaNulo(lojaAtiva.getMetaMensal())) {
                                valorComissaoTotal = valorComissaoTotal + consultarMetaMensal(lojaAtiva);
                        } else {
                                valorComissaoTotal = valorComissaoTotal + lojaAtiva.getMetaMensal();
                        }
                }
                return valorComissaoTotal;
    }
   
    public Double consultarMetaMensal(Loja loja) {
        return avaliacaoLojaService.consultarValorMetaMensalLojaPelaData(loja.getSequencial(), DataUtils.getDataAtual());
    }
   
    public Double consultarMetaGeral() {
        return avaliacaoLojaService.consultarValorMetaMensalLojaPelaData(null, DataUtils.getDataAtual());
    }
   
    public Boolean lojaPossuiMeta(Loja loja) {
        return consultarMetaMensal(loja) > 0.0;
    }
   
}