Subversion Repositories Integrator Subversion

Rev

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