Subversion Repositories Integrator Subversion

Rev

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

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