Subversion Repositories Integrator Subversion

Rev

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