Subversion Repositories Integrator Subversion

Rev

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