Subversion Repositories Integrator Subversion

Rev

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

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