Subversion Repositories Integrator Subversion

Rev

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

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