Subversion Repositories Integrator Subversion

Rev

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