package br.com.ec.domain.service.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
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.AlertasComprasDTO;
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.AlertasLogisticaComprasDTO;
import br.com.ec.domain.dto.RankingComprasTransferenciasDTO;
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.model.tipos.TipoStatusPedidoCompra;
import br.com.ec.domain.service.AlertasService;
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 ModeloService modeloService
;
private SubtipoProdutoService subtipoProdutoService
;
private VendaService vendaService
;
public AlertasServiceImpl
(Validador validador, ModeloService modeloService, SubtipoProdutoService subtipoProdutoService,
VendaService vendaService
) {
super(validador
);
this.
modeloService = modeloService
;
this.
subtipoProdutoService = subtipoProdutoService
;
this.
vendaService = vendaService
;
}
@
Override
protected GenericRepository
<AlertasGeralDTO
> getRepository
() {
return null;
}
@
Override
public AlertasComprasDTO consultarAlertasComprasGeral
(AlertasGeralDTO alertasGeralDTO
) {
AlertasComprasDTO alertasComprasDTO =
new AlertasComprasDTO
();
// LISTA DE TODOS OS TIPOS, EXCETO CAPAS
List<TipoProduto
> tiposProduto =
new ArrayList<TipoProduto
>();
tiposProduto.
addAll(Arrays.
asList(TipoProduto.
values()));
for (TipoProduto tipoProduto : tiposProduto
) {
if (!tipoProduto.
getValor().
equals(TipoProduto.
CAPA.
getValor())) {
alertasGeralDTO.
getTiposProdutoSelecionados().
add(tipoProduto
);
}
}
// ADICIONAR PRODUTOS ESSENCIAIS DOS 30 MODELOS MAIS VENDIDOS
// TIPO: CAPA, ESTILO: TPU, COR: TRANSPARENTE
// TIPO: PELÍCULA, SUBTIPO: VIDRO
// TIPO: PELÍCULA, SUBTIPO: SOFT NORMAL
// CONSULTAR TODOS OS PRODUTOS VENDIDOS NOS ULTIMOS 90 DIAS
List<RankingProdutoDTO
> rankingProdutosDTOGeral =
new ArrayList<RankingProdutoDTO
>();
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());
rankingProdutosDTOGeral.
addAll(vendaService.
consultarProdutosVendidos(parametrosConsulta
));
}
// RETIRAR PRODUTOS PARA NÃO COMPRAR
for (RankingProdutoDTO rankingProdutoDTO : rankingProdutosDTOGeral
) {
if (VerificadorUtil.
naoEstaNulo(rankingProdutoDTO.
getStatusPedidoCompra())) {
if (!rankingProdutoDTO.
getStatusPedidoCompra().
equals(TipoStatusPedidoCompra.
NAO_COMPRAR.
getValor())) {
rankingProdutosDTO.
add(rankingProdutoDTO
);
}
}
}
// 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
);
if (VerificadorUtil.
estaNulo(rankingProdutoDTO.
getStatusPedidoCompra())) {
alertasComprasGeralDTO.
adicionarQuantidadeAlertasSemPedidoCompra();
}
}
if (rankingProdutoDTO.
getTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta()/
2) {
alertasComprasGeralDTO.
adicionarQuantidadeAlertasCriticos();
}
} 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 (VerificadorUtil.
estaNulo(rankingProdutoDTOComSubtipo.
getStatusPedidoCompra())) {
alertasComprasGeralDTO.
adicionarQuantidadeAlertasSemPedidoCompra();
}
}
}
if (!alertasComprasGeralSubTipoDTO.
getRankingProdutosDTO().
isEmpty() &&
(tipoProdutoSelecionado.
getValor().
equals(TipoProduto.
PELICULA.
getValor()) ||
alertasComprasGeralSubTipoDTO.
getQuantidadeTotalTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta())) {
alertasComprasGeralDTO.
getAlertasComprasGeralSubTipoDTO().
add(alertasComprasGeralSubTipoDTO
);
if (alertasComprasGeralSubTipoDTO.
getQuantidadeTotalTempoEstoque() <= alertasGeralDTO.
getTempoDeEstoqueParaAlerta()/
2) {
alertasComprasGeralDTO.
adicionarQuantidadeAlertasCriticos();
}
}
}
alertasComprasGeralDTO.
setQuantidadeAlertasPossiveis(quantidadeAlertasPossiveisSemSubtipo
);
alertasComprasGeralDTO.
setQuantidadeAlertasPossiveisComSubtipo(quantidadeAlertasPossiveisComSubtipo
);
alertasComprasDTO.
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 alertasComprasDTO
;
}
@
Override
public AlertasLogisticaComprasDTO consultarAlertasLogistica
(Integer quantidadeDiasVendas,
Integer quantidadeDiasParaAlerta,
Boolean adicionarModelosFavoritosSemVendas
) {
// CONSULTAR MODELOS MAIS VENDIDOS
List<RankingModeloDTO
> modelosMaisVendidos = consultarModelosMaisVendidos
(DataUtils.
getDataAtual(),
DataUtils.
acrescentarDias(DataUtils.
getDataAtual(), quantidadeDiasVendas
*-
1),
adicionarModelosFavoritosSemVendas
);
List<RankingModeloDTO
> modelosFavoritosMaisVendidos =
new ArrayList<>();
for (RankingModeloDTO rankingModeloDTO : modelosMaisVendidos
) {
if (rankingModeloDTO.
getModelo().
getIndicadorFavorito()) {
modelosFavoritosMaisVendidos.
add(rankingModeloDTO
);
}
}
List<RankingComprasTransferenciasDTO
> rankingComprasTransferencias =
new ArrayList<RankingComprasTransferenciasDTO
>();
rankingComprasTransferencias.
addAll(vendaService.
consultarRankingComprasTransferencias(quantidadeDiasVendas, quantidadeDiasParaAlerta, modelosFavoritosMaisVendidos,
true));
AlertasLogisticaComprasDTO alertasLogisticaComprasDTO =
new AlertasLogisticaComprasDTO
();
alertasLogisticaComprasDTO.
setQuantidadeAlertasModelosPossiveis(modelosFavoritosMaisVendidos.
size());
alertasLogisticaComprasDTO.
setRankingsComprasTransferenciasDTO(rankingComprasTransferencias
);
return alertasLogisticaComprasDTO
;
}
private List<RankingModeloDTO
> consultarModelosMaisVendidos
(Date dataInicial,
Date dataFinal,
Boolean adicionarModelosFavoritosSemVendas
) {
List<RankingModeloDTO
> modelosMaisVendidos =
new ArrayList<RankingModeloDTO
>();
ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta =
new ParametrosConsultaModelosMaisVendidosDTO
();
parametrosConsulta.
setDataFinal(dataInicial
);
parametrosConsulta.
setDataInicial(dataFinal
);
modelosMaisVendidos.
addAll(vendaService.
consultarRankingModelos(parametrosConsulta, adicionarModelosFavoritosSemVendas
));
return modelosMaisVendidos
;
}
}