package br.com.ec.domain.service.cupom.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ec.domain.model.Cupom;
import br.com.ec.domain.model.tipos.TipoCupom;
import br.com.ec.domain.service.cupom.CupomService;
import br.com.ec.domain.service.lancamento.LancamentoService;
import br.com.ec.infrastructure.repository.CupomRepository;
import br.edu.cesmac.core.exception.NegocioException;
import br.edu.cesmac.core.generic.AbstractService;
import br.edu.cesmac.core.generic.GenericRepository;
import br.edu.cesmac.core.util.DataUtils;
import br.edu.cesmac.core.util.VerificadorUtil;
import br.edu.cesmac.core.validador.Validador;
@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");
}
}
}
}