Subversion Repositories Integrator Subversion

Rev

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