Subversion Repositories Integrator Subversion

Rev

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