Subversion Repositories Integrator Subversion

Rev

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