Subversion Repositories Integrator Subversion

Rev

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