Subversion Repositories Integrator Subversion

Rev

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