Subversion Repositories Integrator Subversion

Rev

Rev 151 | Rev 164 | 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
 
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())) {
162 espaco 736
                        lancamento.setValorCompra(lancamento.getProduto().calculoOperacao());
149 espaco 737
                }
738
        }
739
 
740
        private void cadastrarPagamentos(ParametrosVendaDTO parametrosVenda, Venda venda) {
741
                for (VendaFormaPagamento vendaFormaPagamento : parametrosVenda.getLancamentosPagamentos()) {
742
                        adicionarMaquineta(vendaFormaPagamento, parametrosVenda, venda);
743
                        vendaFormaPagamento.setVenda(venda);
744
                        vendaFormaPagamentoService.cadastrar(vendaFormaPagamento);
745
                        utilizarCupom(vendaFormaPagamento.getCupom());
746
                }
747
        }
748
 
749
        private void adicionarMaquineta(VendaFormaPagamento vendaFormaPagamento, ParametrosVendaDTO parametrosVenda, Venda venda) {
750
                if (vendaFormaPagamento.getFormaPagamento().formaPagamentoEhCartao()) {
751
                        if (VerificadorUtil.estaNulo(parametrosVenda.getMaquineta())) {
752
                                parametrosVenda.setMaquineta(parametrosVenda.getLoja().getMaquineta());
753
                        }
754
                        venda.setMaquineta(parametrosVenda.getMaquineta());
755
                }
756
        }
757
 
758
        private void alterarPagamentos(ParametrosVendaDTO parametrosVenda) {
759
                excluirPagamentosRetiradosDaLista(parametrosVenda, consultarPagamentosCadastrados(parametrosVenda));
760
                cadastrarNovosPagamentos(parametrosVenda);
761
        }
762
 
763
        private void excluirPagamentosRetiradosDaLista(ParametrosVendaDTO parametrosVenda, List<VendaFormaPagamento> pagamentosAntigos) {
764
                for (VendaFormaPagamento pagamentoAntigo : pagamentosAntigos) {
765
                        if (!parametrosVenda.getLancamentosPagamentos().contains(pagamentoAntigo)) {
766
                                vendaFormaPagamentoService.excluir(pagamentoAntigo);
767
                        }
768
//                      if (verificarSePagamentoFoiRetiradoDaLista(parametrosVenda.getLancamentosPagamentos(), pagamentoAntigo)) {
769
//                              vendaFormaPagamentoService.excluirPorId(pagamentoAntigo);
770
//                      }
771
                }
772
        }
773
 
774
        private boolean verificarSePagamentoFoiRetiradoDaLista(List<VendaFormaPagamento> pagamentos, VendaFormaPagamento pagamentoAntigo) {
775
                boolean pagamentoRetirado = true;
776
                for (VendaFormaPagamento pagamento : pagamentos) {
777
                        if (pagamento.getCodigoDaFormaPagamento().equals(pagamentoAntigo.getCodigoDaFormaPagamento())) {
778
                                if (verificarSeBandeiraCartaoEhIgual(pagamento.getCodigoDaBandeiraCartao(), pagamentoAntigo.getCodigoDaBandeiraCartao()) &&
779
                                                pagamento.getValorPagamento().equals(pagamentoAntigo.getValorPagamento())) {
780
                                        return false;
781
                                } else {
782
                                        pagamento.setVenda(pagamentoAntigo.getVenda());
783
                                        vendaFormaPagamentoService.alterar(pagamento);
784
                                        return false;
785
                                }
786
                        }
787
                }
788
                return pagamentoRetirado;
789
        }
790
 
791
        private boolean verificarSeBandeiraCartaoEhIgual(Long codigoDaBandeiraCartao, Long codigoDaBandeiraCartaoSegundo) {
792
                if (VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartao) && VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartaoSegundo)) {
793
                        return codigoDaBandeiraCartao.equals(codigoDaBandeiraCartaoSegundo);
794
                }
795
                if ((VerificadorUtil.estaNulo(codigoDaBandeiraCartao) && VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartaoSegundo)) ||
796
                                (VerificadorUtil.naoEstaNulo(codigoDaBandeiraCartao) && VerificadorUtil.estaNulo(codigoDaBandeiraCartaoSegundo))) {
797
                        return false;
798
                }
799
                return true;
800
        }
801
 
802
        private void cadastrarNovosPagamentos(ParametrosVendaDTO parametrosVenda) {
803
                for (VendaFormaPagamento pagamento : parametrosVenda.getLancamentosPagamentos()) {
804
                        if (VerificadorUtil.estaNulo(pagamento.getSequencial())) {
805
                                adicionarMaquineta(pagamento, parametrosVenda, parametrosVenda.getVenda());
806
                                pagamento.setVenda(parametrosVenda.getVenda());
807
                                vendaFormaPagamentoService.cadastrar(pagamento);
808
                                utilizarCupom(pagamento.getCupom());
809
                        }
810
                }
811
        }
812
 
813
        private List<VendaFormaPagamento> consultarPagamentosCadastrados(ParametrosVendaDTO parametrosVenda) {
814
                VendaFormaPagamento pagamentoDaVenda = new VendaFormaPagamento();
815
                pagamentoDaVenda.setVenda(parametrosVenda.getVenda());
816
                return vendaFormaPagamentoService.consultarPassandoEntidade(pagamentoDaVenda, 0, vendaFormaPagamentoService.obterQuantidadeDeRegistrosPassandoEntidade(pagamentoDaVenda));
817
        }
818
 
819
        private void alterarEstoqueProduto(Integer quantidadeAlterar, Loja loja, String codigoProduto) {
820
                if (VerificadorUtil.naoEstaNulo(codigoProduto)) {
821
                        Produto produto = produtoService.consultarProdutoPorCodigo(codigoProduto);
822
                        produtoLojaService.alterarEstoqueAcrescentandoQuantidadeInformada(quantidadeAlterar, produto, loja);
823
                }
824
        }
825
 
826
        private void utilizarCupom(Cupom cupom) {
827
                if (VerificadorUtil.naoEstaNulo(cupom)) {
828
                        Cupom cupomUtilizado = cupomService.consultarPorId(cupom);
829
                        cupomUtilizado.setDataHoraUtilizado(DataUtils.getDataAtual());
830
                        if (VerificadorUtil.estaNulo(cupomUtilizado.getQuantidadeUtilizada())) {
831
                                cupomUtilizado.setQuantidadeUtilizada(0);
832
                        }
833
                        cupomUtilizado.setQuantidadeUtilizada(cupomUtilizado.getQuantidadeUtilizada() + 1);
834
                        cupomService.alterar(cupomUtilizado);
835
                }
836
        }
837
 
838
        @Override
839
        public List<Venda> consultarVendasPorDemanda(ParametrosConsulta<Venda> parametrosConsulta, Integer primeiroRegistro,
840
                        Integer tamanhoPagina, String sortField, String orderSort, Map<String, Object> filters) {
841
                return vendaRepository.consultarVendasPorDemanda(parametrosConsulta, primeiroRegistro, tamanhoPagina, sortField, orderSort, filters);
842
        }
843
 
844
        @Override
845
        public List<Venda> consultarVendaPorParametros(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
846
                return vendaRepository.consultarVendaPorParametros(parametrosConsultaVendas);
847
        }
848
 
849
        @Override
850
        public GraficoAcumuladoDTO consultarGrafico(String mes, String ano) {
851
                return vendaRepository.consultarGrafico(mes, ano);
852
        }
853
 
854
        @Override
855
        public List<RankingVendedorDTO> consultarRankingVendedores(Date dataInicial, Date dataFinal, Boolean produtosComissionados, Loja lojaSelecionada) {
856
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
857
                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradoresAtivos(lojaSelecionada);
858
                for (Vendedor vendedor : vendedores) {
859
                        RankingVendedorDTO vendedorConsultado = consultarRankingVendedor(vendedor, dataInicial, dataFinal, produtosComissionados);
860
                        rankingVendedores.add(vendedorConsultado);
861
                }
862
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
863
        }
864
 
865
        @Override
866
        public RankingVendedorDTO consultarRankingVendedor(Vendedor vendedor, Vigencia vigencia, Boolean produtosComissionados) {
867
                Avaliacao avaliacao = avaliacaoService.consultarAvaliacaoDaVigencia(vigencia);
868
                RankingVendedorDTO rankingVendedor = consultarRankingVendedor(vendedor, vigencia.getDataInicio(), vigencia.getDataFim(), produtosComissionados);
869
                rankingVendedor.setFuncionario(funcionarioService.consultarFuncionarioPorPessoa(vendedor.getPessoa()));
870
                rankingVendedor.setQuantidadeBancoHoras(bancoHorasService.consultarQuantidadeHoras(rankingVendedor.getFuncionario()));
871
                AvaliacaoFuncionario avaliacaoFuncionario = avaliacaoFuncionarioService.detalhar(vendedor.getPessoa(), avaliacao);
872
                if (VerificadorUtil.naoEstaNuloOuVazio(avaliacaoFuncionario)) {
873
                        rankingVendedor.setAvaliacaoFuncionario(avaliacaoFuncionario);
874
                        if (VerificadorUtil.naoEstaNulo(avaliacaoFuncionario.getPorcentagemComissao())) {
875
                                rankingVendedor.setComissao(calcularComissao(rankingVendedor.getValorTotalVendido(), avaliacaoFuncionario.getPorcentagemComissao()/100));
876
                        } else {
877
                                rankingVendedor.setComissao(calcularComissao(rankingVendedor.getValorTotalVendido(), avaliacaoFuncionario.retornarFaixaComissao(rankingVendedor.getValorTotalVendido(), rankingVendedor.getFuncionario().getTipoComissionamento())));
878
                        }
879
                }
880
                return rankingVendedor;
881
        }
882
 
883
        public Double calcularComissao(Double valorTotalVendido, Double porcentagemComissao) {
884
                if (VerificadorUtil.naoEstaNuloOuVazio(porcentagemComissao)) {
885
                        return valorTotalVendido * porcentagemComissao;
886
                }
887
                return 0.0;
888
        }
889
 
890
        @Override
891
        public RankingVendedorDTO consultarRankingVendedor(Vendedor vendedor, Date dataInicial, Date dataFinal, Boolean produtosComissionados) {
892
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
893
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
894
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
895
                parametrosConsultaVendas.setVendedor(vendedor);
896
                if (VerificadorUtil.naoEstaNulo(produtosComissionados)) {
897
                        parametrosConsultaVendas.setIndicadorComissionado(produtosComissionados);
898
                }
899
 
900
                RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
901
                rankingVendedor.setVendedor(vendedor);
902
                try {
903
                        rankingVendedor.setFuncionario(funcionarioService.consultarFuncionarioPorPessoa(vendedor.getPessoa()));
904
                        rankingVendedor.setQuantidadeBancoHoras(bancoHorasService.consultarQuantidadeHoras(rankingVendedor.getFuncionario()));
905
                } catch (RuntimeException e) {
906
                        rankingVendedor.setFuncionario(null);
907
                }
908
 
909
                rankingVendedor.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas));
910
                rankingVendedor.setValorTotalDescontos(obterValorTotalDeDescontosPorLojaEePeriodo(parametrosConsultaVendas));
911
                rankingVendedor.setQuantidadeTotalProdutosVendidos(obterQuantidadeProdutosVendidosPorLojaEePeriodo(parametrosConsultaVendas));
912
 
913
                Venda venda = new Venda();
914
                venda.setVendedor(vendedor);
915
                rankingVendedor.setQuantidadeVendas(obterQuantidadeDeVendasPorLojaEePeriodo(venda, dataInicial, dataFinal));
916
                rankingVendedor.setQuantidadePedidos(obterQuantidadePedidosValidos(vendedor, null, dataInicial, dataFinal));
917
                rankingVendedor.setQuantidadePedidosInvalidos(obterQuantidadePedidos(vendedor, null, dataInicial, dataFinal, TipoSituacaoPedido.INVALIDO.getValor()));
918
                rankingVendedor.setQuantidadeContagens(obterQuantidadeDeContagens(vendedor, dataInicial, dataFinal));
919
                rankingVendedor.setQuantidadeAtendimentos(obterQuantidadeDeAtendimentos(vendedor, dataInicial, dataFinal));
920
                rankingVendedor.setValorTotalVendidoVivo(obterValorTotalBrutoDeVendasVivoPorLojaEePeriodo(parametrosConsultaVendas));
921
 
922
                rankingVendedor.setAvaliacaoFuncionario(avaliacaoFuncionarioService.consultarAvaliacaoFuncionarioPelaData(vendedor, DataUtils.getDataComHorarioMinimo(dataFinal)));
923
                if (VerificadorUtil.naoEstaNulo(rankingVendedor.getAvaliacaoFuncionario())) {
924
                        rankingVendedor.setPercentualDescontos(rankingVendedor.getAvaliacaoFuncionario().retornarPercentual(rankingVendedor.getValorTotalDescontos(), rankingVendedor.getValorTotalVendido()));
925
                        rankingVendedor.setPercentualMetaMensal(rankingVendedor.getAvaliacaoFuncionario().retornarPercentualRealizado(rankingVendedor.getValorTotalVendido()));
926
                        rankingVendedor.setPercentualMetaMensalVivo(rankingVendedor.getAvaliacaoFuncionario().retornarPercentualVivoRealizado(rankingVendedor.getValorTotalVendidoVivo()));
927
                }
928
 
929
                ParametrosConsultaVendasDTO parametrosConsultaVendasDoDia = new ParametrosConsultaVendasDTO();
930
                parametrosConsultaVendasDoDia.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()));
931
                parametrosConsultaVendasDoDia.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getDataAtual()));
932
                parametrosConsultaVendasDoDia.setVendedor(vendedor);
933
                if (VerificadorUtil.naoEstaNulo(produtosComissionados)) {
934
                        parametrosConsultaVendasDoDia.setIndicadorComissionado(produtosComissionados);
935
                }
936
                rankingVendedor.setValorTotalVendidoDoDia(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendasDoDia));
937
 
938
                return rankingVendedor;
939
        }
940
 
941
        private Integer obterQuantidadePedidos(Vendedor vendedor, Loja loja, Date dataInicial, Date dataFinal, String tipoSituacao) {
942
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
943
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
944
                                return 0;
945
                        }
946
                }
947
                ParametrosConsultaPedidoDTO parametrosPedidos = new ParametrosConsultaPedidoDTO();
948
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
949
                        parametrosPedidos.setPessoa(vendedor.getPessoa());
950
                }
951
                parametrosPedidos.setEntidade(new Pedido());
952
                parametrosPedidos.getEntidade().setTipoSituacao(tipoSituacao);
953
                parametrosPedidos.getEntidade().setLoja(loja);
954
                parametrosPedidos.setDataInicial(dataInicial);
955
                parametrosPedidos.setDataFinal(dataFinal);
956
                return pedidoService.obterQuantidadeDeRegistrosParametrosConsulta(parametrosPedidos);
957
        }
958
 
959
        private Integer obterQuantidadePedidosValidos(Vendedor vendedor, Loja loja, Date dataInicial, Date dataFinal) {
960
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
961
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
962
                                return 0;
963
                        }
964
                }
965
                ParametrosConsultaPedidoDTO parametrosPedidos = new ParametrosConsultaPedidoDTO();
966
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
967
                        parametrosPedidos.setPessoa(vendedor.getPessoa());
968
                }
969
                parametrosPedidos.setEntidade(new Pedido());
970
                parametrosPedidos.getEntidade().setLoja(loja);
971
                parametrosPedidos.setDataInicial(dataInicial);
972
                parametrosPedidos.setDataFinal(dataFinal);
973
                parametrosPedidos.setValidos(true);
974
                return pedidoService.obterQuantidadeDeRegistrosParametrosConsulta(parametrosPedidos);
975
        }
976
 
977
        private Integer obterQuantidadeDeContagens(Vendedor vendedor, Date dataInicial, Date dataFinal) {
978
                if (VerificadorUtil.naoEstaNulo(vendedor)) {
979
                        if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
980
                                return 0;
981
                        }
982
                }
983
                return produtoLojaService.obterQuantidadeDeContagens(vendedor.getPessoa(), dataInicial, dataFinal);
984
        }
985
 
986
        private Integer obterQuantidadeDeAtendimentos(Vendedor vendedor, Date dataInicial, Date dataFinal) {
987
                if (VerificadorUtil.estaNulo(vendedor.getPessoa())) {
988
                        return 0;
989
                }
990
                return produtoLojaService.obterQuantidadeDeAtendimentos(vendedor.getPessoa(), dataInicial, dataFinal);
991
        }
992
 
993
        private Integer obterQuantidadeDeAtendimentos(Loja loja, Date dataInicial, Date dataFinal) {
994
                return produtoLojaService.obterQuantidadeDeAtendimentos(loja, dataInicial, dataFinal);
995
        }
996
 
997
        private Double obterValorTotalBrutoDeVendasVivoPorLojaEePeriodo(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
998
                ParametrosConsultaVendasVivoDTO parametrosConsultaVendasVivo = new ParametrosConsultaVendasVivoDTO();
999
                parametrosConsultaVendasVivo.setVendedor(parametrosConsultaVendas.getVendedor());
1000
                parametrosConsultaVendasVivo.setDataInicial(parametrosConsultaVendas.getDataInicial());
1001
                parametrosConsultaVendasVivo.setDataFinal(parametrosConsultaVendas.getDataFinal());
1002
                return vendaVivoService.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendasVivo);
1003
        }
1004
 
1005
        @Override
1006
        public List<RankingLojaDTO> consultarRankingLojas(Date dataInicial, Date dataFinal) {
1007
                List<RankingLojaDTO> rankingLojas = new ArrayList<RankingLojaDTO>();
1008
                List<Loja> lojas = lojaService.listarLojasAtivas();
1009
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1010
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1011
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1012
                for (Loja loja : lojas) {
1013
                        if (!loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_LOJA_FARMACIA_7)
1014
                                        && !loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_RESTAURANTE_16)) {
1015
                                parametrosConsultaVendas.setLoja(loja);
1016
 
1017
                                RankingLojaDTO rankingLoja = new RankingLojaDTO();
1018
                                rankingLoja.setLoja(loja);
1019
                                rankingLoja.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
1020
                                                - obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1021
                                rankingLoja.setAvaliacaoLoja(avaliacaoLojaService.consultarAvaliacaoLojaPelaData(loja, DataUtils.getDataComHorarioMinimo(dataFinal)));
1022
                                if (VerificadorUtil.naoEstaNulo(rankingLoja.getAvaliacaoLoja())) {
1023
                                        rankingLoja.setValorMetaMensal(rankingLoja.getAvaliacaoLoja().getValorMetaMensal());
1024
                                }
1025
                                rankingLojas.add(rankingLoja);
1026
                        }
1027
                }
1028
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojas);
1029
        }
1030
 
1031
        @Override
1032
        public List<RankingLojaDTO> consultarRankingLojasCompleto(Date dataInicial, Date dataFinal) {
1033
                List<RankingLojaDTO> rankingLojasCompleto = new ArrayList<RankingLojaDTO>();
1034
                List<RankingLojaDTO> rankingLojas = consultarRankingLojas(dataInicial, dataFinal);
1035
                for (RankingLojaDTO rankingLoja : rankingLojas) {
1036
                        rankingLoja.setQuantidadeVendas(obterQuantidadeDeVendasPorLojaEePeriodo(new Venda(rankingLoja.getLoja(), null), dataInicial, dataFinal));
1037
                        rankingLoja.setQuantidadeAtendimentos(obterQuantidadeDeAtendimentos(rankingLoja.getLoja(), dataInicial, dataFinal));
1038
                        rankingLoja.setQuantidadePedidos(obterQuantidadePedidosValidos(null, rankingLoja.getLoja(), dataInicial, dataFinal));
1039
                        rankingLoja.setQuantidadePedidosInvalidos(obterQuantidadePedidos(null, rankingLoja.getLoja(), dataInicial, dataFinal, TipoSituacaoPedido.INVALIDO.getValor()));
1040
 
1041
                        ParametrosConsultaPorPeriodoDTO parametrosConsulta = new ParametrosConsultaPorPeriodoDTO();
1042
                        ((ParametrosConsultaPorPeriodoDTO)parametrosConsulta).setDataInicial(dataInicial);
1043
                        ((ParametrosConsultaPorPeriodoDTO)parametrosConsulta).setDataFinal(dataFinal);
1044
                        EstoqueAuditoria estoqueAuditoria = new EstoqueAuditoria();
1045
                        estoqueAuditoria.setLoja(rankingLoja.getLoja());
1046
                        estoqueAuditoria.setTipoEstoqueAuditoria(TipoEstoqueAuditoria.AVARIA.getValor());
1047
                        parametrosConsulta.setEntidade(estoqueAuditoria);
1048
                        rankingLoja.setQuantidadeAvarias(estoqueAuditoriaService.obterQuantidadeTotalAuditoria(parametrosConsulta));
1049
 
1050
                        estoqueAuditoria.setTipoEstoqueAuditoria(TipoEstoqueAuditoria.TROCA.getValor());
1051
                        parametrosConsulta.setEntidade(estoqueAuditoria);
1052
                        rankingLoja.setQuantidadeTrocas(estoqueAuditoriaService.obterQuantidadeTotalAuditoria(parametrosConsulta));
1053
 
1054
                        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1055
                        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1056
                        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1057
                        parametrosConsultaVendas.setLoja(rankingLoja.getLoja());
1058
                        rankingLoja.setValorTotalDescontos(obterValorTotalDeDescontosPorLojaEePeriodo(parametrosConsultaVendas));
1059
                        rankingLoja.setCustoProdutosVendidos(obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(parametrosConsultaVendas));
1060
                        rankingLoja.setValorTotalEstoque(produtoService.valorTotalEstoque(rankingLoja.getLoja(), null));
1061
                        rankingLoja.setQuantidadeTotalEstoque(produtoService.quantidadeTotalEstoque(rankingLoja.getLoja()));
1062
 
1063
                        ParametrosConsultaLancamentosDTO parametros = new ParametrosConsultaLancamentosDTO();
1064
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_ALUGUEL_11));
1065
                        parametros.setCentroDeCustos(rankingLoja.getLoja());
1066
                        parametros.setPagamentoRealizado(true);
1067
                        parametros.setDataInicial(dataInicial);
1068
                        parametros.setDataFinal(dataFinal);
1069
                        Double valorCac = 0.0;
1070
 
1071
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1072
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_HORA_EXTRA_2));
1073
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1074
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_SALARIO_9));
1075
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1076
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_FERIAS_12));
1077
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1078
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_COMISSOES_8));
1079
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1080
                        parametros.setCategoria(new Categoria(ConstantesSEC.Categoria.SEQUENCIAL_CATEGORIA_VALE_TRANSPORTE_46));
1081
                        valorCac = somarValor(valorCac, parcelaService.obterValorPassandoParametrosConsulta(parametros));
1082
                        valorCac = valorCac / rankingLoja.getQuantidadeVendas();
1083
                        rankingLoja.setValorCac(valorCac);
1084
 
1085
                        rankingLojasCompleto.add(rankingLoja);
1086
                }
1087
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojasCompleto);
1088
        }
1089
 
1090
        private Double somarValor(Double valor, Double valorAcrescentar) {
1091
                if (VerificadorUtil.naoEstaNulo(valorAcrescentar)) {
1092
                        return valor + valorAcrescentar;
1093
                }
1094
                return valor;
1095
        }
1096
 
1097
        @Override
1098
        public List<RankingLojaDTO> consultarRankingLojasExtras(Date dataInicial, Date dataFinal) {
1099
                List<RankingLojaDTO> rankingLojas = new ArrayList<RankingLojaDTO>();
1100
                List<Loja> lojas = lojaService.listarLojasAtivas();
1101
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1102
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1103
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1104
                for (Loja loja : lojas) {
1105
                        if (loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_LOJA_FARMACIA_7)
1106
                                        || loja.getSequencial().equals(ConstantesSEC.SEQUENCIAL_RESTAURANTE_16)) {
1107
                                parametrosConsultaVendas.setLoja(loja);
1108
 
1109
                                RankingLojaDTO rankingLoja = new RankingLojaDTO();
1110
                                rankingLoja.setLoja(loja);
1111
                                rankingLoja.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas)
1112
                                                - obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1113
                                rankingLoja.setAvaliacaoLoja(avaliacaoLojaService.consultarAvaliacaoLojaPelaData(loja, DataUtils.getDataComHorarioMinimo(dataFinal)));
1114
                                if (VerificadorUtil.naoEstaNulo(rankingLoja.getAvaliacaoLoja())) {
1115
                                        rankingLoja.setValorMetaMensal(rankingLoja.getAvaliacaoLoja().getValorMetaMensal());
1116
                                }
1117
                                rankingLojas.add(rankingLoja);
1118
                        }
1119
                }
1120
                parametrosConsultaVendas.setLoja(null);
1121
                RankingLojaDTO rankingLojaServico = new RankingLojaDTO();
1122
                Loja lojaServico = new Loja();
1123
                lojaServico.setDescricao("ASSISTÊNCIA");
1124
                rankingLojaServico.setValorMetaMensal(new Double(0.0));
1125
                rankingLojaServico.setLoja(lojaServico);
1126
                rankingLojaServico.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(parametrosConsultaVendas));
1127
                rankingLojas.add(rankingLojaServico);
1128
                return (List<RankingLojaDTO>) ordenador.ordenar(rankingLojas);
1129
        }
1130
 
1131
        @Override
1132
        public Double obterValorTotalBrutoDeVendasPorLojaEePeriodoServicos(ParametrosConsultaVendasDTO parametrosConsultaVendas) {
1133
                parametrosConsultaVendas.setTipoProduto(TipoProduto.SERVICO.getValor());
1134
                Double valorTotal = vendaRepository.obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas);
1135
                parametrosConsultaVendas.setTipoProduto(null);
1136
                return VerificadorUtil.estaNulo(valorTotal)? new Double(0.0) : valorTotal;
1137
        }
1138
 
1139
        @Override
1140
        public List<RankingProdutoDTO> consultarProdutosVendidos(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1141
                List<RankingProdutoDTO> produtosVendidosConsultados = vendaRepository.consultarProdutosVendidos(parametrosConsulta);
1142
                for (RankingProdutoDTO produtoVendido : produtosVendidosConsultados) {
1143
                        produtoVendido.atualizarTempoEstoque(parametrosConsulta.getDataInicial(), parametrosConsulta.getDataFinal());
1144
                }
1145
                return produtosVendidosConsultados;
1146
        }
1147
 
1148
        @Override
1149
        public List<RankingProdutoDTO> consultarProdutosVendidosResumido(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1150
                return vendaRepository.consultarProdutosVendidosResumido(parametrosConsulta);
1151
        }
1152
 
1153
        @Override
1154
        public List<RankingProdutoDTO> consultarProdutosParaTransferir(ParametrosConsultaProdutosVendidosDTO parametrosConsulta) {
1155
                return vendaRepository.consultarProdutosParaTransferir(parametrosConsulta);
1156
        }
1157
 
1158
        @Override
1159
        public List<RankingProdutoDTO> consultarRankingProdutos(Date dataInicial, Date dataFinal, Integer quantidadeProdutos, String tipoOrdenacao, Long sequencialLoja, String tipoProduto, Produto produto, Marca marca) {
1160
                return vendaRepository.consultarProdutosMaisVendidos(dataInicial, dataFinal, quantidadeProdutos, tipoOrdenacao, sequencialLoja, tipoProduto, produto, marca);
1161
        }
1162
 
1163
        @Override
1164
        public List<RankingModeloDTO> consultarRankingModelos(ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta) {
1165
                return vendaRepository.consultarModelosMaisVendidos(parametrosConsulta);
1166
        }
1167
 
1168
        @Override
1169
        public List<RankingModeloDTO> consultarRankingModelos(Date dataInicial, Date dataFinal, Integer quantidadeModelos, String tipoOrdenacao, String tipoProduto, Long sequencialLoja) {
151 espaco 1170
                ParametrosConsultaModelosMaisVendidosDTO parametros = new ParametrosConsultaModelosMaisVendidosDTO(dataInicial, dataFinal, quantidadeModelos, tipoOrdenacao, tipoProduto, sequencialLoja);
1171
                return this.consultarRankingModelos(parametros);
149 espaco 1172
        }
1173
 
1174
        @Override
1175
        public List<RankingComprasTransferenciasDTO> consultarPlanejamentoParaCompras(ParametrosConsultaParaComprasTransferenciasDTO parametrosParaConsulta) {
1176
                Integer limite = parametrosParaConsulta.getQuantidadeModelos();
1177
                if (parametrosParaConsulta.getIndicadorConsultarTodosModelos()) {
1178
                        limite = null;
1179
                }
1180
                List<RankingComprasTransferenciasDTO> planejamentos = new ArrayList<RankingComprasTransferenciasDTO>();
1181
                ParametrosConsultaModelosMaisVendidosDTO parametrosConsulta = new ParametrosConsultaModelosMaisVendidosDTO(parametrosParaConsulta.getDataInicial(), parametrosParaConsulta.getDataFinal(), limite,
1182
                                parametrosParaConsulta.getTipoOrdenacao(), parametrosParaConsulta.getTipoProduto(), parametrosParaConsulta.getSequencialLoja(), parametrosParaConsulta.getModelo(), parametrosParaConsulta.getEstilo());
1183
                List<RankingModeloDTO> modelos = vendaRepository.consultarModelosMaisVendidos(parametrosConsulta);
1184
                for (RankingModeloDTO modelo : modelos) {
1185
                        RankingComprasTransferenciasDTO planejamento = new RankingComprasTransferenciasDTO();
1186
                        planejamento.setModelo(modelo.getModelo());
1187
                        planejamento.setValorTotalVendido(modelo.getValorTotalVendido());
1188
                        planejamento.setValorTotalComprado(modelo.getValorTotalComprado());
1189
                        planejamento.setQuantidadeVendas(modelo.getQuantidadeVendas());
1190
                        planejamento.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1191
                        if (VerificadorUtil.naoEstaNuloOuVazio(modelo.getQuantidadeEstoqueLocal())) {
1192
                                planejamento.setQuantidadeEstoqueLocal(modelo.getQuantidadeEstoqueLocal().intValue());
1193
                        }
1194
                        planejamento.setQuantidadeEstoqueGeral(modelo.getQuantidadeEstoqueGeral().intValue());
1195
                        planejamentos.add(planejamento);
1196
                }
1197
 
1198
                if (parametrosParaConsulta.getIndicadorConsultarTodosModelos()) {
1199
                        List<Modelo> modelosAtivos = new ArrayList<Modelo>();
1200
                        if (VerificadorUtil.estaNulo(parametrosParaConsulta.getModelo())) {
1201
                                modelosAtivos = modeloService.consultarTodosAtivos();
1202
                        } else {
1203
                                modelosAtivos = modeloService.consultarPassandoEntidade(parametrosParaConsulta.getModelo(), 0, modeloService.obterQuantidadeDeRegistrosPassandoEntidade(parametrosParaConsulta.getModelo()));
1204
                        }
1205
                        for (Modelo modeloAtivo : modelosAtivos) {
1206
                                if (modeloNaoEstaPresenteNaLista(modelos, modeloAtivo)) {
1207
                                        RankingComprasTransferenciasDTO planejamento = new RankingComprasTransferenciasDTO();
1208
                                        planejamento.setModelo(modeloAtivo);
1209
                                        planejamento.setValorTotalVendido(new Double(0.0));
1210
                                        planejamento.setValorTotalComprado(new Double(0.0));
1211
                                        planejamento.setQuantidadeVendas(new Long(0));
1212
                                        planejamento.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1213
                                        if (VerificadorUtil.naoEstaNuloOuVazio(parametrosParaConsulta.getSequencialLoja())) {
1214
                                                planejamento.setQuantidadeEstoqueLocal(produtoLojaService.consultarEstoqueModeloEeLoja(modeloAtivo, parametrosParaConsulta.getSequencialLoja(), null, parametrosParaConsulta.getTipoProduto(), null, null));
1215
                                        }
1216
                                        planejamento.setQuantidadeEstoqueGeral(produtoLojaService.consultarEstoqueModeloEeLoja(modeloAtivo, null, null, parametrosParaConsulta.getTipoProduto(), null, null));
1217
                                        if (planejamento.getQuantidadeEstoqueGeral() > 0) {
1218
                                                planejamentos.add(planejamento);
1219
                                        }
1220
                                }
1221
                        }
1222
                }
1223
 
1224
                if (parametrosParaConsulta.getTipoOrdenacao().equals(TipoOrdenacaoPlanejamentoCompras.QUANTIDADE_COMPRAR.getValor())) {
1225
                        return new ArrayList<RankingComprasTransferenciasDTO>(ordenador.ordenar(planejamentos));
1226
                }
1227
                return planejamentos;
1228
        }
1229
 
1230
        private Boolean modeloNaoEstaPresenteNaLista(List<RankingModeloDTO> rankingModelos, Modelo modeloAtivo) {
1231
                for (RankingModeloDTO rankingModelo : rankingModelos) {
1232
                        if (rankingModelo.getModelo().getSequencial().equals(modeloAtivo.getSequencial())) {
1233
                                return false;
1234
                        }
1235
                }
1236
                return true;
1237
        }
1238
 
1239
        @Override
1240
        public List<RankingComprasTransferenciasEstiloDTO> consultarDetalhamentoPlanejamentoParaCompras(ParametrosConsultaParaComprasTransferenciasDTO parametrosParaConsulta, Modelo modelo) {
1241
                List<RankingComprasTransferenciasEstiloDTO> estilos = new ArrayList<RankingComprasTransferenciasEstiloDTO>();
1242
                for (TipoEstiloProduto estiloProduto : TipoEstiloProduto.values()) {
1243
                        parametrosParaConsulta.setEstilo(StringUtil.setarUpperCase(estiloProduto.getValor()));
1244
                        RankingComprasTransferenciasEstiloDTO estilo = vendaRepository.consultarEstoqueEeVendasPorEstilo(parametrosParaConsulta, modelo);
1245
                        estilo.setRankingsPorLoja(vendaRepository.consultarEstoqueEeVendasEstiloPorLoja(parametrosParaConsulta, modelo));
1246
                        estilo.setQuantidadeMinimaComprar(parametrosParaConsulta.getQuantidadeMinimaComprar());
1247
                        estilos.add(estilo);
1248
                }
1249
                return estilos;
1250
        }
1251
 
1252
        @Override
1253
        public List<RankingVendedorDTO> consultarRankingPromocaoInterna(Date dataInicial, Date dataFinal) {
1254
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
1255
                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradoresAtivos(null);
1256
                for (Vendedor vendedor : vendedores) {
1257
                        RankingVendedorDTO ranking = consultarRankingPromocaoInternaDoVendedor(vendedor, dataInicial, dataFinal);
1258
                        if (ranking.getValorTotalVendido() > new Double(0.0)) {
1259
                                rankingVendedores.add(ranking);
1260
                        }
1261
                }
1262
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
1263
        }
1264
 
1265
        @Override
1266
        public RankingVendedorDTO consultarRankingPromocaoInternaDoVendedor(Vendedor vendedor, Date dataInicial, Date dataFinal) {
1267
                ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1268
                parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1269
                parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1270
                parametrosConsultaVendas.setVendedor(vendedor);
1271
                RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
1272
                rankingVendedor.setVendedor(vendedor);
1273
 
1274
                rankingVendedor.setQuantidadePedidos(lancamentoService.obterQuantidadeVendasDosProdutosDaPromocaoInterna(parametrosConsultaVendas));
1275
//              if (rankingVendedor.getQuantidadePedidos() >= ConstantesSEC.ProdutosPromocaoInterna.QUANTIDADE_MINIMA_RECEBIMENTO) {
1276
                        rankingVendedor.setValorTotalVendido(lancamentoService.obterValorTotalVendidoDosProdutosDaPromocaoInterna(parametrosConsultaVendas) * ConstantesSEC.ProdutosPromocaoInterna.PERCENTUAL);
1277
//              } else {
1278
//                      rankingVendedor.setValorTotalVendido(new Double(0.0));
1279
//              }
1280
 
1281
                ParametrosConsultaVendasDTO parametrosConsultaVendasDoDia = new ParametrosConsultaVendasDTO();
1282
                parametrosConsultaVendasDoDia.setDataInicial(DataUtils.getDataComHorarioMinimo(DataUtils.getDataAtual()));
1283
                parametrosConsultaVendasDoDia.setDataFinal(DataUtils.getDataComHorarioMaximo(DataUtils.getDataAtual()));
1284
                parametrosConsultaVendasDoDia.setVendedor(vendedor);
1285
                rankingVendedor.setValorTotalVendidoDoDia(lancamentoService.obterValorTotalVendidoDosProdutosDaPromocaoInterna(parametrosConsultaVendasDoDia));
1286
                return rankingVendedor;
1287
        }
1288
 
1289
        @Override
1290
        public List<VendasDTO> consultarVendas(ParametrosConsultaVendasDTO parametrosConsultaVendasDTO) {
1291
                return vendaRepository.consultarVendas(parametrosConsultaVendasDTO);
1292
        }
1293
 
1294
        /*
1295
        @Override
1296
        public List<RankingVendedorDTO> consultarRankingVendedores(Date dataInicial, Date dataFinal) {
1297
                List<RankingVendedorDTO> rankingVendedores = new ArrayList<RankingVendedorDTO>();
1298
                List<Vendedor> vendedores = vendedorService.consultarVendedoresColaboradores();
1299
                for (Vendedor vendedor : vendedores) {
1300
                        ParametrosConsultaVendasDTO parametrosConsultaVendas = new ParametrosConsultaVendasDTO();
1301
                        parametrosConsultaVendas.setDataInicial(DataUtils.getDataComHorarioMinimo(dataInicial));
1302
                        parametrosConsultaVendas.setDataFinal(DataUtils.getDataComHorarioMaximo(dataFinal));
1303
                        parametrosConsultaVendas.setVendedor(vendedor);
1304
                        RankingVendedorDTO rankingVendedor = new RankingVendedorDTO();
1305
                        rankingVendedor.setVendedor(vendedor);
1306
                        rankingVendedor.setValorTotalVendido(obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas));
1307
                        rankingVendedor.setQuantidadePedidos(obterQuantidadePedidos(vendedor, dataInicial, dataFinal));
1308
                        rankingVendedores.add(rankingVendedor);
1309
                }
1310
                return (List<RankingVendedorDTO>) ordenador.ordenar(rankingVendedores);
1311
        }
1312
        */
1313
 
1314
}