Subversion Repositories Integrator Subversion

Rev

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