Subversion Repositories Integrator Subversion

Rev

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

Rev Author Line No. Line
582 blopes 1
package br.com.ec.domain.service.impl;
2
 
3
import java.util.ArrayList;
588 blopes 4
import java.util.Arrays;
5
import java.util.Date;
582 blopes 6
import java.util.List;
7
 
8
import org.springframework.stereotype.Service;
9
 
10
import br.com.ec.core.generic.AbstractService;
11
import br.com.ec.core.generic.GenericRepository;
12
import br.com.ec.core.util.DataUtils;
13
import br.com.ec.core.util.VerificadorUtil;
14
import br.com.ec.core.validador.Validador;
588 blopes 15
import br.com.ec.domain.dto.AlertasComprasDTO;
583 blopes 16
import br.com.ec.domain.dto.AlertasComprasGeralDTO;
584 blopes 17
import br.com.ec.domain.dto.AlertasComprasGeralSubTipoDTO;
582 blopes 18
import br.com.ec.domain.dto.AlertasGeralDTO;
588 blopes 19
import br.com.ec.domain.dto.AlertasLogisticaComprasDTO;
20
import br.com.ec.domain.dto.RankingComprasTransferenciasDTO;
582 blopes 21
import br.com.ec.domain.dto.RankingModeloDTO;
22
import br.com.ec.domain.dto.RankingProdutoDTO;
23
import br.com.ec.domain.dto.consulta.ParametrosConsultaModelosMaisVendidosDTO;
24
import br.com.ec.domain.dto.consulta.ParametrosConsultaProdutosVendidosDTO;
25
import br.com.ec.domain.model.SubtipoProduto;
583 blopes 26
import br.com.ec.domain.model.tipos.TipoOrdenacaoMaisVendidos;
582 blopes 27
import br.com.ec.domain.model.tipos.TipoProduto;
587 blopes 28
import br.com.ec.domain.model.tipos.TipoStatusPedidoCompra;
582 blopes 29
import br.com.ec.domain.service.AlertasService;
30
import br.com.ec.domain.service.ModeloService;
31
import br.com.ec.domain.service.SubtipoProdutoService;
32
import br.com.ec.domain.service.VendaService;
33
 
34
@Service
35
public class AlertasServiceImpl extends AbstractService<AlertasGeralDTO> implements AlertasService {
36
 
37
        private ModeloService modeloService;
38
 
39
        private SubtipoProdutoService subtipoProdutoService;
40
        private VendaService vendaService;
41
 
588 blopes 42
        public AlertasServiceImpl(Validador validador, ModeloService modeloService, SubtipoProdutoService subtipoProdutoService,
582 blopes 43
                        VendaService vendaService) {
44
                super(validador);
45
                this.modeloService = modeloService;
46
                this.subtipoProdutoService = subtipoProdutoService;
47
                this.vendaService = vendaService;
48
        }
49
 
50
        @Override
51
        protected GenericRepository<AlertasGeralDTO> getRepository() {
52
                return null;
53
        }
54
 
55
        @Override
588 blopes 56
        public AlertasComprasDTO consultarAlertasComprasGeral(AlertasGeralDTO alertasGeralDTO) {
57
                AlertasComprasDTO alertasComprasDTO = new AlertasComprasDTO();
58
 
59
                // LISTA DE TODOS OS TIPOS, EXCETO CAPAS
60
                List<TipoProduto> tiposProduto = new ArrayList<TipoProduto>();
61
                tiposProduto.addAll(Arrays.asList(TipoProduto.values()));
62
                for (TipoProduto tipoProduto : tiposProduto) {
63
                        if (!tipoProduto.getValor().equals(TipoProduto.CAPA.getValor())) {
64
                                alertasGeralDTO.getTiposProdutoSelecionados().add(tipoProduto);
65
                        }
66
                }
67
 
587 blopes 68
                // ADICIONAR PRODUTOS ESSENCIAIS DOS 30 MODELOS MAIS VENDIDOS
69
                // TIPO: CAPA, ESTILO: TPU, COR: TRANSPARENTE
70
                // TIPO: PELÍCULA, SUBTIPO: VIDRO
71
                // TIPO: PELÍCULA, SUBTIPO: SOFT NORMAL
72
 
582 blopes 73
                // CONSULTAR TODOS OS PRODUTOS VENDIDOS NOS ULTIMOS 90 DIAS
587 blopes 74
                List<RankingProdutoDTO> rankingProdutosDTOGeral = new ArrayList<RankingProdutoDTO>();
582 blopes 75
                List<RankingProdutoDTO> rankingProdutosDTO = new ArrayList<RankingProdutoDTO>();
76
 
77
                ParametrosConsultaProdutosVendidosDTO parametrosConsulta = new ParametrosConsultaProdutosVendidosDTO();
78
                parametrosConsulta.setDataFinal(DataUtils.getDataAtual());
79
                parametrosConsulta.setDataInicial(DataUtils.acrescentarDias(DataUtils.getDataAtual(), alertasGeralDTO.getQuantidadeDiasVendas()*-1));
583 blopes 80
                parametrosConsulta.setTipoOrdenacao(TipoOrdenacaoMaisVendidos.QUANTIDADE.getValor());
582 blopes 81
 
82
                for (TipoProduto tipoProdutoSelecionado : alertasGeralDTO.getTiposProdutoSelecionados()) {
83
                        parametrosConsulta.setTipoProduto(tipoProdutoSelecionado.getValor());
587 blopes 84
                        rankingProdutosDTOGeral.addAll(vendaService.consultarProdutosVendidos(parametrosConsulta));
582 blopes 85
                }
86
 
587 blopes 87
                // RETIRAR PRODUTOS PARA NÃO COMPRAR
88
                for (RankingProdutoDTO rankingProdutoDTO : rankingProdutosDTOGeral) {
89
                        if (VerificadorUtil.naoEstaNulo(rankingProdutoDTO.getStatusPedidoCompra())) {
90
                                if (!rankingProdutoDTO.getStatusPedidoCompra().equals(TipoStatusPedidoCompra.NAO_COMPRAR.getValor())) {
91
                                        rankingProdutosDTO.add(rankingProdutoDTO);
92
                                }
582 blopes 93
                        }
587 blopes 94
                }
582 blopes 95
 
583 blopes 96
                // CONSULTAR SUBTIPOS
582 blopes 97
                // VERIFICAR ITENS POR TIPO, SEM SUBTIPO
583 blopes 98
                for (TipoProduto tipoProdutoSelecionado : alertasGeralDTO.getTiposProdutoSelecionados()) {
586 blopes 99
                        Integer quantidadeAlertasPossiveisSemSubtipo = 0;
100
                        Integer quantidadeAlertasPossiveisComSubtipo = 0;
583 blopes 101
                        AlertasComprasGeralDTO alertasComprasGeralDTO = new AlertasComprasGeralDTO();
102
                        alertasComprasGeralDTO.setTipoProduto(tipoProdutoSelecionado);
103
 
104
                        List<SubtipoProduto> subtiposProduto = subtipoProdutoService.consultarPorTipo(tipoProdutoSelecionado.getValor());
105
                        List<RankingProdutoDTO> rankingProdutosDTOComSubtipo = new ArrayList<RankingProdutoDTO>();
106
                        for (RankingProdutoDTO rankingProdutoDTO : rankingProdutosDTO) {
107
                                if (rankingProdutoDTO.getProduto().getTipo().equals(tipoProdutoSelecionado.getValor())) {
108
                                        if (VerificadorUtil.estaNulo(rankingProdutoDTO.getProduto().getSubtipoProduto())) {
584 blopes 109
                                                quantidadeAlertasPossiveisSemSubtipo++;
110
                                                // ALERTA PARA CADA PRODUTO COM MENOS DE DIAS PRE-DEFINIDO
583 blopes 111
                                                if (rankingProdutoDTO.getTempoEstoque() <= alertasGeralDTO.getTempoDeEstoqueParaAlerta()) {
112
                                                        alertasComprasGeralDTO.getAlertasProdutosSemSubtipo().add(rankingProdutoDTO);
588 blopes 113
                                                        if (VerificadorUtil.estaNulo(rankingProdutoDTO.getStatusPedidoCompra())) {
114
                                                                alertasComprasGeralDTO.adicionarQuantidadeAlertasSemPedidoCompra();
115
                                                        }
583 blopes 116
                                                }
587 blopes 117
                                                if (rankingProdutoDTO.getTempoEstoque() <= alertasGeralDTO.getTempoDeEstoqueParaAlerta()/2) {
118
                                                        alertasComprasGeralDTO.adicionarQuantidadeAlertasCriticos();
119
                                                }
583 blopes 120
                                        } else {
586 blopes 121
                                                if (tipoProdutoSelecionado.getValor().equals(TipoProduto.PELICULA.getValor())) {
122
                                                        quantidadeAlertasPossiveisSemSubtipo++;
123
                                                }
583 blopes 124
                                                rankingProdutosDTOComSubtipo.add(rankingProdutoDTO);
125
                                        }
126
                                }
127
                        }
128
 
129
                        for (SubtipoProduto subtipoProduto : subtiposProduto) {
586 blopes 130
                                if (!tipoProdutoSelecionado.getValor().equals(TipoProduto.PELICULA.getValor())) {
131
                                        quantidadeAlertasPossiveisComSubtipo++;
132
                                }
584 blopes 133
                                AlertasComprasGeralSubTipoDTO alertasComprasGeralSubTipoDTO = new AlertasComprasGeralSubTipoDTO();
134
                                alertasComprasGeralSubTipoDTO.setSubtipoProduto(subtipoProduto);
583 blopes 135
                                for (RankingProdutoDTO rankingProdutoDTOComSubtipo : rankingProdutosDTOComSubtipo) {
586 blopes 136
                                        if ((!tipoProdutoSelecionado.getValor().equals(TipoProduto.PELICULA.getValor()) &&
137
                                                subtipoProduto.equals(rankingProdutoDTOComSubtipo.getProduto().getSubtipoProduto())) ||
138
                                                (tipoProdutoSelecionado.getValor().equals(TipoProduto.PELICULA.getValor()) &&
139
                                                subtipoProduto.equals(rankingProdutoDTOComSubtipo.getProduto().getSubtipoProduto()) &&
140
                                                rankingProdutoDTOComSubtipo.getTempoEstoque() <= alertasGeralDTO.getTempoDeEstoqueParaAlerta())) {
584 blopes 141
                                                alertasComprasGeralSubTipoDTO.getRankingProdutosDTO().add(rankingProdutoDTOComSubtipo);
588 blopes 142
                                                if (VerificadorUtil.estaNulo(rankingProdutoDTOComSubtipo.getStatusPedidoCompra())) {
143
                                                        alertasComprasGeralDTO.adicionarQuantidadeAlertasSemPedidoCompra();
144
                                                }
583 blopes 145
                                        }
146
                                }
584 blopes 147
                                if (!alertasComprasGeralSubTipoDTO.getRankingProdutosDTO().isEmpty() &&
586 blopes 148
                                        (tipoProdutoSelecionado.getValor().equals(TipoProduto.PELICULA.getValor()) ||
149
                                        alertasComprasGeralSubTipoDTO.getQuantidadeTotalTempoEstoque() <= alertasGeralDTO.getTempoDeEstoqueParaAlerta())) {
584 blopes 150
                                        alertasComprasGeralDTO.getAlertasComprasGeralSubTipoDTO().add(alertasComprasGeralSubTipoDTO);
587 blopes 151
                                        if (alertasComprasGeralSubTipoDTO.getQuantidadeTotalTempoEstoque() <= alertasGeralDTO.getTempoDeEstoqueParaAlerta()/2) {
152
                                                alertasComprasGeralDTO.adicionarQuantidadeAlertasCriticos();
153
                                        }
584 blopes 154
                                }
583 blopes 155
                        }
584 blopes 156
                        alertasComprasGeralDTO.setQuantidadeAlertasPossiveis(quantidadeAlertasPossiveisSemSubtipo);
157
                        alertasComprasGeralDTO.setQuantidadeAlertasPossiveisComSubtipo(quantidadeAlertasPossiveisComSubtipo);
588 blopes 158
 
159
                        alertasComprasDTO.getAlertasComprasGeralDTO().add(alertasComprasGeralDTO);
583 blopes 160
                }
582 blopes 161
 
162
                // CONSULTAR ITENS SEM SUBTIPO: TOTAL DE VENDAS (90 DIAS), TOTAL DE ESTOQUE, TEMPO DE ESTOQUE E QNT PARA COMPRAR (90 DIAS)
163
                /*
164
                List<SubtipoProduto> subtiposProduto = new ArrayList<SubtipoProduto>();
165
                for (TipoProduto tipoProduto : tiposProduto) {
166
                        if (!tipoProduto.getValor().equals(TipoProduto.CAPA.getValor())) {
167
                                subtiposProduto.addAll(subtipoProdutoService.consultarPorTipo(tipoProduto.getValor()));
168
                        }
169
                }
170
                */
171
 
172
                // LISTA DE TODOS OS SUBTIPOS DO TIPO
173
                // CONSULTAR ITENS DO SUBTIPO: TOTAL DE VENDAS (90 DIAS), TOTAL DE ESTOQUE, TEMPO DE ESTOQUE E QNT PARA COMPRAR (90 DIAS)
174
                // ALERTA PARA CADA SUBTIPO COM MENOS DE 15 DIAS DE ESTOQUE
175
 
176
                // PERMITIR DETALHAR A LISTA DOS ITENS DO SUBTIPO
588 blopes 177
                return alertasComprasDTO;
178
        }
179
 
180
        @Override
181
        public AlertasLogisticaComprasDTO consultarAlertasLogistica(Integer quantidadeDiasVendas, Integer quantidadeDiasParaAlerta, Boolean adicionarModelosFavoritosSemVendas) {
182
                // CONSULTAR MODELOS MAIS VENDIDOS
183
                List<RankingModeloDTO> modelosMaisVendidos = consultarModelosMaisVendidos(DataUtils.getDataAtual(),
184
                                DataUtils.acrescentarDias(DataUtils.getDataAtual(), quantidadeDiasVendas*-1),
185
                                adicionarModelosFavoritosSemVendas);
582 blopes 186
 
614 blopes 187
                List<RankingModeloDTO> modelosFavoritosMaisVendidos = new ArrayList<>();
188
                for (RankingModeloDTO rankingModeloDTO : modelosMaisVendidos) {
189
                        if (rankingModeloDTO.getModelo().getIndicadorFavorito()) {
190
                                modelosFavoritosMaisVendidos.add(rankingModeloDTO);
191
                        }
192
                }
193
 
588 blopes 194
                List<RankingComprasTransferenciasDTO> rankingComprasTransferencias = new ArrayList<RankingComprasTransferenciasDTO>();
614 blopes 195
                rankingComprasTransferencias.addAll(vendaService.consultarRankingComprasTransferencias(quantidadeDiasVendas, quantidadeDiasParaAlerta, modelosFavoritosMaisVendidos, true));
588 blopes 196
 
197
                AlertasLogisticaComprasDTO alertasLogisticaComprasDTO = new AlertasLogisticaComprasDTO();
614 blopes 198
                alertasLogisticaComprasDTO.setQuantidadeAlertasModelosPossiveis(modelosFavoritosMaisVendidos.size());
588 blopes 199
                alertasLogisticaComprasDTO.setRankingsComprasTransferenciasDTO(rankingComprasTransferencias);
200
                return alertasLogisticaComprasDTO;
582 blopes 201
        }
202
 
588 blopes 203
        private List<RankingModeloDTO> consultarModelosMaisVendidos(Date dataInicial, Date dataFinal, Boolean adicionarModelosFavoritosSemVendas) {
582 blopes 204
                List<RankingModeloDTO> modelosMaisVendidos = new ArrayList<RankingModeloDTO>();
205
                ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta = new ParametrosConsultaModelosMaisVendidosDTO();
588 blopes 206
                parametrosConsulta.setDataFinal(dataInicial);
207
                parametrosConsulta.setDataInicial(dataFinal);
208
                modelosMaisVendidos.addAll(vendaService.consultarRankingModelos(parametrosConsulta, adicionarModelosFavoritosSemVendas));
582 blopes 209
                return modelosMaisVendidos;
210
        }
211
 
212
}