Subversion Repositories Integrator Subversion

Rev

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