package br.com.ec.domain.service.vendavivo.impl;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ec.core.consulta.ParametrosConsulta;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.ParametrosConsultaVendasVivoDTO;
import br.com.ec.domain.dto.ProdutoVivoDTO;
import br.com.ec.domain.dto.VendasDTO;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.model.VendaVivo;
import br.com.ec.domain.model.Vendedor;
import br.com.ec.domain.service.email.impl.GerenciadorEmailImpl;
import br.com.ec.domain.service.linhavivo.LinhaVivoService;
import br.com.ec.domain.service.vendavivo.VendaVivoService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.infrastructure.repository.VendaVivoRepository;
@Service
public class VendaVivoServiceImpl
extends AbstractService
<VendaVivo
> implements VendaVivoService
{
private LinhaVivoService linhaVivoService
;
private VendaVivoRepository vendaVivoRepository
;
@Autowired
public VendaVivoServiceImpl
(Validador validador, LinhaVivoService linhaVivoService, VendaVivoRepository vendaVivoRepository
) {
super(validador
);
this.
linhaVivoService = linhaVivoService
;
this.
vendaVivoRepository = vendaVivoRepository
;
}
@
Override
protected GenericRepository
<VendaVivo
> getRepository
() {
return vendaVivoRepository
;
}
@
Override
protected void regrasNegocioCadastrar
(VendaVivo vendaVivo
) {
if (VerificadorUtil.
estaNulo(vendaVivo.
getVendedor())) {
throw new NegocioException
("Obrigatório informar o vendedor.");
}
if (VerificadorUtil.
estaNulo(vendaVivo.
getDataVenda())) {
vendaVivo.
setDataVenda(DataUtils.
getDataAtual());
}
}
@
Override
public VendaVivo detalharVendaVivo
(VendaVivo vendaVivo
) {
return vendaVivoRepository.
detalharVendaVivo(vendaVivo
);
}
@
Override
public void excluirVendaVivo
(VendaVivo vendaVivo, Usuario usuario
) {
super.
excluir(vendaVivo
);
enviarEmail
(vendaVivo, usuario
);
}
private void enviarEmail
(VendaVivo vendaVivo, Usuario usuario
) {
String diaAtual = DataUtils.
converterDataParaString(DataUtils.
getDataAtual());
StringBuilder conteudo =
new StringBuilder();
conteudo.
append("OPERAÇÃO REALIZADA POR: " + usuario.
getNome() +
"\n");
conteudo.
append("DATA DA VENDA: " + DataUtils.
converterDataComHorarioParaString(vendaVivo.
getDataVenda()) +
"\n");
conteudo.
append("LOJA: " + vendaVivo.
getLoja().
getDescricao() +
"\n");
conteudo.
append("VENDEDOR: " + vendaVivo.
getVendedor().
getNomeDaPessoa() +
"\n");
conteudo.
append("PRODUTO: " + vendaVivo.
getProdutoVivo().
getDescricaoCompleta() +
"\n");
conteudo.
append("OBS.: " + vendaVivo.
getObservacao() +
"\n");
conteudo.
append("JUSTIFICATIVA: " + vendaVivo.
getJustificativaParaExcluir() +
"\n");
conteudo.
append("__________________________________________________\n\n");
new GerenciadorEmailImpl
()
.
comEmailsDestino(ConstantesSEC.
DESTINATARIOS_EMAIL_DIRECAO)
.
comAssunto("ESPAÇO CASE - OPERAÇÃO DE EXCLUSÃO DE VENDA: " + diaAtual
)
.
comConteudo(conteudo.
toString())
.
enviar();
}
@
Override
public void cadastrarVendaVivoPeloPDV
(VendaVivo vendaVivo
) {
lancarExcecaoCasoNaoSejaInformadoCamposObrigatorios
(vendaVivo
);
validarEntidadeNoContextoInformado
(vendaVivo, Cadastrar.
class);
if (VerificadorUtil.
naoEstaNuloOuVazio(vendaVivo.
getIndicadorMigracao())) {
if (!vendaVivo.
getIndicadorMigracao()) {
vendaVivo.
setValorAssinatura(vendaVivo.
getProdutoVivo().
getValorAssinatura());
if (vendaVivo.
getIndicadorPortabilidade()) {
vendaVivo.
setValorRecebido(vendaVivo.
getProdutoVivo().
getValorAssinatura() * ConstantesSEC.
Vivo.
COMISSSAO_VIVO_PORTABILIDADE_1_9);
vendaVivo.
setValorComissao(vendaVivo.
getProdutoVivo().
getValorComissao() * ConstantesSEC.
Vivo.
COMISSSAO_PORTABILIDADE_1_3);
} else {
vendaVivo.
setValorRecebido(vendaVivo.
getProdutoVivo().
getValorAssinatura() * ConstantesSEC.
Vivo.
COMISSAO_VIVO_1_6);
vendaVivo.
setValorComissao(vendaVivo.
getProdutoVivo().
getValorComissao());
}
}
}
vendaVivo.
getLinhaVivo().
setPlanoAtual(vendaVivo.
getProdutoVivo());
vendaVivo.
getLinhaVivo().
setDataAtualizacao(DataUtils.
getDataAtual());
if (VerificadorUtil.
estaNulo(vendaVivo.
getSequencialDaLinha())) {
linhaVivoService.
cadastrar(vendaVivo.
getLinhaVivo());
} else {
linhaVivoService.
alterar(vendaVivo.
getLinhaVivo());
}
cadastrar
(vendaVivo
);
}
@
Override
public void alterarVendaVivoPeloPDV
(VendaVivo vendaVivo
) {
linhaVivoService.
alterar(vendaVivo.
getLinhaVivo());
alterar
(vendaVivo
);
}
@
Override
public List<VendaVivo
> consultarVendasVivoDoDia
(Long sequencialLoja,
Date dataVendas
) {
return vendaVivoRepository.
consultarVendasDoDia(sequencialLoja, dataVendas
);
}
@
Override
public Integer obterQuantidadeDeVendasPorLojaEePeriodo
(VendaVivo vendaVivo,
Date dataInicial,
Date dataFinal
) {
return vendaVivoRepository.
obterQuantidadeDeVendasPorLojaEePeriodo(vendaVivo, dataInicial, dataFinal
);
}
@
Override
public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo
(Loja loja,
Date dataInicial,
Date dataFinal
) {
return vendaVivoRepository.
obterValorTotalBrutoDeVendasPorLojaEePeriodo(loja, dataInicial, dataFinal
);
}
@
Override
public Double obterValorTotalBrutoDeVendasPorLojaEePeriodo
(ParametrosConsultaVendasVivoDTO parametrosConsulta
) {
return vendaVivoRepository.
obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsulta
);
}
@
Override
public Integer obterQuantidadeProdutosVendidosPorLojaEePeriodo
(ParametrosConsultaVendasVivoDTO parametrosConsultaVendas
) {
return vendaVivoRepository.
obterQuantidadeProdutosVendidosPorLojaEePeriodo(parametrosConsultaVendas
);
}
private void lancarExcecaoCasoNaoSejaInformadoCamposObrigatorios
(VendaVivo vendaVivo
) {
if (VerificadorUtil.
estaNulo(vendaVivo.
getLoja())) {
throw new NegocioException
("Informe a loja");
}
}
@
Override
public List<VendaVivo
> consultarVendasPorDemanda
(ParametrosConsulta
<VendaVivo
> parametrosConsulta,
Integer primeiroRegistro,
Integer tamanhoPagina,
String sortField,
String orderSort,
Map<String,
Object> filters
) {
return vendaVivoRepository.
consultarVendasPorDemanda(parametrosConsulta, primeiroRegistro, tamanhoPagina, sortField, orderSort, filters
);
}
@
Override
public List<VendaVivo
> consultarVendaPorParametros
(ParametrosConsultaVendasVivoDTO parametrosConsultaVendas
) {
return vendaVivoRepository.
consultarVendaPorParametros(parametrosConsultaVendas
);
}
@
Override
public List<ProdutoVivoDTO
> consultarVendasVivo
(Date dataInicial,
Date dataFinal, Vendedor vendedor,
Integer homologado
) {
return vendaVivoRepository.
consultarVendasVivo(dataInicial, dataFinal, vendedor, homologado
);
}
@
Override
public List<VendasDTO
> consultarVendas
(ParametrosConsultaVendasVivoDTO parametrosConsultaVendasDTO
) {
return vendaVivoRepository.
consultarVendas(parametrosConsultaVendasDTO
);
}
}