package br.com.ec.domain.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.AlertasComprasGeralDTO;
import br.com.ec.domain.dto.AlertasComprasGeralSubTipoDTO;
import br.com.ec.domain.dto.AlertasGeralDTO;
import br.com.ec.domain.dto.RankingModeloDTO;
import br.com.ec.domain.dto.RankingProdutoDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaModelosMaisVendidosDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaProdutosVendidosDTO;
import br.com.ec.domain.model.SubtipoProduto;
import br.com.ec.domain.model.tipos.TipoOrdenacaoMaisVendidos;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.service.AlertasService;
import br.com.ec.domain.service.LojaService;
import br.com.ec.domain.service.ModeloService;
import br.com.ec.domain.service.SubtipoProdutoService;
import br.com.ec.domain.service.VendaService;
@Service
public class AlertasServiceImpl
extends AbstractService
<AlertasGeralDTO
> implements AlertasService
{
private LojaService lojaService
;
private ModeloService modeloService
;
private SubtipoProdutoService subtipoProdutoService
;
private VendaService vendaService
;
public AlertasServiceImpl
(Validador validador, LojaService lojaService, ModeloService modeloService, SubtipoProdutoService subtipoProdutoService,
VendaService vendaService
) {
super(validador
);
this.
lojaService = lojaService
;
this.
modeloService = modeloService
;
this.
subtipoProdutoService = subtipoProdutoService
;
this.
vendaService = vendaService
;
}
@
Override
protected GenericRepository
<AlertasGeralDTO
> getRepository
() {
return null;
}
@
Override
public AlertasGeralDTO consultarAlertasComprasGeral
(AlertasGeralDTO alertasGeralDTO
) {
// CONSULTAR TODOS OS PRODUTOS VENDIDOS NOS ULTIMOS 90 DIAS
List<RankingProdutoDTO
> rankingProdutosDTO =
new ArrayList<RankingProdutoDTO
>();
ParametrosConsultaProdutosVendidosDTO parametrosConsulta =
new ParametrosConsultaProdutosVendidosDTO
();
parametrosConsulta.
setDataFinal(DataUtils.
getDataAtual());
parametrosConsulta.
setDataInicial(DataUtils.
acrescentarDias(DataUtils.
getDataAtual(), alertasGeralDTO.
getQuantidadeDiasVendas()*-
1));
parametrosConsulta.
setTipoOrdenacao(TipoOrdenacaoMaisVendidos.
QUANTIDADE.
getValor());
for (TipoProduto tipoProdutoSelecionado : alertasGeralDTO.
getTiposProdutoSelecionados()) {
parametrosConsulta.
setTipoProduto(tipoProdutoSelecionado.
getValor());
rankingProdutosDTO.
addAll(vendaService.
consultarProdutosVendidos(parametrosConsulta
));
}
// RETIRAR SUBTIPOS DAS PELÍCULAS (PARA ANÁLISE INDIVIDUAL)
/*
for (RankingProdutoDTO rankingProdutoDTO : rankingProdutosDTO) {
if (rankingProdutoDTO.getProduto().getTipo().equals(TipoProduto.PELICULA.getValor())) {
rankingProdutoDTO.getProduto().setSubtipoProduto(null);
}
}*/
// CONSULTAR SUBTIPOS
// VERIFICAR ITENS POR TIPO, SEM SUBTIPO
for (TipoProduto tipoProdutoSelecionado : alertasGeralDTO.
getTiposProdutoSelecionados()) {
Integer quantidadeAlertasPossiveisSemSubtipo =
0;
Integer quantidadeAlertasPossiveisComSubtipo =
0;
AlertasComprasGeralDTO alertasComprasGeralDTO =
new AlertasComprasGeralDTO
();
alertasComprasGeralDTO.
setTipoProduto(tipoProdutoSelecionado
);
List<SubtipoProduto
> subtiposProduto = subtipoProdutoService.
consultarPorTipo(tipoProdutoSelecionado.
getValor());
List<RankingProdutoDTO
> rankingProdutosDTOComSubtipo =
new ArrayList<RankingProdutoDTO
>();
for (RankingProdutoDTO rankingProdutoDTO : rankingProdutosDTO
) {
if (rankingProdutoDTO.
getProduto().
getTipo().
equals(tipoProdutoSelecionado.
getValor())) {
if (VerificadorUtil.
estaNulo(rankingProdutoDTO.
getProduto().
getSubtipoProduto())) {
quantidadeAlertasPossiveisSemSubtipo++
;
// ALERTA PARA CADA PRODUTO COM MENOS DE DIAS PRE-DEFINIDO
if (rankingProdutoDTO.
getTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta()) {
alertasComprasGeralDTO.
getAlertasProdutosSemSubtipo().
add(rankingProdutoDTO
);
}
} else {
if (tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor())) {
quantidadeAlertasPossiveisSemSubtipo++
;
}
rankingProdutosDTOComSubtipo.
add(rankingProdutoDTO
);
}
}
}
for (SubtipoProduto subtipoProduto : subtiposProduto
) {
if (!tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor())) {
quantidadeAlertasPossiveisComSubtipo++
;
}
AlertasComprasGeralSubTipoDTO alertasComprasGeralSubTipoDTO =
new AlertasComprasGeralSubTipoDTO
();
alertasComprasGeralSubTipoDTO.
setSubtipoProduto(subtipoProduto
);
for (RankingProdutoDTO rankingProdutoDTOComSubtipo : rankingProdutosDTOComSubtipo
) {
if ((!tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor()) &&
subtipoProduto.
equals(rankingProdutoDTOComSubtipo.
getProduto().
getSubtipoProduto())) ||
(tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor()) &&
subtipoProduto.
equals(rankingProdutoDTOComSubtipo.
getProduto().
getSubtipoProduto()) &&
rankingProdutoDTOComSubtipo.
getTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta())) {
alertasComprasGeralSubTipoDTO.
getRankingProdutosDTO().
add(rankingProdutoDTOComSubtipo
);
}
}
if (!alertasComprasGeralSubTipoDTO.
getRankingProdutosDTO().
isEmpty() &&
(tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor()) ||
alertasComprasGeralSubTipoDTO.
getQuantidadeTotalTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta())) {
alertasComprasGeralDTO.
getAlertasComprasGeralSubTipoDTO().
add(alertasComprasGeralSubTipoDTO
);
}
}
alertasComprasGeralDTO.
setQuantidadeAlertasPossiveis(quantidadeAlertasPossiveisSemSubtipo
);
alertasComprasGeralDTO.
setQuantidadeAlertasPossiveisComSubtipo(quantidadeAlertasPossiveisComSubtipo
);
alertasGeralDTO.
getAlertasComprasGeralDTO().
add(alertasComprasGeralDTO
);
}
// CONSULTAR ITENS SEM SUBTIPO: TOTAL DE VENDAS (90 DIAS), TOTAL DE ESTOQUE, TEMPO DE ESTOQUE E QNT PARA COMPRAR (90 DIAS)
/*
List<SubtipoProduto> subtiposProduto = new ArrayList<SubtipoProduto>();
for (TipoProduto tipoProduto : tiposProduto) {
if (!tipoProduto.getValor().equals(TipoProduto.CAPA.getValor())) {
subtiposProduto.addAll(subtipoProdutoService.consultarPorTipo(tipoProduto.getValor()));
}
}
*/
// LISTA DE TODOS OS SUBTIPOS DO TIPO
// CONSULTAR ITENS DO SUBTIPO: TOTAL DE VENDAS (90 DIAS), TOTAL DE ESTOQUE, TEMPO DE ESTOQUE E QNT PARA COMPRAR (90 DIAS)
// ALERTA PARA CADA SUBTIPO COM MENOS DE 15 DIAS DE ESTOQUE
// PERMITIR DETALHAR A LISTA DOS ITENS DO SUBTIPO
return alertasGeralDTO
;
}
private List<RankingModeloDTO
> consultarModelosMaisVendidos
(AlertasGeralDTO alertasGeralDTO
) {
List<RankingModeloDTO
> modelosMaisVendidos =
new ArrayList<RankingModeloDTO
>();
ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta =
new ParametrosConsultaModelosMaisVendidosDTO
();
parametrosConsulta.
setDataFinal(DataUtils.
getDataAtual());
parametrosConsulta.
setDataInicial(DataUtils.
acrescentarDias(DataUtils.
getDataAtual(), alertasGeralDTO.
getQuantidadeDiasVendas()*-
1));
modelosMaisVendidos.
addAll(vendaService.
consultarRankingModelos(parametrosConsulta, alertasGeralDTO.
getAdicionarModelosFavoritosSemVendas()));
return modelosMaisVendidos
;
}
}