Subversion Repositories Integrator Subversion

Rev

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

Rev Author Line No. Line
229 espaco 1
package br.com.ec.repository.jpa;
2
 
3
import java.util.Date;
261 espaco 4
import java.util.List;
229 espaco 5
 
230 espaco 6
import javax.persistence.Query;
229 espaco 7
import javax.persistence.TypedQuery;
8
 
9
import org.springframework.stereotype.Repository;
10
 
11
import br.com.ec.core.util.DataUtils;
230 espaco 12
import br.com.ec.core.util.VerificadorUtil;
261 espaco 13
import br.com.ec.domain.dto.FormaPagamentoDTO;
264 espaco 14
import br.com.ec.domain.dto.LojaDTO;
230 espaco 15
import br.com.ec.domain.dto.consulta.ParametrosConsultaVendasDTO;
259 espaco 16
import br.com.ec.domain.model.Venda;
261 espaco 17
import br.com.ec.domain.shared.ConstantesSEC;
229 espaco 18
import br.com.ec.repository.SistemaAbstractRepository;
19
import br.com.ec.repository.VendaRepository;
20
 
21
@Repository
22
public class VendaRepositoryJpaImpl extends SistemaAbstractRepository<Venda> implements VendaRepository {
23
 
24
        @Override
25
        protected String getColunaOrdenadora() {
26
                return "dataVenda";
27
        }
28
 
29
        @Override
230 espaco 30
        public Integer obterQuantidadeDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
229 espaco 31
                StringBuilder sql = new StringBuilder();
32
                sql.append("SELECT COUNT(*) FROM Venda e ");
230 espaco 33
                sql.append("WHERE 1=1 ");
34
                setarStringParametrosConsulta(sql, parametrosConsultaVendasDTO);
229 espaco 35
                try {
230 espaco 36
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
37
                        setarQueryParametrosConsulta(query, parametrosConsultaVendasDTO);
38
                        return query.getSingleResult().intValue();
229 espaco 39
                } catch(Exception ex) {
40
                        ex.printStackTrace();
41
                        return null;
42
                }
43
        }
44
 
230 espaco 45
        @Override
46
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
47
                StringBuilder sql = new StringBuilder();
48
                sql.append("SELECT SUM(l.valorVenda) FROM Venda e ");
49
                sql.append("LEFT JOIN e.listaLancamentos l ");
50
                sql.append("WHERE l.ativo IS TRUE ");
51
                setarStringParametrosConsulta(sql, parametrosConsultaVendasDTO);
52
                try {
53
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
54
                        setarQueryParametrosConsulta(query, parametrosConsultaVendasDTO);
55
                        Double total = query.getSingleResult();
56
                        if (VerificadorUtil.estaNulo(total)) {
57
                                return new Double(0.0);
58
                        }
59
                        return total;
60
                } catch(Exception ex) {
61
                        ex.printStackTrace();
62
                        return null;
63
                }
64
        }
65
 
66
        @Override
67
        public Double obterValorDeCuponsUtilizadosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
68
                StringBuilder sql = new StringBuilder();
69
                sql.append("SELECT SUM(p.valorPagamento) FROM VendaFormaPagamento p ");
70
                sql.append("LEFT JOIN p.venda e ");
71
                sql.append("WHERE p.formaPagamento.codigo = 16 ");
72
                setarStringParametrosConsulta(sql, parametrosConsultaVendasDTO);
73
//              parametrosConsulta.setIndicadorComissionado(null);
74
//              parametrosConsulta.setTipoProduto(null);
75
                try {
76
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
77
                        setarQueryParametrosConsulta(query, parametrosConsultaVendasDTO);
78
                        Double total = query.getSingleResult();
79
                        if (VerificadorUtil.estaNulo(total)) {
80
                                return new Double(0.0);
81
                        }
82
                        return total;
83
                } catch(Exception ex) {
84
                        ex.printStackTrace();
85
                        return null;
86
                }
87
        }
88
 
89
        private void setarStringParametrosConsulta(StringBuilder sql, ParametrosConsultaVendasDTO parametros) {
90
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialLoja())) {
91
                        sql.append("AND e.loja.sequencial = :sequencialLoja ");
92
                }
253 espaco 93
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getTipoSituacaoVenda())) {
230 espaco 94
                        sql.append("AND e.tipoSituacao = :tipoSituacao ");
95
                }
264 espaco 96
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialVendedor())) {
230 espaco 97
                        sql.append("AND e.vendedor.sequencial = :sequencialVendedor ");
98
                }
264 espaco 99
                /*
230 espaco 100
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getIndicacao())) {
101
                        sql.append("AND e.indicacao.sequencial = :sequencialIndicacao ");
102
                }
103
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getIndicadorComissionado())) {
104
                        sql.append("AND l.produto.indicadorComissionado = :indicadorComissionado ");
105
                }
106
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getTipoProduto())) {
107
                        sql.append("AND l.produto.tipo = :tipoProduto ");
108
                }
109
                //TODO: VERIFICAR LANÇAMENTOS COM MAIS PAGAMENTOS QUE LANÇAMENTOS
110
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSituacaoFinanceiraVenda())) {
111
                        if (parametros.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.NENHUMA.getValor())) {
112
                                sql.append("AND (SELECT COUNT(c) FROM Conta c WHERE c.venda = e) = 0 ");
113
//                                      sql.append("AND ((SELECT COUNT(vf) FROM VendaFormaPagamento vf WHERE vf.venda = e) > (SELECT COUNT(cr) FROM ContaAReceber cr WHERE cr.venda = e)) ");
114
                        }
115
                        if (parametros.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.QUITADO.getValor())) {
116
                                sql.append("AND (SELECT COUNT(p) FROM Parcela p WHERE p.conta.venda = e AND p.dataPagamento is null AND p.indicadorAtivo = true) = 0 ");
117
                                sql.append("AND (SELECT COUNT(c) FROM Conta c WHERE c.venda = e AND c.indicadorAtivo = true) > 0 ");
118
                        }
119
                        if (parametros.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.PENDENCIAS.getValor())) {
120
                                sql.append("AND ((SELECT COUNT(p) FROM Parcela p WHERE p.conta.venda = e AND p.dataPagamento is null AND p.indicadorAtivo = true) > 0 ");
121
                                sql.append("OR (SELECT COUNT(c) FROM Conta c WHERE c.venda = e AND c.indicadorAtivo = true) = 0) ");
122
                        }
123
                }
124
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getFormaPagamento())) {
125
                        sql.append("AND (SELECT COUNT(p) FROM VendaFormaPagamento p WHERE p.venda = e AND p.formaPagamento.codigo = :codigoFormaPagamento) > 0 ");
126
                }
127
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getBandeiraCartao())) {
128
                        sql.append("AND (SELECT COUNT(b) FROM VendaFormaPagamento b WHERE b.venda = e AND b.bandeiraCartao.codigo = :codigoBandeiraCartao) > 0 ");
129
                }
130
                */
131
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialVenda())) {
132
                        sql.append("AND e.sequencial = :sequencialVenda ");
261 espaco 133
                } else if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataSelecionada())
134
                                || VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataInicial())
135
                                || VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataFinal())) {
230 espaco 136
                        sql.append("AND e.dataVenda >= :dataInicial ");
137
                        sql.append("AND e.dataVenda <= :dataFinal ");
138
                }
139
                /*
140
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getCodigoCupom())) {
141
                        sql.append("AND (SELECT COUNT(cl) FROM Lancamento cl WHERE cl.venda = e AND cl.cupom.codigo = :codigoCupom) > 0) ");
142
                }
143
                */
144
        }
145
 
146
        private void setarQueryParametrosConsulta(Query query, ParametrosConsultaVendasDTO parametros) {
147
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialLoja())) {
148
                        query.setParameter("sequencialLoja", parametros.getSequencialLoja());
149
                }
253 espaco 150
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getTipoSituacaoVenda())) {
151
                        query.setParameter("tipoSituacao", parametros.getTipoSituacaoVenda());
152
                }
264 espaco 153
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialVendedor())) {
154
                        query.setParameter("sequencialVendedor", parametros.getSequencialVendedor());
155
                }
230 espaco 156
                /*
157
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getIndicacao())) {
158
                        query.setParameter("sequencialIndicacao", parametros.getIndicacao().getSequencial());
159
                }
160
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getIndicadorComissionado())) {
161
                        query.setParameter("indicadorComissionado", parametros.getIndicadorComissionado());
162
                }
163
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getTipoProduto())) {
164
                        query.setParameter("tipoProduto", parametros.getTipoProduto());
165
                }
166
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getFormaPagamento())) {
167
                        query.setParameter("codigoFormaPagamento", parametros.getFormaPagamento().getCodigo());
168
                }
169
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getBandeiraCartao())) {
170
                        query.setParameter("codigoBandeiraCartao", parametros.getBandeiraCartao().getCodigo());
171
                }
172
                 */
173
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getSequencialVenda())) {
174
                        query.setParameter("sequencialVenda", parametros.getSequencialVenda());
261 espaco 175
                } else if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataInicial())
176
                                && VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataFinal())) {
177
                        Date dataInicial = DataUtils.getDataComHorarioMinimo(parametros.getParametrosPeriodoDTO().getDataInicial());
178
                        Date dataFinal = DataUtils.getDataComHorarioMaximo(parametros.getParametrosPeriodoDTO().getDataFinal());
230 espaco 179
                        query.setParameter("dataInicial", dataInicial);
180
                        query.setParameter("dataFinal", dataFinal);
261 espaco 181
                } else if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getParametrosPeriodoDTO().getDataSelecionada())) {
182
                        Date dataInicial = DataUtils.getDataComHorarioMinimo(parametros.getParametrosPeriodoDTO().getDataSelecionada());
183
                        Date dataFinal = DataUtils.getDataComHorarioMaximo(parametros.getParametrosPeriodoDTO().getDataSelecionada());
230 espaco 184
                        query.setParameter("dataInicial", dataInicial);
185
                        query.setParameter("dataFinal", dataFinal);
186
                }
187
                /*
188
                if (VerificadorUtil.naoEstaNuloOuVazio(parametros.getCodigoCupom())) {
189
                        query.setParameter("codigoCupom", parametros.getCodigoCupom());
190
                }
191
                */
192
        }
193
 
229 espaco 194
        /*
195
        private void setarParametrosStringConsultarVendaPorLojaEePeriodo(StringBuilder sql, Venda venda, Date dataInicial, Date dataFinal) {
196
                setarStringParametrosConsultar(sql, venda);
197
                if (VerificadorUtil.naoEstaNuloOuVazio(dataInicial) && VerificadorUtil.naoEstaNuloOuVazio(dataFinal)) {
198
                        sql.append("AND e.dataVenda >= :dataInicial AND e.dataVenda <= :dataFinal ");
199
                }
200
        }
201
        */
202
/*
203
        @Override
204
        protected void setarStringParametrosConsultar(StringBuilder sql, Venda venda) {
205
                if (VerificadorUtil.naoEstaNuloOuVazio(venda)) {
206
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getSequencialDaLoja())) {
207
                                sql.append("AND e.loja.sequencial = :sequencialLoja ");
208
                        }
209
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getVendedor())) {
210
                                sql.append("AND e.vendedor.sequencial = :sequencialVendedor ");
211
                        }
212
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getIndicacao())) {
213
                                sql.append("AND e.indicacao.sequencial = :sequencialIndicacao ");
214
                        }
215
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getTipoSituacao())) {
216
                                sql.append("AND e.tipoSituacao = :tipoSituacao ");
217
                        }
218
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getDataVenda())) {
219
                                sql.append("AND e.dataVenda >= :dataInicial ");
220
                                sql.append("AND e.dataVenda <= :dataFinal ");
221
                        }
222
                }
223
        }
224
 
225
        @Override
226
        protected void setarQueryParametrosConsultar(Query query, Venda venda) {
227
                if (VerificadorUtil.naoEstaNuloOuVazio(venda)) {
228
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getSequencialDaLoja())) {
229
                                query.setParameter("sequencialLoja", venda.getSequencialDaLoja());
230
                        }
231
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getSequencialDoVendedor())) {
232
                                query.setParameter("sequencialVendedor", venda.getSequencialDoVendedor());
233
                        }
234
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getIndicacao())) {
235
                                query.setParameter("sequencialIndicacao", venda.getIndicacao());
236
                        }
237
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getTipoSituacao())) {
238
                                query.setParameter("tipoSituacao", venda.getTipoSituacao());
239
                        }
240
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getDataVenda())) {
241
                                Date dataInicial = DataUtils.getDataComHorarioMinimo(venda.getDataVenda());
242
                                Date dataFinal = DataUtils.getDataComHorarioMaximo(venda.getDataVenda());
243
                                query.setParameter("dataInicial", dataInicial);
244
                                query.setParameter("dataFinal", dataFinal);
245
                        }
246
                }
247
        }
248
 
249
        @Override
250
        public List<Venda> consultarVendasPorDemanda(ParametrosConsulta<Venda> parametrosConsulta, Integer primeiroRegistro,
251
                        Integer tamanhoPagina, String sortField, String orderSort, Map<String, Object> filters) {
252
                StringBuilder sql = new StringBuilder();
253
                sql.append("SELECT DISTINCT e FROM Venda e ");
254
                sql.append("LEFT JOIN FETCH e.listaLancamentos l ");
255
                sql.append("LEFT JOIN FETCH e.listaVendaFormaPagamentos p ");
256
                sql.append("WHERE 1=1 ");
257
 
258
                try {
259
                        setarStringParametrosConsulta(sql, parametrosConsulta);
260
                        sql.append("ORDER BY e.dataVenda");
261
                        TypedQuery<Venda> query = (TypedQuery<Venda>) getEntityManager().createQuery(sql.toString(), Venda.class);
262
                        setarQueryParametrosConsulta(query, parametrosConsulta);
263
 
264
                        return query.setFirstResult(primeiroRegistro).setMaxResults(tamanhoPagina).getResultList();
265
                } catch(Exception ex) {
266
                        ex.printStackTrace();
267
                        return null;
268
                }
269
        }
270
 
271
        @Override
272
        public List<Venda> consultarVendaPorParametros(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
273
                StringBuilder sql = new StringBuilder();
274
                sql.append("SELECT DISTINCT e FROM Venda e ");
275
                sql.append("LEFT JOIN FETCH e.listaLancamentos l ");
276
                sql.append("LEFT JOIN FETCH e.listaVendaFormaPagamentos p ");
277
                sql.append("WHERE 1=1 ");
278
 
279
                try {
280
                        setarStringParametrosConsulta(sql, parametrosConsultaVendas);
281
                        sql.append("ORDER BY e.dataVenda");
282
                        TypedQuery<Venda> query = (TypedQuery<Venda>) getEntityManager().createQuery(sql.toString(), Venda.class);
283
                        setarQueryParametrosConsulta(query, parametrosConsultaVendas);
284
                        return query.getResultList();
285
                } catch(Exception ex) {
286
                        ex.printStackTrace();
287
                        return null;
288
                }
289
        }
290
 
291
        @Override
292
        public Venda detalharVenda(Venda venda) {
293
                StringBuilder jpql = new StringBuilder();
294
                try {
295
                        jpql.append("SELECT c FROM Venda c ");
296
                        //jpql.append("LEFT JOIN FETCH c.listaPedidos p ");
297
                        //jpql.append("LEFT JOIN FETCH c.listaVendas v ");
298
                        jpql.append("WHERE c = :venda");
299
                        return getEntityManager().createQuery(jpql.toString(), Venda.class).setParameter("venda", venda).getSingleResult();
300
                } catch (NoResultException e) {
301
                        return null;
302
                }
303
        }
304
 
305
        @Override
306
        public Venda detalharVendaCompleta(Venda venda) {
307
                StringBuilder jpql = new StringBuilder();
308
                try {
309
                        jpql.append("SELECT c FROM Venda c ");
310
                        jpql.append("LEFT JOIN FETCH c.listaLancamentos l ");
311
                        jpql.append("LEFT JOIN FETCH c.listaVendaFormaPagamentos p ");
312
                        jpql.append("WHERE c = :venda");
313
                        return getEntityManager().createQuery(jpql.toString(), Venda.class).setParameter("venda", venda).getSingleResult();
314
                } catch (NoResultException e) {
315
                        return null;
316
                }
317
        }
318
 
319
        @Override
320
        public List<Venda> consultarVendasDoDia(Long sequencialLoja, Date data) {
321
                StringBuilder sql = new StringBuilder();
322
                sql.append("SELECT DISTINCT v FROM Venda v ");
323
                sql.append("LEFT JOIN FETCH v.listaVendaFormaPagamentos p ");
324
                sql.append("WHERE v.loja.sequencial = :sequencialLoja ");
325
                sql.append("AND v.dataVenda >= :dataInicial AND v.dataVenda <= :dataFinal ");
326
                try {
327
                        sql.append("ORDER BY v.dataVenda");
328
                        return getEntityManager().createQuery(sql.toString(), Venda.class)
329
                                                .setParameter("sequencialLoja", sequencialLoja)
330
                                                .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(data))
331
                                                .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(data))
332
                                                .getResultList();
333
                } catch(Exception ex) {
334
                        ex.printStackTrace();
335
                        return null;
336
                }
337
        }
338
 
339
 
340
        private void setarParametrosQueryConsultarVendaPorLojaEePeriodo(Query query, Venda venda, Date dataInicial, Date dataFinal) {
341
                setarQueryParametrosConsultar(query, venda);
342
                if (VerificadorUtil.naoEstaNuloOuVazio(dataInicial) && VerificadorUtil.naoEstaNuloOuVazio(dataFinal)) {
343
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial));
344
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
345
                }
346
        }
347
 
348
        @Override
349
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
350
                StringBuilder sql = new StringBuilder();
351
                sql.append("SELECT SUM(l.valorVenda) FROM Venda e ");
352
                sql.append("LEFT JOIN e.listaLancamentos l ");
353
                sql.append("WHERE l.ativo IS TRUE ");
354
                try {
355
                        setarStringParametrosConsulta(sql, parametrosConsulta);
356
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
357
                        setarQueryParametrosConsulta(query, parametrosConsulta);
358
                        Double total = query.getSingleResult();
359
                        if (VerificadorUtil.estaNulo(total)) {
360
                                return new Double(0.0);
361
                        }
362
                        return total;
363
                } catch(Exception ex) {
364
                        ex.printStackTrace();
365
                        return null;
366
                }
367
        }
368
 
369
        @Override
370
        public Double obterValorDeCuponsUtilizadosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
371
                StringBuilder sql = new StringBuilder();
372
                sql.append("SELECT SUM(p.valorPagamento) FROM VendaFormaPagamento p ");
373
                sql.append("LEFT JOIN p.venda e ");
374
                sql.append("WHERE p.formaPagamento.codigo = 16 ");
375
 
376
                parametrosConsulta.setIndicadorComissionado(null);
377
                parametrosConsulta.setTipoProduto(null);
378
 
379
                setarStringParametrosConsulta(sql, parametrosConsulta);
380
*/             
381
                /*
382
                sql.append("AND (SELECT COUNT(l) FROM Lancamento l WHERE l.venda = e AND l.ativo = true) > 0 ");
383
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getLoja())) {
384
                        sql.append("AND e.loja.sequencial = :sequencialLoja ");
385
                }
386
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getVendedor())) {
387
                        sql.append("AND e.vendedor.sequencial = :sequencialVendedor ");
388
                }
389
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataVendas())
390
                                || VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataInicial())
391
                                || VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataFinal())) {
392
                        sql.append("AND e.dataVenda >= :dataInicial ");
393
                        sql.append("AND e.dataVenda <= :dataFinal ");
394
                }
395
                */
396
/*     
397
                try {
398
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
399
                        setarQueryParametrosConsulta(query, parametrosConsulta);
400
*/                     
401
                        /*
402
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getLoja())) {
403
                                query.setParameter("sequencialLoja", parametrosConsulta.getLoja().getSequencial());
404
                        }
405
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getVendedor())) {
406
                                query.setParameter("sequencialVendedor", parametrosConsulta.getVendedor().getSequencial());
407
                        }
408
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataInicial())
409
                                        && VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataFinal())) {
410
                                Date dataInicial = DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial());
411
                                Date dataFinal = DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal());
412
                                query.setParameter("dataInicial", dataInicial);
413
                                query.setParameter("dataFinal", dataFinal);
414
                        } else if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataVendas())) {
415
                                Date dataInicial = DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataVendas());
416
                                Date dataFinal = DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataVendas());
417
                                query.setParameter("dataInicial", dataInicial);
418
                                query.setParameter("dataFinal", dataFinal);
419
                        }
420
                        */
421
/*     
422
                        Double total = query.getSingleResult();
423
                        if (VerificadorUtil.estaNulo(total)) {
424
                                return new Double(0.0);
425
                        }
426
                        return total;
427
                } catch(Exception ex) {
428
                        ex.printStackTrace();
429
                        return null;
430
                }
431
        }
432
 
433
        @Override
434
        public Double obterValorTotalDeDescontosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
435
                StringBuilder sql = new StringBuilder();
436
                sql.append("SELECT SUM(l.valorVarejo - l.valorVenda) FROM Venda e ");
437
                sql.append("LEFT JOIN e.listaLancamentos l ");
438
                sql.append("WHERE l.ativo IS TRUE ");
439
                try {
440
                        setarStringParametrosConsulta(sql, parametrosConsulta);
441
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
442
                        setarQueryParametrosConsulta(query, parametrosConsulta);
443
                        Double total = query.getSingleResult();
444
                        if (VerificadorUtil.estaNulo(total)) {
445
                                return new Double(0.0);
446
                        }
447
                        return total;
448
                } catch(Exception ex) {
449
                        ex.printStackTrace();
450
                        return null;
451
                }
452
        }
261 espaco 453
        */
229 espaco 454
        @Override
261 espaco 455
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodoEeFormasDePagamento(ParametrosConsultaVendasDTO parametrosConsultaVendas, List<FormaPagamentoDTO> formasDePagamento) {
229 espaco 456
                StringBuilder sql = new StringBuilder();
457
                sql.append("SELECT SUM(v.valorPagamento) FROM VendaFormaPagamento v ");
458
                sql.append("LEFT JOIN v.venda e ");
459
                sql.append("LEFT JOIN v.formaPagamento f ");
261 espaco 460
                sql.append("WHERE v.formaPagamento.codigo != ");
461
                sql.append(ConstantesSEC.FormasDePagamento.FORMAPAGAMENTO_CUPOM);
462
                sql.append(" ");
229 espaco 463
                try {
464
                        sql = setarParametrosFormasDePagamento(sql, formasDePagamento);
264 espaco 465
                        sql = setarParametrosLojasSelecionadas(sql, parametrosConsultaVendas.getLojasSelecionadasDTO());
229 espaco 466
                        setarStringParametrosConsulta(sql, parametrosConsultaVendas);
467
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
468
                        setarQueryParametrosConsulta(query, parametrosConsultaVendas);
469
 
470
                        Double total = query.getSingleResult();
471
                        if (VerificadorUtil.estaNulo(total)) {
472
                                return new Double(0.0);
473
                        }
474
                        return total;
475
                } catch(Exception ex) {
476
                        ex.printStackTrace();
477
                        return null;
478
                }
479
        }
264 espaco 480
 
261 espaco 481
        private StringBuilder setarParametrosFormasDePagamento(StringBuilder sql, List<FormaPagamentoDTO> formasPagamento) {
482
                if (VerificadorUtil.naoEstaNuloOuVazio(formasPagamento)) {
229 espaco 483
                        sql.append("AND v.formaPagamento.codigo IN (");
261 espaco 484
                        for (FormaPagamentoDTO formaPagamento : formasPagamento) {
485
                                if (!formaPagamento.formaPagamentoEhCupom()) {
486
                                        sql.append(formaPagamento.getCodigo() + ",");
487
                                }
229 espaco 488
                        }
489
                        sql.append(") ");
490
                }
491
                return new StringBuilder(sql.toString().replace(",)", ")"));
492
        }
264 espaco 493
 
494
        private StringBuilder setarParametrosLojasSelecionadas(StringBuilder sql, List<LojaDTO> lojasSelecionadas) {
495
                if (VerificadorUtil.naoEstaNuloOuVazio(lojasSelecionadas)) {
496
                        sql.append("AND v.venda.loja.sequencial IN (");
497
                        for (LojaDTO loja : lojasSelecionadas) {
498
                                sql.append(loja.getSequencial() + ",");
499
                        }
500
                        sql.append(") ");
501
                }
502
                return new StringBuilder(sql.toString().replace(",)", ")"));
503
        }
504
 
261 espaco 505
        /*
229 espaco 506
        @Override
507
        public Double obterValorTotalLiquidoDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
508
                StringBuilder sql = new StringBuilder();
509
                sql.append("SELECT SUM(e.valor) FROM Parcela e ");
510
                sql.append("INNER JOIN e.conta c ");
511
                sql.append("WHERE e.indicadorAtivo IS TRUE ");
512
                try {
513
                        setarParametrosStringConsultarValorTotalLiquidoVendaPorLojaEePeriodo(sql, parametrosConsulta);
514
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
515
                        setarParametrosQueryConsultarValorTotalLiquidoVendaPorLojaEePeriodo(query, parametrosConsulta);
516
 
517
                        Double total = query.getSingleResult();
518
                        if (VerificadorUtil.estaNulo(total)) {
519
                                return new Double(0.0);
520
                        }
521
                        return total;
522
                } catch(Exception ex) {
523
                        ex.printStackTrace();
524
                        return null;
525
                }
526
        }
527
 
528
        private void setarParametrosStringConsultarValorTotalLiquidoVendaPorLojaEePeriodo(StringBuilder sql, ParametrosConsultaVendasDTO parametrosConsulta) {
529
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getLoja())) {
530
                        sql.append("AND e.conta.venda.loja.sequencial = :sequencialLoja ");
531
                }
532
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getVendedor())) {
533
                        sql.append("AND e.conta.venda.vendedor.sequencial = :sequencialVendedor ");
534
                }
535
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getIndicacao())) {
536
                        sql.append("AND e.conta.venda.indicacao.sequencial = :sequencialIndicacao ");
537
                }
538
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataInicial()) && VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataFinal())) {
539
                        sql.append("AND e.conta.venda.dataVenda >= :dataInicial AND e.conta.venda.dataVenda <= :dataFinal ");
540
                }
541
        }
542
 
543
        private void setarParametrosQueryConsultarValorTotalLiquidoVendaPorLojaEePeriodo(Query query, ParametrosConsultaVendasDTO parametrosConsulta) {
544
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getLoja())) {
545
                        query.setParameter("sequencialLoja", parametrosConsulta.getLoja().getSequencial());
546
                }
547
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getVendedor())) {
548
                        query.setParameter("sequencialVendedor", parametrosConsulta.getVendedor().getSequencial());
549
                }
550
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getIndicacao())) {
551
                        query.setParameter("sequencialIndicacao", parametrosConsulta.getIndicacao().getSequencial());
552
                }
553
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataInicial()) && VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getDataFinal())) {
554
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()));
555
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
556
                }
557
        }
558
 
559
        @Override
560
        public Integer obterQuantidadeProdutosVendidosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
561
                StringBuilder sql = new StringBuilder();
562
                sql.append("SELECT COUNT(l) FROM Venda e ");
563
                sql.append("LEFT JOIN e.listaLancamentos l ");
564
                sql.append("WHERE l.ativo IS TRUE ");
565
                try {
566
                        setarStringParametrosConsulta(sql, parametrosConsulta);
567
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
568
                        setarQueryParametrosConsulta(query, parametrosConsulta);
569
                        return query.getSingleResult().intValue();
570
                } catch(Exception ex) {
571
                        ex.printStackTrace();
572
                        return null;
573
                }
574
        }
575
 
576
        @Override
577
        public Integer obterQuantidadeProdutosVendidosPorLojaEePeriodoNaoVivo(ParametrosConsultaVendasDTO parametrosConsulta) {
578
                StringBuilder sql = new StringBuilder();
579
                sql.append("SELECT COUNT(l) FROM Venda e ");
580
                sql.append("LEFT JOIN e.listaLancamentos l ");
581
                sql.append("WHERE l.ativo IS TRUE AND l.produto.tipo not like 'V' ");
582
                try {
583
                        setarStringParametrosConsulta(sql, parametrosConsulta);
584
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
585
                        setarQueryParametrosConsulta(query, parametrosConsulta);
586
                        return query.getSingleResult().intValue();
587
                } catch(Exception ex) {
588
                        ex.printStackTrace();
589
                        return null;
590
                }
591
        }
592
 
593
        @Override
594
        public Double obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
595
                StringBuilder sql = new StringBuilder();
596
                sql.append("SELECT SUM(l.valorCompra) FROM Venda e ");
597
                sql.append("LEFT JOIN e.listaLancamentos l ");
598
                sql.append("WHERE l.ativo IS TRUE ");
599
                try {
600
                        setarStringParametrosConsulta(sql, parametrosConsulta);
601
                        TypedQuery<Double> query = getEntityManager().createQuery(sql.toString(), Double.class);
602
                        setarQueryParametrosConsulta(query, parametrosConsulta);
603
                        Double total = query.getSingleResult();
604
                        if (VerificadorUtil.estaNulo(total)) {
605
                                return new Double(0.0);
606
                        }
607
                        return total;
608
                } catch(Exception ex) {
609
                        ex.printStackTrace();
610
                        return null;
611
                }
612
        }
613
 
614
        @Override
615
        public GraficoAcumuladoDTO consultarGrafico(String mes, String ano) {
616
                StringBuilder sql = new StringBuilder();
617
                sql.append("SELECT ");
618
                Calendar data = DataUtils.obterCalendario(DataUtils.obterData(1, new Integer(mes)-1, new Integer(ano)));
619
                int qntMaximaDias = data.getActualMaximum(Calendar.DAY_OF_MONTH);
620
                for (int i = 1; i <= qntMaximaDias; i++) {
621
                        String dia = String.format("%02d", i);
622
                        sql.append("SUM(D.DIA" + dia + ") AS dia" + dia);
623
                        if (i < qntMaximaDias) {
624
                                sql.append(", ");
625
                        } else {
626
                                sql.append(" ");
627
                        }
628
                }
629
                sql.append(" FROM ");
630
                sql.append("(SELECT ");
631
                for (int i = 1; i <= qntMaximaDias; i++) {
632
                        String dia = String.format("%02d", i);
633
                        sql.append("CASE date(v.dth_venda) WHEN '" + ano + "-" + mes + "-" + dia + "' THEN SUM(l.val_venda) END AS DIA" + dia);
634
                        if (i < qntMaximaDias) {
635
                                sql.append(", ");
636
                        } else {
637
                                sql.append(" ");
638
                        }
639
                }
640
                sql.append("FROM sc_sec.sec_lancamento l, sc_sec.sec_venda v ");
641
                sql.append("WHERE l.seq_venda = v.seq_venda AND l.ind_ativo is true ");
642
                sql.append("GROUP BY date(v.dth_venda) ");
643
                sql.append(") AS D ");
644
 
645
                try {
646
                        Query query = getEntityManager().createNativeQuery(sql.toString());
647
                        Object[] valores = new Object[31];
648
                        Object[] resultado = (Object[]) query.getSingleResult();
649
                        for (int i = 0; i < resultado.length; i++) {
650
                                valores[i] = resultado[i];
651
                        }
652
                        GraficoAcumuladoDTO grafico = new GraficoAcumuladoDTO();
653
                        grafico.setDIA_01(retornarValorEmString(valores[0]));
654
                        grafico.setDIA_02(retornarValorEmString(valores[1]));
655
                        grafico.setDIA_03(retornarValorEmString(valores[2]));
656
                        grafico.setDIA_04(retornarValorEmString(valores[3]));
657
                        grafico.setDIA_05(retornarValorEmString(valores[4]));
658
                        grafico.setDIA_06(retornarValorEmString(valores[5]));
659
                        grafico.setDIA_07(retornarValorEmString(valores[6]));
660
                        grafico.setDIA_08(retornarValorEmString(valores[7]));
661
                        grafico.setDIA_09(retornarValorEmString(valores[8]));
662
                        grafico.setDIA_10(retornarValorEmString(valores[9]));
663
                        grafico.setDIA_11(retornarValorEmString(valores[10]));
664
                        grafico.setDIA_12(retornarValorEmString(valores[11]));
665
                        grafico.setDIA_13(retornarValorEmString(valores[12]));
666
                        grafico.setDIA_14(retornarValorEmString(valores[13]));
667
                        grafico.setDIA_15(retornarValorEmString(valores[14]));
668
                        grafico.setDIA_16(retornarValorEmString(valores[15]));
669
                        grafico.setDIA_17(retornarValorEmString(valores[16]));
670
                        grafico.setDIA_18(retornarValorEmString(valores[17]));
671
                        grafico.setDIA_19(retornarValorEmString(valores[18]));
672
                        grafico.setDIA_20(retornarValorEmString(valores[19]));
673
                        grafico.setDIA_21(retornarValorEmString(valores[20]));
674
                        grafico.setDIA_22(retornarValorEmString(valores[21]));
675
                        grafico.setDIA_23(retornarValorEmString(valores[22]));
676
                        grafico.setDIA_24(retornarValorEmString(valores[23]));
677
                        grafico.setDIA_25(retornarValorEmString(valores[24]));
678
                        grafico.setDIA_26(retornarValorEmString(valores[25]));
679
                        grafico.setDIA_27(retornarValorEmString(valores[26]));
680
                        grafico.setDIA_28(retornarValorEmString(valores[27]));
681
                        grafico.setDIA_29(retornarValorEmString(valores[28]));
682
                        grafico.setDIA_30(retornarValorEmString(valores[29]));
683
                        grafico.setDIA_31(retornarValorEmString(valores[30]));
684
                        return grafico;
685
                } catch(Exception ex) {
686
                        return null;
687
                }
688
        }
689
 
690
        private Double retornarValorEmString(Object objeto) {
691
                try {
692
                        return new Double(objeto.toString());
693
                } catch (Exception e) {
694
                        return new Double(0.0);
695
                }
696
        }
697
 
698
        private String adicionarEstoque(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
699
                StringBuilder sql = new StringBuilder();
700
                sql.append(", (SELECT SUM(pl.quantidadeEstoque) FROM ProdutoLoja pl WHERE pl.produto = l.produto ");
701
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
702
                        sql.append("AND pl.loja.sequencial = :sequencialLoja ");
703
                }
704
                sql.append(")");
705
                return sql.toString();
706
        }
707
*/
708
        /*private String adicionarConsumoMedioDiario(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
709
                StringBuilder sql = new StringBuilder();
710
                sql.append(", (SELECT COUNT(*) FROM Lancamento lc WHERE lc.produto = l.produto AND lc.ativo = true ");
711
                sql.append("WHERE lc.venda.dataVenda >= :dataInicial AND lc.venda.dataVenda <= :dataFinal) ");
712
//              String dataAnterior = DataUtil.retornarDataFormatadaEmFormatoTexto("yyyy-MM-dd", DataUtils.acrescentarMeses(DataUtils.getDataAtual(), -2));
713
//              sql.append("AND lc.venda.dataVenda >= :dataDoisMesesAnterior) ");
714
                return sql.toString();
715
        }*/
716
/*     
717
        private String adicionarSolicitacaoCompraProduto() {
718
                StringBuilder sql = new StringBuilder();
719
//              sql.append(", (SELECT COUNT(*) > 0 FROM ProdutoPedidoCompra ppc WHERE ppc.produto = l.produto)");
720
//              sql.append(", (SELECT ppc.status, ppc.quantidadeParaComprar FROM ProdutoPedidoCompra ppc WHERE ppc.produto = l.produto)");
721
//              sql.append(", (SELECT (ppc) FROM ProdutoPedidoCompra ppc WHERE ppc.produto = l.produto)");
722
                sql.append(", (SELECT ppc.status FROM ProdutoPedidoCompra ppc WHERE ppc.produto = l.produto)");
723
                sql.append(", (SELECT ppc.quantidadeParaComprar FROM ProdutoPedidoCompra ppc WHERE ppc.produto = l.produto)");
724
                return sql.toString();
725
        }
726
 
727
        @Override
728
        public List<RankingProdutoDTO> consultarProdutosVendidos(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
729
                StringBuilder sql = new StringBuilder();
730
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getTipoOrdenacao())) {
731
                        if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.DATA.getValor())) {
732
                                sql.append("SELECT new br.com.ec.domain.dto.RankingProdutoDTO(l.produto, l.venda, l.valorVenda, l.valorVarejo - l.valorVenda");
733
                                sql.append(adicionarEstoque(parametrosConsulta));
734
                                sql.append(adicionarSolicitacaoCompraProduto());
735
                                sql.append(") FROM Lancamento l ");
736
                        } else {
737
                                sql.append("SELECT new br.com.ec.domain.dto.RankingProdutoDTO(l.produto, SUM(l.valorVenda), SUM(l.valorCompra), SUM(l.valorVarejo - l.valorVenda), COUNT(l.produto), MAX(l.venda.dataVenda)");
738
                                sql.append(adicionarEstoque(parametrosConsulta));
739
                                sql.append(adicionarSolicitacaoCompraProduto());
740
                                sql.append(") FROM Lancamento l ");
741
                        }
742
                } else {
743
                        sql.append("SELECT new br.com.ec.domain.dto.RankingProdutoDTO(l.produto, l.venda, l.valorVenda, l.valorVarejo - l.valorVenda");
744
                        sql.append(adicionarEstoque(parametrosConsulta));
745
                        sql.append(adicionarSolicitacaoCompraProduto());
746
                        sql.append(") FROM Lancamento l ");
747
                }
748
                sql.append("WHERE l.venda.dataVenda >= :dataInicial AND l.venda.dataVenda <= :dataFinal ");
749
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
750
                        sql.append("AND l.venda.loja.sequencial = :sequencialLoja ");
751
                }
752
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
753
                        sql.append("AND l.produto.tipo = :tipoProduto ");
754
                }
755
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
756
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
757
                                sql.append("AND l.produto.codigo = :codigo ");
758
                        }
759
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
760
                                sql.append("AND ");
761
                                sql.append(sqlConsultarSemAcento("l.produto.descricao"));
762
                                sql.append(" like upper(:descricao) ");
763
                        }
764
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
765
                                sql.append("AND l.produto.estilo = :tipoEstilo ");
766
                        }
767
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
768
                                sql.append("AND l.produto.cor = :tipoCor ");
769
                        }
770
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
771
                                sql.append("AND l.produto.genero = :tipoGenero ");
772
                        }
773
                }
774
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
775
                        sql.append("AND l.produto.modelo.marca.sequencial = :sequencialMarcaDoModelo ");
776
                }
777
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
778
                        sql.append("AND l.produto.modelo.sequencial = :sequencialModelo ");
779
                }
780
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getFornecedor())) {
781
                        sql.append("AND :fornecedor in (SELECT fp.fornecedor FROM FornecedorProduto fp WHERE fp.produto.sequencial = l.produto.sequencial) ");
782
                }
783
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getVendedor())) {
784
                        sql.append("AND l.venda.vendedor = :vendedor ");
785
                }
786
 
787
                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getTipoOrdenacao())) {
788
                        if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.DATA.getValor())) {
789
                                sql.append("ORDER BY l.venda.dataVenda DESC ");
790
                        } else {
791
                                sql.append("GROUP BY l.produto ");
792
                                if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.LUCRO.getValor())) {
793
                                        sql.append("ORDER BY SUM(l.valorVenda - l.valorCompra) DESC ");
794
                                } else if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.QUANTIDADE.getValor())) {
795
                                        sql.append("ORDER BY COUNT(l.produto) DESC ");
796
                                } else if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.VALOR_VENDIDO.getValor())) {
797
                                        sql.append("ORDER BY SUM(l.valorVenda) DESC ");
798
                                }
799
                        }
800
                } else {
801
                        sql.append("ORDER BY l.venda.dataVenda DESC ");
802
                }
803
                try {
804
                        TypedQuery<RankingProdutoDTO> query = getEntityManager().createQuery(sql.toString(), RankingProdutoDTO.class)
805
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()))
806
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()))
807
                                        .setMaxResults(parametrosConsulta.getQuantidadeProdutos());
808
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
809
                                query.setParameter("sequencialLoja", parametrosConsulta.getLoja().getSequencial());
810
                        }
811
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
812
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
813
                        }
814
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
815
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
816
                                        query.setParameter("codigo", parametrosConsulta.getProduto().getCodigoProdutoPadrao());
817
                                }
818
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
819
                                        query.setParameter("descricao", "%" + removerAcentuacao(parametrosConsulta.getProduto().getDescricao()) + "%");
820
                                }
821
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
822
                                        query.setParameter("tipoEstilo", parametrosConsulta.getProduto().getEstilo());
823
                                }
824
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
825
                                        query.setParameter("tipoCor", parametrosConsulta.getProduto().getCor());
826
                                }
827
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
828
                                        query.setParameter("tipoGenero", parametrosConsulta.getProduto().getGenero());
829
                                }
830
                        }
831
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
832
                                query.setParameter("sequencialMarcaDoModelo", parametrosConsulta.getMarca().getSequencial());
833
                        }
834
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
835
                                query.setParameter("sequencialModelo", parametrosConsulta.getModelo().getSequencial());
836
                        }
837
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getFornecedor())) {
838
                                query.setParameter("fornecedor", parametrosConsulta.getFornecedor());
839
                        }
840
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getVendedor())) {
841
                                query.setParameter("vendedor", parametrosConsulta.getVendedor());
842
                        }
843
*/
844
                        /*if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSomenteParaComprar())) {
845
                                query.setParameter("quantidadeMinimaComprar", parametrosConsulta.getQuantidadeMinimaComprar());
846
                        }*/
847
                        /*if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getTipoOrdenacao())) {
848
                                if (!parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.DATA.getValor())) {
849
                                        query.setParameter("dataDoisMesesAnterior", DataUtils.acrescentarMeses(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()), -2));
850
                                }
851
                        }*/
852
/*     
853
                        return query.getResultList();
854
                } catch(Exception ex) {
855
                        ex.printStackTrace();
856
                        return null;
857
                }
858
        }
859
 
860
        @Override
861
        public List<RankingProdutoDTO> consultarProdutosVendidosResumido(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
862
                StringBuilder sql = new StringBuilder();
863
                sql.append("SELECT CAST(l.seq_produto AS VARCHAR), COUNT(l.seq_produto) ");
864
                sql.append(adicionarEstoqueSqlNativo(parametrosConsulta));
865
                sql.append(" FROM sc_sec.sec_lancamento l ");
866
                sql.append("LEFT JOIN sc_sec.sec_venda v ON v.seq_venda = l.seq_venda ");
867
                sql.append("LEFT JOIN sc_sec.sec_loja lj ON v.seq_loja = lj.seq_loja ");
868
                sql.append("LEFT JOIN sc_sec.sec_produto p ON p.seq_produto = l.seq_produto ");
869
                sql.append("LEFT JOIN sc_sec.sec_modelo m ON m.seq_modelo = p.seq_modelo ");
870
                sql.append("LEFT JOIN sc_sec.sec_marca ma ON ma.seq_marca = m.seq_marca ");
871
                sql.append("WHERE v.dth_venda >= :dataInicial AND v.dth_venda <= :dataFinal ");
872
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
873
                        sql.append("AND lj.seq_loja = :sequencialLoja ");
874
                }
875
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
876
                        sql.append("AND p.tip_produto = :tipoProduto ");
877
                }
878
 
879
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
880
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getSequencial())) {
881
                                sql.append("AND p.seq_produto = :sequencialProduto ");
882
                        }
883
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
884
                                sql.append("AND p.cod_produto = :codigo ");
885
                        }
886
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
887
                                sql.append("AND ");
888
                                sql.append(sqlConsultarSemAcento("p.dsc_produto"));
889
                                sql.append(" like upper(:descricao) ");
890
                        }
891
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
892
                                sql.append("AND p.tip_estilo = :tipoEstilo ");
893
                        }
894
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
895
                                sql.append("AND p.tip_cor = :tipoCor ");
896
                        }
897
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
898
                                sql.append("AND p.tip_genero = :tipoGenero ");
899
                        }
900
                }
901
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
902
                        sql.append("AND ma.seq_marcal = :sequencialMarcaDoModelo ");
903
                }
904
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
905
                        sql.append("AND m.seq_modelo = :sequencialModelo ");
906
                }
907
 
908
                sql.append("GROUP BY l.seq_produto ");
909
//              if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.QUANTIDADE.getValor())) {
910
//                      sql.append("ORDER BY COUNT(l.seq_produto) DESC ");
911
//              }
912
                try {
913
                        Query query = getEntityManager().createNativeQuery(sql.toString())
914
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()))
915
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
916
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getPrimeiroRegistro())) {
917
                                if (parametrosConsulta.getPrimeiroRegistro() > 0) {
918
                                        query.setFirstResult(parametrosConsulta.getPrimeiroRegistro());
919
                                }
920
                        }
921
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTamanhoPagina())) {
922
                                if (parametrosConsulta.getTamanhoPagina() > 0) {
923
                                        query.setMaxResults(parametrosConsulta.getTamanhoPagina());
924
                                } else {
925
                                        query.setMaxResults(parametrosConsulta.getQuantidadeProdutos());
926
                                }
927
                        } else {
928
                                query.setMaxResults(parametrosConsulta.getQuantidadeProdutos());
929
                        }
930
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
931
                                query.setParameter("sequencialLoja", parametrosConsulta.getLoja().getSequencial());
932
                        }
933
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
934
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
935
                        }
936
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
937
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getSequencial())) {
938
                                        query.setParameter("sequencialProduto", parametrosConsulta.getProduto().getSequencial());
939
                                }
940
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
941
                                        query.setParameter("codigo", parametrosConsulta.getProduto().getCodigoProdutoPadrao());
942
                                }
943
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
944
                                        query.setParameter("descricao", "%" + removerAcentuacao(parametrosConsulta.getProduto().getDescricao()) + "%");
945
                                }
946
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
947
                                        query.setParameter("tipoEstilo", parametrosConsulta.getProduto().getEstilo());
948
                                }
949
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
950
                                        query.setParameter("tipoCor", parametrosConsulta.getProduto().getCor());
951
                                }
952
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
953
                                        query.setParameter("tipoGenero", parametrosConsulta.getProduto().getGenero());
954
                                }
955
                        }
956
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
957
                                query.setParameter("sequencialMarcaDoModelo", parametrosConsulta.getMarca().getSequencial());
958
                        }
959
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
960
                                query.setParameter("sequencialModelo", parametrosConsulta.getModelo().getSequencial());
961
                        }
962
                        List<Object[]> resultList = query.getResultList();
963
                        List<RankingProdutoDTO> produtos = new ArrayList<RankingProdutoDTO>();
964
                        for (Object[] objects : resultList) {
965
                                RankingProdutoDTO rankingProduto = new RankingProdutoDTO();
966
                                Produto produto = new Produto();
967
                                if (VerificadorUtil.naoEstaNulo(objects[0])) {
968
                                        produto.setSequencial(Long.parseLong(objects[0].toString()));
969
                                }
970
                                rankingProduto.setProduto(produto);
971
                                if (VerificadorUtil.naoEstaNulo(objects[1])) {
972
                                        rankingProduto.setQuantidadeVendas(Long.parseLong(objects[1].toString()));
973
                                }
974
                                if (VerificadorUtil.naoEstaNulo(objects[2])) {
975
                                        rankingProduto.setQuantidadeEstoque(Long.parseLong(objects[2].toString()));
976
                                }
977
                                produtos.add(rankingProduto);
978
                        }
979
                        return produtos;
980
                } catch(Exception ex) {
981
                        ex.printStackTrace();
982
                        return null;
983
                }
984
        }
985
 
986
        @Override
987
        public List<RankingProdutoDTO> consultarProdutosParaTransferir(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
988
                StringBuilder sql = new StringBuilder();
989
                sql.append("SELECT CAST(l.seq_produto AS VARCHAR) AS produto, COUNT(l.seq_produto) AS vendas ");
990
                sql.append(" FROM sc_sec.sec_lancamento l ");
991
                sql.append("LEFT JOIN sc_sec.sec_venda v ON v.seq_venda = l.seq_venda ");
992
                sql.append("LEFT JOIN sc_sec.sec_loja lj ON v.seq_loja = lj.seq_loja ");
993
                sql.append("LEFT JOIN sc_sec.sec_produto p ON p.seq_produto = l.seq_produto ");
994
                sql.append("LEFT JOIN sc_sec.sec_modelo m ON m.seq_modelo = p.seq_modelo ");
995
                sql.append("LEFT JOIN sc_sec.sec_marca ma ON ma.seq_marca = m.seq_marca ");
996
                sql.append("WHERE ");
997
                sql.append(adicionarParametrosSqlNativo(parametrosConsulta));
998
                sql.append("GROUP BY l.seq_produto, ma.dsc_marca, m.dsc_modelo ");
999
                sql.append("HAVING ");
1000
                for (Loja loja : parametrosConsulta.getLojasParaConsulta()) {
1001
                        sql.append(adicionarHavingSqlNativo(parametrosConsulta, loja.getSequencial()));
1002
                        sql.append(" OR ");
1003
                }
1004
                sql.append(" (SELECT SUM(pl.qtd_estoque) AS estoque FROM sc_sec.sec_produto_loja pl WHERE pl.seq_produto = l.seq_produto AND pl.seq_loja in (");
1005
                for (Loja loja : parametrosConsulta.getLojasParaConsulta()) {
1006
                        sql.append(" ").append(loja.getSequencial()).append(", ");
1007
                }
1008
                sql.deleteCharAt(sql.length()-1);
1009
                sql.deleteCharAt(sql.length()-1);
1010
                sql.append(" )) = 0 ");
1011
                sql.append("ORDER BY ma.dsc_marca, m.dsc_modelo ");
1012
                try {
1013
                        Query query = getEntityManager().createNativeQuery(sql.toString())
1014
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()))
1015
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
1016
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getPrimeiroRegistro())) {
1017
                                if (parametrosConsulta.getPrimeiroRegistro() > 0) {
1018
                                        query.setFirstResult(parametrosConsulta.getPrimeiroRegistro());
1019
                                }
1020
                        }
1021
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTamanhoPagina())) {
1022
                                if (parametrosConsulta.getTamanhoPagina() > 0) {
1023
                                        query.setMaxResults(parametrosConsulta.getTamanhoPagina());
1024
                                } else {
1025
                                        query.setMaxResults(parametrosConsulta.getQuantidadeProdutos());
1026
                                }
1027
                        } else {
1028
                                query.setMaxResults(parametrosConsulta.getQuantidadeProdutos());
1029
                        }
1030
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
1031
                                query.setParameter("sequencialLoja", parametrosConsulta.getLoja().getSequencial());
1032
                        }
1033
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1034
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
1035
                        }
1036
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
1037
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getSequencial())) {
1038
                                        query.setParameter("sequencialProduto", parametrosConsulta.getProduto().getSequencial());
1039
                                }
1040
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
1041
                                        query.setParameter("codigo", parametrosConsulta.getProduto().getCodigoProdutoPadrao());
1042
                                }
1043
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
1044
                                        query.setParameter("descricao", "%" + removerAcentuacao(parametrosConsulta.getProduto().getDescricao()) + "%");
1045
                                }
1046
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
1047
                                        query.setParameter("tipoEstilo", parametrosConsulta.getProduto().getEstilo());
1048
                                }
1049
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
1050
                                        query.setParameter("tipoCor", parametrosConsulta.getProduto().getCor());
1051
                                }
1052
                                if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
1053
                                        query.setParameter("tipoGenero", parametrosConsulta.getProduto().getGenero());
1054
                                }
1055
                        }
1056
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
1057
                                query.setParameter("sequencialMarcaDoModelo", parametrosConsulta.getMarca().getSequencial());
1058
                        }
1059
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
1060
                                query.setParameter("sequencialModelo", parametrosConsulta.getModelo().getSequencial());
1061
                        }
1062
                        List<Object[]> resultList = query.getResultList();
1063
                        List<RankingProdutoDTO> produtos = new ArrayList<RankingProdutoDTO>();
1064
                        for (Object[] objects : resultList) {
1065
                                RankingProdutoDTO rankingProduto = new RankingProdutoDTO();
1066
                                Produto produto = new Produto();
1067
                                if (VerificadorUtil.naoEstaNulo(objects[0])) {
1068
                                        System.out.println(objects[0].toString());
1069
                                        produto.setSequencial(Long.parseLong(objects[0].toString()));
1070
                                }
1071
                                rankingProduto.setProduto(produto);
1072
                                produtos.add(rankingProduto);
1073
                        }
1074
                        return produtos;
1075
                } catch(Exception ex) {
1076
                        ex.printStackTrace();
1077
                        return null;
1078
                }
1079
        }
1080
 
1081
        private String adicionarVendasSqlNativo(ParametrosConsultaProdutosVendidosDTO parametrosConsulta, Long sequencialLoja) {
1082
                StringBuilder sql = new StringBuilder("");
1083
                sql.append(", (SELECT COUNT(lanc.seq_produto) FROM sc_sec.sec_lancamento lanc ");
1084
                sql.append("LEFT JOIN sc_sec.sec_venda v ON v.seq_venda = lanc.seq_venda ");
1085
                sql.append("LEFT JOIN sc_sec.sec_loja lj ON v.seq_loja = lj.seq_loja ");
1086
                sql.append("WHERE v.dth_venda >= :dataInicial AND v.dth_venda <= :dataFinal ");
1087
                sql.append("AND lanc.seq_produto = l.seq_produto AND lj.seq_loja = ");
1088
                sql.append(sequencialLoja);
1089
                sql.append(" GROUP BY lanc.seq_produto) AS vendas" + sequencialLoja + " ");
1090
                return sql.toString();
1091
        }
1092
 
1093
        private String adicionarEstoqueSqlNativo(ParametrosConsultaProdutosVendidosDTO parametrosConsulta, Long sequencialLoja) {
1094
                StringBuilder sql = new StringBuilder();
1095
                sql.append(", (SELECT SUM(pl.qtd_estoque) FROM sc_sec.sec_produto_loja pl ");
1096
                sql.append("WHERE pl.seq_produto = l.seq_produto ");
1097
                sql.append("AND pl.seq_loja = ");
1098
                sql.append(sequencialLoja);
1099
                sql.append(") AS estoque" + sequencialLoja + " ");
1100
                return sql.toString();
1101
        }
1102
 
1103
        private String adicionarHavingSqlNativo(ParametrosConsultaProdutosVendidosDTO parametrosConsulta, Long sequencialLoja) {
1104
                StringBuilder sql = new StringBuilder();
1105
                sql.append("((SELECT SUM(pl.qtd_estoque) AS estoque FROM sc_sec.sec_produto_loja pl WHERE pl.seq_produto = l.seq_produto AND pl.seq_loja = ");
1106
                sql.append(sequencialLoja);
1107
                sql.append(") - (");
1108
                sql.append("SELECT COUNT(lanc.seq_produto) FROM sc_sec.sec_lancamento lanc ");
1109
                sql.append("LEFT JOIN sc_sec.sec_venda v ON v.seq_venda = lanc.seq_venda ");
1110
                sql.append("LEFT JOIN sc_sec.sec_loja lj ON v.seq_loja = lj.seq_loja ");
1111
                sql.append("WHERE v.dth_venda >= :dataInicial AND v.dth_venda <= :dataFinal AND lanc.seq_produto = l.seq_produto ");
1112
                sql.append("AND lj.seq_loja = ");
1113
                sql.append(sequencialLoja);
1114
                sql.append(" GROUP BY lanc.seq_produto) ");
1115
                sql.append("* 1) * -1 > 0 ");
1116
                return sql.toString();
1117
        }
1118
 
1119
        private String adicionarEstoqueSqlNativo(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1120
                StringBuilder sql = new StringBuilder();
1121
                sql.append(", (");
1122
                sql.append("SELECT SUM(pl.qtd_estoque) FROM sc_sec.sec_produto_loja pl ");
1123
                sql.append("WHERE pl.seq_produto = l.seq_produto ");
1124
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
1125
                        sql.append("AND pl.seq_loja = :sequencialLoja ");
1126
                }
1127
                sql.append(") ");
1128
                return sql.toString();
1129
        }
1130
 
1131
        private String adicionarParametrosSqlNativo(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1132
                StringBuilder sql = new StringBuilder("v.dth_venda >= :dataInicial AND v.dth_venda <= :dataFinal ");
1133
 
1134
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLojaSelecionada()) &&
1135
                                VerificadorUtil.naoEstaNulo(parametrosConsulta.getEstoqueMinimo())) {
1136
                        sql.append("AND (");
1137
                        sql.append("SELECT SUM(pl.qtd_estoque) FROM sc_sec.sec_produto_loja pl ");
1138
                        sql.append("WHERE pl.seq_produto = l.seq_produto ");
1139
                        sql.append("AND pl.seq_loja = ");
1140
                        sql.append(parametrosConsulta.getLojaSelecionada().getSequencial());
1141
                        sql.append(") >= ");
1142
                        sql.append(parametrosConsulta.getEstoqueMinimo());
1143
                        sql.append(" ");
1144
                }
1145
 
1146
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getLoja())) {
1147
                        sql.append("AND lj.seq_loja = :sequencialLoja ");
1148
                }
1149
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1150
                        sql.append("AND p.tip_produto = :tipoProduto ");
1151
                }
1152
 
1153
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getProduto())) {
1154
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getSequencial())) {
1155
                                sql.append("AND p.seq_produto = :sequencialProduto ");
1156
                        }
1157
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCodigo())) {
1158
                                sql.append("AND p.cod_produto = :codigo ");
1159
                        }
1160
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getDescricao())) {
1161
                                sql.append("AND ");
1162
                                sql.append(sqlConsultarSemAcento("p.dsc_produto"));
1163
                                sql.append(" like upper(:descricao) ");
1164
                        }
1165
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getEstilo())) {
1166
                                sql.append("AND p.tip_estilo = :tipoEstilo ");
1167
                        }
1168
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getCor())) {
1169
                                sql.append("AND p.tip_cor = :tipoCor ");
1170
                        }
1171
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsulta.getProduto().getGenero())) {
1172
                                sql.append("AND p.tip_genero = :tipoGenero ");
1173
                        }
1174
                }
1175
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getMarca())) {
1176
                        sql.append("AND ma.seq_marcal = :sequencialMarcaDoModelo ");
1177
                }
1178
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
1179
                        sql.append("AND m.seq_modelo = :sequencialModelo ");
1180
                }
1181
                return sql.toString();
1182
        }
1183
 
1184
        @Override
1185
        public List<RankingProdutoDTO> consultarProdutosMaisVendidos(Date dataInicial, Date dataFinal, Integer quantidadeProdutos, String tipoOrdenacao, Long sequencialLoja, String tipoProduto,
1186
                        Produto produto, Marca marca) {
1187
                StringBuilder sql = new StringBuilder();
1188
                sql.append("SELECT new br.com.ec.domain.dto.RankingProdutoDTO(l.produto, SUM(l.valorVenda), SUM(l.valorCompra), SUM(l.valorVarejo - l.valorVenda), COUNT(l.produto)) FROM Lancamento l ");
1189
                sql.append("WHERE l.venda.dataVenda >= :dataInicial AND l.venda.dataVenda <= :dataFinal ");
1190
                if (VerificadorUtil.naoEstaNulo(sequencialLoja)) {
1191
                        sql.append("AND l.venda.loja.sequencial = :sequencialLoja ");
1192
                }
1193
                if (VerificadorUtil.naoEstaNulo(tipoProduto)) {
1194
                        sql.append("AND l.produto.tipo = :tipoProduto ");
1195
                }
1196
                if (VerificadorUtil.naoEstaNulo(produto)) {
1197
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigo())) {
1198
                                sql.append("AND l.produto.codigo = :codigo ");
1199
                        }
1200
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getDescricao())) {
1201
                                sql.append("AND ");
1202
                                sql.append(sqlConsultarSemAcento("l.produto.descricao"));
1203
                                sql.append(" like upper(:descricao) ");
1204
                        }
1205
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getEstilo())) {
1206
                                sql.append("AND l.produto.estilo = :tipoEstilo ");
1207
                        }
1208
                        if (VerificadorUtil.naoEstaNuloOuVazio(produto.getGenero())) {
1209
                                sql.append("AND l.produto.genero = :tipoGenero ");
1210
                        }
1211
                }
1212
                if (VerificadorUtil.naoEstaNulo(marca)) {
1213
                        sql.append("AND l.produto.modelo.marca.sequencial = :sequencialMarcaDoModelo ");
1214
                }
1215
 
1216
                sql.append("GROUP BY l.produto ");
1217
                if (tipoOrdenacao.equals(TipoOrdenacaoMaisVendidos.LUCRO.getValor())) {
1218
                        sql.append("ORDER BY SUM(l.valorVenda - l.valorCompra) DESC ");
1219
                } else if (tipoOrdenacao.equals(TipoOrdenacaoMaisVendidos.QUANTIDADE.getValor())) {
1220
                        sql.append("ORDER BY COUNT(l.produto) DESC ");
1221
                } else if (tipoOrdenacao.equals(TipoOrdenacaoMaisVendidos.VALOR_VENDIDO.getValor())) {
1222
                        sql.append("ORDER BY SUM(l.valorVenda) DESC ");
1223
                }
1224
                try {
1225
                        TypedQuery<RankingProdutoDTO> query = getEntityManager().createQuery(sql.toString(), RankingProdutoDTO.class)
1226
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial))
1227
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal))
1228
                                        .setMaxResults(quantidadeProdutos);
1229
                        if (VerificadorUtil.naoEstaNulo(sequencialLoja)) {
1230
                                query.setParameter("sequencialLoja", sequencialLoja);
1231
                        }
1232
                        if (VerificadorUtil.naoEstaNulo(tipoProduto)) {
1233
                                query.setParameter("tipoProduto", tipoProduto);
1234
                        }
1235
                        if (VerificadorUtil.naoEstaNulo(produto)) {
1236
                                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getCodigo())) {
1237
                                        query.setParameter("codigo", produto.getCodigoProdutoPadrao());
1238
                                }
1239
                                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getDescricao())) {
1240
                                        query.setParameter("descricao", "%" + removerAcentuacao(produto.getDescricao()) + "%");
1241
                                }
1242
                                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getEstilo())) {
1243
                                        query.setParameter("tipoEstilo", produto.getEstilo());
1244
                                }
1245
                                if (VerificadorUtil.naoEstaNuloOuVazio(produto.getGenero())) {
1246
                                        query.setParameter("tipoGenero", produto.getGenero());
1247
                                }
1248
                        }
1249
                        if (VerificadorUtil.naoEstaNulo(marca)) {
1250
                                query.setParameter("sequencialMarcaDoModelo", marca.getSequencial());
1251
                        }
1252
                        return query.getResultList();
1253
                } catch(Exception ex) {
1254
                        ex.printStackTrace();
1255
                        return null;
1256
                }
1257
        }
1258
 
1259
        @Override
1260
        public List<RankingModeloDTO> consultarModelosMaisVendidos(ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta) {
1261
                StringBuilder sql = new StringBuilder();
1262
                sql.append("SELECT new br.com.ec.domain.dto.RankingModeloDTO(l.produto.modelo, SUM(l.valorVenda), SUM(l.valorCompra), COUNT(l.produto.modelo), ");
1263
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1264
                        sql.append("(");
1265
                        sql.append(adicionarConsultaDoEstoque(parametrosConsulta.getSequencialLoja(), "l.produto.modelo", parametrosConsulta.getTipoProduto(), parametrosConsulta.getEstiloProduto()));
1266
                        sql.append("), ");
1267
                }
1268
                sql.append("(");
1269
                sql.append(adicionarConsultaDoEstoque(null, "l.produto.modelo", parametrosConsulta.getTipoProduto(), parametrosConsulta.getEstiloProduto()));
1270
                sql.append(")) FROM Lancamento l ");
1271
                sql.append("WHERE l.venda.dataVenda >= :dataInicial AND l.venda.dataVenda <= :dataFinal ");
1272
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1273
                        sql.append("AND l.venda.loja.sequencial = :sequencialLoja ");
1274
                }
1275
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1276
                        sql.append("AND l.produto.tipo = :tipoProduto ");
1277
                }
1278
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
1279
                        sql.append("AND l.produto.modelo = :modelo ");
1280
                }
1281
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getEstiloProduto())) {
1282
                        sql.append("AND l.produto.estilo = :estiloProduto ");
1283
                }
1284
                sql.append("GROUP BY l.produto.modelo ");
1285
                if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.LUCRO.getValor())) {
1286
                        sql.append("ORDER BY SUM(l.valorVenda - l.valorCompra) DESC ");
1287
                } else if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.QUANTIDADE.getValor())) {
1288
                        sql.append("ORDER BY COUNT(l.produto.modelo) DESC ");
1289
                } else if (parametrosConsulta.getTipoOrdenacao().equals(TipoOrdenacaoMaisVendidos.VALOR_VENDIDO.getValor())) {
1290
                        sql.append("ORDER BY SUM(l.valorVenda) DESC ");
1291
                }
1292
                try {
1293
                        TypedQuery<RankingModeloDTO> query = getEntityManager().createQuery(sql.toString(), RankingModeloDTO.class)
1294
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()))
1295
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
1296
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getQuantidadeModelos())) {
1297
                                query.setMaxResults(parametrosConsulta.getQuantidadeModelos());
1298
                        }
1299
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1300
                                query.setParameter("sequencialLoja", parametrosConsulta.getSequencialLoja());
1301
                        }
1302
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1303
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
1304
                        }
1305
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getModelo())) {
1306
                                query.setParameter("modelo", parametrosConsulta.getModelo());
1307
                        }
1308
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getEstiloProduto())) {
1309
                                query.setParameter("estiloProduto", parametrosConsulta.getEstiloProduto());
1310
                        }
1311
                        return query.getResultList();
1312
                } catch(Exception ex) {
1313
                        ex.printStackTrace();
1314
                        return null;
1315
                }
1316
        }
1317
 
1318
        private String adicionarConsultaDoEstoque(Long sequencialLoja, String modelo, String tipoProduto, String estiloProduto) {
1319
                StringBuilder sql = new StringBuilder();
1320
                sql.append("SELECT SUM(pl.quantidadeEstoque) FROM ProdutoLoja pl ");
1321
                sql.append("WHERE pl.produto.modelo = " + modelo + " ");
1322
                if (VerificadorUtil.naoEstaNuloOuVazio(sequencialLoja)) {
1323
                        sql.append("AND pl.loja.sequencial = :sequencialLoja ");
1324
                }
1325
                if (VerificadorUtil.naoEstaNuloOuVazio(tipoProduto)) {
1326
                        sql.append("AND pl.produto.tipo = :tipoProduto ");
1327
                }
1328
                if (VerificadorUtil.naoEstaNuloOuVazio(estiloProduto)) {
1329
                        sql.append("AND pl.produto.estilo = :estiloProduto ");
1330
                }
1331
                return sql.toString().trim();
1332
        }
1333
*/     
1334
        /*     
1335
        private String adicionarQueryConsultaDoEstoque(Long sequencialLoja, Modelo modelo, String tipoProduto, String estiloProduto) {
1336
                try {
1337
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class);
1338
                        if (VerificadorUtil.naoEstaNuloOuVazio(sequencialLoja)) {
1339
                                query.setParameter("sequencialLoja", sequencialLoja);
1340
                        }
1341
                        if (VerificadorUtil.naoEstaNuloOuVazio(tipoProduto)) {
1342
                                query.setParameter("tipoProduto", tipoProduto);
1343
                        }
1344
                        if (VerificadorUtil.naoEstaNuloOuVazio(estiloProduto)) {
1345
                                query.setParameter("estiloProduto", estiloProduto);
1346
                        }
1347
//                              if (VerificadorUtil.naoEstaNuloOuVazio(genero)) {
1348
//                                      query.setParameter("tipoGenero", genero);
1349
//                              }
1350
                        query.setParameter("sequencialModelo", modelo.getSequencial());
1351
//                              if (VerificadorUtil.naoEstaNuloOuVazio(descricaoProduto)) {
1352
//                                      query.setParameter("descricaoProduto", "%" + removerAcentuacao(descricaoProduto) + "%");
1353
//                              }
1354
                        return sql.toString();
1355
        }
1356
*/
1357
/*
1358
        @Override
1359
        public List<VendasDTO> consultarVendas(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
1360
                StringBuilder sql = new StringBuilder();
1361
                try {
1362
                        sql.append("SELECT ");
1363
                        sql.append("v.seq_venda, ");
1364
                        sql.append("l.dsc_loja, v.dth_venda, ");
1365
                        sql.append("(SELECT SUM(lc.val_venda) FROM sc_sec.sec_lancamento lc WHERE lc.seq_venda = v.seq_venda AND lc.ind_ativo = true), ");
1366
                        sql.append("v.tip_situacao, ");
1367
                        sql.append("us.dsc_nome, v.dsc_observacao, ");
1368
                        sql.append("p.cod_produto, m.dsc_modelo, p.dsc_produto, lanc.val_venda ");
1369
                        sql.append("FROM sc_sec.sec_venda v ");
1370
                        sql.append("LEFT JOIN sc_sec.sec_loja l ON l.seq_loja = v.seq_loja ");
1371
                        sql.append("LEFT JOIN sc_sec.sec_vendedor ve ON ve.seq_vendedor = v.seq_vendedor ");
1372
                        sql.append("LEFT JOIN sc_sec.sec_usuario us ON us.seq_pessoa = ve.seq_pessoa ");
1373
                        sql.append("LEFT JOIN sc_sec.sec_lancamento lanc ON lanc.seq_venda = v.seq_venda ");
1374
                        sql.append("LEFT JOIN sc_sec.sec_produto p ON p.seq_produto = lanc.seq_produto ");
1375
                        sql.append("LEFT JOIN sc_sec.sec_modelo m ON m.seq_modelo = p.seq_modelo ");
1376
                        sql.append("WHERE 1=1 ");
1377
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getLoja())) {
1378
                                sql.append("AND l.seq_loja.sequencial = :sequencialLoja ");
1379
                        }
1380
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getSituacaoVenda())) {
1381
                                sql.append("AND v.tip_situacao = :tipoSituacao ");
1382
                        }
1383
//                      if (VerificadorUtil.naoEstaNuloOuVazio(((ParametrosConsultaVendasDTO)parametros).getVendedor())) {
1384
//                              sql.append("AND e.vendedor.sequencial = :sequencialVendedor ");
1385
//                      }
1386
//                      if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getIndicacao())) {
1387
//                              sql.append("AND e.indicacao.sequencial = :sequencialIndicacao ");
1388
//                      }
1389
*/
1390
                        //TODO: VERIFICAR LANÇAMENTOS COM MAIS PAGAMENTOS QUE LANÇAMENTOS
1391
                        /*
1392
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getSituacaoFinanceiraVenda())) {
1393
                                if (parametrosConsultaVendasDTO.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.NENHUMA.getValor())) {
1394
                                        sql.append("AND (SELECT COUNT(c) FROM Conta c WHERE c.venda = e) = 0 ");
1395
//                                              sql.append("AND ((SELECT COUNT(vf) FROM VendaFormaPagamento vf WHERE vf.venda = e) > (SELECT COUNT(cr) FROM ContaAReceber cr WHERE cr.venda = e)) ");
1396
                                }
1397
                                if (parametrosConsultaVendasDTO.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.QUITADO.getValor())) {
1398
                                        sql.append("AND (SELECT COUNT(p) FROM Parcela p WHERE p.conta.venda = e AND p.dataPagamento is null AND p.indicadorAtivo = true) = 0 ");
1399
                                        sql.append("AND (SELECT COUNT(c) FROM Conta c WHERE c.venda = e AND c.indicadorAtivo = true) > 0 ");
1400
                                }
1401
                                if (parametrosConsultaVendasDTO.getSituacaoFinanceiraVenda().equals(br.com.ec.domain.model.tipos.TipoSituacaoFinanceira.PENDENCIAS.getValor())) {
1402
                                        sql.append("AND ((SELECT COUNT(p) FROM Parcela p WHERE p.conta.venda = e AND p.dataPagamento is null AND p.indicadorAtivo = true) > 0 ");
1403
                                        sql.append("OR (SELECT COUNT(c) FROM Conta c WHERE c.venda = e AND c.indicadorAtivo = true) = 0) ");
1404
                                }
1405
                        }
1406
                        */
1407
/*     
1408
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataVendas())
1409
                                        || VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataInicial())
1410
                                        || VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataFinal())) {
1411
                                sql.append("AND v.dth_venda >= :dataInicial ");
1412
                                sql.append("AND v.dth_venda <= :dataFinal ");
1413
                        }
1414
 
1415
                        sql.append("ORDER BY v.seq_venda ");
1416
 
1417
                        Query query = getEntityManager().createNativeQuery(sql.toString());
1418
 
1419
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getLoja())) {
1420
                                query.setParameter("sequencialLoja", parametrosConsultaVendasDTO.getLoja().getSequencial());
1421
                        }
1422
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getSituacaoVenda())) {
1423
                                query.setParameter("tipoSituacao", parametrosConsultaVendasDTO.getSituacaoVenda());
1424
                        }
1425
//                      if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getVendedor())) {
1426
//                              query.setParameter("sequencialVendedor", parametrosConsultaVendasDTO.getVendedor().getSequencial());
1427
//                      }
1428
//                      if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getIndicacao())) {
1429
//                              query.setParameter("sequencialIndicacao", ((ParametrosConsultaVendasDTO)parametros).getIndicacao().getSequencial());
1430
//                      }
1431
                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataInicial())
1432
                                        && VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataFinal())) {
1433
                                Date dataInicial = DataUtils.getDataComHorarioMinimo(parametrosConsultaVendasDTO.getDataInicial());
1434
                                Date dataFinal = DataUtils.getDataComHorarioMaximo(parametrosConsultaVendasDTO.getDataFinal());
1435
                                query.setParameter("dataInicial", dataInicial);
1436
                                query.setParameter("dataFinal", dataFinal);
1437
                        } else if (VerificadorUtil.naoEstaNuloOuVazio(parametrosConsultaVendasDTO.getDataVendas())) {
1438
                                Date dataInicial = DataUtils.getDataComHorarioMinimo(parametrosConsultaVendasDTO.getDataVendas());
1439
                                Date dataFinal = DataUtils.getDataComHorarioMaximo(parametrosConsultaVendasDTO.getDataVendas());
1440
                                query.setParameter("dataInicial", dataInicial);
1441
                                query.setParameter("dataFinal", dataFinal);
1442
                        }
1443
 
1444
                        List<Object[]> resultList = query.getResultList();
1445
 
1446
                        List<VendasDTO> vendas = new ArrayList<VendasDTO>();
1447
 
1448
                        // PREENCHER VENDAS
1449
                        for (Object[] objects : resultList) {
1450
                                VendasDTO venda = new VendasDTO();
1451
                                venda.setSequencial(Long.parseLong(objects[0].toString()));
1452
                                if (!vendas.contains(venda)) {
1453
                                        venda.setDescricaoLoja(objects[1].toString());
1454
//                                      System.out.println(objects[2].toString());
1455
//                                      venda.setDataVenda(new Date(objects[2].toString()));
1456
                                        venda.setValorVenda(Double.parseDouble(objects[3].toString()));
1457
                                        venda.setTipoSituacao(objects[4].toString());
1458
                                        venda.setNomeUsuario(objects[5].toString());
1459
                                        venda.setObservacao(objects[6].toString());
1460
                                        vendas.add(venda);
1461
                                }
1462
                        }
1463
 
1464
                        for (Object[] objects : resultList) {
1465
                                VendasDTO venda = new VendasDTO();
1466
                                venda.setSequencial(Long.parseLong(objects[0].toString()));
1467
 
1468
                                VendasLancamentoDTO lancamento = new VendasLancamentoDTO();
1469
                                lancamento.setCodigoProduto(objects[7].toString());
1470
                                if (VerificadorUtil.naoEstaNulo(objects[8])) {
1471
                                        lancamento.setDescricaoModelo(objects[8].toString());
1472
                                }
1473
                                lancamento.setDescricaoProduto(objects[9].toString());
1474
                                lancamento.setValorVenda(Double.parseDouble(objects[10].toString()));
1475
 
1476
                                VendasDTO vendaCompleta = vendas.get(vendas.indexOf(venda));
1477
                                vendaCompleta.getLancamentos().add(lancamento);
1478
                                vendas.remove(vendas.indexOf(venda));
1479
                                vendas.add(vendaCompleta);
1480
                        }
1481
                        return vendas;
1482
                } catch (NoResultException e) {
1483
                        return null;
1484
                }
1485
        }
1486
 
1487
        @Override
1488
        public Integer obterQuantidadeProdutosVendidosPorEstiloEeGenero(Date dataInicial, Date dataFinal, Long sequencialLoja, Long sequencialModelo, String tipoProduto, String estiloProduto, String tipoGenero) {
1489
                StringBuilder sql = new StringBuilder();
1490
                sql.append("SELECT COUNT(l) FROM Lancamento l ");
1491
                sql.append("WHERE l.venda.dataVenda >= :dataInicial AND l.venda.dataVenda <= :dataFinal ");
1492
                if (VerificadorUtil.naoEstaNulo(sequencialLoja)) {
1493
                        sql.append("AND l.venda.loja.sequencial = :sequencialLoja ");
1494
                }
1495
                if (VerificadorUtil.naoEstaNulo(sequencialModelo)) {
1496
                        sql.append("AND l.produto.modelo.sequencial = :sequencialModelo ");
1497
                }
1498
                if (VerificadorUtil.naoEstaNulo(tipoProduto)) {
1499
                        sql.append("AND l.produto.tipo = :tipoProduto ");
1500
                }
1501
                if (VerificadorUtil.naoEstaNuloOuVazio(estiloProduto)) {
1502
                        sql.append("AND l.produto.estilo = :tipoEstilo ");
1503
                }
1504
                if (VerificadorUtil.naoEstaNuloOuVazio(tipoGenero)) {
1505
                        sql.append("AND l.produto.genero = :tipoGenero ");
1506
                }
1507
*/             
1508
                /*sql.append("GROUP BY l.produto.estilo ");*/
1509
/*     
1510
                try {
1511
                        TypedQuery<Long> query = getEntityManager().createQuery(sql.toString(), Long.class)
1512
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(dataInicial))
1513
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(dataFinal));
1514
                        if (VerificadorUtil.naoEstaNulo(sequencialLoja)) {
1515
                                query.setParameter("sequencialLoja", sequencialLoja);
1516
                        }
1517
                        if (VerificadorUtil.naoEstaNulo(sequencialModelo)) {
1518
                                query.setParameter("sequencialModelo", sequencialModelo);
1519
                        }
1520
                        if (VerificadorUtil.naoEstaNulo(tipoProduto)) {
1521
                                query.setParameter("tipoProduto", tipoProduto);
1522
                        }
1523
                        if (VerificadorUtil.naoEstaNuloOuVazio(estiloProduto)) {
1524
                                query.setParameter("tipoEstilo", estiloProduto);
1525
                        }
1526
                        if (VerificadorUtil.naoEstaNuloOuVazio(tipoGenero)) {
1527
                                query.setParameter("tipoGenero", tipoGenero);
1528
                        }
1529
                        return query.getSingleResult().intValue();
1530
                } catch(Exception ex) {
1531
                        ex.printStackTrace();
1532
                        return null;
1533
                }
1534
        }
1535
*/     
1536
        /*
1537
        @Override
1538
        public RankingComprasTransferenciasEstiloDTO consultarVendasPorEstilo(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, Modelo modelo) {
1539
                StringBuilder sql = new StringBuilder();
1540
                sql.append("SELECT new br.com.ec.domain.dto.RankingComprasTransferenciasEstiloDTO(");
1541
                sql.append("l.produto.estilo");
1542
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, null) + ")");
1543
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor()) + ")");
1544
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor()) + ")");
1545
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor()) + ")");
1546
                sql.append(", COUNT(0), COUNT(0), COUNT(0), COUNT(0)");
1547
                sql.append(") FROM Lancamento l ");
1548
                sql.append("WHERE l.venda.dataVenda >= :dataInicial AND l.venda.dataVenda <= :dataFinal ");
1549
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1550
                        sql.append("AND l.venda.loja.sequencial = :sequencialLoja ");
1551
                }
1552
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1553
                        sql.append("AND l.produto.tipo = :tipoProduto ");
1554
                }
1555
                sql.append("AND l.produto.modelo = :modelo ");
1556
                sql.append("AND l.produto.estilo = :estiloProduto ");
1557
                sql.append("GROUP BY l.produto.estilo ");
1558
                try {
1559
                        TypedQuery<RankingComprasTransferenciasEstiloDTO> query = getEntityManager().createQuery(sql.toString(), RankingComprasTransferenciasEstiloDTO.class)
1560
                                        .setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()))
1561
                                        .setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
1562
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1563
                                query.setParameter("sequencialLoja", parametrosConsulta.getSequencialLoja());
1564
                        }
1565
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1566
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
1567
                        }
1568
                        if (VerificadorUtil.naoEstaNulo(modelo)) {
1569
                                query.setParameter("modelo", modelo);
1570
                        }
1571
                        query.setParameter("estiloProduto", parametrosConsulta.getEstilo());
1572
                        return query.getSingleResult();
1573
                } catch(NoResultException nr) {
1574
                        RankingComprasTransferenciasEstiloDTO rankingComprasTransferenciasEstilo = new RankingComprasTransferenciasEstiloDTO();
1575
                        rankingComprasTransferenciasEstilo.setEstilo(TipoEstiloProduto.parse(parametrosConsulta.getEstilo()));
1576
                        return rankingComprasTransferenciasEstilo;
1577
                } catch(Exception ex) {
1578
                        ex.printStackTrace();
1579
                        return null;
1580
                }
1581
        }
1582
*/
1583
/*
1584
        private String adicionarConsultaQuantidadeVendasPorEstilo(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, String genero, Boolean consultarPorLoja) {
1585
                StringBuilder sql = new StringBuilder();
1586
                sql.append("SELECT COUNT(lanc) FROM Lancamento lanc ");
1587
                sql.append("WHERE lanc.venda.dataVenda >= :dataInicial AND lanc.venda.dataVenda <= :dataFinal ");
1588
                sql.append("AND lanc.produto.modelo = :modelo ");
1589
                sql.append("AND lanc.produto.estilo = :estiloProduto ");
1590
                if (consultarPorLoja) {
1591
                        sql.append("AND lanc.venda.loja = l ");
1592
                }
1593
                sql.append("AND lanc.produto.genero = '" + genero + "' ");
1594
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1595
                        sql.append("AND lanc.produto.tipo = :tipoProduto ");
1596
                }
1597
                return sql.toString().trim();
1598
        }
1599
 
1600
        @Override
1601
        public RankingComprasTransferenciasEstiloDTO consultarEstoqueEeVendasPorEstilo(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, Modelo modelo) {
1602
                StringBuilder sql = new StringBuilder();
1603
                sql.append("SELECT new br.com.ec.domain.dto.RankingComprasTransferenciasEstiloDTO(");
1604
                sql.append("pLoja.produto.estilo");
1605
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor(), false) + ")");
1606
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor(), false) + ")");
1607
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor(), false) + ")");
1608
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor(), false) + ")");
1609
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor(), false) + ")");
1610
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor(), false) + ")");
1611
                sql.append(", (" + adicionarConsultaPedidosCompraPorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor()) + ")");
1612
                sql.append(", (" + adicionarConsultaPedidosCompraPorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor()) + ")");
1613
                sql.append(", (" + adicionarConsultaPedidosCompraPorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor()) + ")");
1614
                // ADICIONAR QUANTIDADE JÁ SOLCITADO PARA COMPRA (VERIFICADO + SOLICITADO)
1615
                sql.append(") FROM ProdutoLoja pLoja ");
1616
                sql.append("WHERE pLoja.produto.estilo = :estiloProduto ");
1617
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1618
                        sql.append("AND pLoja.loja.sequencialLoja = :sequencialLoja ");
1619
                }
1620
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1621
                        sql.append("AND pLoja.produto.tipo = :tipoProduto ");
1622
                }
1623
                sql.append("AND pLoja.produto.modelo = :modelo ");
1624
                sql.append("GROUP BY pLoja.produto.estilo ");
1625
                try {
1626
                        TypedQuery<RankingComprasTransferenciasEstiloDTO> query = getEntityManager().createQuery(sql.toString(), RankingComprasTransferenciasEstiloDTO.class);
1627
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()));
1628
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
1629
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1630
                                query.setParameter("sequencialLoja", parametrosConsulta.getSequencialLoja());
1631
                        }
1632
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1633
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
1634
                        }
1635
                        if (VerificadorUtil.naoEstaNulo(modelo)) {
1636
                                query.setParameter("modelo", modelo);
1637
                        }
1638
                        query.setParameter("estiloProduto", parametrosConsulta.getEstilo());
1639
                        return query.getSingleResult();
1640
                } catch(NoResultException nr) {
1641
                        RankingComprasTransferenciasEstiloDTO rankingComprasTransferenciasEstilo = new RankingComprasTransferenciasEstiloDTO();
1642
                        rankingComprasTransferenciasEstilo.setEstilo(TipoEstiloProduto.parse(parametrosConsulta.getEstilo()));
1643
                        return rankingComprasTransferenciasEstilo;
1644
                } catch(Exception ex) {
1645
                        ex.printStackTrace();
1646
                        return null;
1647
                }
1648
        }
1649
 
1650
        private String adicionarConsultaEstoquePorEstilo(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, String genero, Boolean consultarPorLoja) {
1651
                StringBuilder sql = new StringBuilder();
1652
                sql.append("SELECT SUM(pl.quantidadeEstoque) FROM ProdutoLoja pl ");
1653
                sql.append("WHERE pl.produto.modelo = :modelo ");
1654
                sql.append("AND pl.produto.estilo = :estiloProduto ");
1655
                if (consultarPorLoja) {
1656
                        sql.append("AND pl.loja = l ");
1657
                }
1658
                sql.append("AND pl.produto.genero = '" + genero + "' ");
1659
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1660
                        sql.append("AND pl.produto.tipo = :tipoProduto ");
1661
                }
1662
                return sql.toString().trim();
1663
        }
1664
 
1665
        private String adicionarConsultaPedidosCompraPorEstilo(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, String genero) {
1666
                StringBuilder sql = new StringBuilder();
1667
                sql.append("SELECT SUM(ppc.quantidadeParaComprar) FROM ProdutoPedidoCompra ppc ");
1668
                sql.append("WHERE ppc.status IN ('" + TipoStatusPedidoCompra.VERIFICADO.getValor() + "','" + TipoStatusPedidoCompra.SOLICITADO.getValor() + "') ");
1669
                sql.append("AND ppc.produto.modelo = :modelo ");
1670
                sql.append("AND ppc.produto.estilo = :estiloProduto ");
1671
                sql.append("AND ppc.produto.genero = '" + genero + "' ");
1672
                if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1673
                        sql.append("AND ppc.produto.tipo = :tipoProduto ");
1674
                }
1675
                return sql.toString().trim();
1676
        }
1677
 
1678
        @Override
1679
        public List<RankingComprasTransferenciasEstiloPorLoja> consultarEstoqueEeVendasEstiloPorLoja(ParametrosConsultaParaComprasTransferenciasDTO parametrosConsulta, Modelo modelo) {
1680
                StringBuilder sql = new StringBuilder();
1681
                sql.append("SELECT new br.com.ec.domain.dto.RankingComprasTransferenciasEstiloPorLoja(");
1682
                sql.append("l");
1683
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor(), true) + ")");
1684
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor(), true) + ")");
1685
                sql.append(", (" + adicionarConsultaQuantidadeVendasPorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor(), true) + ")");
1686
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.UNISSEX.getValor(), true) + ")");
1687
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.MASCULINO.getValor(), true) + ")");
1688
                sql.append(", (" + adicionarConsultaEstoquePorEstilo(parametrosConsulta, TipoGenero.FEMININO.getValor(), true) + ")");
1689
                sql.append(", " + parametrosConsulta.getQuantidadeMinimaComprar());
1690
                // ADICIONAR QUANTIDADE JÁ SOLICITADO PARA COMPRA (VERIFICADO + SOLICITADO)
1691
                sql.append(") FROM Loja l ");
1692
                sql.append("WHERE l.ativo IS TRUE ");
1693
                sql.append("GROUP BY l, l.ordenador ");
1694
                sql.append("ORDER BY l.ordenador ");
1695
                try {
1696
                        TypedQuery<RankingComprasTransferenciasEstiloPorLoja> query = getEntityManager().createQuery(sql.toString(), RankingComprasTransferenciasEstiloPorLoja.class);
1697
                        query.setParameter("dataInicial", DataUtils.getDataComHorarioMinimo(parametrosConsulta.getDataInicial()));
1698
                        query.setParameter("dataFinal", DataUtils.getDataComHorarioMaximo(parametrosConsulta.getDataFinal()));
1699
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getSequencialLoja())) {
1700
                                query.setParameter("sequencialLoja", parametrosConsulta.getSequencialLoja());
1701
                        }
1702
                        if (VerificadorUtil.naoEstaNulo(parametrosConsulta.getTipoProduto())) {
1703
                                query.setParameter("tipoProduto", parametrosConsulta.getTipoProduto());
1704
                        }
1705
                        if (VerificadorUtil.naoEstaNulo(modelo)) {
1706
                                query.setParameter("modelo", modelo);
1707
                        }
1708
                        query.setParameter("estiloProduto", parametrosConsulta.getEstilo());
1709
                        return query.getResultList();
1710
                } catch(Exception ex) {
1711
                        ex.printStackTrace();
1712
                        return null;
1713
                }
1714
        }
1715
*/
1716
}