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;
}
}