Subversion Repositories Integrator Subversion

Rev

Rev 151 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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