Subversion Repositories Integrator Subversion

Rev

Rev 462 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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