Subversion Repositories Integrator Subversion

Rev

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