Subversion Repositories Integrator Subversion

Rev

Rev 462 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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