Subversion Repositories Integrator Subversion

Rev

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