Subversion Repositories Integrator Subversion

Rev

Rev 259 | Rev 265 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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