Subversion Repositories Integrator Subversion

Rev

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