Subversion Repositories Integrator Subversion

Rev

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

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