Subversion Repositories Integrator Subversion

Rev

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

Rev Author Line No. Line
149 espaco 1
package br.com.ec.domain.service.venda.impl;
2
 
3
import java.util.ArrayList;
4
import java.util.Date;
5
import java.util.List;
6
import java.util.Map;
7
 
8
import org.springframework.beans.factory.annotation.Autowired;
9
import org.springframework.stereotype.Service;
10
 
195 espaco 11
import br.com.ec.core.consulta.ParametrosConsulta;
12
import br.com.ec.core.exception.NegocioException;
13
import br.com.ec.core.generic.AbstractService;
14
import br.com.ec.core.generic.GenericRepository;
15
import br.com.ec.core.util.DataUtils;
16
import br.com.ec.core.util.StringUtil;
17
import br.com.ec.core.util.VerificadorUtil;
18
import br.com.ec.core.validador.Validador;
149 espaco 19
import br.com.ec.domain.dto.GraficoAcumuladoDTO;
20
import br.com.ec.domain.dto.ParametrosConsultaLancamentosDTO;
21
import br.com.ec.domain.dto.ParametrosConsultaModelosMaisVendidosDTO;
22
import br.com.ec.domain.dto.ParametrosConsultaParaComprasTransferenciasDTO;
23
import br.com.ec.domain.dto.ParametrosConsultaPedidoDTO;
24
import br.com.ec.domain.dto.ParametrosConsultaPorPeriodoDTO;
25
import br.com.ec.domain.dto.ParametrosConsultaProdutosVendidosDTO;
26
import br.com.ec.domain.dto.ParametrosConsultaVendasDTO;
27
import br.com.ec.domain.dto.ParametrosConsultaVendasVivoDTO;
28
import br.com.ec.domain.dto.ParametrosVendaDTO;
29
import br.com.ec.domain.dto.RankingComprasTransferenciasDTO;
30
import br.com.ec.domain.dto.RankingComprasTransferenciasEstiloDTO;
600 blopes 31
import br.com.ec.domain.dto.RankingComprasTransferenciasSubtipoProdutoDTO;
149 espaco 32
import br.com.ec.domain.dto.RankingLojaDTO;
33
import br.com.ec.domain.dto.RankingModeloDTO;
34
import br.com.ec.domain.dto.RankingProdutoDTO;
35
import br.com.ec.domain.dto.RankingVendedorDTO;
36
import br.com.ec.domain.dto.VendasDTO;
37
import br.com.ec.domain.model.Avaliacao;
38
import br.com.ec.domain.model.AvaliacaoFuncionario;
356 espaco 39
import br.com.ec.domain.model.AvaliacaoProduto;
149 espaco 40
import br.com.ec.domain.model.Categoria;
704 blopes 41
import br.com.ec.domain.model.Cliente;
42
import br.com.ec.domain.model.Cliente;
149 espaco 43
import br.com.ec.domain.model.Cupom;
44
import br.com.ec.domain.model.EstoqueAuditoria;
45
import br.com.ec.domain.model.FormaPagamento;
46
import br.com.ec.domain.model.Lancamento;
47
import br.com.ec.domain.model.Loja;
48
import br.com.ec.domain.model.Marca;
49
import br.com.ec.domain.model.Modelo;
50
import br.com.ec.domain.model.NotaFiscal;
51
import br.com.ec.domain.model.Pedido;
52
import br.com.ec.domain.model.PedidoHistorico;
53
import br.com.ec.domain.model.Produto;
600 blopes 54
import br.com.ec.domain.model.SubtipoProduto;
149 espaco 55
import br.com.ec.domain.model.Usuario;
577 blopes 56
import br.com.ec.domain.model.UsuarioPerfil;
149 espaco 57
import br.com.ec.domain.model.Venda;
58
import br.com.ec.domain.model.VendaFormaPagamento;
59
import br.com.ec.domain.model.Vendedor;
60
import br.com.ec.domain.model.Vigencia;
61
import br.com.ec.domain.model.tipos.TipoEmitirNotaFiscal;
62
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
63
import br.com.ec.domain.model.tipos.TipoEstoqueAuditoria;
64
import br.com.ec.domain.model.tipos.TipoOrdenacaoPlanejamentoCompras;
65
import br.com.ec.domain.model.tipos.TipoProduto;
66
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
67
import br.com.ec.domain.model.tipos.TipoSituacaoVenda;
68
import br.com.ec.domain.service.avaliacao.AvaliacaoService;
69
import br.com.ec.domain.service.avaliacaofuncionario.AvaliacaoFuncionarioService;
70
import br.com.ec.domain.service.avaliacaoloja.AvaliacaoLojaService;
71
import br.com.ec.domain.service.bancohoras.BancoHorasService;
685 blopes 72
import br.com.ec.domain.service.cashback.CashbackService;
149 espaco 73
import br.com.ec.domain.service.cupom.CupomService;
74
import br.com.ec.domain.service.email.impl.GerenciadorEmailImpl;
75
import br.com.ec.domain.service.estoqueauditoria.EstoqueAuditoriaService;
76
import br.com.ec.domain.service.funcionario.FuncionarioService;
77
import br.com.ec.domain.service.lancamento.LancamentoService;
78
import br.com.ec.domain.service.loja.LojaService;
79
import br.com.ec.domain.service.modelo.ModeloService;
80
import br.com.ec.domain.service.parcela.ParcelaService;
81
import br.com.ec.domain.service.pedido.PedidoService;
635 blopes 82
import br.com.ec.domain.service.posvenda.PosVendaService;
149 espaco 83
import br.com.ec.domain.service.produto.ProdutoService;
84
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
577 blopes 85
import br.com.ec.domain.service.usuario.UsuarioService;
149 espaco 86
import br.com.ec.domain.service.venda.VendaService;
87
import br.com.ec.domain.service.vendaformapagamento.VendaFormaPagamentoService;
88
import br.com.ec.domain.service.vendavivo.VendaVivoService;
89
import br.com.ec.domain.service.vendedor.VendedorService;
356 espaco 90
import br.com.ec.domain.service.vigencia.VigenciaService;
149 espaco 91
import br.com.ec.domain.shared.ConstantesSEC;
92
import br.com.ec.domain.shared.Ordenador;
93
import br.com.ec.domain.shared.OrdenadorImpl;
94
import br.com.ec.infrastructure.repository.NotaFiscalRepository;
95
import br.com.ec.infrastructure.repository.VendaRepository;
96
 
97
@Service
98
public class VendaServiceImpl extends AbstractService<Venda> implements VendaService {
99
 
100
        private VendaRepository vendaRepository;
101
 
102
        private LancamentoService lancamentoService;
103
        private VendaFormaPagamentoService vendaFormaPagamentoService;
104
        private ProdutoService produtoService;
105
        private ProdutoLojaService produtoLojaService;
106
        private VendedorService vendedorService;
107
        private FuncionarioService funcionarioService;
108
        private LojaService lojaService;
109
        private PedidoService pedidoService;
110
        private ParcelaService parcelaService;
111
        private AvaliacaoService avaliacaoService;
112
        private AvaliacaoFuncionarioService avaliacaoFuncionarioService;
113
        private AvaliacaoLojaService avaliacaoLojaService;
114
        private VendaVivoService vendaVivoService;
115
        private ModeloService modeloService;
116
        private CupomService cupomService;
117
        private BancoHorasService bancoHorasService;
118
        private EstoqueAuditoriaService estoqueAuditoriaService;
356 espaco 119
        private VigenciaService vigenciaService;
577 blopes 120
        private UsuarioService usuarioService;
635 blopes 121
        private PosVendaService posVendaService;
685 blopes 122
        private CashbackService cashbackService;
149 espaco 123
 
124
        private Ordenador ordenador;
125
        private NotaFiscalRepository notaFiscalRepository;
126
 
127
        @Autowired
128
        public VendaServiceImpl(Validador validador, VendaRepository vendaRepository, LancamentoService lancamentoService,
129
                        VendaFormaPagamentoService vendaFormaPagamentoService, ProdutoService produtoService, ProdutoLojaService produtoLojaService,
130
                        VendedorService vendedorService, FuncionarioService funcionarioService, LojaService lojaService, PedidoService pedidoService,
131
                        ParcelaService parcelaService, AvaliacaoService avaliacaoService, AvaliacaoFuncionarioService avaliacaoFuncionarioService,
132
                        AvaliacaoLojaService avaliacaoLojaService, VendaVivoService vendaVivoService, ModeloService modeloService, CupomService cupomService,
356 espaco 133
                        BancoHorasService bancoHorasService, EstoqueAuditoriaService estoqueAuditoriaService, VigenciaService vigenciaService,
685 blopes 134
                        UsuarioService usuarioService, PosVendaService posVendaService, CashbackService cashbackService, NotaFiscalRepository notaFiscalRepository) {
149 espaco 135
                super(validador);
136
                this.vendaRepository = vendaRepository;
137
                this.funcionarioService = funcionarioService;
138
                this.lancamentoService = lancamentoService;
139
                this.vendaFormaPagamentoService = vendaFormaPagamentoService;
140
                this.produtoService = produtoService;
141
                this.produtoLojaService = produtoLojaService;
142
                this.vendedorService = vendedorService;
143
                this.lojaService = lojaService;
144
                this.pedidoService = pedidoService;
145
                this.parcelaService = parcelaService;
146
                this.avaliacaoService = avaliacaoService;
147
                this.avaliacaoFuncionarioService = avaliacaoFuncionarioService;
148
                this.avaliacaoLojaService = avaliacaoLojaService;
149
                this.vendaVivoService = vendaVivoService;
150
                this.modeloService = modeloService;
151
                this.cupomService = cupomService;
152
                this.bancoHorasService = bancoHorasService;
153
                this.estoqueAuditoriaService = estoqueAuditoriaService;
356 espaco 154
                this.vigenciaService = vigenciaService;
577 blopes 155
                this.usuarioService = usuarioService;
635 blopes 156
                this.posVendaService = posVendaService;
685 blopes 157
                this.cashbackService = cashbackService;
356 espaco 158
                this.notaFiscalRepository = notaFiscalRepository;
149 espaco 159
                this.ordenador = new OrdenadorImpl();
160
        }
161
 
162
        @Override
163
        protected GenericRepository<Venda> getRepository() {
164
                return vendaRepository;
165
        }
166
 
167
        @Override
168
        protected void regrasNegocioCadastrar(Venda venda) {
169
                if (VerificadorUtil.estaNulo(venda.getVendedor())) {
170
                        throw new NegocioException("Obrigatório informar o vendedor.");
171
                }
172
                venda.setDataVenda(DataUtils.getDataAtual());
173
                venda.setTipoSituacao(TipoSituacaoVenda.NOVO.getValor());
174
        }
175
 
176
        /***************************************************************/
177
 
178
        @Override
179
        public Venda detalharVenda(Venda venda) {
180
                return vendaRepository.detalharVenda(venda);
181
        }
182
 
183
        @Override
184
        public Venda detalharVendaCompleta(Venda venda) {
185
                return vendaRepository.detalharVendaCompleta(venda);
186
        }
187
 
188
        public void excluirVenda(Venda venda, Usuario usuario) {
189
                List<NotaFiscal> notasVinculadas = desvincularNotaFiscalEmitida(venda, usuario);
190
                verificarSeExisteLancamentoFinanceiro(venda);
191
                reporEstoqueAoExcluirVenda(venda);
635 blopes 192
                excluirPosVenda(venda);
149 espaco 193
                excluirPagamentos(venda);
689 blopes 194
                excluirCashback(venda);
237 espaco 195
                desvincularPedido(venda, usuario);
149 espaco 196
                super.excluir(venda);
197
                enviarEmail(venda, usuario, notasVinculadas);
198
        }
199
 
200
        private List<NotaFiscal> desvincularNotaFiscalEmitida(Venda venda, Usuario usuario) {
201
                List<NotaFiscal> notasFiscais = notaFiscalRepository.consultarNotasFiscais(venda);
202
                for (NotaFiscal nf : notasFiscais) {
203
                        nf.setObservacaoVenda("VENDA ID: " + venda.getSequencial() + " em " +
204
                                DataUtils.converterDataComHorarioParaString(venda.getDataVenda()) + ". " +
205
                                venda.getJustificativaParaExcluir());
206
                        notaFiscalRepository.desvincularVenda(nf);
207
                }
208
                return notasFiscais;
209
        }
210
 
211
        private void verificarSeExisteLancamentoFinanceiro(Venda venda) {
212
                if (parcelaService.verificarPossuiParcela(venda)) {
213
                        throw new NegocioException("Não é permitido excluir uma venda com lançamentos financeiros.");
214
                }
215
        }
216
 
217
        public void reporEstoqueAoExcluirVenda(Venda venda) {
218
                for (Lancamento lancamento : venda.getLancamentos()) {
305 espaco 219
                        alterarEstoqueProduto(1, venda.getLoja(), lancamento.getProduto().getCodigo(), lancamento.getTipoPersonalizacao());
149 espaco 220
                }
221
        }
222
 
635 blopes 223
        public void excluirPosVenda(Venda venda) {
224
                posVendaService.excluirPosVenda(venda.getSequencial());
225
        }
226
 
149 espaco 227
        private void excluirPagamentos(Venda venda) {
228
                for (VendaFormaPagamento vendaFormaPagamento : venda.getListaVendaFormaPagamentos()) {
229
//                      vendaFormaPagamentoService.excluirPorId(vendaFormaPagamento);
230
                        vendaFormaPagamentoService.excluir(vendaFormaPagamento);
231
                }
232
        }
233
 
689 blopes 234
        private void excluirCashback(Venda venda) {
235
                cashbackService.excluirCashbackVenda(venda.getSequencial());
236
        }
237
 
237 espaco 238
        private void desvincularPedido(Venda venda, Usuario usuario) {
239
                Pedido pedidoCompleto = pedidoService.consultarPedidoCompletoDaVenda(venda);
246 espaco 240
                if (VerificadorUtil.naoEstaNulo(pedidoCompleto)) {
241
                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
242
                        pedidoHistorico.setPedido(pedidoCompleto);
243
                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
244
                        pedidoHistorico.setObservacao("VENDA: " + venda.getSequencial() + " FOI ESTORNADA.");
245
                        if (VerificadorUtil.naoEstaNuloOuVazio(venda.getJustificativaParaExcluir())) {
246
                                pedidoHistorico.setObservacao(pedidoHistorico.getObservacao() + " JUSTIFICATIVA: " + venda.getJustificativaParaExcluir());
247
                        }
248
                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.PENDENTE.getValor());
249
                        pedidoHistorico.setUsuario(usuario);
250
                        pedidoCompleto.getHistorico().add(pedidoHistorico);
251
                        pedidoCompleto.setTipoSituacao(TipoSituacaoPedido.PENDENTE.getValor());
252
                        pedidoCompleto.setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
253
                        pedidoCompleto.setVenda(null);
254
                        pedidoService.alterar(pedidoCompleto);
237 espaco 255
                }
256
        }
257
 
149 espaco 258
        private void enviarEmail(Venda venda, Usuario usuario, List<NotaFiscal> notasFiscaisVinculadas) {
259
                String diaAtual = DataUtils.converterDataParaString(DataUtils.getDataAtual());
260
                StringBuilder conteudo = new StringBuilder();
261
                conteudo.append(montarDadosDaVenda(venda, usuario, venda.getLancamentos(), venda.getVendaFormaPagamentos()));
262
                if (!notasFiscaisVinculadas.isEmpty()) {
263
                        conteudo.append("--------------------------------------------------\n\n");
264
                        conteudo.append("NOTAS FISCAIS DESVINCULADAS:\n");
265
                        for (NotaFiscal nota : notasFiscaisVinculadas) {
266
                                conteudo.append("NÚMERO: " + nota.getNumeroNotaFiscal() + "\n");
267
                        }
268
                }
269
                new GerenciadorEmailImpl()
270
                        .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
271
                        .comAssunto("ESPAÇO CASE - OPERAÇÃO DE EXCLUSÃO DE VENDA: " + diaAtual)
272
                        .comConteudo(conteudo.toString())
273
                        .enviar();
274
        }
275
 
276
        @Override
277
        public Venda cadastrarVendaPeloPDV(ParametrosVendaDTO parametrosVenda) {
278
                verificarLancamentos(parametrosVenda.getLancamentos());
279
//              lancarExcecaoCasoFreteContraditorio(parametrosVenda);
280
                lancarExcecaoCasoNaoSejaInformadoCamposObrigatorios(parametrosVenda);
281
                lancarExcecaoSeValoresNaoSaoIguais(parametrosVenda);
282
                Venda venda = new Venda(parametrosVenda);
283
                cadastrar(venda);
284
                cadastrarLancamentos(parametrosVenda, venda);
285
                cadastrarPagamentos(parametrosVenda, venda);
635 blopes 286
                cadastrarPosVenda(venda);
686 blopes 287
                atualizarCashback(parametrosVenda, venda);
149 espaco 288
                alterarSituacaoPedido(parametrosVenda.getPedidoVinculado(), venda);
289
                enviarAlertasPorEmail(parametrosVenda, venda);
290
                venda.verificarSePermiteEmissaoNotaFiscal();
291
                venda.setEmitirNotaFiscal(verificarEmissaoNotaFiscal(parametrosVenda, venda));
292
                return venda;
293
        }
294
 
295
        private Boolean verificarEmissaoNotaFiscal(ParametrosVendaDTO parametrosVenda, Venda venda) {
296
                if (venda.getPermitirEmissaoNotaFiscal() == false) {return false;}
297
                Boolean emitir = null;
298
                emitir = naoEmitirLojaSemPermissao(parametrosVenda);
299
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
300
 
301
                emitir = naoEmitirCpfCnpjInvalido(parametrosVenda);
302
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
303
 
304
                emitir = emitirLojaComEmissaoObrigatoria(parametrosVenda);
305
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
306
 
307
                emitir = emitirProdutoComEmissaoObrigatoria(parametrosVenda);
308
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
309
 
310
                emitir = emitirVendasAcimaQuinhetosReais(parametrosVenda);
311
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
312
 
313
                emitir = emitirVendaPagamentoCartao(parametrosVenda);
314
                if (VerificadorUtil.naoEstaNulo(emitir)) {return emitir;}
315
                return false;
316
        }
317
 
318
        private Boolean naoEmitirLojaSemPermissao(ParametrosVendaDTO parametrosVenda) {
319
                if (parametrosVenda.getLoja().getTipoEmitirNotaFiscal().equals(TipoEmitirNotaFiscal.NAO_PERMITIR_EMISSAO.getValor()) ||
320
                                parametrosVenda.getLoja().getTipoEmitirNotaFiscal().equals(TipoEmitirNotaFiscal.NAO_EMITIR.getValor())) {
321
                        return false;
322
                }
323
                return null;
324
        }
325
 
326
        private Boolean naoEmitirCpfCnpjInvalido(ParametrosVendaDTO parametrosVenda) {
327
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getCliente())) {
328
                        if (!parametrosVenda.getCliente().cpfCnpjEhValido()) {
329
                                return false;
330
                        }
331
                }
332
                return null;
333
        }
334
 
335
        private Boolean emitirLojaComEmissaoObrigatoria(ParametrosVendaDTO parametrosVenda) {
336
                if (parametrosVenda.getLoja().getTipoEmitirNotaFiscal().equals(TipoEmitirNotaFiscal.TODAS_VENDAS.getValor())) {
337
                        return true;
338
                }
339
                return null;
340
        }
341
 
342
 
343
 
344
        private Boolean emitirProdutoComEmissaoObrigatoria(ParametrosVendaDTO parametrosVenda) {
345
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
346
                        if (lancamento.getProduto().getIndicadorEmissaoNotaFiscal()) {
347
                                return true;
348
                        }
349
                }
350
                return null;
351
        }
352
 
353
        private Boolean emitirVendasAcimaQuinhetosReais(ParametrosVendaDTO parametrosVenda) {
354
                Double valorVenda = new Double(0.0);
355
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
356
                        valorVenda = valorVenda + lancamento.getValorVenda();
357
                }
358
                if (valorVenda > 499.9) {
359
                        return true;
360
                }
361
                return null;
362
        }
363
 
364
        private Boolean emitirVendaPagamentoCartao(ParametrosVendaDTO parametrosVenda) {
365
                if (parametrosVenda.getLoja().getTipoEmitirNotaFiscal().equals(TipoEmitirNotaFiscal.VENDAS_OBRIGATORIAS.getValor())) {
366
                        for (VendaFormaPagamento pagamento : parametrosVenda.getLancamentosPagamentos()) {
690 blopes 367
                                if (pagamento.getFormaPagamento().formaPagamentoEhPix() ||
368
                                                pagamento.getFormaPagamento().formaPagamentoEhTransferencia() ||
369
                                                pagamento.getFormaPagamento().formaPagamentoEhCredito() ||
149 espaco 370
                                                pagamento.getFormaPagamento().formaPagamentoEhDebito() ||
371
                                                pagamento.getFormaPagamento().formaPagamentoEhPagseguro()) {
372
                                        return true;
373
                                }
374
                        }
375
                }
376
                return null;
377
        }
378
 
379
        private void alterarSituacaoPedido(Pedido pedidoVinculado, Venda venda) {
380
                if (VerificadorUtil.naoEstaNulo(pedidoVinculado)) {
381
                        PedidoHistorico pedidoHistorico = new PedidoHistorico();
382
                        pedidoHistorico.setDataHistorico(DataUtils.getDataAtual());
383
                        pedidoHistorico.setObservacao("VENDA: " + venda.getSequencial());
384
                        pedidoHistorico.setTipoSituacao(TipoSituacaoPedido.FINALIZADO_COM_VENDAS.getValor());
385
                        pedidoHistorico.setUsuario(venda.getUsuario());
386
                        pedidoHistorico.setPedido(pedidoVinculado);
387
                        if (VerificadorUtil.estaNulo(pedidoVinculado.getHistorico())) {
388
                                pedidoVinculado.setHistorico(new ArrayList<PedidoHistorico>());
389
                        }
390
                        pedidoVinculado.getHistorico().add(pedidoHistorico);
391
                        pedidoVinculado.setTipoSituacao(TipoSituacaoPedido.FINALIZADO_COM_VENDAS.getValor());
392
                        pedidoVinculado.setDataUltimaAlteracaoSituacao(DataUtils.getDataAtual());
165 espaco 393
                        pedidoVinculado.setVenda(venda);
149 espaco 394
                        pedidoService.alterar(pedidoVinculado);
395
                }
396
        }
397
 
398
        private void enviarAlertasPorEmail(ParametrosVendaDTO parametrosVenda, Venda venda) {
577 blopes 399
                Boolean enviarAlerta = false;
400
                String emailsDestino = "";
401
                String assuntoAlerta = "";
149 espaco 402
                if (descontosEmProdutosSuperiores(parametrosVenda)) {
577 blopes 403
                        enviarAlerta = true;
404
                        emailsDestino = ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO;
405
                        assuntoAlerta = "ESPAÇO CASE - VENDA COM DESCONTO SUPERIOR : " + DataUtils.converterDataParaString(DataUtils.getDataAtual());
149 espaco 406
                }
407
                if (produtosComDescontoECupom(parametrosVenda)) {
577 blopes 408
                        enviarAlerta = true;
409
                        emailsDestino = ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO;
410
                        assuntoAlerta = "ESPAÇO CASE - VENDA COM PRODUTO COM DESCONTO E CUPOM PROMOCIONAL : " + DataUtils.converterDataParaString(DataUtils.getDataAtual());
411
                }
412
                if (possuiMaisDeDuasFormasDePagamento(parametrosVenda)) {
413
                        enviarAlerta = true;
414
                        emailsDestino = ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO;
415
                        assuntoAlerta = "ESPAÇO CASE - VENDA SUSPEITA COM MAIS DE 2 FORMAS DE PAGAMENTO : " + DataUtils.converterDataParaString(DataUtils.getDataAtual());
416
                }
417
                if (enviarAlerta) {
149 espaco 418
                        new GerenciadorEmailImpl()
577 blopes 419
                                .comEmailsDestino(emailsDestino)
420
                                .comAssunto(assuntoAlerta)
149 espaco 421
                                .comConteudo(montarDadosDaVenda(venda, venda.getUsuario(), parametrosVenda.getLancamentos(), parametrosVenda.getLancamentosPagamentos()))
422
                                .enviar();
423
                }
424
        }
425
 
577 blopes 426
        private Boolean possuiMaisDeDuasFormasDePagamento(ParametrosVendaDTO parametrosVenda) {
427
                return parametrosVenda.getLancamentosPagamentos().size() > 2;
428
        }
429
 
149 espaco 430
        /*
431
        private void enviarAlertasPorEmail(ParametrosVendaDTO parametrosVenda, Venda venda) {
432
                if (pagamentoDividido(parametrosVenda)) {
433
                        if (descontoEmProdutos(parametrosVenda)) {
434
                                String diaAtual = DataUtils.converterDataParaString(DataUtils.getDataAtual());
435
                                new GerenciadorEmailImpl()
436
                                        .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_DIRECAO)
437
                                        .comAssunto("ESPAÇO CASE - VENDA DIVIDIDA E COM DESCONTO : " + diaAtual)
438
                                        .comConteudo(montarDadosDaVenda(venda, venda.getUsuario(), parametrosVenda.getLancamentos(), parametrosVenda.getLancamentosPagamentos()))
439
                                        .enviar();
440
                        }
441
                }
442
        }
320 espaco 443
 
149 espaco 444
 
445
        private Boolean pagamentoDividido(ParametrosVendaDTO parametrosVenda) {
446
                for (VendaFormaPagamento pagamento : parametrosVenda.getLancamentosPagamentos()) {
447
                        if (pagamento.getFormaPagamento().formaPagamentoEhCreditoDividido()) {
448
                                return true;
449
                        }
450
                }
451
                return false;
452
        }
453
 
454
        private boolean descontoEmProdutos(ParametrosVendaDTO parametrosVenda) {
455
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
456
                        if (lancamento.comDescontos()) {
457
                                return true;
458
                        }
459
                }
460
                return false;
461
        }
320 espaco 462
        */
149 espaco 463
 
464
        private boolean descontosEmProdutosSuperiores(ParametrosVendaDTO parametrosVenda) {
320 espaco 465
                if (produtoJBLComDesconto(parametrosVenda.getLancamentos())) {
466
                        return true;
467
                }
468
 
469
                Double totalDescontoPermitido = 0.0;
470
                Double totalDescontoConcebido = 0.0;
149 espaco 471
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
320 espaco 472
                        if (VerificadorUtil.naoEstaNulo(lancamento.getValorVarejo()) && VerificadorUtil.naoEstaNulo(lancamento.getValorVenda())) {
473
                                totalDescontoConcebido = totalDescontoConcebido + (lancamento.getValorVarejo() - lancamento.getValorVenda());
474
                                if (lancamento.getValorVarejo() < 100) {
475
                                        totalDescontoPermitido = totalDescontoPermitido + 5.0;
476
                                } else {
477
                                        totalDescontoPermitido = totalDescontoPermitido + (lancamento.getValorVarejo()*10/100);
478
                                }
479
                        }
480
                }
481
                if (totalDescontoConcebido > totalDescontoPermitido) {
482
                        return true;
483
                }
484
                return false;
485
        }
486
 
487
        private boolean produtoJBLComDesconto(List<Lancamento> lancamentos) {
488
                for (Lancamento lancamento : lancamentos) {
489
                        if (lancamento.getProduto().getDescricaoCompleta().contains("JBL") && lancamento.comDescontos()) {
149 espaco 490
                                return true;
491
                        }
492
                }
493
                return false;
494
        }
320 espaco 495
 
149 espaco 496
        private boolean produtosComDescontoECupom(ParametrosVendaDTO parametrosVenda) {
497
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
498
                        if (VerificadorUtil.naoEstaNulo(lancamento.getCupom()) && lancamento.comDescontos()) {
499
                                return true;
500
                        }
501
                }
502
                return false;
503
        }
504
 
505
        @Override
506
        public void alterarVenda(ParametrosVendaDTO parametrosVenda, Usuario usuario, Boolean verificarJustificativa) {
507
                verificarLancamentos(parametrosVenda.getLancamentos());
577 blopes 508
                lancarExcecaoSeUsuarioNaoTiverPermissao(parametrosVenda, usuario, verificarJustificativa);
149 espaco 509
                lancarExcecaoCasoNaoSejaInformadoCamposObrigatorios(parametrosVenda);
510
                lancarExcecaoSeValoresNaoSaoIguais(parametrosVenda);
511
                if (verificarJustificativa) {enviarEmailAlteracoes(parametrosVenda, usuario);}
704 blopes 512
                ajustarCashbackSeAlterarCliente(parametrosVenda);
149 espaco 513
                atualizarDadosDaVenda(parametrosVenda);
514
                alterarLancamentos(parametrosVenda);
515
                alterarPagamentos(parametrosVenda);
516
                alterar(parametrosVenda.getVenda());
517
                alterarSituacaoPedido(parametrosVenda.getPedidoVinculado(), parametrosVenda.getVenda());
518
        }
519
 
577 blopes 520
        private void lancarExcecaoSeUsuarioNaoTiverPermissao(ParametrosVendaDTO parametrosVenda, Usuario usuario, Boolean verificarJustificativa) {
521
                if (verificarJustificativa) {
522
                        for (UsuarioPerfil usuarioPerfil : usuario.getPerfis()) {
523
                                if (usuarioPerfil.getPerfil().getCodigo().equals(ConstantesSEC.PERFIL_LOJA_9)) {
524
                                        throw new NegocioException("USUÁRIO SEM PERMISSÃO PARA ESTA OPERAÇÃO");
525
                                }
526
                        }
527
 
528
                        if (!parametrosVenda.getVendedor().equals(parametrosVenda.getVenda().getVendedor())) {
529
                                Usuario usuarioDetalhe = usuarioService.detalhar(usuario);
530
                                if (VerificadorUtil.naoEstaNulo(usuarioDetalhe.getPessoa())) {
531
                                        if (!parametrosVenda.getVenda().getVendedor().getPessoa().equals(usuarioDetalhe.getPessoa())) {
532
                                                throw new NegocioException("OPERAÇÃO SÓ PODE SER REALIZADA PELO VENDEDOR ATUAL");
533
                                        }
534
                                } else {
535
                                        throw new NegocioException("USUÁRIO SEM PERMISSÃO PARA ESTA OPERAÇÃO");
536
                                }
537
                        }
538
                }
539
        }
540
 
149 espaco 541
        private void enviarEmailAlteracoes(ParametrosVendaDTO parametrosVenda, Usuario usuario) {
542
                String diaAtual = DataUtils.converterDataParaString(DataUtils.getDataAtual());
543
                StringBuilder conteudo = new StringBuilder();
544
                conteudo.append("OPERAÇÃO REALIZADA POR: " + usuario.getNome() + "\n");
545
                conteudo.append("ID: " + parametrosVenda.getVenda().getSequencial() + "\n");
546
                conteudo.append("DATA DA VENDA: " + DataUtils.converterDataComHorarioParaString(parametrosVenda.getVenda().getDataVenda()) + "\n");
547
                conteudo.append("ALTERAÇÕES:\n");
548
                if (!parametrosVenda.getLoja().equals(parametrosVenda.getVenda().getLoja())) {
549
                        conteudo.append("LOJA: " + parametrosVenda.getVenda().getLoja().getDescricao() + " -> " + parametrosVenda.getLoja().getDescricao() + "\n");
550
                }
551
                if (!parametrosVenda.getVendedor().equals(parametrosVenda.getVenda().getVendedor())) {
552
                        conteudo.append("VENDEDOR: " + parametrosVenda.getVenda().getVendedor().getNomeDaPessoa() + " -> " + parametrosVenda.getVendedor().getNomeDaPessoa() + "\n");
553
                }
554
 
555
                String indicacao = "NÃO INFORMADO";
556
                String novaIndicacao = "NÃO INFORMADO";
557
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getVenda().getIndicacao())) {
558
                        indicacao = parametrosVenda.getVenda().getIndicacao().getNome();
559
                }
560
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getIndicacao())) {
561
                        novaIndicacao = parametrosVenda.getIndicacao().getNome();
562
                }
563
                if (!indicacao.equals(novaIndicacao)) {
564
                        conteudo.append("INDICAÇÃO: " + indicacao + " -> " + novaIndicacao + "\n");
565
                }
566
 
567
                String cliente = "NÃO INFORMADO";
568
                String novoCliente = "NÃO INFORMADO";
569
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getVenda().getCliente())) {
570
                        cliente = parametrosVenda.getVenda().getCliente().getNome();
571
                }
572
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getCliente())) {
573
                        novoCliente = parametrosVenda.getCliente().getNome();
574
                }
575
                if (!cliente.equals(novoCliente)) {
576
                        conteudo.append("CLIENTE: " + cliente + " -> " + novoCliente + "\n");
577
                }
578
 
579
                if (!parametrosVenda.getObservacao().equals(parametrosVenda.getVenda().getObservacao())) {
580
                        conteudo.append("OBS: " + parametrosVenda.getVenda().getObservacao() + " -> " + parametrosVenda.getObservacao() + "\n");
581
                }
582
 
583
                String formasPagamento = "";
584
                String novasFormasPagamento = "";
585
                List<VendaFormaPagamento> pagamentosAnteriores = consultarPagamentosCadastrados(parametrosVenda);
586
                if (!VerificadorUtil.isListaNulaOuVazia(pagamentosAnteriores)) {
587
                        for (VendaFormaPagamento pagamento : pagamentosAnteriores) {
588
                                formasPagamento = formasPagamento + " R$" + pagamento.getValorPagamento() + " (" + pagamento.getFormaPagamento().getDescricao();
589
                                if (VerificadorUtil.naoEstaNulo(pagamento.getBandeiraCartao())) {
590
                                        formasPagamento =  formasPagamento + " - " + pagamento.getBandeiraCartao().getTipoCartaoDescricao() + " - " + pagamento.getDescricaoDaBandeiraCartao();
591
                                }
592
                                formasPagamento =  formasPagamento + "); ";
593
                        }
594
                }
595
                if (!VerificadorUtil.isListaNulaOuVazia(parametrosVenda.getLancamentosPagamentos())) {
596
                        for (VendaFormaPagamento pagamento : parametrosVenda.getLancamentosPagamentos()) {
597
                                novasFormasPagamento = novasFormasPagamento + " R$" + pagamento.getValorPagamento() + " (" + pagamento.getFormaPagamento().getDescricao();
598
                                if (VerificadorUtil.naoEstaNulo(pagamento.getBandeiraCartao())) {
599
                                        novasFormasPagamento =  novasFormasPagamento + " - " + pagamento.getBandeiraCartao().getTipoCartaoDescricao() + " - " + pagamento.getDescricaoDaBandeiraCartao();
600
                                }
601
                                novasFormasPagamento =  novasFormasPagamento + "); ";
602
                        }
603
                }
604
                if (!formasPagamento.equals(novasFormasPagamento)) {
605
                        conteudo.append("FORMAS DE PAGAMENTO: " + formasPagamento + " -> " + novasFormasPagamento + "\n");
606
                }
607
 
608
                conteudo.append("\n");
609
                conteudo.append("JUSTIFICATIVA: " + parametrosVenda.getVenda().getJustificativaParaExcluir() + "\n");
610
                new GerenciadorEmailImpl()
611
                        .comEmailsDestino(ConstantesSEC.DESTINATARIOS_EMAIL_SUPERVISAO)
612
                        .comAssunto("ESPAÇO CASE - ALTERAÇÃO DE VENDA: " + diaAtual)
613
                        .comConteudo(conteudo.toString())
614
                        .enviar();
615
        }
616
 
617
        private String montarDadosDaVenda(Venda venda, Usuario usuario, List<Lancamento> lancamentos, List<VendaFormaPagamento> pagamentos) {
618
                StringBuilder conteudo = new StringBuilder();
619
                conteudo.append("OPERAÇÃO REALIZADA POR: " + usuario.getNome() + "\n");
620
                conteudo.append("ID: " + venda.getSequencial() + "\n");
621
                conteudo.append("DATA DA VENDA: " + DataUtils.converterDataComHorarioParaString(venda.getDataVenda()) + "\n");
622
                conteudo.append("LOJA: " + venda.getLoja().getDescricao() + "\n");
623
                conteudo.append("VENDEDOR: " + venda.getVendedor().getNomeDaPessoa() + "\n");
624
                conteudo.append("TOTAL: " + valorTotalVenda(lancamentos) + "\n");
625
                conteudo.append("OBS.: " + venda.getObservacao() + "\n");
626
                if (VerificadorUtil.naoEstaNuloOuVazio(venda.getJustificativaParaExcluir())) {
627
                        conteudo.append("JUSTIFICATIVA: " + venda.getJustificativaParaExcluir() + "\n");
628
                } else {
629
                        conteudo.append("SEM JUSTIFICATIVA\n");
630
                }
631
                conteudo.append("--------------------------------------------------\n");
632
                for (Lancamento lancamento : lancamentos) {
633
                        conteudo.append(lancamento.getProduto().getCodigoProdutoPadrao() + " | ");
634
                        conteudo.append(lancamento.getProduto().getDescricaoComModeloCompleta() + ", ");
635
                        conteudo.append("R$" + lancamento.getValorVenda());
636
                        if (lancamento.comDescontos()) {
637
                                conteudo.append(" (COM DESCONTO DE R$" + lancamento.valorDescontos());
638
                                conteudo.append(" [" + lancamento.valorPercentualDescontos() + "])");
639
                        }
640
                        if (VerificadorUtil.naoEstaNuloOuVazio(lancamento.getObservacao())) {
641
                                conteudo.append(" (OBS.: " + lancamento.getObservacao() + ")");
642
                        }
643
                        if (VerificadorUtil.naoEstaNulo(lancamento.getCupom())) {
644
                                String descricaoCupom = lancamento.getCupom().getCodigo();
645
                                if (VerificadorUtil.naoEstaNulo(lancamento.getCupom().getDescricao())) {
646
                                        descricaoCupom = descricaoCupom + " - " + lancamento.getCupom().getDescricao();
647
                                }
648
                                conteudo.append(" (CUPOM: " + descricaoCupom + ")");
649
                        }
650
                        conteudo.append("\n");
651
                }
652
                conteudo.append("--------------------------------------------------\n");
653
                for (VendaFormaPagamento pagamento : pagamentos) {
654
                        if (VerificadorUtil.naoEstaNulo(pagamento.getBandeiraCartao())) {
655
                                conteudo.append(pagamento.getFormaPagamento().getDescricao() + " - " + pagamento.getBandeiraCartao().getDescricao() + ": R$" +  pagamento.getValorPagamento() + "\n");
656
                        } else {
657
                                conteudo.append(pagamento.getFormaPagamento().getDescricao() + ": R$" + pagamento.getValorPagamento() + "\n");
658
                        }
659
                        conteudo.append("\n");
660
                }
661
                conteudo.append("--------------------------------------------------\n");
662
                if (VerificadorUtil.naoEstaNulo(venda.getCliente())) {
663
                        conteudo.append("DADOS DO CLIENTE:\n");
664
                        conteudo.append(venda.getCliente().getNome() + "\n");
665
                        conteudo.append(venda.getCliente().getCpfCnpjFormatado() + "\n");
666
                }
667
                return conteudo.toString();
668
        }
669
 
670
        private Double valorTotalVenda(List<Lancamento> lancamentos) {
671
                Double total = new Double(0.0);
672
                for (Lancamento lancamento : lancamentos) {
673
                        if (lancamento.getAtivo()) {
674
                                total = total + lancamento.getValorVenda();
675
                        }
676
                }
677
                return total;
678
        }
704 blopes 679
 
680
        //TODO : AJUSTAR CASHBACK AO ALTERAR NA VENDA
681
        private void ajustarCashbackSeAlterarCliente(ParametrosVendaDTO parametrosVenda) {
682
//              parametrosVenda.getVenda().setCliente(parametrosVenda.getCliente());
683
                Cliente clienteAnterior = parametrosVenda.getVenda().getCliente();
684
                Cliente clienteNovo = parametrosVenda.getCliente();
685
                if (VerificadorUtil.naoEstaNulo(clienteAnterior) && VerificadorUtil.estaNulo(clienteNovo)) {
686
                        // RETIRAR CASHBACK DO CLIENTE ANTERIOR
687
                }
688
                if (VerificadorUtil.naoEstaNulo(clienteNovo) && VerificadorUtil.estaNulo(clienteAnterior)) {
689
                        // ADICIONAR CASHBACK DO CLIENTE NOVO
690
                }
691
                if (VerificadorUtil.naoEstaNulo(clienteAnterior) && VerificadorUtil.naoEstaNulo(clienteNovo)) {
692
                        if (!clienteAnterior.getSequencial().equals(clienteNovo.getSequencial())) {
693
                                // RETIRAR CASHBACK DO CLIENTE ANTERIOR
694
                                // ADICIONAR CASHBACK DO CLIENTE NOVO
695
                        }
696
                }
697
        }
149 espaco 698
 
699
        private void atualizarDadosDaVenda(ParametrosVendaDTO parametrosVenda) {
700
                parametrosVenda.getVenda().setVendedor(parametrosVenda.getVendedor());
701
                parametrosVenda.getVenda().setIndicacao(parametrosVenda.getIndicacao());
702
                parametrosVenda.getVenda().setCliente(parametrosVenda.getCliente());
703
                parametrosVenda.getVenda().setObservacao(parametrosVenda.getObservacao());
704
                parametrosVenda.getVenda().setNotaFiscal(parametrosVenda.getNotaFiscal());
705
                parametrosVenda.getVenda().setMaquineta(parametrosVenda.getMaquineta());
706
                if (!parametrosVenda.getVenda().getLoja().equals(parametrosVenda.getLoja())) {
707
                        for (Lancamento lancamento : parametrosVenda.getVenda().getLancamentos()) {
305 espaco 708
                                alterarEstoqueProduto(1, parametrosVenda.getVenda().getLoja(), lancamento.getProduto().getCodigo(), lancamento.getTipoPersonalizacao());
709
                                alterarEstoqueProduto(-1, parametrosVenda.getLoja(), lancamento.getProduto().getCodigo(), lancamento.getTipoPersonalizacao());
149 espaco 710
                        }
711
                        parametrosVenda.getVenda().setLoja(parametrosVenda.getLoja());
712
                        parametrosVenda.getVenda().setMaquineta(parametrosVenda.getLoja().getMaquineta());
713
                }
714
                parametrosVenda.getVenda().setTipoSituacao(parametrosVenda.getTipoSituacao());
715
                parametrosVenda.getVenda().setDataVenda(parametrosVenda.getDataVenda());
716
        }
717
 
718
        @Override
719
        public List<Venda> consultarVendasDoDia(Long sequencialLoja, Date dataVendas) {
720
                return vendaRepository.consultarVendasDoDia(sequencialLoja, dataVendas);
721
        }
722
 
723
        @Override
724
        public Integer obterQuantidadeDeVendasPorLojaEePeriodo(Venda venda, Date dataInicial, Date dataFinal) {
725
                return vendaRepository.obterQuantidadeDeVendasPorLojaEePeriodo(venda, dataInicial, dataFinal);
726
        }
727
 
728
        @Override
729
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo(Loja loja, Date dataInicial, Date dataFinal) {
730
                Double valorTotal = vendaRepository.obterValorTotalBrutoDeVendasPorLojaEePeriodo(loja, dataInicial, dataFinal);
689 blopes 731
                valorTotal = valorTotal - vendaRepository.obterValorDeCuponsOuCashbackUtilizadosPorLojaEePeriodo(new ParametrosConsultaVendasDTO(loja, dataInicial, dataFinal));
149 espaco 732
                return valorTotal;
733
        }
734
 
735
        @Override
736
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
737
                Double valorTotal = vendaRepository.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsulta);
689 blopes 738
                valorTotal = valorTotal - vendaRepository.obterValorDeCuponsOuCashbackUtilizadosPorLojaEePeriodo(parametrosConsulta);
149 espaco 739
                return valorTotal;
740
        }
741
 
742
        @Override
743
        public Double obterValorTotalDeDescontosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
744
                return vendaRepository.obterValorTotalDeDescontosPorLojaEePeriodo(parametrosConsulta);
745
        }
746
 
747
        @Override
748
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodoEeFormasDePagamento(ParametrosConsultaVendasDTO parametrosConsultaVendas, List<FormaPagamento> formasDePagamento) {
749
                return vendaRepository.obterValorTotalBrutoDeVendasPorLojaEePeriodoEeFormasDePagamento(parametrosConsultaVendas, formasDePagamento);
750
        }
751
 
752
        @Override
753
        public Double obterValorTotalLiquidoDeVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
754
                return vendaRepository.obterValorTotalLiquidoDeVendasPorLojaEePeriodo(parametrosConsulta);
755
        }
756
 
757
        @Override
758
        public Integer obterQuantidadeProdutosVendidosPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
759
                return vendaRepository.obterQuantidadeProdutosVendidosPorLojaEePeriodo(parametrosConsultaVendas);
760
        }
761
 
762
        @Override
763
        public Integer obterQuantidadeProdutosVendidosPorLojaEePeriodoNaoVivo(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
764
                return vendaRepository.obterQuantidadeProdutosVendidosPorLojaEePeriodoNaoVivo(parametrosConsultaVendas);
765
        }
766
 
767
        @Override
768
        public Integer obterQuantidadeProdutosVendidosPorEstiloEeGenero(Date dataInicial, Date dataFinal, Long sequencialLoja, Long sequencialModelo, String tipoProduto, String estiloProduto, String tipoGenero) {
769
                return vendaRepository.obterQuantidadeProdutosVendidosPorEstiloEeGenero(dataInicial, dataFinal, sequencialLoja, sequencialModelo, tipoProduto, estiloProduto, tipoGenero);
770
        }
771
 
772
        @Override
773
        public Double obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsulta) {
774
                return vendaRepository.obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(parametrosConsulta);
775
        }
776
 
777
        private void verificarLancamentos(List<Lancamento> lancamentos) {
778
                if (lancamentos.isEmpty()) {
779
                        throw new NegocioException("Obrigatório informar ao menos um produto");
780
                }
781
        }
782
 
783
        // TODO: EM DESENVOLVIMENTO
784
        /*
785
        private void lancarExcecaoCasoFreteContraditorio(ParametrosVendaDTO parametrosVenda) {
786
                if (VerificadorUtil.naoEstaNulo(parametrosVenda.getTipoFrete())) {
787
                        if (parametrosVenda.getTipoFrete().equals(ConstantesSEC.NotaFiscal.Transporte.SEM_OCORRENCIA_TRANSPORTE_9)
788
                                        && parametrosVenda.getValorFrete() > 0.0) {
789
                                throw new NegocioException("Não é possível informar o frete sem a ocorrência.");
790
                        }
791
                        if (parametrosVenda.getTipoFrete().equals(ConstantesSEC.NotaFiscal.Transporte.FRETE_POR_CONTA_REMETENTE_TRANSPORTE_PROPRIO_3)
792
                                        && parametrosVenda.getValorFrete() == 0.0) {
793
                                throw new NegocioException("É necessário informar o valor do frete.");
794
                        }
795
 
796
                }
797
                // CASO TENHA VALOR E: FRETE CIF, FRETE DE TERCEIROS, FRETE REMETENTE (TP) OU SEM OCORRÊNCIA
798
                // CASO NÃO TENHA VALOR E: FRETE FOB.
799
        }
800
        */
801
 
802
        private void lancarExcecaoCasoNaoSejaInformadoCamposObrigatorios(ParametrosVendaDTO parametrosVenda) {
803
                if (VerificadorUtil.isListaNulaOuVazia(parametrosVenda.getLancamentosPagamentos()) && VerificadorUtil.estaNuloOuVazio(parametrosVenda.getObservacao())) {
804
                        throw new NegocioException("Obrigatório informar as observações em vendas sem pagamentos");
805
                }
806
                if (VerificadorUtil.estaNulo(parametrosVenda.getLoja())) {
807
                        throw new NegocioException("Informe a loja");
808
                }
277 espaco 809
                for (VendaFormaPagamento vendaFormaPagamento : parametrosVenda.getLancamentosPagamentos()) {
702 blopes 810
                        if (vendaFormaPagamento.getFormaPagamento().formaPagamentoEhCartao() ||
811
                                vendaFormaPagamento.getFormaPagamento().formaPagamentoEhPix()) {
277 espaco 812
                                if (VerificadorUtil.estaNulo(parametrosVenda.getMaquineta())) {
813
                                        throw new NegocioException("Informe a maquineta");
814
                                }
815
                        }
816
                }
305 espaco 817
                if (possuiLancamentoPersonalizacao(parametrosVenda.getLancamentos())) {
818
                        if (VerificadorUtil.estaNulo(parametrosVenda.getCliente()) && VerificadorUtil.estaNuloOuVazio(parametrosVenda.getObservacao())) {
819
                                throw new NegocioException("Informe o cliente ou o contato do cliente nas observações");
820
                        }
821
                }
822
                if (VerificadorUtil.estaNulo(parametrosVenda.getLoja())) {
823
                        throw new NegocioException("Informe a loja");
824
                }
149 espaco 825
        }
305 espaco 826
 
827
        private Boolean possuiLancamentoPersonalizacao(List<Lancamento> lancamentos) {
828
                for (Lancamento lancamento : lancamentos) {
829
                        if (VerificadorUtil.naoEstaNuloOuVazio(lancamento.getTipoPersonalizacao())) {
830
                                return true;
831
                        }
832
                }
833
                return false;
834
        }
149 espaco 835
 
836
        private void lancarExcecaoSeValoresNaoSaoIguais(ParametrosVendaDTO parametrosVenda) {
837
                final double TOLERANCE = 0.01;
838
                if(Math.abs(parametrosVenda.valorTotalLancamentos() /*+ parametrosVenda.getValorFrete() */- parametrosVenda.valorTotalPago()) > TOLERANCE) {
839
                        throw new NegocioException("Valores pagos não corresponde ao valor vendido.");
840
                }
841
        }
842
 
843
        private void cadastrarLancamentos(ParametrosVendaDTO parametrosVenda, Venda venda) {
844
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
845
                        cadastrarLancamento(parametrosVenda.getLoja(), venda, lancamento);
846
                }
847
        }
848
 
849
        private void alterarLancamentos(ParametrosVendaDTO parametrosVenda) {
850
                excluirLancamentosRetiradosDaLista(parametrosVenda, consultarLancamentosCadastrados(parametrosVenda));
851
                cadastrarNovosLancamentos(parametrosVenda);
852
        }
853
 
854
        private void excluirLancamentosRetiradosDaLista(ParametrosVendaDTO parametrosVenda, List<Lancamento> lancamentosAntigos) {
855
                for (Lancamento lancamentoAntigo : lancamentosAntigos) {
856
                        if (!parametrosVenda.getLancamentos().contains(lancamentoAntigo)) {
857
                                lancamentoService.excluir(lancamentoAntigo);
305 espaco 858
                                alterarEstoqueProduto(1, parametrosVenda.getLoja(), lancamentoAntigo.getProduto().getCodigo(), lancamentoAntigo.getTipoPersonalizacao());
149 espaco 859
                        }
860
                }
861
        }
862
 
863
        private void cadastrarNovosLancamentos(ParametrosVendaDTO parametrosVenda) {
864
                for (Lancamento lancamento : parametrosVenda.getLancamentos()) {
865
                        if (VerificadorUtil.estaNulo(lancamento.getSequencial())) {
866
                                cadastrarLancamento(parametrosVenda.getLoja(), parametrosVenda.getVenda(), lancamento);
867
                        }
868
                }
869
        }
870
 
871
        private List<Lancamento> consultarLancamentosCadastrados(ParametrosVendaDTO parametrosVenda) {
872
                Lancamento lancamentoDaVenda = new Lancamento();
873
                lancamentoDaVenda.setVenda(parametrosVenda.getVenda());
874
                return lancamentoService.consultarPassandoEntidade(lancamentoDaVenda, 0, lancamentoService.obterQuantidadeDeRegistrosPassandoEntidade(lancamentoDaVenda));
875
        }
876
 
877
        private void cadastrarLancamento(Loja loja, Venda venda, Lancamento lancamento) {
878
                lancamento.setVenda(venda);
879
                igualarValorVarejoComCompraSeProdutoForPadrao(lancamento);
880
                acrescentarValorIPISeHouver(lancamento);
881
                lancamentoService.cadastrar(lancamento);
305 espaco 882
                alterarEstoqueProduto(-1, loja, lancamento.getProduto().getCodigo(), lancamento.getTipoPersonalizacao());
149 espaco 883
                utilizarCupom(lancamento.getCupom());
884
 
885
        }
886
 
887
        private void igualarValorVarejoComCompraSeProdutoForPadrao(Lancamento lancamento) {
888
                if (VerificadorUtil.naoEstaNulo(lancamento.getProduto())) {
889
                        if (lancamento.getProduto().getCodigo().equals(ConstantesSEC.CODIGO_PRODUTO_PADRAO_000000)) {
890
                                lancamento.setValorVarejo(lancamento.getValorVenda());
891
                        }
892
                }
893
        }
894
 
895
        private void acrescentarValorIPISeHouver(Lancamento lancamento) {
896
                if (VerificadorUtil.naoEstaNulo(lancamento.getProduto())) {
212 espaco 897
                        lancamento.setValorCompra(lancamento.getProduto().getValorCompra());
898
//                      lancamento.setValorCompra(lancamento.getProduto().calculoOperacao());
149 espaco 899
                }
900
        }
901
 
902
        private void cadastrarPagamentos(ParametrosVendaDTO parametrosVenda, Venda venda) {
903
                for (VendaFormaPagamento vendaFormaPagamento : parametrosVenda.getLancamentosPagamentos()) {
904
                        adicionarMaquineta(vendaFormaPagamento, parametrosVenda, venda);
905
                        vendaFormaPagamento.setVenda(venda);
906
                        vendaFormaPagamentoService.cadastrar(vendaFormaPagamento);
907
                        utilizarCupom(vendaFormaPagamento.getCupom());
908
                }
909
        }
635 blopes 910
 
149 espaco 911
        private void adicionarMaquineta(VendaFormaPagamento vendaFormaPagamento, ParametrosVendaDTO parametrosVenda, Venda venda) {
702 blopes 912
                if (vendaFormaPagamento.getFormaPagamento().formaPagamentoEhCartao() ||
913
                        vendaFormaPagamento.getFormaPagamento().formaPagamentoEhPix()) {
149 espaco 914
                        if (VerificadorUtil.estaNulo(parametrosVenda.getMaquineta())) {
915
                                parametrosVenda.setMaquineta(parametrosVenda.getLoja().getMaquineta());
916
                        }
917
                        venda.setMaquineta(parametrosVenda.getMaquineta());
918
                }
919
        }
920
 
635 blopes 921
        private void cadastrarPosVenda(Venda venda) {
922
                posVendaService.iniciarPosVenda(venda);
923
        }
924
 
686 blopes 925
        private void atualizarCashback(ParametrosVendaDTO parametrosVenda, Venda venda) {
926
                // RETIRAR DO SALDO O CASHBACK
689 blopes 927
                Double valorCashback = 0.0;
928
                for (VendaFormaPagamento vendaFormaPagamento : parametrosVenda.getLancamentosPagamentos()) {
929
                        if (vendaFormaPagamento.getFormaPagamento().formaPagamentoEhCashback()) {
930
                                valorCashback += vendaFormaPagamento.getValorPagamento();
931
                        }
932
                }
933
                if (valorCashback > 0.0) {
934
                        cashbackService.utilizarCashback(venda, valorCashback);
935
                } else {
936
                        // GERAR SE NÃO HOUVER UTILIZAÇÃO DO CASHBACK
937
                        cashbackService.gerarCashback(parametrosVenda, venda);
938
                }
686 blopes 939
 
685 blopes 940
        }
941
 
149 espaco 942
        private void alterarPagamentos(ParametrosVendaDTO parametrosVenda) {
943
                excluirPagamentosRetiradosDaLista(parametrosVenda, consultarPagamentosCadastrados(parametrosVenda));
944
                cadastrarNovosPagamentos(parametrosVenda);
945
        }
946
 
947
        private void excluirPagamentosRetiradosDaLista(ParametrosVendaDTO parametrosVenda, List<VendaFormaPagamento> pagamentosAntigos) {
948
                for (VendaFormaPagamento pagamentoAntigo : pagamentosAntigos) {
949
                        if (!parametrosVenda.getLancamentosPagamentos().contains(pagamentoAntigo)) {
950
                                vendaFormaPagamentoService.excluir(pagamentoAntigo);
951
                        }
952
//                      if (verificarSePagamentoFoiRetiradoDaLista(parametrosVenda.getLancamentosPagamentos(), pagamentoAntigo)) {
953
//                              vendaFormaPagamentoService.excluirPorId(pagamentoAntigo);
954
//                      }
955
                }
956
        }
957
 
958
        private boolean verificarSePagamentoFoiRetiradoDaLista(List<VendaFormaPagamento> pagamentos, VendaFormaPagamento pagamentoAntigo) {
959
                boolean pagamentoRetirado = true;
960
                for (VendaFormaPagamento pagamento : pagamentos) {
961
                        if (pagamento.getCodigoDaFormaPagamento().equals(pagamentoAntigo.getCodigoDaFormaPagamento())) {
962
                                if (verificarSeBandeiraCartaoEhIgual(pagamento.getCodigoDaBandeiraCartao(), pagamentoAntigo.getCodigoDaBandeiraCartao()) &&
963
                                                pagamento.getValorPagamento().equals(pagamentoAntigo.getValorPagamento())) {
964
                                        return false;
965
                                } else {
966
                                        pagamento.setVenda(pagamentoAntigo.getVenda());
967
                                        vendaFormaPagamentoService.alterar(pagamento);
968
                                        return false;
969
                                }
970
                        }
971
                }
972
                return pagamentoRetirado;
973
        }
974
 
975
        private boolean verificarSeBandeiraCartaoEhIgual(Long codigoDaBandeiraCartao, Long codigoDaBandeiraCartaoSegundo) {
976
                if (VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartao) && VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartaoSegundo)) {
977
                        return codigoDaBandeiraCartao.equals(codigoDaBandeiraCartaoSegundo);
978
                }
979
                if ((VerificadorUtil.estaNulo(codigoDaBandeiraCartao) && VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartaoSegundo)) ||
980
                                (VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartao) && VerificadorUtil.estaNulo(codigoDaBandeiraCartaoSegundo))) {
981
                        return false;
982
                }
983
                return true;
984
        }
985
 
986
        private void cadastrarNovosPagamentos(ParametrosVendaDTO parametrosVenda) {
987
                for (VendaFormaPagamento pagamento : parametrosVenda.getLancamentosPagamentos()) {
988
                        if (VerificadorUtil.estaNulo(pagamento.getSequencial())) {
989
                                adicionarMaquineta(pagamento, parametrosVenda, parametrosVenda.getVenda());
990
                                pagamento.setVenda(parametrosVenda.getVenda());
991
                                vendaFormaPagamentoService.cadastrar(pagamento);
992
                                utilizarCupom(pagamento.getCupom());
993
                        }
994
                }
995
        }
996
 
997
        private List<VendaFormaPagamento> consultarPagamentosCadastrados(ParametrosVendaDTO parametrosVenda) {
998
                VendaFormaPagamento pagamentoDaVenda = new VendaFormaPagamento();
999
                pagamentoDaVenda.setVenda(parametrosVenda.getVenda());
1000
                return vendaFormaPagamentoService.consultarPassandoEntidade(pagamentoDaVenda, 0, vendaFormaPagamentoService.obterQuantidadeDeRegistrosPassandoEntidade(pagamentoDaVenda));
1001
        }
1002
 
305 espaco 1003
        private void alterarEstoqueProduto(Integer quantidadeAlterar, Loja loja, String codigoProduto, String tipoPersonalizacao) {
149 espaco 1004
                if (VerificadorUtil.naoEstaNulo(codigoProduto)) {
1005
                        Produto produto = produtoService.consultarProdutoPorCodigo(codigoProduto);
305 espaco 1006
                        Loja lojaAlterarEstoque = retornarLojaParaAlteracaoEstoque(loja, tipoPersonalizacao);
1007
                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeAlterar, produto, lojaAlterarEstoque);
149 espaco 1008
                }
1009
        }
1010
 
305 espaco 1011
        private Loja retornarLojaParaAlteracaoEstoque(Loja loja, String tipoPersonalizacao) {
1012
                if (VerificadorUtil.naoEstaNulo(tipoPersonalizacao)) {
1013
                        return new Loja(ConstantesSEC.Personalizacao.SEQUENCIAL_LOJA_PERSONALIZACAO);
1014
                }
1015
                return loja;
1016
        }
1017
 
149 espaco 1018
        private void utilizarCupom(Cupom cupom) {
1019
                if (VerificadorUtil.naoEstaNulo(cupom)) {
1020
                        Cupom cupomUtilizado = cupomService.consultarPorId(cupom);
1021
                        cupomUtilizado.setDataHoraUtilizado(DataUtils.getDataAtual());
1022
                        if (VerificadorUtil.estaNulo(cupomUtilizado.getQuantidadeUtilizada())) {
1023
                                cupomUtilizado.setQuantidadeUtilizada(0);
1024
                        }
1025
                        cupomUtilizado.setQuantidadeUtilizada(cupomUtilizado.getQuantidadeUtilizada() + 1);
1026
                        cupomService.alterar(cupomUtilizado);
1027
                }
1028
        }
1029
 
1030
        @Override
1031
        public List<Venda> consultarVendasPorDemanda(ParametrosConsulta<Venda> parametrosConsulta, Integer primeiroRegistro,
1032
                        Integer tamanhoPagina, String sortField, String orderSort, Map<String, Object> filters) {
1033
                return vendaRepository.consultarVendasPorDemanda(parametrosConsulta, primeiroRegistro, tamanhoPagina, sortField, orderSort, filters);
1034
        }
1035
 
1036
        @Override
1037
        public List<Venda> consultarVendaPorParametros(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1038
                return vendaRepository.consultarVendaPorParametros(parametrosConsultaVendas);
1039
        }
1040
 
1041
        @Override
1042
        public GraficoAcumuladoDTO consultarGrafico(String mes, String ano) {
1043
                return vendaRepository.consultarGrafico(mes, ano);
1044
        }
1045
 
1046
        @Override
1047
        public List<RankingVendedorDTO> consultarRankingVendedores(Date dataInicial, Date dataFinal, Boolean produtosComissionados, Loja lojaSelecionada) {
1048
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
1049
                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradoresAtivos(lojaSelecionada);
1050
                for (Vendedor vendedor : vendedores) {
1051
                        RankingVendedorDTO vendedorConsultado = consultarRankingVendedor(vendedor, dataInicial, dataFinal, produtosComissionados);
1052
                        rankingVendedores.add(vendedorConsultado);
1053
                }
1054
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
1055
        }
1056
 
1057
        @Override
1058
        public RankingVendedorDTO consultarRankingVendedor(Vendedor vendedor, Vigencia vigencia, Boolean produtosComissionados) {
1059
                Avaliacao avaliacao = avaliacaoService.consultarAvaliacaoDaVigencia(vigencia);
1060
                RankingVendedorDTO rankingVendedor = consultarRankingVendedor(vendedor, vigencia.getDataInicio(), vigencia.getDataFim(), produtosComissionados);
1061
                rankingVendedor.setFuncionario(funcionarioService.consultarFuncionarioPorPessoa(vendedor.getPessoa()));
1062
                rankingVendedor.setQuantidadeBancoHoras(bancoHorasService.consultarQuantidadeHoras(rankingVendedor.getFuncionario()));
1063
                AvaliacaoFuncionario avaliacaoFuncionario = avaliacaoFuncionarioService.detalhar(vendedor.getPessoa(), avaliacao);
1064
                if (VerificadorUtil.naoEstaNuloOuVazio(avaliacaoFuncionario)) {
1065
                        rankingVendedor.setAvaliacaoFuncionario(avaliacaoFuncionario);
337 espaco 1066
                        rankingVendedor.setPontuacaoGeral(avaliacaoFuncionario.getPontuacao());
149 espaco 1067
                        if (VerificadorUtil.naoEstaNulo(avaliacaoFuncionario.getPorcentagemComissao())) {
1068
                                rankingVendedor.setComissao(calcularComissao(rankingVendedor.getValorTotalVendido(), avaliacaoFuncionario.getPorcentagemComissao()/100));
1069
                        } else {
1070
                                rankingVendedor.setComissao(calcularComissao(rankingVendedor.getValorTotalVendido(), avaliacaoFuncionario.retornarFaixaComissao(rankingVendedor.getValorTotalVendido(), rankingVendedor.getFuncionario().getTipoComissionamento())));
1071
                        }
1072
                }
1073
                return rankingVendedor;
1074
        }
1075
 
1076
        public Double calcularComissao(Double valorTotalVendido, Double porcentagemComissao) {
1077
                if (VerificadorUtil.naoEstaNuloOuVazio(porcentagemComissao)) {
1078
                        return valorTotalVendido * porcentagemComissao;
1079
                }
1080
                return 0.0;
1081
        }
1082
 
1083
        @Override
1084
        public RankingVendedorDTO consultarRankingVendedor(Vendedor vendedor, Date dataInicial, Date dataFinal, Boolean produtosComissionados) {
1085
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1086
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1087
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1088
                parametrosConsultaVendas.setVendedor(vendedor);
1089
                if (VerificadorUtil.naoEstaNulo(produtosComissionados)) {
1090
                        parametrosConsultaVendas.setIndicadorComissionado(produtosComissionados);
1091
                }
1092
 
1093
                RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
1094
                rankingVendedor.setVendedor(vendedor);
1095
                try {
1096
                        rankingVendedor.setFuncionario(funcionarioService.consultarFuncionarioPorPessoa(vendedor.getPessoa()));
1097
                        rankingVendedor.setQuantidadeBancoHoras(bancoHorasService.consultarQuantidadeHoras(rankingVendedor.getFuncionario()));
1098
                } catch (RuntimeException e) {
1099
                        rankingVendedor.setFuncionario(null);
1100
                }
1101
 
1102
                rankingVendedor.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas));
1103
                rankingVendedor.setValorTotalDescontos(obterValorTotalDeDescontosPorLojaEePeriodo(parametrosConsultaVendas));
1104
                rankingVendedor.setQuantidadeTotalProdutosVendidos(obterQuantidadeProdutosVendidosPorLojaEePeriodo(parametrosConsultaVendas));
1105
 
1106
                Venda venda = new Venda();
1107
                venda.setVendedor(vendedor);
1108
                rankingVendedor.setQuantidadeVendas(obterQuantidadeDeVendasPorLojaEePeriodo(venda, dataInicial, dataFinal));
1109
                rankingVendedor.setQuantidadePedidos(obterQuantidadePedidosValidos(vendedor, null, dataInicial, dataFinal));
1110
                rankingVendedor.setQuantidadePedidosInvalidos(obterQuantidadePedidos(vendedor, null, dataInicial, dataFinal, TipoSituacaoPedido.INVALIDO.getValor()));
1111
                rankingVendedor.setQuantidadeContagens(obterQuantidadeDeContagens(vendedor, dataInicial, dataFinal));
1112
                rankingVendedor.setQuantidadeAtendimentos(obterQuantidadeDeAtendimentos(vendedor, dataInicial, dataFinal));
1113
                rankingVendedor.setValorTotalVendidoVivo(obterValorTotalBrutoDeVendasVivoPorLojaEePeriodo(parametrosConsultaVendas));
1114
 
1115
                rankingVendedor.setAvaliacaoFuncionario(avaliacaoFuncionarioService.consultarAvaliacaoFuncionarioPelaData(vendedor, DataUtils.getDataComHorarioMinimo(dataFinal)));
1116
                if (VerificadorUtil.naoEstaNulo(rankingVendedor.getAvaliacaoFuncionario())) {
1117
                        rankingVendedor.setPercentualDescontos(rankingVendedor.getAvaliacaoFuncionario().retornarPercentual(rankingVendedor.getValorTotalDescontos(), rankingVendedor.getValorTotalVendido()));
1118
                        rankingVendedor.setPercentualMetaMensal(rankingVendedor.getAvaliacaoFuncionario().retornarPercentualRealizado(rankingVendedor.getValorTotalVendido()));
1119
                        rankingVendedor.setPercentualMetaMensalVivo(rankingVendedor.getAvaliacaoFuncionario().retornarPercentualVivoRealizado(rankingVendedor.getValorTotalVendidoVivo()));
333 espaco 1120
                        rankingVendedor.setPercentualMetaTicketMedio(rankingVendedor.getAvaliacaoFuncionario().retornarPercentualTicketMedioRealizado(rankingVendedor.getTicketMedio()));
149 espaco 1121
                }
1122
 
1123
                ParametrosConsultaVendasDTO parametrosConsultaVendasDoDia = new ParametrosConsultaVendasDTO();
1124
                parametrosConsultaVendasDoDia.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()));
1125
                parametrosConsultaVendasDoDia.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getDataAtual()));
1126
                parametrosConsultaVendasDoDia.setVendedor(vendedor);
1127
                if (VerificadorUtil.naoEstaNulo(produtosComissionados)) {
1128
                        parametrosConsultaVendasDoDia.setIndicadorComissionado(produtosComissionados);
1129
                }
1130
                rankingVendedor.setValorTotalVendidoDoDia(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendasDoDia));
1131
 
1132
                return rankingVendedor;
1133
        }
1134
 
1135
        private Integer obterQuantidadePedidos(Vendedor vendedor, Loja loja, Date dataInicial, Date dataFinal, String tipoSituacao) {
1136
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
1137
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
1138
                                return 0;
1139
                        }
1140
                }
1141
                ParametrosConsultaPedidoDTO parametrosPedidos = new ParametrosConsultaPedidoDTO();
1142
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
1143
                        parametrosPedidos.setPessoa(vendedor.getPessoa());
1144
                }
1145
                parametrosPedidos.setEntidade(new Pedido());
1146
                parametrosPedidos.getEntidade().setTipoSituacao(tipoSituacao);
1147
                parametrosPedidos.getEntidade().setLoja(loja);
1148
                parametrosPedidos.setDataInicial(dataInicial);
1149
                parametrosPedidos.setDataFinal(dataFinal);
1150
                return pedidoService.obterQuantidadeDeRegistrosParametrosConsulta(parametrosPedidos);
1151
        }
1152
 
1153
        private Integer obterQuantidadePedidosValidos(Vendedor vendedor, Loja loja, Date dataInicial, Date dataFinal) {
1154
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
1155
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
1156
                                return 0;
1157
                        }
1158
                }
1159
                ParametrosConsultaPedidoDTO parametrosPedidos = new ParametrosConsultaPedidoDTO();
1160
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
1161
                        parametrosPedidos.setPessoa(vendedor.getPessoa());
1162
                }
1163
                parametrosPedidos.setEntidade(new Pedido());
1164
                parametrosPedidos.getEntidade().setLoja(loja);
1165
                parametrosPedidos.setDataInicial(dataInicial);
1166
                parametrosPedidos.setDataFinal(dataFinal);
1167
                parametrosPedidos.setValidos(true);
1168
                return pedidoService.obterQuantidadeDeRegistrosParametrosConsulta(parametrosPedidos);
1169
        }
1170
 
1171
        private Integer obterQuantidadeDeContagens(Vendedor vendedor, Date dataInicial, Date dataFinal) {
1172
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
1173
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
1174
                                return 0;
1175
                        }
1176
                }
1177
                return produtoLojaService.obterQuantidadeDeContagens(vendedor.getPessoa(), dataInicial, dataFinal);
1178
        }
1179
 
1180
        private Integer obterQuantidadeDeAtendimentos(Vendedor vendedor, Date dataInicial, Date dataFinal) {
1181
                if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
1182
                        return 0;
1183
                }
1184
                return produtoLojaService.obterQuantidadeDeAtendimentos(vendedor.getPessoa(), dataInicial, dataFinal);
1185
        }
1186
 
1187
        private Integer obterQuantidadeDeAtendimentos(Loja loja, Date dataInicial, Date dataFinal) {
1188
                return produtoLojaService.obterQuantidadeDeAtendimentos(loja, dataInicial, dataFinal);
1189
        }
1190
 
1191
        private Double obterValorTotalBrutoDeVendasVivoPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1192
                ParametrosConsultaVendasVivoDTO parametrosConsultaVendasVivo = new ParametrosConsultaVendasVivoDTO();
1193
                parametrosConsultaVendasVivo.setVendedor(parametrosConsultaVendas.getVendedor());
1194
                parametrosConsultaVendasVivo.setDataInicial(parametrosConsultaVendas.getDataInicial());
1195
                parametrosConsultaVendasVivo.setDataFinal(parametrosConsultaVendas.getDataFinal());
1196
                return vendaVivoService.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendasVivo);
1197
        }
1198
 
1199
        @Override
1200
        public List<RankingLojaDTO> consultarRankingLojas(Date dataInicial, Date dataFinal) {
1201
                List<RankingLojaDTO> rankingLojas = new ArrayList<RankingLojaDTO>();
1202
                List<Loja> lojas = lojaService.listarLojasAtivas();
1203
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1204
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1205
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1206
                for (Loja loja : lojas) {
1207
                        if (!loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_LOJA_FARMACIA_7)
1208
                                        && !loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_RESTAURANTE_16)) {
1209
                                parametrosConsultaVendas.setLoja(loja);
1210
 
1211
                                RankingLojaDTO rankingLoja = new RankingLojaDTO();
1212
                                rankingLoja.setLoja(loja);
1213
                                rankingLoja.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
1214
                                                - obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1215
                                rankingLoja.setAvaliacaoLoja(avaliacaoLojaService.consultarAvaliacaoLojaPelaData(loja, DataUtils.getDataComHorarioMinimo(dataFinal)));
1216
                                if (VerificadorUtil.naoEstaNulo(rankingLoja.getAvaliacaoLoja())) {
1217
                                        rankingLoja.setValorMetaMensal(rankingLoja.getAvaliacaoLoja().getValorMetaMensal());
1218
                                }
1219
                                rankingLojas.add(rankingLoja);
1220
                        }
1221
                }
1222
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojas);
1223
        }
1224
 
1225
        @Override
1226
        public List<RankingLojaDTO> consultarRankingLojasCompleto(Date dataInicial, Date dataFinal) {
1227
                List<RankingLojaDTO> rankingLojasCompleto = new ArrayList<RankingLojaDTO>();
1228
                List<RankingLojaDTO> rankingLojas = consultarRankingLojas(dataInicial, dataFinal);
1229
                for (RankingLojaDTO rankingLoja : rankingLojas) {
1230
                        rankingLoja.setQuantidadeVendas(obterQuantidadeDeVendasPorLojaEePeriodo(new Venda(rankingLoja.getLoja(), null), dataInicial, dataFinal));
1231
                        rankingLoja.setQuantidadeAtendimentos(obterQuantidadeDeAtendimentos(rankingLoja.getLoja(), dataInicial, dataFinal));
1232
                        rankingLoja.setQuantidadePedidos(obterQuantidadePedidosValidos(null, rankingLoja.getLoja(), dataInicial, dataFinal));
1233
                        rankingLoja.setQuantidadePedidosInvalidos(obterQuantidadePedidos(null, rankingLoja.getLoja(), dataInicial, dataFinal, TipoSituacaoPedido.INVALIDO.getValor()));
1234
 
1235
                        ParametrosConsultaPorPeriodoDTO parametrosConsulta = new ParametrosConsultaPorPeriodoDTO();
1236
                        ((ParametrosConsultaPorPeriodoDTO)parametrosConsulta).setDataInicial(dataInicial);
1237
                        ((ParametrosConsultaPorPeriodoDTO)parametrosConsulta).setDataFinal(dataFinal);
1238
                        EstoqueAuditoria estoqueAuditoria = new EstoqueAuditoria();
1239
                        estoqueAuditoria.setLoja(rankingLoja.getLoja());
1240
                        estoqueAuditoria.setTipoEstoqueAuditoria(TipoEstoqueAuditoria.AVARIA.getValor());
1241
                        parametrosConsulta.setEntidade(estoqueAuditoria);
1242
                        rankingLoja.setQuantidadeAvarias(estoqueAuditoriaService.obterQuantidadeTotalAuditoria(parametrosConsulta));
1243
 
1244
                        estoqueAuditoria.setTipoEstoqueAuditoria(TipoEstoqueAuditoria.TROCA.getValor());
1245
                        parametrosConsulta.setEntidade(estoqueAuditoria);
1246
                        rankingLoja.setQuantidadeTrocas(estoqueAuditoriaService.obterQuantidadeTotalAuditoria(parametrosConsulta));
1247
 
1248
                        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1249
                        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1250
                        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1251
                        parametrosConsultaVendas.setLoja(rankingLoja.getLoja());
1252
                        rankingLoja.setValorTotalDescontos(obterValorTotalDeDescontosPorLojaEePeriodo(parametrosConsultaVendas));
1253
                        rankingLoja.setCustoProdutosVendidos(obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(parametrosConsultaVendas));
1254
                        rankingLoja.setValorTotalEstoque(produtoService.valorTotalEstoque(rankingLoja.getLoja(), null));
1255
                        rankingLoja.setQuantidadeTotalEstoque(produtoService.quantidadeTotalEstoque(rankingLoja.getLoja()));
1256
 
1257
                        ParametrosConsultaLancamentosDTO parametros = new ParametrosConsultaLancamentosDTO();
1258
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_ALUGUEL_11));
1259
                        parametros.setCentroDeCustos(rankingLoja.getLoja());
1260
                        parametros.setPagamentoRealizado(true);
1261
                        parametros.setDataInicial(dataInicial);
1262
                        parametros.setDataFinal(dataFinal);
1263
                        Double valorCac = 0.0;
1264
 
1265
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1266
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_HORA_EXTRA_2));
1267
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1268
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_SALARIO_9));
1269
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1270
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_FERIAS_12));
1271
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1272
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_COMISSOES_8));
1273
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1274
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_VALE_TRANSPORTE_46));
1275
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1276
                        valorCac = valorCac / rankingLoja.getQuantidadeVendas();
1277
                        rankingLoja.setValorCac(valorCac);
1278
 
1279
                        rankingLojasCompleto.add(rankingLoja);
1280
                }
1281
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojasCompleto);
1282
        }
1283
 
1284
        private Double somarValor(Double valor, Double valorAcrescentar) {
1285
                if (VerificadorUtil.naoEstaNulo(valorAcrescentar)) {
1286
                        return valor + valorAcrescentar;
1287
                }
1288
                return valor;
1289
        }
1290
 
1291
        @Override
1292
        public List<RankingLojaDTO> consultarRankingLojasExtras(Date dataInicial, Date dataFinal) {
1293
                List<RankingLojaDTO> rankingLojas = new ArrayList<RankingLojaDTO>();
164 espaco 1294
 
149 espaco 1295
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1296
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1297
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
164 espaco 1298
                // rankingLojas.addAll(preenchendoLojasExtras(parametrosConsultaVendas));
1299
 
1300
                parametrosConsultaVendas.setLoja(null);
1301
                // rankingLojas.add(preencherLojaAssistencia(parametrosConsultaVendas));
1302
 
1303
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojas);
1304
        }
1305
 
1306
        private RankingLojaDTO preencherLojaAssistencia(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1307
                RankingLojaDTO rankingLojaServico = new RankingLojaDTO();
1308
                Loja lojaServico = new Loja();
1309
                lojaServico.setDescricao("ASSISTÊNCIA");
1310
                rankingLojaServico.setValorMetaMensal(new Double(0.0));
1311
                rankingLojaServico.setLoja(lojaServico);
1312
                rankingLojaServico.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1313
                return rankingLojaServico;
1314
        }
1315
 
1316
        private RankingLojaDTO preencherVendasComPedidos(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1317
                RankingLojaDTO rankingLojaServico = new RankingLojaDTO();
1318
                Loja lojaServico = new Loja();
1319
                lojaServico.setDescricao("E-COMMERCE");
1320
                rankingLojaServico.setValorMetaMensal(new Double(0.0));
1321
                rankingLojaServico.setLoja(lojaServico);
1322
                rankingLojaServico.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1323
                return rankingLojaServico;
1324
        }
1325
 
1326
        private List<RankingLojaDTO> preenchendoLojasExtras(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1327
                List<RankingLojaDTO> rankingLojas = new ArrayList<RankingLojaDTO>();
1328
                List<Loja> lojas = lojaService.listarLojasAtivas();
149 espaco 1329
                for (Loja loja : lojas) {
1330
                        if (loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_LOJA_FARMACIA_7)
1331
                                        || loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_RESTAURANTE_16)) {
1332
                                parametrosConsultaVendas.setLoja(loja);
1333
 
1334
                                RankingLojaDTO rankingLoja = new RankingLojaDTO();
1335
                                rankingLoja.setLoja(loja);
1336
                                rankingLoja.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
1337
                                                - obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
164 espaco 1338
                                rankingLoja.setAvaliacaoLoja(avaliacaoLojaService.consultarAvaliacaoLojaPelaData(loja, DataUtils.getDataComHorarioMinimo(parametrosConsultaVendas.getDataFinal())));
149 espaco 1339
                                if (VerificadorUtil.naoEstaNulo(rankingLoja.getAvaliacaoLoja())) {
1340
                                        rankingLoja.setValorMetaMensal(rankingLoja.getAvaliacaoLoja().getValorMetaMensal());
1341
                                }
1342
                                rankingLojas.add(rankingLoja);
1343
                        }
1344
                }
164 espaco 1345
                return rankingLojas;
149 espaco 1346
        }
1347
 
1348
        @Override
1349
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1350
                parametrosConsultaVendas.setTipoProduto(TipoProduto.SERVICO.getValor());
1351
                Double valorTotal = vendaRepository.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas);
1352
                parametrosConsultaVendas.setTipoProduto(null);
1353
                return VerificadorUtil.estaNulo(valorTotal)? new Double(0.0) : valorTotal;
1354
        }
1355
 
1356
        @Override
1357
        public List<RankingProdutoDTO> consultarProdutosVendidos(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1358
                List<RankingProdutoDTO> produtosVendidosConsultados = vendaRepository.consultarProdutosVendidos(parametrosConsulta);
1359
                for (RankingProdutoDTO produtoVendido : produtosVendidosConsultados) {
1360
                        produtoVendido.atualizarTempoEstoque(parametrosConsulta.getDataInicial(), parametrosConsulta.getDataFinal());
1361
                }
1362
                return produtosVendidosConsultados;
1363
        }
1364
 
1365
        @Override
1366
        public List<RankingProdutoDTO> consultarProdutosVendidosResumido(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1367
                return vendaRepository.consultarProdutosVendidosResumido(parametrosConsulta);
1368
        }
1369
 
1370
        @Override
1371
        public List<RankingProdutoDTO> consultarProdutosParaTransferir(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1372
                return vendaRepository.consultarProdutosParaTransferir(parametrosConsulta);
1373
        }
1374
 
1375
        @Override
1376
        public List<RankingProdutoDTO> consultarRankingProdutos(Date dataInicial, Date dataFinal, Integer quantidadeProdutos, String tipoOrdenacao, Long sequencialLoja, String tipoProduto, Produto produto, Marca marca) {
1377
                return vendaRepository.consultarProdutosMaisVendidos(dataInicial, dataFinal, quantidadeProdutos, tipoOrdenacao, sequencialLoja, tipoProduto, produto, marca);
1378
        }
1379
 
1380
        @Override
1381
        public List<RankingModeloDTO> consultarRankingModelos(ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta) {
1382
                return vendaRepository.consultarModelosMaisVendidos(parametrosConsulta);
1383
        }
1384
 
1385
        @Override
1386
        public List<RankingModeloDTO> consultarRankingModelos(Date dataInicial, Date dataFinal, Integer quantidadeModelos, String tipoOrdenacao, String tipoProduto, Long sequencialLoja) {
151 espaco 1387
                ParametrosConsultaModelosMaisVendidosDTO parametros = new ParametrosConsultaModelosMaisVendidosDTO(dataInicial, dataFinal, quantidadeModelos, tipoOrdenacao, tipoProduto, sequencialLoja);
1388
                return this.consultarRankingModelos(parametros);
149 espaco 1389
        }
1390
 
1391
        @Override
1392
        public List<RankingComprasTransferenciasDTO> consultarPlanejamentoParaCompras(ParametrosConsultaParaComprasTransferenciasDTO parametrosParaConsulta) {
1393
                Integer limite = parametrosParaConsulta.getQuantidadeModelos();
1394
                if (parametrosParaConsulta.getIndicadorConsultarTodosModelos()) {
1395
                        limite = null;
1396
                }
1397
                List<RankingComprasTransferenciasDTO> planejamentos = new ArrayList<RankingComprasTransferenciasDTO>();
1398
                ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta = new ParametrosConsultaModelosMaisVendidosDTO(parametrosParaConsulta.getDataInicial(), parametrosParaConsulta.getDataFinal(), limite,
1399
                                parametrosParaConsulta.getTipoOrdenacao(), parametrosParaConsulta.getTipoProduto(), parametrosParaConsulta.getSequencialLoja(), parametrosParaConsulta.getModelo(), parametrosParaConsulta.getEstilo());
1400
                List<RankingModeloDTO> modelos = vendaRepository.consultarModelosMaisVendidos(parametrosConsulta);
1401
                for (RankingModeloDTO modelo : modelos) {
1402
                        RankingComprasTransferenciasDTO planejamento = new RankingComprasTransferenciasDTO();
1403
                        planejamento.setModelo(modelo.getModelo());
1404
                        planejamento.setValorTotalVendido(modelo.getValorTotalVendido());
1405
                        planejamento.setValorTotalComprado(modelo.getValorTotalComprado());
1406
                        planejamento.setQuantidadeVendas(modelo.getQuantidadeVendas());
1407
                        planejamento.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1408
                        if (VerificadorUtil.naoEstaNuloOuVazio(modelo.getQuantidadeEstoqueLocal())) {
1409
                                planejamento.setQuantidadeEstoqueLocal(modelo.getQuantidadeEstoqueLocal().intValue());
1410
                        }
1411
                        planejamento.setQuantidadeEstoqueGeral(modelo.getQuantidadeEstoqueGeral().intValue());
1412
                        planejamentos.add(planejamento);
1413
                }
1414
 
1415
                if (parametrosParaConsulta.getIndicadorConsultarTodosModelos()) {
1416
                        List<Modelo> modelosAtivos = new ArrayList<Modelo>();
1417
                        if (VerificadorUtil.estaNulo(parametrosParaConsulta.getModelo())) {
1418
                                modelosAtivos = modeloService.consultarTodosAtivos();
1419
                        } else {
1420
                                modelosAtivos = modeloService.consultarPassandoEntidade(parametrosParaConsulta.getModelo(), 0, modeloService.obterQuantidadeDeRegistrosPassandoEntidade(parametrosParaConsulta.getModelo()));
1421
                        }
1422
                        for (Modelo modeloAtivo : modelosAtivos) {
1423
                                if (modeloNaoEstaPresenteNaLista(modelos, modeloAtivo)) {
1424
                                        RankingComprasTransferenciasDTO planejamento = new RankingComprasTransferenciasDTO();
1425
                                        planejamento.setModelo(modeloAtivo);
1426
                                        planejamento.setValorTotalVendido(new Double(0.0));
1427
                                        planejamento.setValorTotalComprado(new Double(0.0));
1428
                                        planejamento.setQuantidadeVendas(new Long(0));
1429
                                        planejamento.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1430
                                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosParaConsulta.getSequencialLoja())) {
1431
                                                planejamento.setQuantidadeEstoqueLocal(produtoLojaService.consultarEstoqueModeloEeLoja(modeloAtivo, parametrosParaConsulta.getSequencialLoja(), null, parametrosParaConsulta.getTipoProduto(), null, null));
1432
                                        }
1433
                                        planejamento.setQuantidadeEstoqueGeral(produtoLojaService.consultarEstoqueModeloEeLoja(modeloAtivo, null, null, parametrosParaConsulta.getTipoProduto(), null, null));
1434
                                        if (planejamento.getQuantidadeEstoqueGeral() > 0) {
1435
                                                planejamentos.add(planejamento);
1436
                                        }
1437
                                }
1438
                        }
1439
                }
1440
 
1441
                if (parametrosParaConsulta.getTipoOrdenacao().equals(TipoOrdenacaoPlanejamentoCompras.QUANTIDADE_COMPRAR.getValor())) {
1442
                        return new ArrayList<RankingComprasTransferenciasDTO>(ordenador.ordenar(planejamentos));
1443
                }
1444
                return planejamentos;
1445
        }
1446
 
1447
        private Boolean modeloNaoEstaPresenteNaLista(List<RankingModeloDTO> rankingModelos, Modelo modeloAtivo) {
1448
                for (RankingModeloDTO rankingModelo : rankingModelos) {
1449
                        if (rankingModelo.getModelo().getSequencial().equals(modeloAtivo.getSequencial())) {
1450
                                return false;
1451
                        }
1452
                }
1453
                return true;
1454
        }
1455
 
1456
        @Override
1457
        public List<RankingComprasTransferenciasEstiloDTO> consultarDetalhamentoPlanejamentoParaCompras(ParametrosConsultaParaComprasTransferenciasDTO parametrosParaConsulta, Modelo modelo) {
600 blopes 1458
                List<RankingComprasTransferenciasEstiloDTO> consulta = new ArrayList<RankingComprasTransferenciasEstiloDTO>();
149 espaco 1459
                for (TipoEstiloProduto estiloProduto : TipoEstiloProduto.values()) {
1460
                        parametrosParaConsulta.setEstilo(StringUtil.setarUpperCase(estiloProduto.getValor()));
602 blopes 1461
                        parametrosParaConsulta.setSubtipo(null);
149 espaco 1462
                        RankingComprasTransferenciasEstiloDTO estilo = vendaRepository.consultarEstoqueEeVendasPorEstilo(parametrosParaConsulta, modelo);
1463
                        estilo.setRankingsPorLoja(vendaRepository.consultarEstoqueEeVendasEstiloPorLoja(parametrosParaConsulta, modelo));
1464
                        estilo.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
600 blopes 1465
                        consulta.add(estilo);
149 espaco 1466
                }
600 blopes 1467
                return consulta;
149 espaco 1468
        }
600 blopes 1469
 
1470
        @Override
1471
        public List<RankingComprasTransferenciasSubtipoProdutoDTO> consultarDetalhamentoPlanejamentoParaCompras(List<SubtipoProduto> subtiposParaConsultar, ParametrosConsultaParaComprasTransferenciasDTO parametrosParaConsulta, Modelo modelo) {
1472
                List<RankingComprasTransferenciasSubtipoProdutoDTO> consulta = new ArrayList<RankingComprasTransferenciasSubtipoProdutoDTO>();
1473
                for (SubtipoProduto subtipoProduto : subtiposParaConsultar) {
1474
                        parametrosParaConsulta.setSubtipo(subtipoProduto);
602 blopes 1475
                        parametrosParaConsulta.setEstilo(null);;
600 blopes 1476
                        RankingComprasTransferenciasSubtipoProdutoDTO subtipo = vendaRepository.consultarEstoqueEeVendasPorSubtipo(parametrosParaConsulta, modelo);
1477
                        subtipo.setRankingsPorLoja(vendaRepository.consultarEstoqueEeVendasSubtipoPorLoja(parametrosParaConsulta, modelo));
1478
                        subtipo.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1479
                        consulta.add(subtipo);
1480
                }
1481
                return consulta;
1482
        }
149 espaco 1483
 
1484
        @Override
356 espaco 1485
        public List<RankingVendedorDTO> consultarRankingPromocaoInterna(Date dataInicial, Date dataFinal) {
149 espaco 1486
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
356 espaco 1487
                Vigencia vigencia = vigenciaService.consultarVigenciaDoPeriodo(dataInicial);
1488
                if (VerificadorUtil.naoEstaNulo(vigencia)) {
1489
                        Avaliacao avaliacao = avaliacaoService.consultarAvaliacaoDaVigencia(vigencia);
1490
                        if (VerificadorUtil.naoEstaNulo(avaliacao)) {
1491
                                List<AvaliacaoProduto> produtosAvaliacaoPromocaoInterna = avaliacaoService.consultarProdutosPromocaoInterna(avaliacao.getSequencial());
1492
                                List<Produto> produtosPromocaoInterna = new ArrayList<Produto>();
1493
                                for (AvaliacaoProduto produtoAvaliacaoPromocaoInterna : produtosAvaliacaoPromocaoInterna) {
1494
                                        produtosPromocaoInterna.add(produtoAvaliacaoPromocaoInterna.getProduto());
1495
                                }
1496
 
1497
                                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradoresAtivos(null);
1498
                                for (Vendedor vendedor : vendedores) {
1499
                                        RankingVendedorDTO ranking = consultarRankingPromocaoInternaDoVendedor(vendedor, dataInicial, dataFinal, produtosPromocaoInterna);
422 blopes 1500
                                        rankingVendedores.add(ranking);
356 espaco 1501
                                }
149 espaco 1502
                        }
1503
                }
1504
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
1505
        }
1506
 
1507
        @Override
252 espaco 1508
        public RankingVendedorDTO consultarRankingPromocaoInternaDoVendedor(Vendedor vendedor, Date dataInicial, Date dataFinal,
356 espaco 1509
                        List<Produto> produtosPromocaoInterna) {
149 espaco 1510
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1511
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1512
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1513
                parametrosConsultaVendas.setVendedor(vendedor);
1514
                RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
1515
                rankingVendedor.setVendedor(vendedor);
1516
 
252 espaco 1517
                parametrosConsultaVendas.setProdutosPromocaoInterna(produtosPromocaoInterna);
1518
                rankingVendedor.setQuantidadeProdutosPromocaoInterna(lancamentoService.obterQuantidadeVendasDosProdutosDaPromocaoInterna(parametrosConsultaVendas));
1519
 
1520
                parametrosConsultaVendas.setProdutosPromocaoInterna(null);
1521
                parametrosConsultaVendas.setIndicadorPesquisarPeliculasTpuSoft(true);
1522
                parametrosConsultaVendas.setIndicadorPesquisarPeliculasTpuSoftCameras(false);
1523
                rankingVendedor.setQuantidadeTpuSoftNormal(lancamentoService.obterQuantidadeVendasDosProdutosDaPromocaoInterna(parametrosConsultaVendas));
1524
 
1525
                parametrosConsultaVendas.setProdutosPromocaoInterna(null);
1526
                parametrosConsultaVendas.setIndicadorPesquisarPeliculasTpuSoft(true);
1527
                parametrosConsultaVendas.setIndicadorPesquisarPeliculasTpuSoftCameras(true);
1528
                rankingVendedor.setQuantidadeTpuSoftCamera(lancamentoService.obterQuantidadeVendasDosProdutosDaPromocaoInterna(parametrosConsultaVendas));
1529
 
149 espaco 1530
//              if (rankingVendedor.getQuantidadePedidos() >= ConstantesSEC.ProdutosPromocaoInterna.QUANTIDADE_MINIMA_RECEBIMENTO) {
1531
                        rankingVendedor.setValorTotalVendido(lancamentoService.obterValorTotalVendidoDosProdutosDaPromocaoInterna(parametrosConsultaVendas) * ConstantesSEC.ProdutosPromocaoInterna.PERCENTUAL);
1532
//              } else {
1533
//                      rankingVendedor.setValorTotalVendido(new Double(0.0));
1534
//              }
1535
 
1536
                ParametrosConsultaVendasDTO parametrosConsultaVendasDoDia = new ParametrosConsultaVendasDTO();
1537
                parametrosConsultaVendasDoDia.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()));
1538
                parametrosConsultaVendasDoDia.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getDataAtual()));
1539
                parametrosConsultaVendasDoDia.setVendedor(vendedor);
1540
                rankingVendedor.setValorTotalVendidoDoDia(lancamentoService.obterValorTotalVendidoDosProdutosDaPromocaoInterna(parametrosConsultaVendasDoDia));
1541
                return rankingVendedor;
1542
        }
1543
 
1544
        @Override
1545
        public List<VendasDTO> consultarVendas(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
1546
                return vendaRepository.consultarVendas(parametrosConsultaVendasDTO);
1547
        }
1548
 
1549
        /*
1550
        @Override
1551
        public List<RankingVendedorDTO> consultarRankingVendedores(Date dataInicial, Date dataFinal) {
1552
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
1553
                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradores();
1554
                for (Vendedor vendedor : vendedores) {
1555
                        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1556
                        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1557
                        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1558
                        parametrosConsultaVendas.setVendedor(vendedor);
1559
                        RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
1560
                        rankingVendedor.setVendedor(vendedor);
1561
                        rankingVendedor.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas));
1562
                        rankingVendedor.setQuantidadePedidos(obterQuantidadePedidos(vendedor, dataInicial, dataFinal));
1563
                        rankingVendedores.add(rankingVendedor);
1564
                }
1565
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
1566
        }
1567
        */
1568
 
1569
}