Subversion Repositories Integrator Subversion

Rev

Rev 277 | Rev 320 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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