Subversion Repositories Integrator Subversion

Rev

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