Subversion Repositories Integrator Subversion

Rev

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

Rev Author Line No. Line
1 espaco 1
package br.com.ec.domain.service.produto.impl;
2
 
3
import java.util.ArrayList;
4
import java.util.Calendar;
5
import java.util.Date;
6
import java.util.GregorianCalendar;
7
import java.util.HashMap;
8
import java.util.List;
9
 
10
import org.springframework.beans.factory.annotation.Autowired;
11
import org.springframework.stereotype.Service;
12
 
13
import br.com.ec.controller.util.UtilBean;
14
import br.com.ec.domain.dto.ParametrosConsultaProdutoDTO;
15
import br.com.ec.domain.dto.ProdutoHistoricoDTO;
16
import br.com.ec.domain.dto.ProdutoHistoricoDetalhesDTO;
17
import br.com.ec.domain.model.Cliente;
18
import br.com.ec.domain.model.Cupom;
19
import br.com.ec.domain.model.EstoqueAuditoria;
20
import br.com.ec.domain.model.Loja;
21
import br.com.ec.domain.model.Modelo;
22
import br.com.ec.domain.model.Pagamento;
23
import br.com.ec.domain.model.Pedido;
24
import br.com.ec.domain.model.PedidoHistorico;
25
import br.com.ec.domain.model.PedidoProduto;
26
import br.com.ec.domain.model.Pendencia;
27
import br.com.ec.domain.model.Perfil;
28
import br.com.ec.domain.model.Produto;
29
import br.com.ec.domain.model.ProdutoLoja;
30
import br.com.ec.domain.model.Usuario;
31
import br.com.ec.domain.model.Venda;
32
import br.com.ec.domain.model.tipos.TipoCupom;
33
import br.com.ec.domain.model.tipos.TipoDevolucao;
34
import br.com.ec.domain.model.tipos.TipoEstoqueAuditoria;
35
import br.com.ec.domain.model.tipos.TipoEstoqueAuditoriaVerificacao;
36
import br.com.ec.domain.model.tipos.TipoGenero;
37
import br.com.ec.domain.model.tipos.TipoProduto;
38
import br.com.ec.domain.model.tipos.TipoRelatorio;
39
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
40
import br.com.ec.domain.service.cupom.CupomService;
41
import br.com.ec.domain.service.email.impl.GerenciadorEmailImpl;
42
import br.com.ec.domain.service.estoqueauditoria.EstoqueAuditoriaService;
43
import br.com.ec.domain.service.pagamento.PagamentoService;
44
import br.com.ec.domain.service.pedido.PedidoService;
45
import br.com.ec.domain.service.pendencia.PendenciaService;
46
import br.com.ec.domain.service.perfil.PerfilService;
47
import br.com.ec.domain.service.produto.ProdutoService;
48
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
49
import br.com.ec.domain.shared.ConstantesSEC;
50
import br.com.ec.infrastructure.repository.ProdutoRepository;
51
import br.com.ec.infrastructure.repository.TransferenciaRepository;
52
import br.edu.cesmac.core.exception.NegocioException;
53
import br.edu.cesmac.core.generic.AbstractService;
54
import br.edu.cesmac.core.generic.GenericRepository;
55
import br.edu.cesmac.core.util.DataUtils;
56
import br.edu.cesmac.core.util.StringUtil;
57
import br.edu.cesmac.core.util.VerificadorUtil;
58
import br.edu.cesmac.core.validador.Validador;
59
 
60
@Service
61
public class ProdutoServiceImpl extends AbstractService<Produto> implements ProdutoService {
62
 
63
        private ProdutoRepository produtoRepository;
64
        private TransferenciaRepository transferenciaRepository;
65
        private ProdutoLojaService produtoLojaService;
66
        private EstoqueAuditoriaService estoqueAuditoriaService;
67
        private PerfilService perfilService;
68
        private CupomService cupomService;
69
        private PagamentoService pagamentoService;
70
        private PedidoService pedidoService;
71
        private PendenciaService pendenciaService;
72
 
73
        @Autowired
74
        public ProdutoServiceImpl(Validador validador, ProdutoRepository produtoRepository,
75
                        TransferenciaRepository transferenciaRepository, ProdutoLojaService produtoLojaService,
76
                        EstoqueAuditoriaService estoqueAuditoriaService, PerfilService perfilService, CupomService cupomService,
77
                        PagamentoService pagamentoService, PedidoService pedidoService, PendenciaService pendenciaService) {
78
                super(validador);
79
                this.produtoRepository = produtoRepository;
80
                this.transferenciaRepository = transferenciaRepository;
81
                this.produtoLojaService = produtoLojaService;
82
                this.estoqueAuditoriaService = estoqueAuditoriaService;
83
                this.perfilService = perfilService;
84
                this.cupomService = cupomService;
85
                this.pagamentoService = pagamentoService;
86
                this.pedidoService = pedidoService;
87
                this.pendenciaService = pendenciaService;
88
        }
89
 
90
        @Override
91
        protected GenericRepository<Produto> getRepository() {
92
                return produtoRepository;
93
        }
94
 
95
        @Override
96
        public void cadastrar(Produto produto) {
97
                setarNovoCodigoDoProduto(produto);
98
                super.cadastrar(produto);
99
        }
100
 
101
        private void setarNovoCodigoDoProduto(Produto produto) {
102
                Long novoCodigo = consultarUltimoCodigo();
103
                if (VerificadorUtil.naoEstaNulo(novoCodigo)) {
104
                        novoCodigo = novoCodigo + 1;
105
                        produto.setCodigo(String.format("%06d", novoCodigo));
106
                } else {
107
                        produto.setCodigo(String.format("%06d", new Long(1)));
108
                }
109
        }
110
 
111
        @Override
112
        protected void regrasNegocioCadastrar(Produto produto) {
113
                verificarObrigatoriedades(produto);
114
                verificarSeCodigoRapidoJaExiste(produto);
115
                verificarSeCodigoEANJaExiste(produto);
116
                setarFalsoParaIndicadores(produto);
117
                produto.setAtivo(true);
118
        }
119
 
120
        @Override
121
        protected void regrasNegocioAlterar(Produto produto) {
122
                verificarObrigatoriedades(produto);
123
                verificarSeCodigoRapidoJaExiste(produto);
124
                verificarSeCodigoEANJaExiste(produto);
125
                setarFalsoParaIndicadores(produto);
126
        }
127
 
128
        private void verificarObrigatoriedades(Produto produto) {
129
                StringBuilder excecoes = new StringBuilder();
130
                if (VerificadorUtil.estaNuloOuVazio(produto.getCodigoEAN()) &&
131
                                VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEANTributado())) {
132
                        excecoes.append("Código de Barras Tributado; ");
133
                }
134
                if (produto.getTipo().equals(TipoProduto.CAPA.getValor())) {
135
                        if (VerificadorUtil.estaNuloOuVazio(produto.getModelo())) {
136
                                excecoes.append("Modelo do produto; ");
137
                        }
138
                        if (VerificadorUtil.estaNuloOuVazio(produto.getEstilo())) {
139
                                excecoes.append("Estilo do produto; ");
140
                        }
141
                }
142
                if (produto.tipoProdutoTributado()) {
143
                        if (VerificadorUtil.estaNulo(produto.getTributacao())) {
144
                                excecoes.append("Tributação do produto; ");
145
                        }
146
                }
147
                if (VerificadorUtil.naoEstaNuloOuVazio(excecoes)) {
148
                        throw new NegocioException("Obrigatório informar: " + excecoes.toString());
149
                }
150
        }
151
 
152
        private void verificarSeCodigoRapidoJaExiste(Produto produto) {
153
                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoRapido())) {
154
                        Produto produtoConsultado = produtoRepository.consultarProdutoPorCodigoRapido(produto.getCodigoRapido());
155
                        if (VerificadorUtil.naoEstaNulo(produtoConsultado)) {
156
                                if (!produtoConsultado.getSequencial().equals(produto.getSequencial())) {
157
                                        throw new NegocioException("Código rápido do produto já existente");
158
                                }
159
                        }
160
                }
161
        }
162
 
163
        private void verificarSeCodigoEANJaExiste(Produto produto) {
164
                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEAN())) {
165
                        Produto produtoConsultado = produtoRepository.consultarProdutoPorCodigoEAN(produto.getCodigoEAN());
166
                        if (VerificadorUtil.naoEstaNulo(produtoConsultado)) {
167
                                if (!produtoConsultado.getSequencial().equals(produto.getSequencial())) {
168
                                        throw new NegocioException("Código de Barras já existente.");
169
                                }
170
                        }
171
                }
172
        }
173
 
174
        private void setarFalsoParaIndicadores(Produto produto) {
175
                if (VerificadorUtil.estaNulo(produto.getIndicadorFavorito())) {
176
                        produto.setIndicadorFavorito(false);
177
                }
178
        }
179
 
180
        @Override
181
        public List<Produto> consultarProdutoPorParametros(ParametrosConsultaProdutoDTO parametrosConsultaProduto) {
182
                return produtoRepository.consultarProdutoPorParametros(parametrosConsultaProduto);
183
        }
184
 
185
        @Override
186
        public List<Produto> consultarCompativeis(Produto produto) {
187
                return produtoRepository.consultarCompativeis(produto);
188
        }
189
 
190
        @Override
191
        public Produto detalharProduto(Produto produto) {
192
                Produto produtoDetalhado = produtoRepository.detalharProduto(produto);
193
                produtoDetalhado.setTransferenciasAbertas(transferenciaRepository.consultarTransferenciasAbertas(produtoDetalhado));
194
                produtoDetalhado.setPedidosPendentes(pedidoService.consultarPedidosNaoAtendidos(produtoDetalhado));
195
                return produtoDetalhado;
196
        }
197
 
198
        @Override
199
        public Produto consultarProdutoPorCodigoOuCodigoEAN(String codigoProduto) {
200
                Produto produtoSelecionado = null;
201
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoProduto)) {
202
                        codigoProduto = codigoProduto.trim();
203
                        if (codigoProduto.length() < 7) {
204
                                produtoSelecionado = this.consultarProdutoPorCodigo(UtilBean.padraoCodigoProduto(codigoProduto));
205
                        } else {
206
                                produtoSelecionado = this.consultarProdutoPorCodigoEAN(codigoProduto);
207
                        }
208
                }
209
                if (VerificadorUtil.estaNulo(produtoSelecionado)) {
210
                        return this.consultarProdutoPorCodigo("000000");
211
                }
212
                return produtoSelecionado;
213
        }
214
 
215
        @Override
216
        public Produto consultarProdutoPorCodigoRapidoOuCodigoEAN(String codigoRapidoOuCodigoEAN) {
217
                Produto produtoSelecionado = null;
218
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoRapidoOuCodigoEAN)) {
219
                        codigoRapidoOuCodigoEAN = codigoRapidoOuCodigoEAN.trim();
220
                        if (codigoRapidoOuCodigoEAN.length() < 7) {
221
                                produtoSelecionado = this.consultarProdutoPorCodigoRapido(codigoRapidoOuCodigoEAN);
222
                        } else {
223
                                produtoSelecionado = this.consultarProdutoPorCodigoEAN(codigoRapidoOuCodigoEAN);
224
                        }
225
                }
226
                if (VerificadorUtil.estaNulo(produtoSelecionado)) {
227
                        return this.consultarProdutoPorCodigo("000000");
228
                }
229
                return produtoSelecionado;
230
        }
231
 
232
        @Override
233
        public Produto consultarProdutoPorCodigo(String codigoProduto) {
234
                return produtoRepository.consultarProdutoPorCodigo(codigoProduto.trim());
235
        }
236
 
237
        @Override
238
        public Produto consultarProdutoPorCodigoEAN(String codigoEAN) {
239
                codigoEAN = StringUtil.retornarApenasNumeros(codigoEAN);
240
                if (VerificadorUtil.naoEstaNuloOuVazio(codigoEAN)) {
241
                        return produtoRepository.consultarProdutoPorCodigoEAN(codigoEAN.trim());
242
                }
243
                return null;
244
        }
245
 
246
        @Override
247
        public Produto consultarProdutoPorCodigoRapido(String codigoRapido) {
248
                return produtoRepository.consultarProdutoPorCodigoRapido(codigoRapido.trim());
249
        }
250
 
251
        @Override
252
        public Long consultarUltimoCodigo() {
253
                return produtoRepository.consultarUltimoCodigo();
254
        }
255
 
256
        @Override
257
        public Produto consultarProdutoPorCodigoParaContagem(String codigoProduto, Loja loja, Usuario usuarioParaContagem) {
258
                Produto produto = this.consultarProdutoPorCodigoOuCodigoEAN(codigoProduto);
259
                verificarSeProdutoConstaNaContagem(produto, loja, usuarioParaContagem);
260
                return produto;
261
        }
262
 
263
        private void verificarSeProdutoConstaNaContagem(Produto produto, Loja loja, Usuario usuarioParaContagem) {
264
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
265
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setProduto(produto);
266
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionadaParaContagem(loja);
267
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(1);
268
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setUsuarioParaContagem(usuarioParaContagem);
269
                if (this.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta) == 0) {
270
                        throw new NegocioException("PRODUTO NÃO CONSTA PARA CONTAGEM NA LOJA");
271
                }
272
        }
273
 
274
        @Override
275
        public void lancarAvaria(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario) {
276
                lancarMudancaEstoque(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.AVARIA.getValor());
277
        }
278
 
279
        @Override
280
        public void lancarTroca(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario) {
281
                if (estoqueAuditoria.getEhDevolucaoMesmoProduto()) {
282
                        estoqueAuditoria.setSequencial(lancarMudancaEstoque(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.TROCA.getValor()).getSequencial());
283
                } else {
284
                        estoqueAuditoria.setSequencial(lancarDevolucao(estoqueAuditoria, loja, produto, usuario, TipoEstoqueAuditoria.DEVOLUCAO.getValor()).getSequencial());
285
                }
286
                vincularPedidoComTroca(estoqueAuditoria);
287
        }
288
 
289
        private void vincularPedidoComTroca(EstoqueAuditoria estoqueAuditoria) {
290
                if (VerificadorUtil.naoEstaNulo(estoqueAuditoria.getPedidoParaVincular())) {
291
                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
292
                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
293
                        pedidoHistorico.setObservacao("TROCA REALIZADA: " + estoqueAuditoria.getSequencial());
294
                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.FINALIZADO.getValor());
295
                        pedidoHistorico.setUsuario(estoqueAuditoria.getUsuario());
296
                        pedidoHistorico.setPedido(estoqueAuditoria.getPedidoParaVincular());
297
                        if (VerificadorUtil.estaNulo(estoqueAuditoria.getPedidoParaVincular().getHistorico())) {
298
                                estoqueAuditoria.getPedidoParaVincular().setHistorico(new ArrayList<PedidoHistorico>());
299
                        }
300
                        estoqueAuditoria.getPedidoParaVincular().getHistorico().add(pedidoHistorico);
301
                        estoqueAuditoria.getPedidoParaVincular().setTipoSituacao(TipoSituacaoPedido.FINALIZADO.getValor());
302
                        estoqueAuditoria.getPedidoParaVincular().setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
303
                        pedidoService.alterar(estoqueAuditoria.getPedidoParaVincular());
304
                }
305
        }
306
 
307
        private EstoqueAuditoria lancarMudancaEstoque(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario, String tipoEstoqueAuditoria) {
308
                ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, loja);
309
                if (VerificadorUtil.naoEstaNulo(produtoLoja)) {
310
                        if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoque())) {
311
                                produtoLoja.setQuantidadeEstoque(0);
312
                        }
313
                        String observacao = estoqueAuditoria.getObservacao();
314
                        if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getNumeroLote())) {
315
                                observacao = "LOTE [" + estoqueAuditoria.getNumeroLote() + "] : " + observacao;
316
                        }
317
                        estoqueAuditoria = cadastrarAuditoria(usuario, produtoLoja, tipoEstoqueAuditoria, produtoLoja.getQuantidadeEstoque(), produtoLoja.getQuantidadeEstoque() - 1, estoqueAuditoria.getCliente(), observacao, TipoEstoqueAuditoriaVerificacao.NAO_VERIFICADO.getValor());
318
                        produtoLoja.setQuantidadeEstoque(produtoLoja.getQuantidadeEstoque() - 1);
319
                        produtoLojaService.alterar(produtoLoja);
320
                }
321
                return estoqueAuditoria;
322
        }
323
 
324
        private EstoqueAuditoria lancarDevolucao(EstoqueAuditoria estoqueAuditoria, Loja loja, Produto produto, Usuario usuario, String tipoEstoqueAuditoria) {
325
                verificarDadosPreenchidos(estoqueAuditoria);
326
 
327
                ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, loja);
328
                if (VerificadorUtil.naoEstaNulo(produtoLoja)) {
329
                        if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoque())) {
330
                                produtoLoja.setQuantidadeEstoque(0);
331
                        }
332
                        Cupom cupomGerado = null;
333
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.CUPOM.getValor())) {
334
                                cupomGerado = new Cupom();
335
                                cupomGerado.setCodigo(cupomService.gerarCodigoValido());
336
                                cupomGerado.setDataHoraEmissao(DataUtils.getDataAtual());
337
                                cupomGerado.setPublico(false);
338
                                cupomGerado.setAtivo(true);
339
                                cupomGerado.setTipoCupom(TipoCupom.REEMBOLSO.getValor());
340
                                cupomGerado.setCliente(estoqueAuditoria.getCliente());
341
                                cupomGerado.setValor(estoqueAuditoria.getValorDevolvido());
342
                                cupomGerado.setLimiteUtilizacao(true);
343
                                cupomGerado.setObservacao("CUPOM: " + cupomGerado.getCodigo() + "\nREEMBOLSO DO PRODUTO: " + estoqueAuditoria.getProduto().getDescricaoCompletaCapa());
344
                                cupomService.cadastrar(cupomGerado);
345
                                estoqueAuditoria.setObservacao("CUPOM GERADO: " + cupomGerado.getCodigo() + "\n" + estoqueAuditoria.getObservacao());
346
                        }
347
                        Pagamento pagamentoGerado = null;
348
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.DINHEIRO.getValor())) {
349
                                pagamentoGerado = new Pagamento();
350
                                pagamentoGerado.setLoja(loja);
351
                                pagamentoGerado.setData(DataUtils.getDataAtual());
352
                                pagamentoGerado.setDescricao("DEVOLUÇÃO DO PRODUTO: " + estoqueAuditoria.getProduto().getCodigoProdutoPadrao());
353
                                pagamentoGerado.setValor(estoqueAuditoria.getValorDevolvido());
354
                                pagamentoGerado.setUsuario(usuario);
355
                                pagamentoGerado.setLancado(false);
356
                                pagamentoService.cadastrar(pagamentoGerado);
357
                                estoqueAuditoria.setObservacao("DEVOLUÇÃO EM DINHEIRO: " + estoqueAuditoria.getValorDevolvido() + "\n" + estoqueAuditoria.getObservacao());
358
                        }
359
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor()) ||
360
                                        estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
361
                                String diaAtual = DataUtils.converterDataComHorarioParaString(DataUtils.getDataAtual());
362
                                StringBuilder conteudo = new StringBuilder();
363
                                conteudo.append("OPERAÇÃO REALIZADA POR: " + usuario.getNome() + "\n");
364
                                conteudo.append("VALOR PARA DEVOLVER: R$" + StringUtil.formatarValor(estoqueAuditoria.getValorDevolvido()) + "\n");
365
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
366
                                        conteudo.append("DADOS BANCÁRIOS: " + estoqueAuditoria.getDadosBancarios() + "\n");
367
                                }
368
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getSequencialVenda())) {
369
                                        conteudo.append("ID DA VENDA: " + estoqueAuditoria.getSequencialVenda() + "\n");
370
                                }
371
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getNumeroNotaFiscal())) {
372
                                        conteudo.append("Nº DA NOTA FISCAL: " + estoqueAuditoria.getNumeroNotaFiscal() + "\n");
373
                                }
374
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getDataVenda())) {
375
                                        conteudo.append("DATA DA VENDA: " + DataUtils.converterDataComHorarioParaString(estoqueAuditoria.getDataVenda()) + "\n");
376
                                }
377
                                if (VerificadorUtil.naoEstaNuloOuVazio(estoqueAuditoria.getDescricaoDaLoja())) {
378
                                        conteudo.append("LOJA: " + estoqueAuditoria.getDescricaoDaLoja() + "\n");
379
                                }
380
                                conteudo.append("OBSERVAÇÕES: " + estoqueAuditoria.getObservacao() + "\n\n");
381
                                if (VerificadorUtil.naoEstaNulo(estoqueAuditoria.getCliente())) {
382
                                        conteudo.append("DADOS DO CLIENTE:\n");
383
                                        conteudo.append("NOME: " + estoqueAuditoria.getCliente().getNome() + "\n");
384
                                        conteudo.append("CPF/CNPJ: " + estoqueAuditoria.getCliente().getCpfCnpjFormatado() + "\n");
385
                                        conteudo.append("EMAIL: " + estoqueAuditoria.getCliente().getEmail() + "\n");
386
                                        conteudo.append("TELEFONE: " + estoqueAuditoria.getCliente().getTelefone() + "\n");
387
                                        conteudo.append("CONTATO: " + estoqueAuditoria.getCliente().getContato() + "\n\n");
388
                                }
389
                                conteudo.append("DATA DA SOLICITAÇÃO: " + diaAtual + "\n");
390
                                conteudo.append("__________________________________________________\n\n");
391
 
392
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor())) {
393
                                        new GerenciadorEmailImpl()
394
                                                .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
395
                                                .comAssunto("ESPAÇO CASE - SOLICITAÇÃO DE ESTORNO : " + diaAtual)
396
                                                .comConteudo(conteudo.toString())
397
                                                .enviar();
398
                                }
399
                                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
400
                                        new GerenciadorEmailImpl()
401
                                                .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
402
                                                .comAssunto("ESPAÇO CASE - SOLICITAÇÃO DE TRANSFERÊNCIA : " + diaAtual)
403
                                                .comConteudo(conteudo.toString())
404
                                                .enviar();
405
                                }
406
                                try {
407
                                        Pendencia pendencia = new Pendencia();
408
                                        pendencia.setDescricao("SOLICITAÇÃO DE " + TipoDevolucao.parse(estoqueAuditoria.getTipoDevolucao()).getDescricao() + ": " + diaAtual);
409
                                        pendencia.setUsuario(usuario);
410
                                        pendencia.setData(DataUtils.getDataAtual());
411
                                        pendencia.setLoja(loja);
412
                                        Perfil perfilRh = new Perfil();
413
                                        perfilRh.setCodigo(ConstantesSEC.SETOR_FINANCEIRO_2);
414
                                        pendencia.setPerfil(perfilRh);
415
                                        pendenciaService.cadastrar(pendencia);
416
                                } catch (Exception e) {}
417
                        }
418
 
419
                        estoqueAuditoria = cadastrarAuditoria(usuario, produtoLoja, tipoEstoqueAuditoria, produtoLoja.getQuantidadeEstoque(), produtoLoja.getQuantidadeEstoque(), estoqueAuditoria.getCliente(), estoqueAuditoria.getObservacao(), TipoEstoqueAuditoriaVerificacao.NAO_VERIFICADO.getValor());
420
                        if (VerificadorUtil.naoEstaNulo(cupomGerado)) {
421
                                cupomGerado.setObservacao("AUDITORIA: " + estoqueAuditoria.getSequencial() + "\n" + cupomGerado.getObservacao());
422
                                cupomService.alterar(cupomGerado);
423
                        }
424
                        if (VerificadorUtil.naoEstaNulo(pagamentoGerado)) {
425
                                pagamentoGerado.setDescricao("AUDITORIA: " + estoqueAuditoria.getSequencial() + "\n" + pagamentoGerado.getDescricao());
426
                                pagamentoService.alterar(pagamentoGerado);
427
                        }
428
                }
429
                return estoqueAuditoria;
430
        }
431
 
432
        private void verificarDadosPreenchidos(EstoqueAuditoria estoqueAuditoria) {
433
                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getObservacao())) {
434
                        throw new NegocioException("Informe os motivos da devolução (OBSERVAÇÔES)");
435
                }
436
 
437
                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getValorDevolvido()) ||
438
                                (estoqueAuditoria.getValorDevolvido() <= 0.0)) {
439
                        throw new NegocioException("Informe o valor devolvido");
440
                }
441
                if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor()) ||
442
                                estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.ESTORNO_CARTAO.getValor())) {
443
                        if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente())) {
444
                                throw new NegocioException("Informe o cliente com o contato e/ou email");
445
                        }
446
                        if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente().getContato()) &&
447
                                        VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getCliente().getEmail())) {
448
                                throw new NegocioException("Informe o contato ou email do cliente");
449
                        }
450
                        if (estoqueAuditoria.getTipoDevolucao().equals(TipoDevolucao.TRANSFERENCIA.getValor())) {
451
                                if (VerificadorUtil.estaNuloOuVazio(estoqueAuditoria.getDadosBancarios())) {
452
                                        throw new NegocioException("Informe os dados bancários do cliente");
453
                                }
454
                        }
455
                }
456
        }
457
 
458
        private EstoqueAuditoria cadastrarAuditoria(Usuario usuario, ProdutoLoja produtoLoja, String tipoEstoqueAuditoria, Integer quantidadeEstoqueAnterior, Integer quantidadeEstoqueNovo, Cliente cliente, String observacao, String tipoVerificacao) {
459
                return estoqueAuditoriaService.cadastrarAuditoria(usuario, produtoLoja, quantidadeEstoqueAnterior, quantidadeEstoqueNovo, DataUtils.getDataAtual(), tipoEstoqueAuditoria, cliente, observacao, tipoVerificacao);
460
        }
461
 
462
        @Override
463
        public void desativarProduto(Produto produto) {
464
                produto.setAtivo(false);
465
                this.alterar(produto);
466
        }
467
 
468
        @Override
469
        public void ativarProduto(Produto produto) {
470
                produto.setAtivo(true);
471
                this.alterar(produto);
472
        }
473
 
474
        @Override
475
        public void realizarContagem(ProdutoLoja produtoLoja, Integer quantidadeEstoque, String localizacao, Usuario usuario, Boolean indicadorAvaria) {
476
                if (VerificadorUtil.estaNulo(quantidadeEstoque)) {
477
                        throw new NegocioException("É preciso informar o estoque");
478
                }
479
                verificarSeUsuarioLogadoEhVendedor(usuario);
480
                produtoLoja.setLocalizacao(localizacao);
481
                if (VerificadorUtil.estaNulo(produtoLoja.getDataContagemPreparacao())) {
482
                        produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
483
                        produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoque);
484
                        produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
485
                        produtoLojaService.alterar(produtoLoja);
486
                } else if (VerificadorUtil.estaNulo(produtoLoja.getDataContagem()) ||
487
                                        produtoLoja.getDataContagem().before(produtoLoja.getDataContagemPreparacao()) ||
488
                                        produtoLoja.getIndicadorContagemSolicitada() ||
489
                                        produtoLoja.getUsuarioUltimaContagem().equals(produtoLoja.getUsuarioUltimaContagemPreparacao())) {
490
                        verificarSeUsuarioDePreparacaoDiferente(produtoLoja, usuario);
491
                        verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja);
492
                        Integer quantidadeEstoqueAnterior = produtoLoja.getQuantidadeEstoque();
493
                        Integer quantidadeEstoqueNovo = quantidadeEstoque;
494
 
495
                        if (temDivergenciaContagem(produtoLoja, quantidadeEstoqueNovo)) {
496
                                solicitarContagemCasoDivergentes(produtoLoja, quantidadeEstoqueNovo, usuario);
497
                        } else {
498
                                produtoLoja.setDataContagem(DataUtils.getDataAtual());
499
                                produtoLoja.setUsuarioUltimaContagem(usuario);
500
                                produtoLoja.setQuantidadeEstoque(quantidadeEstoqueNovo);
501
                                produtoLoja.setIndicadorContagemSolicitada(false);
502
                                produtoLojaService.alterar(produtoLoja);
503
                                if (quantidadeEstoqueAnterior != quantidadeEstoqueNovo) {
504
                                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), quantidadeEstoqueAnterior, quantidadeEstoqueNovo, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
505
                                }
506
                                if (quantidadeEstoqueNovo > 0) {
507
                                        solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(produtoLoja.getLoja(), usuario, produtoLoja.getProduto());
508
                                }
509
                        }
510
                } else {
511
                        throw new NegocioException("Contagem indisponível, informe à gestão");
512
                }
513
        }
514
 
515
        private boolean temDivergenciaContagem(ProdutoLoja produtoLoja, Integer quantidadeEstoqueNovo) {
516
                ProdutoHistoricoDTO produtoHistorico = new ProdutoHistoricoDTO();
517
                produtoHistorico.setProduto(produtoLoja.getProduto());
518
                Integer quantidadeEntradas = 0;
519
                List<ProdutoHistoricoDTO> entradas = produtoRepository.consultarHistoricoDeEntradas(produtoLoja.getProduto(), produtoLoja.getLoja(),
520
                                produtoLoja.getDataContagemPreparacao(), DataUtils.getDataAtual());
521
                for (ProdutoHistoricoDTO entrada : entradas) {
522
                        quantidadeEntradas = quantidadeEntradas + entrada.getQuantidadeLancamentos().intValue();
523
                }
524
                Integer quantidadeSaidas = 0;
525
                List<ProdutoHistoricoDTO> saidas = produtoRepository.consultarHistoricoDeSaidas(produtoLoja.getProduto(), produtoLoja.getLoja(),
526
                                produtoLoja.getDataContagemPreparacao(), DataUtils.getDataAtual());
527
                for (ProdutoHistoricoDTO saida : saidas) {
528
                        quantidadeSaidas = quantidadeSaidas + saida.getQuantidadeLancamentos().intValue();
529
                }
530
                if (VerificadorUtil.estaNulo(produtoLoja.getQuantidadeEstoqueContagem())) {
531
                        produtoLoja.setQuantidadeEstoqueContagem(produtoLoja.getQuantidadeEstoque());
532
                }
533
                return !(produtoLoja.getQuantidadeEstoqueContagem() + quantidadeEntradas - quantidadeSaidas == quantidadeEstoqueNovo);
534
        }
535
 
536
        private void verificarSeUsuarioDePreparacaoDiferente(ProdutoLoja produtoLoja, Usuario usuario) {
537
                if (produtoLoja.getUsuarioUltimaContagemPreparacao().equals(usuario)) {
538
                        throw new NegocioException("Usuário já realizou a preparação da contagem");
539
                }
540
        }
541
 
542
        @Override
543
        public void realizarContagemDireta(ProdutoLoja produtoLoja, Integer quantidadeEstoque, String localizacao, Usuario usuario, Boolean indicadorAvaria) {
544
                if (VerificadorUtil.estaNulo(quantidadeEstoque)) {
545
                        throw new NegocioException("É preciso informar o estoque");
546
                }
547
                verificarSeUsuarioLogadoEhVendedor(usuario);
548
                verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja);
549
                Integer quantidadeEstoqueAnterior = produtoLoja.getQuantidadeEstoque();
550
                Integer quantidadeEstoqueNovo = quantidadeEstoque;
551
                produtoLoja.setLocalizacao(localizacao);
552
                produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
553
                produtoLoja.setDataContagem(DataUtils.getDataAtual());
554
                produtoLoja.setUsuarioUltimaContagem(usuario);
555
                produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
556
                produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoqueNovo);
557
                produtoLoja.setQuantidadeEstoque(quantidadeEstoqueNovo);
558
                produtoLoja.setIndicadorContagemSolicitada(false);
559
                produtoLojaService.alterar(produtoLoja);
560
                if (quantidadeEstoqueAnterior != quantidadeEstoqueNovo) {
561
                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), quantidadeEstoqueAnterior, quantidadeEstoqueNovo, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
562
                }
563
                if (quantidadeEstoqueNovo > 0) {
564
                        solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(produtoLoja.getLoja(), usuario, produtoLoja.getProduto());
565
                }
566
        }
567
 
568
        private void solicitarContagemCasoDivergentes(ProdutoLoja produtoLoja, Integer quantidadeEstoqueNovo, Usuario usuarioContagem) {
569
                produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
570
                produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoqueNovo);
571
                produtoLoja.setUsuarioUltimaContagemPreparacao(usuarioContagem);
572
                produtoLojaService.alterar(produtoLoja);
573
        }
574
 
575
        private void verificarSeProdutoPossuiTransferenciasAbertas(ProdutoLoja produtoLoja) {
576
                if (transferenciaRepository.verificarSeProdutoPossuiTransferenciasAbertas(produtoLoja)) {
577
                        throw new NegocioException("Não é permitido contar produto em transferência");
578
                }
579
        }
580
 
581
        private void verificarSeUsuarioLogadoEhVendedor(Usuario usuario) {
582
                if (!perfilService.temPerfilVendedor(usuario)) {
583
                        throw new NegocioException("Sem permissão para esta operação");
584
                }
585
        }
586
 
587
        @Override
588
        public void realizarContagem(Produto produto, Loja loja) {
589
                ProdutoLoja produtoLoja = new ProdutoLoja();
590
                produtoLoja.setProduto(produto);
591
                produtoLoja.setLoja(loja);
592
                produtoLoja.setDataContagem(DataUtils.getDataAtual());
593
                produtoLoja.setIndicadorContagemSolicitada(false);
594
                produtoLojaService.alterar(produtoLoja);
595
        }
596
 
597
        @Override
598
        public void transferirEstoque(Loja lojaEntrada, Loja lojaSaida, Usuario usuario, Produto produto, Integer quantidadeEstoque) {
599
                verificarParametrosParaTransferencia(lojaEntrada, lojaSaida, produto, quantidadeEstoque);
600
 
601
                Integer quantidadeEstoqueAnteriorEntrada = produtoLojaService.consultarEstoqueProdutoEeLoja(produto, lojaEntrada);
602
                Integer quantidadeEstoqueAnteriorSaida = produtoLojaService.consultarEstoqueProdutoEeLoja(produto, lojaSaida);
603
 
604
                produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeEstoque, produto, lojaEntrada);
605
                produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(-quantidadeEstoque, produto, lojaSaida);
606
 
607
                cadastrarAuditoria(usuario, new ProdutoLoja(produto, lojaEntrada), TipoEstoqueAuditoria.TRANSFERENCIA.getValor(),
608
                                quantidadeEstoqueAnteriorEntrada, quantidadeEstoqueAnteriorEntrada + quantidadeEstoque, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
609
 
610
                cadastrarAuditoria(usuario, new ProdutoLoja(produto, lojaSaida), TipoEstoqueAuditoria.TRANSFERENCIA.getValor(),
611
                                quantidadeEstoqueAnteriorSaida, quantidadeEstoqueAnteriorSaida - quantidadeEstoque, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
612
 
613
                realizarContagemComZeroEstoqueNaLojaEntrada(lojaEntrada, usuario, produto, quantidadeEstoqueAnteriorEntrada, quantidadeEstoque);
614
                solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(lojaEntrada, usuario, produto);
615
        }
616
 
617
        private void realizarContagemComZeroEstoqueNaLojaEntrada(Loja lojaEntrada, Usuario usuario, Produto produto, Integer quantidadeEstoqueAnteriorEntrada, Integer quantidadeEstoque) {
618
                if (quantidadeEstoqueAnteriorEntrada == 0) {
619
                        ProdutoLoja produtoLoja = produtoLojaService.consultarProdutoLoja(produto, lojaEntrada);
620
                        produtoLoja.setQuantidadeEstoqueContagem(quantidadeEstoque);
621
                        produtoLoja.setDataContagem(DataUtils.getDataAtual());
622
                        produtoLoja.setDataContagemPreparacao(DataUtils.getDataAtual());
623
                        produtoLoja.setUsuarioUltimaContagem(usuario);
624
                        produtoLoja.setUsuarioUltimaContagemPreparacao(usuario);
625
                        produtoLoja.setIndicadorContagemSolicitada(false);
626
                        produtoLojaService.alterar(produtoLoja);
627
                }
628
        }
629
 
630
        private void solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(Loja lojaEntrada, Usuario usuario, Produto produto) {
631
                pedidoService.solicitarEntrarEmContatoCasoExistaPedidoParaLojaSolicitante(lojaEntrada, produto);
632
        }
633
 
634
        private void verificarParametrosParaTransferencia(Loja lojaEntrada, Loja lojaSaida, Produto produto, Integer quantidade) {
635
                if (VerificadorUtil.estaNulo(lojaEntrada) || VerificadorUtil.estaNulo(lojaSaida) || VerificadorUtil.estaNulo(produto)) {
636
                        throw new NegocioException("Obrigatório informar as lojas para transferência");
637
                } else {
638
                        if (lojaEntrada.getSequencial().equals(lojaSaida.getSequencial())) {
639
                                throw new NegocioException("Não é permitido transferir para uma mesma loja.");
640
                        }
641
                        if (quantidade == 0) {
642
                                throw new NegocioException("Obrigatório informar a quantidade.");
643
                        }
644
                }
645
        }
646
 
647
        @Override
648
        public Integer quantidadeTotalEstoque(Loja loja) {
649
                return produtoRepository.quantidadeTotalEstoque(loja);
650
        }
651
 
652
        @Override
653
        public Double valorTotalEstoque(Loja loja, Modelo modelo) {
654
                return produtoRepository.valorTotalEstoque(loja, modelo);
655
        }
656
 
657
        @Override
658
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta) {
659
                return produtoRepository.quantidadeEstoque(parametrosConsulta);
660
        }
661
 
662
        @Override
663
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta, Long sequencialLoja) {
664
                return produtoRepository.quantidadeEstoque(parametrosConsulta, sequencialLoja);
665
        }
666
 
667
        @Override
668
        public Integer quantidadeParaContagem(Loja loja) {
669
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
670
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionadaParaContagem(loja);
671
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(1);
672
                return this.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
673
        }
674
 
675
        @Override
676
        public Integer solicitarContagem(ParametrosConsultaProdutoDTO parametrosConsulta) {
677
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
678
                for (Produto produto : produtos) {
679
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLojaSelecionadaParaContagem())) {
680
                                produtoLojaService.solicitarContagem(produto, parametrosConsulta.getLojaSelecionadaParaContagem(), true);
681
                        } else {
682
                                produtoLojaService.solicitarContagem(produto, null, true);
683
                        }
684
                }
685
                return produtos.size();
686
        }
687
 
688
        @Override
689
        public void cancelarContagem(ParametrosConsultaProdutoDTO parametrosConsulta) {
690
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
691
                for (Produto produto : produtos) {
692
                        produtoLojaService.cancelarContagem(produto, parametrosConsulta.getLojaSelecionadaParaContagem());
693
                }
694
        }
695
 
696
        @Override
697
        public void zerarEstoque(ParametrosConsultaProdutoDTO parametrosConsulta, Usuario usuario) {
698
                List<Produto> produtos = produtoRepository.consultarPassandoParametrosConsulta(parametrosConsulta, 0, produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta), null, null, new HashMap<String, Object>());
699
                for (Produto produto : produtos) {
700
                        List<ProdutoLoja> lista = produtoLojaService.consultar(new ProdutoLoja(produto, parametrosConsulta.getLojaSelecionadaParaContagem()), 0, produtoLojaService.obterQuantidadeDeRegistrosPassandoEntidade(new ProdutoLoja(produto, parametrosConsulta.getLojaSelecionadaParaContagem())));
701
                        for (ProdutoLoja produtoLoja : lista) {
702
                                produtoLoja.setIndicadorContagemSolicitada(false);
703
                                produtoLojaService.alterar(produtoLoja);
704
                                if (produtoLoja.getQuantidadeEstoque() > 0 ) {
705
                                        cadastrarAuditoria(usuario, produtoLoja, TipoEstoqueAuditoria.CONTAGEM.getValor(), produtoLoja.getQuantidadeEstoque(), 0, null, "", TipoEstoqueAuditoriaVerificacao.VERIFICADO_SEM_PENDENCIA.getValor());
706
                                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(-produtoLoja.getQuantidadeEstoque(), produtoLoja.getProduto(), produtoLoja.getLoja());
707
                                }
708
                        }
709
                }
710
        }
711
 
712
        @Override
713
        public List<ProdutoHistoricoDTO> consultarHistorico(Produto produto, Integer ultimosMeses) {
714
                List<ProdutoHistoricoDTO> historico = new ArrayList<ProdutoHistoricoDTO>();
715
                for (int mes = 0; mes <= ultimosMeses; mes++) {
716
                        Calendar calendarData = new GregorianCalendar();
717
                        calendarData.setTime(DataUtils.acrescentarMeses(DataUtils.getDataAtual(), mes * -1));
718
                        historico.addAll(produtoRepository.consultarHistorico(produto,
719
                                DataUtils.getPrimeiroDiaDoMes(calendarData.get(Calendar.MONTH)+1, calendarData.get(Calendar.YEAR)),
720
                                DataUtils.getUltimoDiaDoMes(calendarData.get(Calendar.MONTH)+1, calendarData.get(Calendar.YEAR))));
721
                }
722
                return historico;
723
        }
724
 
725
        @Override
726
        public List<ProdutoHistoricoDetalhesDTO> detalharHistorico(ProdutoHistoricoDTO produtoHistorico) {
727
                return produtoRepository.detalharHistorico(produtoHistorico,
728
                                DataUtils.getPrimeiroDiaDoMes(new Integer(produtoHistorico.getMes()), new Integer(produtoHistorico.getAno())),
729
                                DataUtils.getUltimoDiaDoMes(new Integer(produtoHistorico.getMes()), new Integer(produtoHistorico.getAno())));
730
        }
731
 
732
        @Override
733
        public Integer quantidadeProdutosParaRetirarDoOnline(Loja loja) {
734
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
735
                parametrosConsulta.setLojaSelecionada(loja.getSequencial());
736
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SITE.getValor());
737
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
738
        }
739
 
740
        @Override
741
        public Integer quantidadeProdutosParaRetirarDoOnlineMatriz() {
742
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
743
                parametrosConsulta.setLojaSelecionada(ConstantesSEC.SEQUENCIAL_MATRIZ_ESTOQUE_9);
744
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SITE.getValor());
745
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
746
        }
747
 
748
        @Override
749
        public Integer quantidadeProdutosParaRetirarDoOnlineShoplog() {
750
                ParametrosConsultaProdutoDTO parametrosConsulta = new ParametrosConsultaProdutoDTO();
751
                parametrosConsulta.setLojaSelecionada(ConstantesSEC.SEQUENCIAL_QUIOSQUE_PATIO_5);
752
                parametrosConsulta.setTipoRelatorioProduto(TipoRelatorio.RETIRAR_SHOPLOG.getValor());
753
                return produtoRepository.obterQuantidadeDeRegistrosParametrosConsulta(parametrosConsulta);
754
        }
755
 
756
        @Override
757
        public Date dataUltimaVenda(Produto produto) {
758
                return produtoRepository.dataUltimaVenda(produto);
759
        }
760
 
761
        @Override
762
        public Integer quantidadeProdutosAdicionadosSite(Date dataInicial, Date dataFinal) {
763
                return produtoRepository.quantidadeProdutosAdicionadosSite(dataInicial, dataFinal);
764
        }
765
 
766
        @Override
767
        public Integer quantidadeProdutosOnline() {
768
                return produtoRepository.quantidadeProdutosOnline();
769
        }
770
 
771
        @Override
772
        public Integer quantidadeProdutosFavoritosOffline(Loja loja) {
773
                return produtoRepository.quantidadeProdutosFavoritosOffline(loja);
774
        }
775
 
776
        @Override
777
        public void verificarPedidosProdutoParaEntrarEmContato(Produto produto, Long sequencialCompra) {
778
                if (!produto.tipoProdutoEhServico()) {
779
                        List<Pedido> pedidosProduto = new ArrayList<Pedido>();
780
                        List<Produto> compativeis = consultarCompativeis(produto);
781
                        for (Produto produtoCompatival : compativeis) {
782
                                pedidosProduto.addAll(pedidoService.consultarPedidosDoProdutoOuModeloPendentes(produtoCompatival));
783
                        }
784
 
785
                        for (Pedido pedidoConsultado : pedidosProduto) {
786
                                Boolean atualizarPedido = false;
787
                                Boolean atualizarPedidoCompativel = false;
788
                                for (Produto produtoCompatival : compativeis) {
789
                                        if (VerificadorUtil.naoEstaNuloOuVazio(pedidoConsultado.getProdutos())) {
790
                                                for (PedidoProduto pedidoProduto : pedidoConsultado.getProdutos()) {
791
                                                        if (pedidoProduto.getProduto().getSequencial().equals(produtoCompatival.getSequencial())) {
792
                                                                if (!produto.getSequencial().equals(produtoCompatival.getSequencial())) {
793
                                                                        atualizarPedidoCompativel = true;
794
                                                                }
795
                                                                atualizarPedido = true;
796
                                                                break;
797
                                                        }
798
                                                }
799
                                        } else if (VerificadorUtil.estaNulo(pedidoConsultado.getTipoProduto())) {
800
                                                atualizarPedido = true;
801
                                        } else if (VerificadorUtil.estaNulo(pedidoConsultado.getGenero())) {
802
                                                if (pedidoConsultado.getTipoProduto().equals(produtoCompatival.getTipo())) {
803
                                                        atualizarPedido = true;
804
                                                }
805
                                        } else if (pedidoConsultado.getTipoProduto().equals(produtoCompatival.getTipo()) &&
806
                                                        (produtoCompatival.getGenero().equals(TipoGenero.UNISSEX.getValor()) ||
807
                                                         pedidoConsultado.getGenero().equals(TipoGenero.UNISSEX.getValor()) ||
808
                                                         pedidoConsultado.getGenero().equals(produtoCompatival.getGenero()))) {
809
                                                if (VerificadorUtil.naoEstaNulo(pedidoConsultado.getEstiloProduto()) &&
810
                                                        VerificadorUtil.estaNulo(pedidoConsultado.getCorProduto())) {
811
                                                        if (pedidoConsultado.getEstiloProduto().equals(produtoCompatival.getEstilo())) {
812
                                                                atualizarPedido = true;
813
                                                        }
814
                                                } else if (VerificadorUtil.estaNulo(pedidoConsultado.getEstiloProduto()) &&
815
                                                                   VerificadorUtil.naoEstaNulo(pedidoConsultado.getCorProduto())) {
816
                                                        if (VerificadorUtil.naoEstaNulo(produtoCompatival.getCor())) {
817
                                                                if (pedidoConsultado.getCorProduto().equals(produtoCompatival.getCor())) {
818
                                                                        atualizarPedido = true;
819
                                                                }
820
                                                        }
821
                                                } else if (VerificadorUtil.naoEstaNulo(pedidoConsultado.getEstiloProduto()) &&
822
                                                                   VerificadorUtil.naoEstaNulo(pedidoConsultado.getCorProduto())) {
823
                                                        if (pedidoConsultado.getEstiloProduto().equals(produtoCompatival.getEstilo())) {
824
                                                                if (VerificadorUtil.naoEstaNulo(produtoCompatival.getCor())) {
825
                                                                        if (pedidoConsultado.getCorProduto().equals(produtoCompatival.getCor())) {
826
                                                                                atualizarPedido = true;
827
                                                                        }
828
                                                                }
829
                                                        }
830
                                                } else if (VerificadorUtil.estaNulo(pedidoConsultado.getEstiloProduto()) &&
831
                                                                   VerificadorUtil.estaNulo(pedidoConsultado.getCorProduto())) {
832
                                                        atualizarPedido = true;
833
                                                }
834
                                        }
835
                                }
836
                                if (atualizarPedido) {
837
                                        pedidoConsultado = pedidoService.consultarPedidoCompleto(pedidoConsultado);
838
                                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
839
                                        pedidoHistorico.setPedido(pedidoConsultado);
840
                                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.ENTRAR_EM_CONTATO.getValor());
841
                                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
842
                                        if (atualizarPedidoCompativel) {
843
                                                pedidoHistorico.setObservacao("PRODUTO COMPATÍVEL DISPONÍVEL PELA COMPRA ID " + sequencialCompra);
844
                                        } else {
845
                                                pedidoHistorico.setObservacao("PRODUTO DISPONÍVEL PELA COMPRA ID " + sequencialCompra);
846
                                        }
847
                                        if (VerificadorUtil.estaNulo(pedidoConsultado.getHistorico())) {
848
                                                pedidoConsultado.setHistorico(new ArrayList<PedidoHistorico>());
849
                                        }
850
                                        pedidoConsultado.setTipoSituacao(TipoSituacaoPedido.ENTRAR_EM_CONTATO.getValor());
851
                                        pedidoConsultado.setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
852
                                        pedidoConsultado.setUsuarioAtendimento(null);
853
                                        pedidoConsultado.getHistorico().add(pedidoHistorico);
854
                                        pedidoService.alterar(pedidoConsultado);
855
                                }
856
                        }
857
                }
858
        }
859
 
860
}