Subversion Repositories Integrator Subversion

Rev

Details | Last modification | View Log | RSS feed

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