Subversion Repositories Integrator Subversion

Rev

Rev 586 | Rev 588 | Go to most recent revision | 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.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.model.tipos.TipoStatusPedidoCompra;
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) {
                // 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 (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 (!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);
                        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;
        }
       
}