Subversion Repositories Integrator Subversion

Rev

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