Subversion Repositories Integrator Subversion

Rev

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

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