Subversion Repositories Integrator Subversion

Rev

Rev 588 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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