Subversion Repositories Integrator Subversion

Rev

Go to most recent revision | 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.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Transient;

import org.springframework.context.annotation.Scope;

import br.com.ec.domain.dto.CarroDTO;
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;
import br.edu.cesmac.core.util.DataUtils;
import br.edu.cesmac.core.util.VerificadorUtil;

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

        private static final long serialVersionUID = 1L;
       
        private Set<CarroDTO> carros;
       
        private VendaService vendaService;
        private LojaService lojaService;
        private AvaliacaoLojaService avaliacaoLojaService;
       
        @Inject
        public CorridaBean(VendaService vendaService, LojaService lojaService, AvaliacaoLojaService avaliacaoLojaService) {
                this.vendaService = vendaService;
                this.lojaService = lojaService;
                this.avaliacaoLojaService = avaliacaoLojaService;
        }
       
        public List<CarroDTO> getCarros() {
                return new ArrayList<CarroDTO>(carros);
        }
        public void setCarros(Set<CarroDTO> carros) {
                this.carros = carros;
        }
       
        @PostConstruct
        public void preCarregamento() {
                carros = new HashSet<CarroDTO>();
                List<Loja> lojas = lojaService.listarLojasAtivasEspacoCase();
                Integer identificador = 0;
                for (Loja loja : lojas) {
                        if (VerificadorUtil.naoEstaNulo(consultarMetaDiaria(loja))) {
                                CarroDTO carro = new CarroDTO();
                                carro.setAltura(identificador * 72);
                                identificador++;
                                carro.setIdentificador(loja.getSequencial().intValue());
                                carro.setSequencialLoja(loja.getSequencial());
                                carro.setDescricao(loja.getDescricao());
                                carro.setVendasDoDia(consultarTotalVendasNoDia(loja));
                                carro.setMetaDiaria(consultarMetaDiaria(loja));
                                carro.calcularPercentual();
                                carros.add(carro);
                        }
                }
        }
       
        @Transient
        public List<CarroDTO> getPodio() {
                List<CarroDTO> carrosOrdenados = null;
                if (VerificadorUtil.naoEstaNulo(getCarros())) {
                        carrosOrdenados = new ArrayList<CarroDTO>(getCarros());
                        Collections.sort(carrosOrdenados, new Comparator<CarroDTO>() {
                                public int compare(CarroDTO p1, CarroDTO p2) {
                                        return p2.getPercentual().compareTo(p1.getPercentual());
                                };
                        });
                }
                List<CarroDTO> podio = new ArrayList<CarroDTO>();
                Integer colocacao = 1;
                for (CarroDTO carro : carrosOrdenados) {
                        carro.setColocacao(colocacao);
                        colocacao++;
                        podio.add(carro);
                }
                return podio;
        }
       
        public Double consultarMetaDiaria(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 String estiloComissao(final Loja loja) {
        Double valorRestante = consultarTotalVendasNoMes(loja) - consularValorComissaoTotal(loja);
        if (valorRestante < new Double(0.0)) {
                return "red-intense";
        }
        return "green-haze";
    }
   
    public Double consultarTotalVendasNoMes(final Loja loja) {
        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;
    }
   
    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 consultarMetaGeral() {
        List<Loja> lojas = lojaService.listarLojasAtivas();
        Double metaGeral = new Double(0.0);
        for (Loja loja : lojas) {
                metaGeral = metaGeral + consultarMetaMensal(loja);
        }
        return metaGeral;
    }
   
    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)) {
                return consultarMetaMensal(loja);
        }
        List<Loja> lojasAtivas = lojaService.listarLojasAtivas();
                Double valorComissaoTotal = new Double(0.0);
                for (Loja lojaAtiva : lojasAtivas) {
                        valorComissaoTotal = valorComissaoTotal + consultarMetaMensal(lojaAtiva);
                }
                return valorComissaoTotal;
    }
   
    private Double consultarMetaMensal(Loja loja) {
        return avaliacaoLojaService.consultarValorMetaMensalLojaPelaData(loja.getSequencial(), DataUtils.getDataAtual());
    }
   
}