Subversion Repositories Integrator Subversion

Rev

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