Subversion Repositories Integrator Subversion

Rev

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