Subversion Repositories Integrator Subversion

Rev

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