Subversion Repositories Integrator Subversion

Rev

Rev 468 | Rev 538 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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