Subversion Repositories Integrator Subversion

Rev

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

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