Subversion Repositories Integrator Subversion

Rev

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

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