Subversion Repositories Integrator Subversion

Rev

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