package br.com.ec.domain.service.cashback.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.CashbackDTO;
import br.com.ec.domain.dto.ParametrosVendaDTO;
import br.com.ec.domain.model.Cashback;
import br.com.ec.domain.model.Cliente;
import br.com.ec.domain.model.Lancamento;
import br.com.ec.domain.model.Venda;
import br.com.ec.domain.model.tipos.TipoCashback;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.service.cashback.CashbackService;
import br.com.ec.infrastructure.repository.CashbackRepository;
@Service
public class CashbackServiceImpl
extends AbstractService
<Cashback
> implements CashbackService
{
private CashbackRepository cashbackRepository
;
@Autowired
public CashbackServiceImpl
(Validador validador, CashbackRepository cashbackRepository
) {
super(validador
);
this.
cashbackRepository = cashbackRepository
;
}
@
Override
protected GenericRepository
<Cashback
> getRepository
() {
return cashbackRepository
;
}
@
Override
public List<CashbackDTO
> consultarCashbackCliente
(Long sequencialCliente
) {
return cashbackRepository.
consultarCashbackCliente(sequencialCliente
);
}
@
Override
public Double consultarSaldoCliente
(Long sequencialCliente
) {
Double saldo =
0.0;
Double valorCreditado = cashbackRepository.
consultarSaldoCliente(sequencialCliente, TipoCashback.
ENTRADA.
getValor());
Double valorUtilizado = cashbackRepository.
consultarSaldoCliente(sequencialCliente, TipoCashback.
SAIDA.
getValor());
if (VerificadorUtil.
naoEstaNulo(valorCreditado
)) {
saldo += valorCreditado
;
if (VerificadorUtil.
naoEstaNulo(valorUtilizado
)) {
saldo -= valorUtilizado
;
}
}
return saldo
;
}
@
Override
public void gerarCashback
(ParametrosVendaDTO parametrosVendaDTO,
Long sequencialVenda
) {
// TODO: 10% capas e pelĂculas e 5% no geral (sem descontos ou cupons)
Double valorCashback =
0.0;
if (VerificadorUtil.
naoEstaNulo(parametrosVendaDTO.
getCliente())) {
if (VerificadorUtil.
naoEstaNuloOuVazio(parametrosVendaDTO.
getLancamentos())) {
for (Lancamento lancamento : parametrosVendaDTO.
getLancamentos()) {
valorCashback += lancamento.
valorCashbackGerado();
}
}
if (valorCashback
> 0.0) {
Cashback cashback =
new Cashback
();
cashback.
setCliente(parametrosVendaDTO.
getCliente());
cashback.
setVenda(new Venda
(sequencialVenda
));
cashback.
setDataHoraEmissao(DataUtils.
getDataAtual());
cashback.
setPrazoInicial(DataUtils.
acrescentarDias(DataUtils.
getDataAtual(),
7));
cashback.
setPrazoFinal(DataUtils.
acrescentarDias(cashback.
getPrazoInicial(),
365));
cashback.
setTipoCashback(TipoCashback.
ENTRADA.
getValor());
cashback.
setValor(valorCashback
);
cashback.
setAtivo(true);
cashbackRepository.
cadastrar(cashback
);
}
}
}
@
Override
public void utilizarCashback
(Long sequencialVenda,
Long sequencialCliente,
Double valorCashback
) {
Cashback cashback =
new Cashback
();
cashback.
setCliente(new Cliente
(sequencialCliente
));
cashback.
setVenda(new Venda
(sequencialVenda
));
cashback.
setDataHoraEmissao(DataUtils.
getDataAtual());
cashback.
setPrazoInicial(null);
cashback.
setPrazoFinal(null);
cashback.
setTipoCashback(TipoCashback.
SAIDA.
getValor());
cashback.
setValor(valorCashback
);
cashback.
setAtivo(true);
cashbackRepository.
cadastrar(cashback
);
}
@
Override
public void excluirCashbackVenda
(Long sequencialVenda
) {
cashbackRepository.
excluirCashbackVenda(sequencialVenda
);
}
}