Subversion Repositories Integrator Subversion

Rev

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