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.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
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;
@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());
}
}