Subversion Repositories Integrator Subversion

Rev

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