Subversion Repositories Integrator Subversion

Rev

Rev 607 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
357 espaco 1
package br.com.ec.repository.jpa;
2
 
468 blopes 3
import java.util.List;
4
 
543 blopes 5
import javax.persistence.NoResultException;
462 blopes 6
import javax.persistence.TypedQuery;
7
 
357 espaco 8
import org.springframework.stereotype.Repository;
9
 
543 blopes 10
import br.com.ec.core.exception.NegocioException;
524 blopes 11
import br.com.ec.core.util.VerificadorUtil;
468 blopes 12
import br.com.ec.domain.dto.CompraProdutoDTO;
462 blopes 13
import br.com.ec.domain.dto.ProdutoDTO;
357 espaco 14
import br.com.ec.domain.model.Produto;
462 blopes 15
import br.com.ec.domain.util.CodigoBarraEAN;
357 espaco 16
import br.com.ec.repository.ProdutoRepository;
17
import br.com.ec.repository.SistemaAbstractRepository;
18
 
19
@Repository
20
public class ProdutoRepositoryJpaImpl extends SistemaAbstractRepository<Produto> implements ProdutoRepository {
21
 
22
        @Override
23
        protected String getColunaOrdenadora() {
24
                return "modelo.descricao, estilo, cor, descricao";
25
        }
26
 
27
        @Override
28
        protected boolean adicionarDistinct() {
29
                return false;
30
        }
31
 
524 blopes 32
        @Override
33
        public Produto consultarProdutoPorCodigo(String codigoProduto) {
34
                StringBuilder sql = new StringBuilder();
35
                sql.append("SELECT e FROM Produto e ");
36
                sql.append("WHERE e.codigo = :codigo");
37
                try {
38
                        return getEntityManager().createQuery(sql.toString(), Produto.class).setParameter("codigo", codigoProduto).getSingleResult();
543 blopes 39
                } catch(NoResultException ex) {
40
                        throw new NegocioException("NÃO EXISTE PRODUTO COM ESTE CÓDIGO");
524 blopes 41
                } catch(Exception ex) {
42
                        ex.printStackTrace();
43
                        return null;
44
                }
45
        }
46
 
47
        @Override
48
        public ProdutoDTO consultarProdutoDTOPorCodigoOuEAN(String codigoOuEAN) {
49
                StringBuilder jpql = new StringBuilder();
50
                jpql.append("SELECT new br.com.ec.domain.dto.ProdutoDTO(");
619 blopes 51
                jpql.append(ProdutoDTO.CONSULTA_DTO_SIMPLES_COM_MODELO_E_SUBTIPO);
524 blopes 52
                jpql.append(") FROM Produto e ");
53
                jpql.append("WHERE 1=1 AND ");
54
                if (CodigoBarraEAN.validarCodigoBarras(codigoOuEAN)) {
55
                        jpql.append("e.codigoEAN = :codigoOuEAN");
56
                } else {
57
                        codigoOuEAN = ProdutoDTO.retornarCodigoProdutoPadrao(codigoOuEAN);
58
                        jpql.append("e.codigo = :codigoOuEAN");
59
                }
60
                try {
619 blopes 61
                        TypedQuery<ProdutoDTO> query = (TypedQuery<ProdutoDTO>) getEntityManager()
62
                                        .createQuery(jpql.toString(), ProdutoDTO.class)
63
                                        .setParameter("codigoOuEAN", codigoOuEAN);
524 blopes 64
                        return query.getSingleResult();
543 blopes 65
                } catch(NoResultException ex) {
66
                        throw new NegocioException("NÃO EXISTE PRODUTO COM ESTE CÓDIGO");
524 blopes 67
                } catch(Exception ex) {
68
                        ex.printStackTrace();
69
                        return null;
70
                }
71
        }
72
 
73
        @Override
74
        public List<CompraProdutoDTO> consultarComprasDoProduto(Long sequencialProduto) {
75
                StringBuilder jpql = new StringBuilder();
76
                jpql.append("SELECT new br.com.ec.domain.dto.CompraProdutoDTO(");
77
                jpql.append(CompraProdutoDTO.CONSULTA_DTO_COMPLETA);
78
                jpql.append(") FROM CompraProduto e ");
79
                jpql.append("WHERE 1=1 AND ");
80
                jpql.append("e.produto.sequencial = :sequencialProduto ");
81
                try {
82
                        jpql.append("ORDER BY e.compra.dataCompra DESC");
83
                        return getEntityManager().createQuery(jpql.toString(), CompraProdutoDTO.class)
84
                                        .setParameter("sequencialProduto", sequencialProduto)
85
                                        .getResultList();
86
                } catch(Exception ex) {
87
                        ex.printStackTrace();
88
                        return null;
89
                }
90
        }
91
 
575 blopes 92
        @Override
93
        public List<ProdutoDTO> consultarProdutosDoFornecedor(Long sequencialFornecedor) {
94
                StringBuilder jpql = new StringBuilder();
95
                jpql.append("SELECT new br.com.ec.domain.dto.ProdutoDTO(");
96
                jpql.append(ProdutoDTO.CONSULTA_DTO_SIMPLES_COM_MODELO);
97
                jpql.append(") FROM Produto e ");
98
                jpql.append("LEFT JOIN ");
99
                jpql.append("WHERE 1=1 ");
100
                jpql.append("AND e.produto.sequencial = :sequencialProduto ");
101
                jpql.append("AND EXISTS(SELECT fp FROM FornecedorProduto fp WHERE fp.fornecedor.sequencial = :sequencialFornecedor AND fp.produto.sequencial = e.sequencial) ");
102
                try {
103
                        jpql.append("ORDER BY e.descricao DESC");
104
                        return getEntityManager().createQuery(jpql.toString(), ProdutoDTO.class)
105
                                        .setParameter("sequencialFornecedor", sequencialFornecedor)
106
                                        .getResultList();
107
                } catch(Exception ex) {
108
                        ex.printStackTrace();
109
                        return null;
110
                }
111
        }
112
 
357 espaco 113
        /*
114
        @Override
115
        public List<Produto> consultarProdutoPorParametros(ParametrosConsultaProdutoDTO parametrosConsultaProduto) {
116
                StringBuilder sql = new StringBuilder();
117
                sql.append("SELECT DISTINCT e FROM Produto e ");
118
                sql.append("WHERE 1=1 ");
119
                try {
120
                        setarStringParametrosConsulta(sql, parametrosConsultaProduto);
121
                        sql.append("ORDER BY e.descricao");
122
                        TypedQuery<Produto> query = (TypedQuery<Produto>) getEntityManager().createQuery(sql.toString(), Produto.class);
123
                        setarQueryParametrosConsulta(query, parametrosConsultaProduto);
124
                        return query.getResultList();
125
                } catch(Exception ex) {
126
                        ex.printStackTrace();
127
                        return null;
128
                }
129
        }
130
 
131
        @Override
132
        public List<Produto> consultarCompativeis(Produto produto) {
133
                StringBuilder sql = new StringBuilder();
134
                sql.append("SELECT DISTINCT e FROM Produto e ");
135
                sql.append("WHERE e.sequencial = :sequencialProduto ");
136
                sql.append("OR e IN (SELECT pr.produtoRelacionado FROM ProdutoRelacionado pr WHERE pr.produto.sequencial = :sequencialProduto) ");
137
                sql.append("OR e IN (SELECT prr.produto FROM ProdutoRelacionado prr WHERE prr.produtoRelacionado.sequencial = :sequencialProduto) ");
138
                try {
139
                        sql.append("ORDER BY e.descricao");
140
                        TypedQuery<Produto> query = (TypedQuery<Produto>) getEntityManager().createQuery(sql.toString(), Produto.class);
141
                        query.setParameter("sequencialProduto", produto.getSequencial());
142
                        return query.getResultList();
143
                } catch(Exception ex) {
144
                        ex.printStackTrace();
145
                        return null;
146
                }
147
        }
148
 
149
        @Override
150
        public Produto detalharProduto(Produto produto) {
151
                StringBuilder jpql = new StringBuilder();
152
                jpql.append("SELECT p FROM Produto p ");
153
                jpql.append("LEFT JOIN FETCH p.pedidosCompra c ");
154
                jpql.append("LEFT JOIN FETCH p.fornecedores f ");
155
                jpql.append("LEFT JOIN FETCH p.relacionados r ");
156
                jpql.append("LEFT JOIN FETCH p.relacionadosReverse v ");
157
                jpql.append("WHERE p = :produto");
158
                return getEntityManager().createQuery(jpql.toString(), Produto.class).setParameter("produto", produto).getSingleResult();
159
        }
160
 
161
        @Override
162
        protected void setarStringParametrosConsultar(StringBuilder sql, Produto produto) {
163
                if (VerificadorUtil.naoEstaNulo(produto)) {
164
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigo())) {
165
                                sql.append("AND e.codigo = :codigo ");
166
                        }
167
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoRapido())) {
168
                                sql.append("AND e.codigoRapido = :codigoRapido ");
169
                        }
170
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEAN())) {
171
                                sql.append("AND e.codigoEAN = :codigoEAN ");
172
                        }
173
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getDescricao())) {
174
                                sql.append("AND ");
175
                                sql.append(sqlConsultarSemAcento("e.descricao"));
176
                                sql.append(" like upper(:descricao) ");
177
                        }
178
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getTipo())) {
179
                                sql.append("AND e.tipo = :tipoProduto ");
180
                        }
181
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getEstilo())) {
182
                                sql.append("AND e.estilo = :estilo ");
183
                        }
184
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCor())) {
185
                                sql.append("AND e.cor = :cor ");
186
                        }
187
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getGenero())) {
188
                                sql.append("AND e.genero = :tipoGenero ");
189
                        }
190
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getIndicadorOnline())) {
191
                                if (produto.getIndicadorOnline()) {
192
                                        sql.append("AND e.dataOnline IS NOT NULL ");
193
                                } else {
194
                                        sql.append("AND e.dataOnline IS NULL ");
195
                                }
196
                        }
197
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getIndicadorOnlineMercadoLivre())) {
198
                                if (produto.getIndicadorOnlineMercadoLivre()) {
199
                                        sql.append("AND e.dataOnlineMercadoLivre IS NOT NULL ");
200
                                } else {
201
                                        sql.append("AND e.dataOnlineMercadoLivre IS NULL ");
202
                                }
203
                        }
204
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getAtivo())) {
205
                                sql.append("AND e.indicadorAtivo = :indicadorAtivo ");
206
                        }
207
                        if (VerificadorUtil.naoEstaNulo(produto.getSequencialDoModelo())) {
208
                                sql.append("AND e.modelo.sequencial = :sequencialModelo ");
209
                        }
210
                        if (VerificadorUtil.naoEstaNulo(produto.getMarcaDoModelo())) {
211
                                sql.append("AND e.modelo.marca.sequencial = :sequencialMarcaDoModelo ");
212
                        }
213
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getSujeitoST())) {
214
                                sql.append("AND e.sujeitoST = :sujeitoST ");
215
                        }
216
                }
217
        }
218
 
219
        @Override
220
        protected void setarQueryParametrosConsultar(Query query, Produto produto) {
221
                if (VerificadorUtil.naoEstaNulo(produto)) {
222
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigo())) {
223
                                query.setParameter("codigo", produto.getCodigoProdutoPadrao());
224
                        }
225
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoRapido())) {
226
                                query.setParameter("codigoRapido", produto.getCodigoRapido());
227
                        }
228
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigoEAN())) {
229
                                query.setParameter("codigoEAN", produto.getCodigoEAN());
230
                        }
231
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getDescricao())) {
232
                                query.setParameter("descricao", "%" + removerAcentuacao(produto.getDescricao()) + "%");
233
                        }
234
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getTipo())) {
235
                                query.setParameter("tipoProduto", produto.getTipo());
236
                        }
237
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getEstilo())) {
238
                                query.setParameter("estilo", produto.getEstilo());
239
                        }
240
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCor())) {
241
                                query.setParameter("cor", produto.getCor());
242
                        }
243
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getGenero())) {
244
                                query.setParameter("tipoGenero", produto.getGenero());
245
                        }
246
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getAtivo())) {
247
                                query.setParameter("indicadorAtivo", produto.getAtivo());
248
                        }
249
                        if (VerificadorUtil.naoEstaNulo(produto.getSequencialDoModelo())) {
250
                                query.setParameter("sequencialModelo", produto.getSequencialDoModelo());
251
                        }
252
                        if (VerificadorUtil.naoEstaNulo(produto.getMarcaDoModelo())) {
253
                                query.setParameter("sequencialMarcaDoModelo", produto.getMarcaDoModelo().getSequencial());
254
                        }
255
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getSujeitoST())) {
256
                                query.setParameter("sujeitoST", produto.getSujeitoST());
257
                        }
258
                }
259
        }
260
 
261
        @Override
262
        protected void setarStringParametrosConsulta(StringBuilder sql, ParametrosConsulta<Produto> parametros) {
263
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getFiltro())) {
264
                        sql.append("AND (e.codigo = :filtro OR e.codigo = :filtroECCEAN OR e.codigoEAN = :filtroCEAN) ");
265
                }
266
                if (VerificadorUtil.naoEstaNulo(parametros.getEntidade())) {
267
                        verificarRestricoes(sql, parametros);
268
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigo())) {
269
                                sql.append("AND e.codigo = :codigo ");
270
                        }
271
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigoRapido())) {
272
                                sql.append("AND e.codigoRapido = :codigoRapido ");
273
                        }
274
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigoEAN())) {
275
                                if (CodigoBarraEAN.validarCodigoBarras(parametros.getEntidade().getCodigoEAN())) {
276
                                        sql.append("AND (e.codigoEAN = :codigoEAN OR e.codigo = :codigoBarras) ");
277
                                } else {
278
                                        sql.append("AND e.codigoEAN = :codigoEAN ");
279
                                }
280
                        }
281
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getDescricao())) {
282
                                sql.append("AND ");
283
                                sql.append(sqlConsultarSemAcento("e.descricao"));
284
                                sql.append(" like upper(:descricao) ");
285
                        }
286
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getTipo())) {
287
                                sql.append("AND e.tipo = :tipoProduto ");
288
                        }
289
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getEstilo())) {
290
                                sql.append("AND e.estilo = :estilo ");
291
                        }
292
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCor())) {
293
                                sql.append("AND e.cor = :cor ");
294
                        }
295
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getGenero())) {
296
                                sql.append("AND e.genero = :tipoGenero ");
297
                        }
298
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getIndicadorComissionado())) {
299
                                sql.append("AND e.indicadorComissionado = :indicadorComissionado ");
300
                        }
301
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getConsultarAtivo())) {
302
                                sql.append("AND e.ativo = :ativo ");
303
                        }
304
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getConsultarOnline())) {
305
                                if (((ParametrosConsultaProdutoDTO)parametros).getConsultarOnline().equals(1)) {
306
                                        sql.append("AND e.dataOnline IS NOT NULL ");
307
                                } else if (((ParametrosConsultaProdutoDTO)parametros).getConsultarOnline().equals(2)) {
308
                                        sql.append("AND e.dataOnline IS NULL ");
309
                                }
310
                        }
311
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getConsultarOnlineMercadoLivre())) {
312
                                if (((ParametrosConsultaProdutoDTO)parametros).getConsultarOnlineMercadoLivre().equals(1)) {
313
                                        sql.append("AND e.dataOnlineMercadoLivre IS NOT NULL ");
314
                                } else if (((ParametrosConsultaProdutoDTO)parametros).getConsultarOnlineMercadoLivre().equals(2)) {
315
                                        sql.append("AND e.dataOnlineMercadoLivre IS NULL ");
316
                                }
317
                        }
318
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getModelo())) {
319
                                sql.append("AND e.modelo.sequencial = :sequencialModelo ");
320
                        }
321
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getMarca())) {
322
                                sql.append("AND e.modelo.marca.sequencial = :sequencialMarcaDoModelo ");
323
                        }
324
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getFornecedor())) {
325
                                sql.append("AND EXISTS(SELECT fp FROM FornecedorProduto fp WHERE fp.fornecedor.sequencial = :sequencialFornecedor AND fp.produto.sequencial = e.sequencial) ");
326
                        }
327
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getIndicadorModeloFavorito())) {
328
                                sql.append("AND e.modelo.indicadorFavorito = :indicadorFavorito ");
329
                        }
330
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getSujeitoST())) {
331
                                sql.append("AND e.sujeitoST = :sujeitoST ");
332
                        }
333
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getTributacao())) {
334
                                sql.append("AND e.tributacao = :tributacao ");
335
                        }
336
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getLojaSelecionadaParaContagem())) {
337
                                sql.append("AND e.modelo is not null ");
338
                                sql.append("AND EXISTS(SELECT pl FROM ProdutoLoja pl WHERE ");
339
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getLocalizacaoLojaSelecionada())) {
340
                                        sql.append("pl.localizacao like upper(:localizacao) AND ");
341
                                }
342
                                if (!((ParametrosConsultaProdutoDTO)parametros).getContagemObrigatoria()) {
343
                                        verificarSeNaoHaTransferenciasDoProduto(sql);
344
                                        // PRODUTOS SEM PREPARACAO DE CONTAGEM
345
                                        // OU (
346
                                                // PRODUTOS PREPARADOS POR OUTROS
347
                                                // AND (
348
                                                        // COM INDICAÇÃO DE CONTAGEM SOLICITADA
349
                                                        // OU
350
                                                        // COM PREPARAÇÃO POSTERIOR AO DA CONTAGEM
351
                                                        // OU
352
                                                        // COM CONTAGENS FINALIZADAS POR MAIS DE 60 DIAS
353
                                                // )
354
                                        // )
355
                                        sql.append("AND (");
356
                                                sql.append("pl.usuarioUltimaContagemPreparacao.sequencial IS NULL ");
357
                                                sql.append("OR (");
358
                                                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getUsuarioParaContagem())) {
359
                                                                sql.append("pl.usuarioUltimaContagemPreparacao != :usuarioParaContagem ");
360
                                                        } else {
361
                                                                sql.append("pl.usuarioUltimaContagemPreparacao != null ");
362
                                                        }
363
                                                        sql.append(") ");
364
                                                        // CONTAR PRODUTOS COM DATA DE CONTAGEM ACIMA DE 60 DIAS
365
//                                                      sql.append("OR ");
366
//                                                      sql.append("(date_part('day', now() - pl.dataContagem) >= ").append(ConstantesSEC.StatusContagem.CONTAGEM_VERMELHO_60_DIAS).append(") ");
367
                                                sql.append(") ");
368
//                                      sql.append("AND (pl.dataContagem IS NULL OR pl.dataContagemPreparacao > pl.dataContagem) ");
369
                                        sql.append("AND (pl.produto.modelo.marca.dataContagemSolicitada > pl.dataContagem) ");
370
                                        sql.append("AND (");
371
                                                sql.append("(pl.quantidadeEstoque != 0 AND ");
372
                                                sql.append("(pl.indicadorContagemSolicitada IS TRUE OR pl.produto.modelo.marca.indicadorContagemSolicitada IS TRUE) ");
373
                                        sql.append(") ");
374
                                        if (ConstantesSEC.FORMATO_CONTAGEM.equals(ConstantesSEC.ContagemFormato.FORMATO_CONTAGEM_POR_PERIODO_1)) {
375
                                                sql.append("AND (date_part('day', now() - pl.dataContagem) >= ").append(ConstantesSEC.StatusContagem.CONTAGEM_VERMELHO_60_DIAS);
376
                                                sql.append(" OR pl.dataContagem IS NULL)) ");
377
                                        } else if (ConstantesSEC.FORMATO_CONTAGEM.equals(ConstantesSEC.ContagemFormato.FORMATO_CONTAGEM_POR_MARCA_2)) {}
378
                                        sql.append("AND (");
379
                                }
380
                                sql.append("pl.produto.sequencial = e.sequencial AND pl.loja.sequencial = ");
381
                                sql.append(((ParametrosConsultaProdutoDTO)parametros).getLojaSelecionadaParaContagem().getSequencial());
382
                                sql.append("))) ");
383
                        }
384
                        /*
385
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getLojaSelecionadaParaContagem())) {
386
                                sql.append("AND e.modelo is not null ");
387
                                sql.append("AND EXISTS(SELECT pl FROM ProdutoLoja pl WHERE ");
388
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getLocalizacaoLojaSelecionada())) {
389
                                        sql.append("pl.localizacao like upper(:localizacao) AND ");
390
                                }
391
                                if (!((ParametrosConsultaProdutoDTO)parametros).getContagemObrigatoria()) {
392
                                        verificarSeNaoHaTransferenciasDoProduto(sql);
393
 
394
                                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getUsuarioParaContagem())) {
395
                                                sql.append("AND (");
396
                                                sql.append("(pl.usuarioUltimaContagemPreparacao != :usuarioParaContagem ");
397
                                                sql.append("AND pl.indicadorContagemSolicitada IS TRUE) ");
398
                                                sql.append("OR (pl.usuarioUltimaContagemPreparacao != :usuarioParaContagem ");
399
                                                sql.append("AND (pl.dataContagem IS NULL ");
400
                                                sql.append("OR pl.dataContagem < pl.dataContagemPreparacao)) ");
401
                                                sql.append("OR pl.usuarioUltimaContagemPreparacao.sequencial IS NULL ");
402
                                                sql.append(") ");
403
                                        }
404
 
405
                                        sql.append("AND (pl.indicadorContagemSolicitada IS TRUE ");
406
                                        sql.append("OR (pl.quantidadeEstoque != 0 AND ");
407
                                        if (ConstantesSEC.FORMATO_CONTAGEM.equals(ConstantesSEC.ContagemFormato.FORMATO_CONTAGEM_POR_PERIODO_1)) {
408
                                                sql.append("(date_part('day', now() - pl.dataContagem) >= ").append(ConstantesSEC.StatusContagem.CONTAGEM_VERMELHO_60_DIAS);
409
                                                sql.append(" OR pl.dataContagem IS NULL)) ");
410
                                        } else if (ConstantesSEC.FORMATO_CONTAGEM.equals(ConstantesSEC.ContagemFormato.FORMATO_CONTAGEM_POR_MARCA_2)) {
411
                                                sql.append("pl.produto.modelo.marca.indicadorContagemSolicitada IS TRUE AND ");
412
                                        }
413
                                        sql.append("(pl.dataContagem IS NULL OR pl.dataContagemPreparacao IS NULL OR pl.dataContagem < pl.dataContagemPreparacao)) ");
414
                                        sql.append(") AND (");
415
                                }
416
                                sql.append("pl.produto.sequencial = e.sequencial AND pl.loja.sequencial = ");
417
                                sql.append(((ParametrosConsultaProdutoDTO)parametros).getLojaSelecionadaParaContagem().getSequencial());
418
                                sql.append("))) ");
419
                        }
420
                        */
421
/*     
422
                }
423
        }
424
 
425
        private void verificarSeNaoHaTransferenciasDoProduto(StringBuilder sql) {
426
                sql.append("NOT EXISTS(SELECT (tp) FROM TransferenciaProduto tp ");
427
                sql.append("WHERE tp.produto.sequencial = pl.produto.sequencial ");
428
                sql.append("AND tp.transferencia.dataFinalizacao IS NULL ");
429
                sql.append("AND (tp.transferencia.lojaEntrada.sequencial = pl.loja.sequencial ");
430
                sql.append("OR tp.transferencia.lojaSaida.sequencial = pl.loja.sequencial)) ");
431
        }
432
 
433
        @Override
434
        protected void setarQueryParametrosConsulta(Query query, ParametrosConsulta<Produto> parametros) {
435
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getFiltro())) {
436
                        query.setParameter("filtro", String.format("%06d", new Long(parametros.getFiltro().trim())));
437
                        if (CodigoBarraEAN.validarCodigoBarras(parametros.getFiltro())) {
438
                                String codigoRetornado = CodigoBarraEAN.retornarCodigoDoCodigoBarras(parametros.getFiltro());
439
                                query.setParameter("filtroECCEAN", String.format("%06d", new Long(codigoRetornado.trim())));
440
                        } else {
441
                                query.setParameter("filtroECCEAN", String.format("%06d", new Long(parametros.getFiltro().trim())));    
442
                        }
443
                        query.setParameter("filtroCEAN", parametros.getFiltro().trim());
444
                }
445
                if (VerificadorUtil.naoEstaNulo(parametros.getEntidade())) {
446
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigo())) {
447
                                query.setParameter("codigo", parametros.getEntidade().getCodigoProdutoPadrao());
448
                        }
449
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigoRapido())) {
450
                                query.setParameter("codigoRapido", parametros.getEntidade().getCodigoRapido());
451
                        }
452
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCodigoEAN())) {
453
                                if (CodigoBarraEAN.validarCodigoBarras(parametros.getEntidade().getCodigoEAN())) {
454
                                        query.setParameter("codigoBarras", CodigoBarraEAN.retornarCodigoDoCodigoBarras(parametros.getEntidade().getCodigoEAN()));
455
                                }
456
                                query.setParameter("codigoEAN", parametros.getEntidade().getCodigoEAN());
457
                        }
458
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getDescricao())) {
459
                                query.setParameter("descricao", "%" + removerAcentuacao(parametros.getEntidade().getDescricao()) + "%");
460
                        }
461
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getTipo())) {
462
                                query.setParameter("tipoProduto", parametros.getEntidade().getTipo());
463
                        }
464
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getEstilo())) {
465
                                query.setParameter("estilo", parametros.getEntidade().getEstilo());
466
                        }
467
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getCor())) {
468
                                query.setParameter("cor", parametros.getEntidade().getCor());
469
                        }
470
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getGenero())) {
471
                                query.setParameter("tipoGenero", parametros.getEntidade().getGenero());
472
                        }
473
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getEntidade().getIndicadorComissionado())) {
474
                                query.setParameter("indicadorComissionado", parametros.getEntidade().getIndicadorComissionado());
475
                        }
476
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getConsultarAtivo())) {
477
                                query.setParameter("ativo", ((ParametrosConsultaProdutoDTO)parametros).getConsultarAtivo() == 1 );
478
                        }
479
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getModelo())) {
480
                                query.setParameter("sequencialModelo", ((ParametrosConsultaProdutoDTO)parametros).getModelo().getSequencial());
481
                        }
482
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getMarca())) {
483
                                query.setParameter("sequencialMarcaDoModelo", ((ParametrosConsultaProdutoDTO)parametros).getMarca().getSequencial());
484
                        }
485
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getFornecedor())) {
486
                                query.setParameter("sequencialFornecedor", ((ParametrosConsultaProdutoDTO)parametros).getFornecedor().getSequencial());
487
                        }
488
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getIndicadorModeloFavorito())) {
489
                                query.setParameter("indicadorFavorito", ((ParametrosConsultaProdutoDTO)parametros).getIndicadorModeloFavorito());
490
                        }
491
                        if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getSujeitoST())) {
492
                                query.setParameter("sujeitoST", ((ParametrosConsultaProdutoDTO)parametros).getSujeitoST());
493
                        }
494
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getTributacao())) {
495
                                query.setParameter("tributacao", ((ParametrosConsultaProdutoDTO)parametros).getTributacao());
496
                        }
497
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getLojaSelecionadaParaContagem())) {
498
                                if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaProdutoDTO)parametros).getLocalizacaoLojaSelecionada())) {
499
                                        query.setParameter("localizacao", "%" + ((ParametrosConsultaProdutoDTO)parametros).getLocalizacaoLojaSelecionada() + "%");
500
                                }
501
                        }
502
                        if (((ParametrosConsultaProdutoDTO)parametros).getIndicadorProdutosSemVendas()) {
503
                                query.setParameter("dataInicialSemVendas", DataUtils.getDataComHorarioMinimo(((ParametrosConsultaProdutoDTO)parametros).getDataInicialSemVendas()));
504
                                query.setParameter("dataFinalSemVendas", DataUtils.getDataComHorarioMaximo(((ParametrosConsultaProdutoDTO)parametros).getDataFinalSemVendas()));
505
                        }
506
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametros).getUsuarioParaContagem())) {
507
                                query.setParameter("usuarioParaContagem", ((ParametrosConsultaProdutoDTO)parametros).getUsuarioParaContagem());
508
                        }
509
                }
510
        }
511
 
512
        private void verificarRestricoes(StringBuilder sql, ParametrosConsulta<Produto> parametrosConsulta) {
513
                clonarProdutoParaAlteracaoParaConsulta(parametrosConsulta);
514
                prepararVerificacoesRestricoes(parametrosConsulta);
515
 
516
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.GERAL.getValor())) {
517
                        sql.append("AND e.modelo.ativo is true ");
518
                }
519
 
520
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.PRODUTOS_COM_ESTOQUE.getValor())) {
521
                        adicionarSqlProdutoComEstoque(sql, parametrosConsulta);
522
                }
523
 
524
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.PELICULAS_SEM_ESTOQUE.getValor())) {
525
                        sql.append("AND e.modelo.ativo is true ");
526
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).getProduto().setTipo(TipoProduto.PELICULA.getValor());
527
                        setarParametrosSemEstoquePorPonto(sql, parametrosConsulta);
528
                }
529
 
530
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.PRODUTOS_SEM_ESTOQUE.getValor())) {
531
                        sql.append("AND e.modelo.ativo is true ");
532
                        setarParametrosSemEstoquePorPonto(sql, parametrosConsulta);
533
                }
534
 
535
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.RETIRAR_SITE.getValor())) {
536
                        // RETIRAR DO SITE: SEM ESTOQUE NA MATRIZ, JATIÚCA OU MACEIÓ, EXCETO TPU SOFT
537
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionada(ConstantesSEC.SEQUENCIAL_MATRIZ_ESTOQUE_9);
538
                        setarParametrosSemEstoquePorPonto(sql, parametrosConsulta);
539
                        sql.append("AND e.descricao NOT LIKE '%TPU SOFT%' ");
540
                        sql.append("AND (NOT EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque > 0 ");
541
                        sql.append("AND p.produto.sequencial = e.sequencial ");
542
                        sql.append("AND p.loja.sequencial IN (");
543
                        sql.append(ConstantesSEC.SEQUENCIAL_MATRIZ_ESTOQUE_9);
544
                        sql.append(", ");
545
                        sql.append(ConstantesSEC.SEQUENCIAL_QUIOSQUE_BIG_JATIUCA_6);
546
                        sql.append(", ");
547
                        sql.append(ConstantesSEC.SEQUENCIAL_LOJA_MACEIO_8);
548
                        sql.append("))) ");
549
//                      sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
550
//                      sql.append(") AND (SELECT SUM(p.quantidadeEstoque) AS estoque FROM ProdutoLoja p WHERE p.produto.sequencial = e.sequencial) < 2) ");
551
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarOnline(1);;
552
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(null);
553
                }
554
 
555
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.ESTOQUE_INVALIDO.getValor())) {
556
                        sql.append("AND EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque < 0 ");
557
                        sql.append("AND p.produto.sequencial = e.sequencial");
558
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
559
                                sql.append(" AND p.loja.sequencial = ");
560
                                sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
561
                        }
562
                        sql.append(") ");
563
                }
564
 
565
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.ESTOQUE_NAO_FAVORITO.getValor())) {
566
                        sql.append("AND EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque > 0 ");
567
                        sql.append("AND p.produto.modelo.indicadorFavorito IS FALSE ");
568
                        sql.append("AND p.produto.sequencial = e.sequencial ");
569
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
570
                                sql.append("AND p.loja.sequencial = ");
571
                                sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
572
                        }
573
                        sql.append(") ");
574
                }
575
 
576
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.CONTAGENS_PENDENTES.getValor())) {
577
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
578
                                ((ParametrosConsultaProdutoDTO)parametrosConsulta).setLojaSelecionadaParaContagem(new Loja(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada()));
579
                        }
580
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).setConsultarAtivo(1);
581
                }
582
 
583
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getTipoRelatorioProduto().equals(TipoRelatorio.PROMOCOES.getValor())) {
584
                        sql.append("AND e.valorVarejoPromocional is not null ");
585
                        sql.append("AND e.valorVarejoPromocional > 0 ");
586
                }
587
 
588
                if (((ParametrosConsultaProdutoDTO)parametrosConsulta).getIndicadorProdutosSemVendas()) {
589
                        sql.append("AND NOT EXISTS(SELECT l FROM Lancamento l WHERE l.produto.sequencial = e.sequencial ");
590
                        sql.append("AND l.venda.dataVenda >= :dataInicialSemVendas AND l.venda.dataVenda <= :dataFinalSemVendas ");
591
                        if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
592
                                sql.append(" AND l.venda.loja.sequencial = ");
593
                                sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
594
                        }
595
                        sql.append(") ");
596
                }
597
        }
598
 
599
        private void adicionarSqlProdutoComEstoque(StringBuilder sql, ParametrosConsulta<Produto> parametrosConsulta) {
600
                sql.append("AND EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque > 0 ");
601
                sql.append("AND p.produto.sequencial = e.sequencial");
602
                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
603
                        sql.append(" AND p.loja.sequencial = ");
604
                        sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
605
                }
606
                sql.append(") ");
607
        }
608
 
609
        private void clonarProdutoParaAlteracaoParaConsulta(ParametrosConsulta<Produto> parametrosConsulta) {
610
                try {
611
                        ((ParametrosConsultaProdutoDTO)parametrosConsulta).setProduto(((ParametrosConsultaProdutoDTO)parametrosConsulta).getProduto().clone());
612
                } catch (CloneNotSupportedException e) {
613
                        e.printStackTrace();
614
                }
615
        }
616
 
617
        private void prepararVerificacoesRestricoes(ParametrosConsulta<Produto> parametrosConsulta) {
618
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).getProduto().setIndicadorOnline(null);
619
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).getProduto().setIndicadorOnlineMercadoLivre(null);
620
                ((ParametrosConsultaProdutoDTO)parametrosConsulta).getProduto().setDataOnline(null);
621
        }
622
 
623
        private void setarParametrosSemEstoquePorPonto(StringBuilder sql, ParametrosConsulta<Produto> parametrosConsulta) {
624
                sql.append("AND NOT EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque > 0 ");
625
                sql.append("AND p.produto.sequencial = e.sequencial");
626
                if (VerificadorUtil.naoEstaNulo(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada())) {
627
                        sql.append(" AND p.loja.sequencial = ");
628
                        sql.append(((ParametrosConsultaProdutoDTO)parametrosConsulta).getLojaSelecionada());
629
                }
630
                sql.append(") ");
631
        }
524 blopes 632
 
357 espaco 633
        @Override
634
        public Produto consultarProdutoPorCodigoEAN(String codigoEAN) {
635
                StringBuilder sql = new StringBuilder();
636
                sql.append("SELECT e FROM Produto e ");
637
                sql.append("WHERE e.codigoEAN = :codigoEAN");
638
                if (CodigoBarraEAN.validarCodigoBarras(codigoEAN)) {
639
                        sql.append(" OR e.codigo = :codigoBarras");
640
                }
641
                try {
642
                        Query query = getEntityManager().createQuery(sql.toString(), Produto.class).setParameter("codigoEAN", codigoEAN);
643
                        if (CodigoBarraEAN.validarCodigoBarras(codigoEAN)) {
644
                                query.setParameter("codigoBarras", CodigoBarraEAN.retornarCodigoDoCodigoBarras(codigoEAN));
645
                        }
646
                        return (Produto) query.getSingleResult();
647
                } catch(Exception ex) {
648
                        ex.printStackTrace();
649
                        return null;
650
                }
651
        }
462 blopes 652
 
357 espaco 653
        @Override
654
        public Produto consultarProdutoPorCodigoRapido(String codigoRapido) {
655
                StringBuilder sql = new StringBuilder();
656
                sql.append("SELECT e FROM Produto e ");
657
                sql.append("WHERE e.codigoRapido = :codigoRapido");
658
                try {
659
                        return getEntityManager().createQuery(sql.toString(), Produto.class).setParameter("codigoRapido", codigoRapido).getSingleResult();
660
                } catch(Exception ex) {
661
                        ex.printStackTrace();
662
                        return null;
663
                }
664
        }
665
 
666
        @Override
667
        public Long consultarUltimoCodigo() {
668
                StringBuilder sql = new StringBuilder();
669
                sql.append("SELECT MAX(CAST(coalesce(p.cod_produto, '0') AS integer)) ");
670
                sql.append("FROM sc_sec.sec_produto p ");
671
                sql.append("WHERE p.cod_produto not like '000000'");
672
                try {
673
                        return new Long(getEntityManager().createNativeQuery(sql.toString()).getSingleResult().toString());
674
                } catch(Exception ex) {
675
                        ex.printStackTrace();
676
                        return null;
677
                }
678
        }
679
 
680
        @Override
681
        public Integer quantidadeTotalEstoque(Loja loja) {
682
                StringBuilder sql = new StringBuilder();
683
                sql.append("SELECT SUM(e.quantidadeEstoque) FROM ProdutoLoja e WHERE e.produto.codigo != '000000'");
684
                if (VerificadorUtil.naoEstaNulo(loja)) {
685
                        sql.append(" AND e.loja.sequencial = :sequencialLoja");
686
                }
687
                try {
688
                        Long quantidadeTotal = new Long(0);
689
                        TypedQuery<Long> query =  getEntityManager().createQuery(sql.toString(), Long.class);
690
                        if (VerificadorUtil.naoEstaNulo(loja)) {
691
                                query.setParameter("sequencialLoja", loja.getSequencial());
692
                        }
693
                        quantidadeTotal = query.getSingleResult();
694
                        if (VerificadorUtil.naoEstaNulo(quantidadeTotal)) {
695
                                return quantidadeTotal.intValue();
696
                        }
697
                        return 0;
698
                } catch(Exception ex) {
699
                        ex.printStackTrace();
700
                        return 0;
701
                }
702
        }
703
 
704
 
524 blopes 705
 
357 espaco 706
        @Override
707
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta) {
708
                StringBuilder sql = new StringBuilder("SELECT SUM(pl.quantidadeEstoque) FROM ProdutoLoja pl WHERE pl.produto.codigo != '000000'");
709
                try {
710
                        setarStringParametrosConsulta(sql, parametrosConsulta);
711
                        String sqlAlterado = sql.toString().replace(" e.", " pl.produto.").replace("(e.", "(pl.produto.");
712
                        TypedQuery<Long> query = getEntityManager().createQuery(sqlAlterado, Long.class);
713
                        setarQueryParametrosConsulta(query, parametrosConsulta);
714
                        Long quantidade = query.getSingleResult();
715
                        if (VerificadorUtil.naoEstaNulo(quantidade)) {
716
                                return quantidade.intValue();
717
                        }
718
                        return 0;
719
                } catch(Exception ex) {
720
                        ex.printStackTrace();
721
                        return 0;
722
                }
723
        }
724
 
725
        @Override
726
        public Integer quantidadeEstoque(ParametrosConsultaProdutoDTO parametrosConsulta, Long sequencialLoja) {
727
                StringBuilder sql = new StringBuilder("SELECT SUM(pl.quantidadeEstoque) FROM ProdutoLoja pl WHERE pl.produto.codigo != '000000'");
728
                try {
729
                        setarStringParametrosConsulta(sql, parametrosConsulta);
730
                        sql.append("AND pl.loja.sequencial = :sequencialLoja ");
731
                        String sqlAlterado = sql.toString().replace(" e.", " pl.produto.").replace("(e.", "(pl.produto.");
732
                        TypedQuery<Long> query = getEntityManager().createQuery(sqlAlterado, Long.class);
733
                        setarQueryParametrosConsulta(query, parametrosConsulta);
734
                        query.setParameter("sequencialLoja", sequencialLoja);
735
                        Long quantidade = query.getSingleResult();
736
                        if (VerificadorUtil.naoEstaNulo(quantidade)) {
737
                                return quantidade.intValue();
738
                        }
739
                        return 0;
740
                } catch(Exception ex) {
741
                        ex.printStackTrace();
742
                        return 0;
743
                }
744
        }
745
*/     
746
        /*
747
        @Override
748
        public Integer quantidadeContagens(Long sequencialLoja) {
749
                StringBuilder sql = new StringBuilder("SELECT COUNT(pl) FROM ProdutoLoja pl WHERE pl.loja.sequencial = :sequencialLoja");
750
                try {
751
                        sql.append(" AND (");
752
                        sql.append("SELECT COUNT(*) FROM TransferenciaProduto tp ");
753
                        sql.append("WHERE tp.produto = pl.produto AND tp.transferencia.dataFinalizacao is null ");
754
                        sql.append("AND (tp.transferencia.lojaSaida.sequencial = :sequencialLoja OR tp.transferencia.lojaEntrada.sequencial = :sequencialLoja)");
755
                        sql.append(")=0 ");
756
                        sql.append(" AND (");
757
                        sql.append("(pl.indicadorContagemSolicitada IS TRUE)");
758
                        sql.append(" OR ");
759
                        sql.append("(pl.quantidadeEstoque != 0");
760
                        sql.append(" AND (date_part('day', now() - pl.dataContagem) >= ").append(ConstantesSEC.StatusContagem.CONTAGEM_VERMELHO_60_DIAS);
761
                        sql.append(" OR pl.dataContagem is null)))");
762
 
763
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
764
                        query.setParameter("sequencialLoja", sequencialLoja);
765
                        Long quantidade = query.getSingleResult();
766
                        if (VerificadorUtil.naoEstaNulo(quantidade)) {
767
                                return quantidade.intValue();
768
                        }
769
                        return 0;
770
                } catch(Exception ex) {
771
                        ex.printStackTrace();
772
                }
773
                return 0;
774
        }
775
        */
776
/*             
777
 
778
        @Override
779
        public Date dataUltimaVenda(Produto produto) {
780
                StringBuilder sql = new StringBuilder();
781
                sql.append("SELECT MAX(e.dataVenda) FROM Venda e ");
782
                sql.append("LEFT JOIN e.listaLancamentos l ");
783
                sql.append("WHERE l.ativo IS TRUE ");
784
                sql.append("AND l.produto.sequencial = :sequencialProduto ");
785
                try {
786
                        TypedQuery<Date> query = getEntityManager().createQuery(sql.toString(), Date.class);
787
                        query.setParameter("sequencialProduto", produto.getSequencial());
788
                        return query.getSingleResult();
789
                } catch(Exception ex) {
790
                        ex.printStackTrace();
791
                }
792
                return null;
793
        }
794
 
795
        @Override
796
        public Integer quantidadeProdutosAdicionadosSite(Date dataInicial, Date dataFinal) {
797
                StringBuilder sql = new StringBuilder();
798
                sql.append("SELECT COUNT(p) FROM Produto p ");
799
                sql.append("WHERE p.dataOnline >= :dataInicial AND p.dataOnline <= :dataFinal ");
800
                try {
801
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
802
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
803
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
804
                        return query.getSingleResult().intValue();
805
                } catch(Exception ex) {
806
                        ex.printStackTrace();
807
                }
808
                return null;
809
        }
810
 
811
        @Override
812
        public Integer quantidadeProdutosOnline() {
813
                StringBuilder sql = new StringBuilder();
814
                sql.append("SELECT COUNT(p) FROM Produto p ");
815
                sql.append("WHERE p.dataOnline IS NOT NULL ");
816
                try {
817
                        return getEntityManager().createQuery(sql.toString(), Long.class).getSingleResult().intValue();
818
                } catch(Exception ex) {
819
                        ex.printStackTrace();
820
                }
821
                return null;
822
        }
823
 
824
        @Override
825
        public Integer quantidadeProdutosFavoritosOffline(Loja loja) {
826
                StringBuilder sql = new StringBuilder();
827
                sql.append("SELECT COUNT(e) FROM Produto e ");
828
                sql.append("WHERE e.dataOnline IS NULL AND e.modelo.indicadorFavorito IS TRUE ");
829
                sql.append("AND EXISTS(SELECT p FROM ProdutoLoja p WHERE p.quantidadeEstoque > 0 ");
830
                sql.append("AND p.produto.sequencial = e.sequencial ");
831
                if (VerificadorUtil.naoEstaNulo(loja)) {
832
                        sql.append("AND p.loja.sequencial = :sequencialLoja");
833
                }
834
                sql.append(") ");
835
                try {
836
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
837
                        if (VerificadorUtil.naoEstaNulo(loja)) {
838
                                query.setParameter("sequencialLoja", loja.getSequencial());
839
                        }
840
                        return query.getSingleResult().intValue();
841
                } catch(Exception ex) {
842
                        ex.printStackTrace();
843
                }
844
                return null;
845
        }
846
 
847
        @Override
848
        public List<ProdutoHistoricoDTO> consultarHistoricoDeEntradas(Produto produto, Loja loja, Date dataInicial, Date dataFinal) {
849
                List<ProdutoHistoricoDTO> historico = new ArrayList<ProdutoHistoricoDTO>();
850
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.COMPRAS.getValor(), loja));
851
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.CONTAGENS_ENTRADA.getValor(), loja));
852
                return historico;
853
        }
854
 
855
        @Override
856
        public List<ProdutoHistoricoDTO> consultarHistoricoDeSaidas(Produto produto, Loja loja, Date dataInicial, Date dataFinal) {
857
                List<ProdutoHistoricoDTO> historico = new ArrayList<ProdutoHistoricoDTO>();
858
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.VENDAS.getValor(), loja));
859
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.AVARIAS.getValor(), loja));
860
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.TROCAS.getValor(), loja));
861
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.CONTAGENS_SAIDA.getValor(), loja));
862
                return historico;
863
        }
864
 
865
        @Override
866
        public List<ProdutoHistoricoDTO> consultarHistorico(Produto produto, Date dataInicial, Date dataFinal) {
867
                List<ProdutoHistoricoDTO> historico = new ArrayList<ProdutoHistoricoDTO>();
868
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.COMPRAS.getValor(), null));
869
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.VENDAS.getValor(), null));
870
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.AVARIAS.getValor(), null));
871
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.TROCAS.getValor(), null));
872
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.DEVOLUCOES.getValor(), null));
873
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.CONTAGENS_ENTRADA.getValor(), null));
874
                historico.addAll(consultarHistoricoProduto(produto, dataInicial, dataFinal, TipoLancamentoHistorico.CONTAGENS_SAIDA.getValor(), null));
875
                return historico;
876
        }
877
 
878
        private List<ProdutoHistoricoDTO> consultarHistoricoProduto(Produto produto, Date dataInicial, Date dataFinal, String tipoLancamento, Loja loja) {
879
                StringBuilder sql = new StringBuilder();
880
                sql.append("SELECT ");
881
                sql.append("new br.com.ec.domain.dto.ProdutoHistoricoDTO(e.produto, ");
882
                sql.append("'" + (DataUtils.obterCalendario(dataInicial).get(Calendar.MONTH)+1) + "', ");
883
                sql.append("'" + DataUtils.obterCalendario(dataInicial).get(Calendar.YEAR) + "', ");
884
 
885
                if (tipoLancamento.equals(TipoLancamentoHistorico.VENDAS.getValor())) {
886
                        sql.append("SUM(e.valorVenda), COUNT(e.produto), ");
887
                        sql.append("'" + tipoLancamento + "') ");
888
                        sql.append("FROM Lancamento e ");
889
                        sql.append("WHERE e.venda.dataVenda >= :dataInicial AND e.venda.dataVenda <= :dataFinal ");
890
                        if (VerificadorUtil.naoEstaNulo(loja)) {
891
                                sql.append("AND e.venda.loja <= :loja ");
892
                        }
893
                }
894
 
895
                if (tipoLancamento.equals(TipoLancamentoHistorico.COMPRAS.getValor())) {
896
                        sql.append("MAX(e.valorCompra), SUM(e.quantidade), ");
897
                        sql.append("'" + tipoLancamento + "') ");
898
                        sql.append("FROM CompraProduto e ");
899
                        sql.append("WHERE e.compra.dataCompra >= :dataInicial AND e.compra.dataCompra <= :dataFinal ");
900
                        if (VerificadorUtil.naoEstaNulo(loja)) {
901
                                sql.append("AND e.compra.loja <= :loja ");
902
                        }
903
                }
904
 
905
                if (tipoLancamento.equals(TipoLancamentoHistorico.AVARIAS.getValor())) {
906
                        sql.append(sqlAuditoria(tipoLancamento, TipoEstoqueAuditoria.AVARIA.getValor(), loja));
907
                }
908
 
909
                if (tipoLancamento.equals(TipoLancamentoHistorico.TROCAS.getValor())) {
910
                        sql.append(sqlAuditoria(tipoLancamento, TipoEstoqueAuditoria.TROCA.getValor(), loja));
911
                }
912
 
913
                if (tipoLancamento.equals(TipoLancamentoHistorico.DEVOLUCOES.getValor())) {
914
                        sql.append(sqlAuditoria(tipoLancamento, TipoEstoqueAuditoria.DEVOLUCAO.getValor(), loja));
915
                }
916
 
917
                if (tipoLancamento.equals(TipoLancamentoHistorico.CONTAGENS_ENTRADA.getValor())) {
918
                        sql.append(sqlAuditoria(tipoLancamento, TipoEstoqueAuditoria.CONTAGEM.getValor(), loja));
919
                        sql.append("AND e.quantidadeEstoqueAnterior < e.quantidadeEstoqueNovo ");
920
                }
921
 
922
                if (tipoLancamento.equals(TipoLancamentoHistorico.CONTAGENS_SAIDA.getValor())) {
923
                        sql.append(sqlAuditoria(tipoLancamento, TipoEstoqueAuditoria.CONTAGEM.getValor(), loja));
924
                        sql.append("AND e.quantidadeEstoqueAnterior > e.quantidadeEstoqueNovo ");
925
                }
926
 
927
                if (VerificadorUtil.naoEstaNulo(produto)) {
928
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getSequencial())) {
929
                                sql.append("AND e.produto.sequencial = :sequencialProduto ");
930
                        }
931
                }
932
                sql.append("GROUP BY e.produto ");
933
                try {
934
                        TypedQuery<ProdutoHistoricoDTO> query = getEntityManager().createQuery(sql.toString(), ProdutoHistoricoDTO.class);
935
                        if (VerificadorUtil.naoEstaNulo(loja)) {
936
                                query.setParameter("dataInicial", dataInicial);
937
                                query.setParameter("dataFinal", dataFinal);
938
                        } else {
939
                                query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
940
                                query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
941
                        }
942
                        if (VerificadorUtil.naoEstaNulo(produto)) {
943
                                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getSequencial())) {
944
                                        query.setParameter("sequencialProduto", produto.getSequencial());
945
                                }
946
                                if (VerificadorUtil.naoEstaNulo(loja)) {
947
                                        query.setParameter("loja", loja);
948
                                }
949
                        }
950
                        return query.getResultList();
951
                } catch(Exception ex) {
952
                        ex.printStackTrace();
953
                        return null;
954
                }
955
        }
956
 
957
        private String sqlAuditoria(String tipoLancamento, String tipoEstoqueAuditoria, Loja loja) {
958
                StringBuilder sql = new StringBuilder();
959
                sql.append("0.0, COUNT(e.produto), ");
960
                sql.append("'" + tipoLancamento + "') ");
961
                sql.append("FROM EstoqueAuditoria e ");
962
                sql.append("WHERE e.dataAtualizacao >= :dataInicial AND e.dataAtualizacao <= :dataFinal ");
963
                sql.append("AND e.tipoEstoqueAuditoria like '" + tipoEstoqueAuditoria + "' ");
964
                if (VerificadorUtil.naoEstaNulo(loja)) {
965
                        sql.append("AND e.loja = :loja ");
966
                }
967
                return sql.toString();
968
        }
969
 
970
        @Override
971
        public List<ProdutoHistoricoDetalhesDTO> detalharHistorico(ProdutoHistoricoDTO produtoHistorico, Date dataInicial, Date dataFinal) {
972
                StringBuilder sql = new StringBuilder();
973
                sql.append("SELECT ");
974
                sql.append("new br.com.ec.domain.dto.ProdutoHistoricoDetalhesDTO(");
975
 
976
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.VENDAS.getValor())) {
977
                        sql.append("e.venda.sequencial, (SELECT v.nome FROM Vendedor v WHERE v.sequencial = e.venda.vendedor.sequencial), ");
978
                        sql.append("e.venda.loja, e.venda.dataVenda, e.valorVenda, ");
979
                        sql.append("'" + produtoHistorico.getTipoLancamento() + "', e.observacao) ");
980
                        sql.append("FROM Lancamento e ");
981
                        sql.append("WHERE e.venda.dataVenda >= :dataInicial AND e.venda.dataVenda <= :dataFinal ");
982
                        if (VerificadorUtil.naoEstaNulo(produtoHistorico.getProduto())) {
983
                                if (VerificadorUtil.naoEstaNuloOuVazio(produtoHistorico.getProduto().getSequencial())) {
984
                                        sql.append("AND e.produto.sequencial = :sequencialProduto ");
985
                                }
986
                        }
987
                        sql.append("ORDER BY e.venda.dataVenda DESC");
988
                }
989
 
990
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.COMPRAS.getValor())) {
991
                        sql.append("e.compra.sequencial, e.compra.dataCompra, e.valorCompra, e.quantidade, ");
992
                        sql.append("(SELECT f FROM Fornecedor f WHERE f = e.compra.fornecedor), ");
993
                        sql.append("'" + produtoHistorico.getTipoLancamento() + "', e.compra.observacao) ");
994
                        sql.append("FROM CompraProduto e ");
995
                        sql.append("WHERE e.compra.dataCompra >= :dataInicial AND e.compra.dataCompra <= :dataFinal ");
996
                        if (VerificadorUtil.naoEstaNulo(produtoHistorico.getProduto())) {
997
                                if (VerificadorUtil.naoEstaNuloOuVazio(produtoHistorico.getProduto().getSequencial())) {
998
                                        sql.append("AND e.produto.sequencial = :sequencialProduto ");
999
                                }
1000
                        }
1001
                        sql.append("ORDER BY e.compra.dataCompra DESC");
1002
                }
1003
 
1004
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.AVARIAS.getValor())) {
1005
                        sql.append(sqlAuditoriaDetalhe(produtoHistorico, TipoEstoqueAuditoria.AVARIA.getValor()));
1006
                        sql.append("ORDER BY e.dataAtualizacao DESC");
1007
                }
1008
 
1009
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.TROCAS.getValor())) {
1010
                        sql.append(sqlAuditoriaDetalhe(produtoHistorico, TipoEstoqueAuditoria.TROCA.getValor()));
1011
                        sql.append("ORDER BY e.dataAtualizacao DESC");
1012
                }
1013
 
1014
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.DEVOLUCOES.getValor())) {
1015
                        sql.append(sqlAuditoriaDetalhe(produtoHistorico, TipoEstoqueAuditoria.DEVOLUCAO.getValor()));
1016
                        sql.append("ORDER BY e.dataAtualizacao DESC");
1017
                }
1018
 
1019
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.CONTAGENS_ENTRADA.getValor())) {
1020
                        sql.append(sqlAuditoriaDetalhe(produtoHistorico, TipoEstoqueAuditoria.CONTAGEM.getValor()));
1021
                        sql.append("AND e.quantidadeEstoqueAnterior < e.quantidadeEstoqueNovo ");
1022
                        sql.append("ORDER BY e.dataAtualizacao DESC");
1023
                }
1024
 
1025
                if (produtoHistorico.getTipoLancamento().equals(TipoLancamentoHistorico.CONTAGENS_SAIDA.getValor())) {
1026
                        sql.append(sqlAuditoriaDetalhe(produtoHistorico, TipoEstoqueAuditoria.CONTAGEM.getValor()));
1027
                        sql.append("AND e.quantidadeEstoqueAnterior > e.quantidadeEstoqueNovo ");
1028
                        sql.append("ORDER BY e.dataAtualizacao DESC");
1029
                }
1030
 
1031
                try {
1032
                        TypedQuery<ProdutoHistoricoDetalhesDTO> query = getEntityManager().createQuery(sql.toString(), ProdutoHistoricoDetalhesDTO.class)
1033
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial))
1034
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
1035
                        if (VerificadorUtil.naoEstaNulo(produtoHistorico.getProduto())) {
1036
                                if (VerificadorUtil.naoEstaNuloOuVazio(produtoHistorico.getProduto().getSequencial())) {
1037
                                        query.setParameter("sequencialProduto", produtoHistorico.getProduto().getSequencial());
1038
                                }
1039
                        }
1040
                        return query.getResultList();
1041
                } catch(Exception ex) {
1042
                        ex.printStackTrace();
1043
                        return null;
1044
                }
1045
        }
1046
 
1047
        private String sqlAuditoriaDetalhe(ProdutoHistoricoDTO produtoHistorico, String tipoEstoqueAuditoria) {
1048
                StringBuilder sql = new StringBuilder();
1049
                sql.append("e.sequencial, (SELECT u.nome FROM Usuario u WHERE u.sequencial = e.usuario.sequencial), e.loja, e.dataAtualizacao, 0.0, ");
1050
                sql.append("'" + produtoHistorico.getTipoLancamento() + "'");
1051
                if (tipoEstoqueAuditoria.equals(TipoEstoqueAuditoria.CONTAGEM.getValor())) {
1052
                        sql.append(", e.quantidadeEstoqueNovo - e.quantidadeEstoqueAnterior");
1053
                }
1054
                sql.append(", e.observacao) ");
1055
                sql.append("FROM EstoqueAuditoria e ");
1056
                sql.append("WHERE e.dataAtualizacao >= :dataInicial AND e.dataAtualizacao <= :dataFinal ");
1057
                sql.append("AND e.tipoEstoqueAuditoria like '" + tipoEstoqueAuditoria + "' ");
1058
                if (VerificadorUtil.naoEstaNulo(produtoHistorico.getProduto())) {
1059
                        if (VerificadorUtil.naoEstaNuloOuVazio(produtoHistorico.getProduto().getSequencial())) {
1060
                                sql.append("AND e.produto.sequencial = :sequencialProduto ");
1061
                        }
1062
                }
1063
                return sql.toString();
1064
        }
1065
        */
1066
 
1067
}