package br.com.ec.domain.service.cupom.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.ParametrosVendaDTO;
import br.com.ec.domain.model.Cupom;
import br.com.ec.domain.model.Lancamento;
import br.com.ec.domain.model.SubtipoProduto;
import br.com.ec.domain.model.tipos.TipoCupom;
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.model.tipos.TipoRegraCupom;
import br.com.ec.domain.service.cupom.CupomService;
import br.com.ec.domain.service.lancamento.LancamentoService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.infrastructure.repository.CupomRepository;
@Service
public class CupomServiceImpl
extends AbstractService
<Cupom
> implements CupomService
{
private CupomRepository cupomRepository
;
private LancamentoService lancamentoService
;
@Autowired
public CupomServiceImpl
(Validador validador, CupomRepository cupomRepository, LancamentoService lancamentoService
) {
super(validador
);
this.
cupomRepository = cupomRepository
;
this.
lancamentoService = lancamentoService
;
}
@
Override
protected GenericRepository
<Cupom
> getRepository
() {
return cupomRepository
;
}
@
Override
protected void regrasNegocioCadastrar
(Cupom cupom
) {
verificarSeCodigoJaExiste
(cupom
);
}
private void verificarSeCodigoJaExiste
(Cupom cupom
) {
if (VerificadorUtil.
naoEstaNulo(consultarCupomPorCodigo
(cupom.
getCodigo()))) {
throw new NegocioException
("CÓDIGO DO CUPOM JÁ EXISTE");
}
}
@
Override
public Cupom consultarCupomPorCodigo
(String codigo
) {
return cupomRepository.
consultarCupomPorCodigo(codigo
);
}
@
Override
public String gerarCodigoValido
() {
Cupom cupomGerado =
new Cupom
();
cupomGerado.
gerarCodigo();
if (VerificadorUtil.
naoEstaNulo(consultarCupomPorCodigo
(cupomGerado.
getCodigo()))) {
return gerarCodigoValido
();
}
return cupomGerado.
getCodigo();
}
@
Override
public void excluirCupom
(Cupom cupom
) {
if (existeCupomComLancamentoVendas
(cupom
)) {
throw new NegocioException
("Não é permitido excluir um cupom com lançamentos em vendas");
}
super.
excluir(cupom
);
}
private Boolean existeCupomComLancamentoVendas
(Cupom cupom
) {
Integer quantidadeUtilizada = lancamentoService.
obterQuantidadeVendasComCupom(cupom
);
if (VerificadorUtil.
naoEstaNulo(quantidadeUtilizada
)) {
if (quantidadeUtilizada
> 0) {
return true;
}
}
return false;
}
@
Override
public Cupom separarCupom
(Cupom cupom,
Double valorSeparacao
) {
verificarCupomValido
(cupom
);
if (0.0 >= valorSeparacao || valorSeparacao
>= cupom.
getValor()) {
throw new NegocioException
("VALOR NÃO PERMITIDO");
}
Cupom cupomNovo =
new Cupom
();
try {
cupomNovo = cupom.
clone();
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
cupomNovo.
setSequencial(null);
cupomNovo.
setCodigo(gerarCodigoValido
());
cupomNovo.
setDataHoraEmissao(DataUtils.
getDataAtual());
cupomNovo.
setValor(valorSeparacao
);
cupomNovo.
setObservacao("PARCIAL DO CUPOM: " + cupom.
getCodigo() +
"\n" + cupomNovo.
getObservacao());
cadastrar
(cupomNovo
);
cupom.
setValor(cupom.
getValor() - valorSeparacao
);
cupom.
setObservacao("PARCIAL DO CUPOM: " + cupomNovo.
getCodigo() +
"\n" + cupom.
getObservacao());
alterar
(cupom
);
return cupomNovo
;
}
@
Override
public Cupom unirCupons
(Cupom cupom, Cupom cupomParaUnir
) {
verificarCupomValido
(cupom
);
verificarCupomValido
(cupomParaUnir
);
if (!cupom.
getCliente().
equals(cupomParaUnir.
getCliente())) {
throw new NegocioException
("OPERAÇÃO NÃO PERMITIRDA: CUPONS PARA DIFERENTES CLIENTES");
}
if (VerificadorUtil.
naoEstaNulo(cupom.
getPercentual()) || VerificadorUtil.
naoEstaNulo(cupomParaUnir.
getPercentual())) {
throw new NegocioException
("OPERAÇÃO NÃO PERMITIRDA: CUPOM COM PERCENTUAL");
}
Cupom cupomNovo =
new Cupom
();
try {
cupomNovo = cupom.
clone();
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
cupomNovo.
setSequencial(null);
cupomNovo.
setCodigo(gerarCodigoValido
());
cupomNovo.
setDataHoraEmissao(DataUtils.
getDataAtual());
cupomNovo.
setValor(cupom.
getValor() + cupomParaUnir.
getValor());
cupomNovo.
setObservacao("UNIÃO DOS CUPONS: " + cupom.
getCodigo() +
" E " + cupomParaUnir.
getCodigo() +
"\n");
cupomNovo.
setObservacao(cupomNovo.
getObservacao() +
"\n" + cupom.
getObservacao() +
"\n" + cupomParaUnir.
getObservacao());
cadastrar
(cupomNovo
);
cupom.
setAtivo(false);
cupom.
setObservacao("UNIDO NO CUPOM: " + cupomNovo.
getCodigo() +
"\n" + cupom.
getObservacao());
alterar
(cupom
);
cupomParaUnir.
setAtivo(false);
cupomParaUnir.
setObservacao("UNIDO NO CUPOM: " + cupomNovo.
getCodigo() +
"\n" + cupomParaUnir.
getObservacao());
alterar
(cupomParaUnir
);
return cupomNovo
;
}
private void verificarCupomValido
(Cupom cupom
) {
if (VerificadorUtil.
naoEstaNulo(cupom
)) {
if (existeCupomComLancamentoVendas
(cupom
)) {
throw new NegocioException
("OPERAÇÃO NÃO PERMITIDA; CUPOM JÁ UTILIZADO");
}
if (!cupom.
getAtivo() ||
!cupom.
valido()) {
throw new NegocioException
("OPERAÇÃO NÃO PERMITIDA; CUPOM INDISPONÍVEL");
}
if (!cupom.
getTipoCupom().
equals(TipoCupom.
REEMBOLSO.
getValor())) {
throw new NegocioException
("OPERAÇÃO NÃO PERMITIDA: CUPOM DEVE SER PARA REEMBOLSO");
}
}
}
@
Override
public void validarRegrasCupom
(ParametrosVendaDTO parametrosVenda, Cupom cupomSelecionado
) {
// APENAS_CAPA_PELICULA_C0("C0", "REGRA: APENAS PARA CAPA OU PELÍCULA");
// APENAS_PELICULA_TPUSOFT_P1("P1", "REGRA: APENAS PARA PELÍCULA TPU SOFT"),
// APENAS_PELICULA_TPUSOFTTPASEIRA_P2("P2", "REGRA: APENAS PARA PELÍCULA TPU SOFT TRASEIRA"),
// APENAS_PELICULA_CAMERACOMFRONTAL_P3("P3", "REGRA: APENAS PARA PELÍCULA DE CÂMERA NA COMPRA DA FRONTAL"),
// APENAS_PELICULA_VIDRO_COM_CAPA_P4("P4", "REGRA: APENAS PARA PELÍCULA DE VIDRO, NA COMPRA DE UMA CAPA"),
// APENAS_CAPA_C1("C1", "REGRA: APENAS PARA CAPAS"),
// APENAS_2CAPAS_C2("C2", "REGRA: APENAS PARA VENDAS COM 2 CAPAS"),
// APENAS_3CAPAS_C3("C3", "REGRA: APENAS PARA VENDAS COM 3 CAPAS"),
// APENAS_CAPA_SILICONE_C4("C4", "REGRA: APENAS PARA CAPAS DE SILICONE");
Boolean verificarSeTemPeliculaTPUFrontalParaP2 =
false;
Boolean verificarSeTemPeliculaFrontalParaP3 =
false;
Integer quantidadeCapas =
0;
for (Lancamento lancamento : parametrosVenda.
getLancamentos()) {
if (lancamento.
getProduto().
getTipo().
equals(TipoProduto.
CAPA.
getValor())) {
quantidadeCapas++
;
}
if (lancamento.
getProduto().
getTipo().
equals(TipoProduto.
PELICULA.
getValor()) &&
VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getProduto().
getSubtipoProduto())) {
if (lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) ||
lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43)) {
verificarSeTemPeliculaTPUFrontalParaP2 =
true;
}
if (lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) ||
lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43) ||
lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_VIDRO_3D_NORMAL_44) ||
lancamento.
getProduto().
getSubtipoProduto().
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_VIDRO_3D_PRIVACIDADE_45)) {
verificarSeTemPeliculaFrontalParaP3 =
true;
}
}
}
for (Lancamento lancamento : parametrosVenda.
getLancamentos()) {
if (lancamento.
equals(cupomSelecionado.
getLancamento()) && VerificadorUtil.
naoEstaNuloOuVazio(cupomSelecionado.
getTipoRegraCupom())) {
String tipoProdutoLancamento = lancamento.
getProduto().
getTipo();
SubtipoProduto subtipoProdutoLancamento = lancamento.
getProduto().
getSubtipoProduto();
// REGRAS PARA PELÍCULAS
if (ehPelicula
(cupomSelecionado.
getTipoRegraCupom())) {
if (!tipoProdutoLancamento.
equals(TipoProduto.
PELICULA.
getValor())) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
if (TipoRegraCupom.
APENAS_PELICULA_TPUSOFT_P1.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom())) {
if (VerificadorUtil.
naoEstaNulo(subtipoProdutoLancamento
)) {
if (!subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_NORMAL_42) &&
!subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_PRIVACIDADE_43)) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
}
}
if (TipoRegraCupom.
APENAS_PELICULA_TPUSOFTTPASEIRA_P2.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom())) {
if (VerificadorUtil.
naoEstaNulo(subtipoProdutoLancamento
)) {
if (!verificarSeTemPeliculaTPUFrontalParaP2 ||
!subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_TRASEIRA_46)) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
}
}
if (TipoRegraCupom.
APENAS_PELICULA_CAMERACOMFRONTAL_P3.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom())) {
if (VerificadorUtil.
naoEstaNulo(subtipoProdutoLancamento
)) {
if (!verificarSeTemPeliculaFrontalParaP3 ||
!(subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_TPU_SOFT_CAMERA_47) ||
subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_VIDRO_CAMERA_48))) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
}
}
if (TipoRegraCupom.
APENAS_PELICULA_VIDRO_COM_CAPA_P4.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom())) {
if (!(quantidadeCapas
> 0 &&
subtipoProdutoLancamento.
getSequencial().
equals(ConstantesSEC.
SubtipoProduto.
SEQUENCIAL_SUBTIPO_VIDRO_3D_NORMAL_44))) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
}
}
// REGRAS PARA CAPAS
if (ehCapa
(cupomSelecionado.
getTipoRegraCupom())) {
if (!tipoProdutoLancamento.
equals(TipoProduto.
CAPA.
getValor())) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
if (TipoRegraCupom.
APENAS_2CAPAS_C2.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom()) && quantidadeCapas
<2) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
if (TipoRegraCupom.
APENAS_3CAPAS_C3.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom()) && quantidadeCapas
<3) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
if (TipoRegraCupom.
APENAS_CAPA_SILICONE_C4.
getValor().
equals(cupomSelecionado.
getTipoRegraCupom())) {
if (VerificadorUtil.
naoEstaNuloOuVazio(lancamento.
getProduto().
getEstilo())) {
if (!lancamento.
getProduto().
getEstilo().
equals(TipoEstiloProduto.
SILICONE_CASE.
getValor())) {
throw new RuntimeException(cupomSelecionado.
getDescricaoDoTipoRegraCupom());
}
}
}
}
break;
}
}
}
private Boolean ehPelicula
(String tipoRegraCupom
) {
return TipoRegraCupom.
APENAS_PELICULA_TPUSOFT_P1.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_PELICULA_TPUSOFTTPASEIRA_P2.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_PELICULA_CAMERACOMFRONTAL_P3.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_PELICULA_VIDRO_COM_CAPA_P4.
getValor().
equals(tipoRegraCupom
);
}
private Boolean ehCapa
(String tipoRegraCupom
) {
return TipoRegraCupom.
APENAS_CAPA_C1.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_2CAPAS_C2.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_3CAPAS_C3.
getValor().
equals(tipoRegraCupom
) ||
TipoRegraCupom.
APENAS_CAPA_SILICONE_C4.
getValor().
equals(tipoRegraCupom
);
}
}